Some optimizations by Volkan YAZICI
authorTeodor Sigaev
Wed, 10 May 2006 11:39:12 +0000 (11:39 +0000)
committerTeodor Sigaev
Wed, 10 May 2006 11:39:12 +0000 (11:39 +0000)
contrib/intarray/_int_op.c
contrib/intarray/_int_tool.c

index 7a2065bc214e8ebcd7c2011cd70d712eba1db9d0..036c357fb0772ec0e13e842e99827723c0d832bd 100644 (file)
@@ -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])
            {
index 480e16ed9fe57eebe1a08cb372ea5db64f9a8ca9..82ce4b7ac5642959bd7494e0fb2ea981730731f4 100644 (file)
@@ -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)