diff --git a/contrib/intarray/_int_op.c b/contrib/intarray/_int_op.c
index 7a2065bc214e8ebcd7c2011cd70d712eba1db9d0..036c357fb0772ec0e13e842e99827723c0d832bd 100644
--- a/contrib/intarray/_int_op.c
+++ b/contrib/intarray/_int_op.c
@@ -83,8 +83,6 @@ _int_same(PG_FUNCTION_ARGS)
 	if (avoid || bvoid)
 		return (avoid && bvoid) ? TRUE : FALSE;
 
-	SORT(a);
-	SORT(b);
 	na = ARRNELEMS(a);
 	nb = ARRNELEMS(b);
 	da = ARRPTR(a);
@@ -94,7 +92,10 @@ _int_same(PG_FUNCTION_ARGS)
 
 	if (na == nb)
 	{
+		SORT(a);
+		SORT(b);
 		result = TRUE;
+
 		for (n = 0; n < na; n++)
 			if (da[n] != db[n])
 			{
diff --git a/contrib/intarray/_int_tool.c b/contrib/intarray/_int_tool.c
index 480e16ed9fe57eebe1a08cb372ea5db64f9a8ca9..82ce4b7ac5642959bd7494e0fb2ea981730731f4 100644
--- a/contrib/intarray/_int_tool.c
+++ b/contrib/intarray/_int_tool.c
@@ -34,7 +34,7 @@ inner_int_contains(ArrayType *a, ArrayType *b)
 			j++;
 		}
 		else
-			j++;
+			break;
 
 	return (n == nb) ? TRUE : FALSE;
 }
@@ -76,13 +76,6 @@ ArrayType *
 inner_int_union(ArrayType *a, ArrayType *b)
 {
 	ArrayType  *r = NULL;
-	int			na,
-				nb;
-	int		   *da,
-			   *db,
-			   *dr;
-	int			i,
-				j;
 
 	CHECKARRVALID(a);
 	CHECKARRVALID(b);
@@ -94,31 +87,35 @@ inner_int_union(ArrayType *a, ArrayType *b)
 	if (ARRISVOID(b))
 		r = copy_intArrayType(a);
 
-	if (r)
-		dr = ARRPTR(r);
-	else
+	if (!r)
 	{
-		na = ARRNELEMS(a);
-		nb = ARRNELEMS(b);
-		da = ARRPTR(a);
-		db = ARRPTR(b);
+		int 	na = ARRNELEMS(a),
+				nb = ARRNELEMS(b);
+		int		*da = ARRPTR(a),
+				*db = ARRPTR(b);
+		int		i,j, *dr;
 
 		r = new_intArrayType(na + nb);
 		dr = ARRPTR(r);
 
 		/* union */
 		i = j = 0;
-		while (i < na && j < nb)
-			if (da[i] < db[j])
+		while (i < na && j < nb) {
+			if (da[i] == db[j]) {
+				*dr++ = da[i++];
+				j++;
+			} else if (da[i] < db[j])
 				*dr++ = da[i++];
 			else
 				*dr++ = db[j++];
+		}
 
 		while (i < na)
 			*dr++ = da[i++];
 		while (j < nb)
 			*dr++ = db[j++];
 
+		r = resize_intArrayType(r, dr-ARRPTR(r));
 	}
 
 	if (ARRNELEMS(r) > 1)