]> granicus.if.org Git - postgresql/commitdiff
contrib/intarray updates from Oleg Bartunov:
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Jun 2001 02:31:25 +0000 (02:31 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Jun 2001 02:31:25 +0000 (02:31 +0000)
it's reimplemented to use function interface version 1 and special
treating of degenerated signatures.

contrib/intarray/_int.c

index dc49355739e66d4a25dab23460be5ba0b6b16979..56d15dac0116b3b3230fc61ccff31046ab4fce3f 100644 (file)
 #define SORT(x) \
        do { \
                 if ( ARRNELEMS( x ) > 1 ) \
-                       isort( (void*)ARRPTR( x ), ARRNELEMS( x ) ); \
+                       isort( ARRPTR( x ), ARRNELEMS( x ) ); \
        } while(0)
 
 #define PREPAREARR(x) \
        do { \
                 if ( ARRNELEMS( x ) > 1 ) \
-                       if ( isort( (void*)ARRPTR( x ), ARRNELEMS( x ) ) ) \
+                       if ( isort( ARRPTR( x ), ARRNELEMS( x ) ) ) \
                                x = _int_unique( x ); \
        } while(0)
 
@@ -126,7 +126,7 @@ typedef void (*formfloat) (ArrayType *, float *);
 /*
 ** usefull function
 */
-static bool isort(int *a, const int len);
+static bool isort(int4 *a, const int len);
 static ArrayType *new_intArrayType(int num);
 static ArrayType *copy_intArrayType(ArrayType *a);
 static ArrayType *resize_intArrayType(ArrayType *a, int num);
@@ -152,48 +152,72 @@ static ArrayType *_int_common_union(bytea *entryvec,
 /*
 ** GiST support methods
 */
-bool           g_int_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy);
-GISTENTRY  *g_int_compress(GISTENTRY *entry);
-GISTENTRY  *g_int_decompress(GISTENTRY *entry);
-float     *g_int_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result);
-GIST_SPLITVEC *g_int_picksplit(bytea *entryvec, GIST_SPLITVEC *v);
-ArrayType  *g_int_union(bytea *entryvec, int *sizep);
-bool      *g_int_same(ArrayType *b1, ArrayType *b2, bool *result);
+PG_FUNCTION_INFO_V1( g_int_consistent );
+PG_FUNCTION_INFO_V1( g_int_compress );
+PG_FUNCTION_INFO_V1( g_int_decompress );
+PG_FUNCTION_INFO_V1( g_int_penalty );
+PG_FUNCTION_INFO_V1( g_int_picksplit );
+PG_FUNCTION_INFO_V1( g_int_union );
+PG_FUNCTION_INFO_V1( g_int_same );
+
+Datum  g_int_consistent(PG_FUNCTION_ARGS);
+Datum  g_int_compress(PG_FUNCTION_ARGS);
+Datum  g_int_decompress(PG_FUNCTION_ARGS);
+Datum  g_int_penalty(PG_FUNCTION_ARGS);
+Datum  g_int_picksplit(PG_FUNCTION_ARGS);
+Datum  g_int_union(PG_FUNCTION_ARGS);
+Datum  g_int_same(PG_FUNCTION_ARGS);
 
 
 /*
 ** R-tree support functions
 */
-bool           inner_int_contains(ArrayType *a, ArrayType *b);
-bool           inner_int_overlap(ArrayType *a, ArrayType *b);
-ArrayType  *inner_int_union(ArrayType *a, ArrayType *b);
-ArrayType  *inner_int_inter(ArrayType *a, ArrayType *b);
-
-bool           _int_different(ArrayType *a, ArrayType *b);
-bool           _int_same(ArrayType *a, ArrayType *b);
-bool           _int_contains(ArrayType *a, ArrayType *b);
-bool           _int_contained(ArrayType *a, ArrayType *b);
-bool           _int_overlap(ArrayType *a, ArrayType *b);
-ArrayType  *_int_union(ArrayType *a, ArrayType *b);
-ArrayType  *_int_inter(ArrayType *a, ArrayType *b);
-void           rt__int_size(ArrayType *a, float *sz);
+static bool            inner_int_contains(ArrayType *a, ArrayType *b);
+static bool            inner_int_overlap(ArrayType *a, ArrayType *b);
+static ArrayType  *inner_int_union(ArrayType *a, ArrayType *b);
+static ArrayType  *inner_int_inter(ArrayType *a, ArrayType *b);
+static void            rt__int_size(ArrayType *a, float *sz);
+
+PG_FUNCTION_INFO_V1( _int_different );
+PG_FUNCTION_INFO_V1( _int_same );
+PG_FUNCTION_INFO_V1( _int_contains );
+PG_FUNCTION_INFO_V1( _int_contained );
+PG_FUNCTION_INFO_V1( _int_overlap );
+PG_FUNCTION_INFO_V1( _int_union );
+PG_FUNCTION_INFO_V1( _int_inter );
+
+Datum  _int_different(PG_FUNCTION_ARGS);
+Datum  _int_same(PG_FUNCTION_ARGS);
+Datum  _int_contains(PG_FUNCTION_ARGS);
+Datum  _int_contained(PG_FUNCTION_ARGS);
+Datum  _int_overlap(PG_FUNCTION_ARGS);
+Datum  _int_union(PG_FUNCTION_ARGS);
+Datum  _int_inter(PG_FUNCTION_ARGS);
 
 /*
 ** _intbig methods
 */
-bool           g_intbig_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy);
-GISTENTRY  *g_intbig_compress(GISTENTRY *entry);
-GISTENTRY  *g_intbig_decompress(GISTENTRY *entry);
-float     *g_intbig_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result);
-GIST_SPLITVEC *g_intbig_picksplit(bytea *entryvec, GIST_SPLITVEC *v);
-ArrayType  *g_intbig_union(bytea *entryvec, int *sizep);
-bool      *g_intbig_same(ArrayType *a, ArrayType *b, bool *result);
+PG_FUNCTION_INFO_V1( g_intbig_consistent );
+PG_FUNCTION_INFO_V1( g_intbig_compress );
+PG_FUNCTION_INFO_V1( g_intbig_decompress );
+PG_FUNCTION_INFO_V1( g_intbig_penalty );
+PG_FUNCTION_INFO_V1( g_intbig_picksplit );
+PG_FUNCTION_INFO_V1( g_intbig_union );
+PG_FUNCTION_INFO_V1( g_intbig_same );
+
+Datum  g_intbig_consistent(PG_FUNCTION_ARGS);
+Datum  g_intbig_compress(PG_FUNCTION_ARGS);
+Datum  g_intbig_decompress(PG_FUNCTION_ARGS);
+Datum  g_intbig_penalty(PG_FUNCTION_ARGS);
+Datum  g_intbig_picksplit(PG_FUNCTION_ARGS);
+Datum  g_intbig_union(PG_FUNCTION_ARGS);
+Datum  g_intbig_same(PG_FUNCTION_ARGS);
 
 static bool _intbig_contains(ArrayType *a, ArrayType *b);
 static bool _intbig_overlap(ArrayType *a, ArrayType *b);
 static ArrayType *_intbig_union(ArrayType *a, ArrayType *b);
 
-/*static ArrayType *   _intbig_inter(ArrayType *a, ArrayType *b);*/
+static ArrayType *     _intbig_inter(ArrayType *a, ArrayType *b);
 static void rt__intbig_size(ArrayType *a, float *sz);
 static void gensign(BITVEC sign, int *a, int len);
 
@@ -207,11 +231,11 @@ static void gensign(BITVEC sign, int *a, int len);
 ** the predicate x op query == FALSE, where op is the oper
 ** corresponding to strategy in the pg_amop table.
 */
-bool
-g_int_consistent(GISTENTRY *entry,
-                                ArrayType *query,
-                                StrategyNumber strategy)
-{
+Datum
+g_int_consistent(PG_FUNCTION_ARGS) {
+       GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
+       ArrayType *query = ( ArrayType * )PG_GETARG_POINTER(1);
+       StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
        bool            retval;
 
        /* sort query for fast search, key is already sorted */
@@ -239,21 +263,26 @@ g_int_consistent(GISTENTRY *entry,
                default:
                        retval = FALSE;
        }
-       return (retval);
+       PG_RETURN_BOOL(retval);
 }
 
-ArrayType  *
-g_int_union(bytea *entryvec, int *sizep)
+Datum
+g_int_union(PG_FUNCTION_ARGS)
 {
-       return _int_common_union(entryvec, sizep, inner_int_union);
+       PG_RETURN_POINTER( _int_common_union(
+               (bytea *) PG_GETARG_POINTER(0), 
+               (int *) PG_GETARG_POINTER(1), 
+               inner_int_union 
+       ) );
 }
 
 /*
 ** GiST Compress and Decompress methods
 */
-GISTENTRY  *
-g_int_compress(GISTENTRY *entry)
+Datum
+g_int_compress(PG_FUNCTION_ARGS)
 {
+       GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
        GISTENTRY  *retval;
        ArrayType  *r;
        int                     len;
@@ -280,7 +309,7 @@ g_int_compress(GISTENTRY *entry)
 
                gistentryinit(*retval, (Datum) 0, entry->rel, entry->page, entry->offset,
                                          0, FALSE);
-               return (retval);
+               PG_RETURN_POINTER(retval);
        }
 
        if (entry->leafkey)
@@ -320,12 +349,13 @@ g_int_compress(GISTENTRY *entry)
        gistentryinit(*retval, PointerGetDatum(r),
                                  entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
 
-       return (retval);
+       PG_RETURN_POINTER(retval);
 }
 
-GISTENTRY  *
-g_int_decompress(GISTENTRY *entry)
+Datum
+g_int_decompress(PG_FUNCTION_ARGS)
 {
+       GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
        GISTENTRY  *retval;
        ArrayType  *r;
        int                *dr,
@@ -352,7 +382,7 @@ g_int_decompress(GISTENTRY *entry)
 #ifdef GIST_DEBUG
                elog(NOTICE, "DECOMP IN: NULL");
 #endif
-               return (retval);
+               PG_RETURN_POINTER(retval);
        }
 
 
@@ -363,7 +393,7 @@ g_int_decompress(GISTENTRY *entry)
        {                                                       /* not comressed value */
                /* sometimes strange bytesize */
                gistentryinit(*entry, PointerGetDatum(in), entry->rel, entry->page, entry->offset, VARSIZE(in), FALSE);
-               return (entry);
+               PG_RETURN_POINTER(entry);
        }
 
 #ifdef GIST_DEBUG
@@ -386,28 +416,35 @@ g_int_decompress(GISTENTRY *entry)
 
        gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
 
-       return (retval);
+       PG_RETURN_POINTER(retval);
 }
 
 /*
 ** The GiST Penalty method for _intments
 */
-float *
-g_int_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result)
+Datum
+g_int_penalty(PG_FUNCTION_ARGS)
 {
-       return _int_common_penalty(origentry, newentry, result, inner_int_union, rt__int_size);
+       PG_RETURN_POINTER( _int_common_penalty( 
+               (GISTENTRY *)PG_GETARG_POINTER(0), 
+               (GISTENTRY *)PG_GETARG_POINTER(1), 
+               (float *)    PG_GETARG_POINTER(2), 
+               inner_int_union, rt__int_size
+       ) );
 }
 
 
-GIST_SPLITVEC *
-g_int_picksplit(bytea *entryvec,
-                               GIST_SPLITVEC *v)
+Datum
+g_int_picksplit(PG_FUNCTION_ARGS)
 {
-       return _int_common_picksplit(entryvec, v,
-                                                                inner_int_union,
-                                                                inner_int_inter,
-                                                                rt__int_size,
-                                                                1e-8);
+       PG_RETURN_POINTER( _int_common_picksplit(
+               (bytea *)PG_GETARG_POINTER(0), 
+               (GIST_SPLITVEC *)PG_GETARG_POINTER(1),
+               inner_int_union,
+               inner_int_inter,
+               rt__int_size,
+               1e-8
+       ) );
 }
 
 /*
@@ -415,26 +452,38 @@ g_int_picksplit(bytea *entryvec,
 */
 
 
-bool *
-g_int_same(ArrayType *b1, ArrayType *b2, bool *result)
+Datum
+g_int_same(PG_FUNCTION_ARGS)
 {
-       if (_int_same(b1, b2))
-               *result = TRUE;
-       else
-               *result = FALSE;
+       bool *result = (bool *)PG_GETARG_POINTER(2);
+       *result = DatumGetBool(
+               DirectFunctionCall2(
+                       _int_same,
+                       PointerGetDatum(PG_GETARG_POINTER(0)),
+                       PointerGetDatum(PG_GETARG_POINTER(1))
+               )
+       );
 
-       return (result);
+       PG_RETURN_POINTER(result);
 }
 
-bool
-_int_contained(ArrayType *a, ArrayType *b)
+Datum 
+_int_contained(PG_FUNCTION_ARGS)
 {
-       return (_int_contains(b, a));
+       PG_RETURN_BOOL( DatumGetBool( 
+               DirectFunctionCall2( 
+                       _int_contains, 
+                       PointerGetDatum(PG_GETARG_POINTER(1)), 
+                       PointerGetDatum(PG_GETARG_POINTER(0)) 
+               )
+       ));
 }
 
-bool
-_int_contains(ArrayType *a, ArrayType *b)
+Datum
+_int_contains(PG_FUNCTION_ARGS)
 {
+       ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
+       ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
        bool            res;
        ArrayType  *an,
                           *bn;
@@ -451,10 +500,10 @@ _int_contains(ArrayType *a, ArrayType *b)
        res = inner_int_contains(an, bn);
        pfree(an);
        pfree(bn);
-       return res;
+       PG_RETURN_BOOL( res );
 }
 
-bool
+static bool
 inner_int_contains(ArrayType *a, ArrayType *b)
 {
        int                     na,
@@ -497,15 +546,23 @@ inner_int_contains(ArrayType *a, ArrayType *b)
  * Operator class for R-tree indexing
  *****************************************************************************/
 
-bool
-_int_different(ArrayType *a, ArrayType *b)
+Datum 
+_int_different(PG_FUNCTION_ARGS)
 {
-       return (!_int_same(a, b));
+       PG_RETURN_BOOL( ! DatumGetBool( 
+               DirectFunctionCall2( 
+                       _int_same, 
+                       PointerGetDatum(PG_GETARG_POINTER(0)), 
+                       PointerGetDatum(PG_GETARG_POINTER(1)) 
+               )
+       ));
 }
 
-bool
-_int_same(ArrayType *a, ArrayType *b)
+Datum
+_int_same(PG_FUNCTION_ARGS)
 {
+       ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
+       ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
        int                     na,
                                nb;
        int                     n;
@@ -546,14 +603,16 @@ _int_same(ArrayType *a, ArrayType *b)
        pfree(an);
        pfree(bn);
 
-       return result;
+       PG_RETURN_BOOL(result);
 }
 
 /*     _int_overlap -- does a overlap b?
  */
-bool
-_int_overlap(ArrayType *a, ArrayType *b)
+Datum
+_int_overlap(PG_FUNCTION_ARGS)
 {
+       ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
+       ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
        bool            result;
        ArrayType  *an,
                           *bn;
@@ -572,10 +631,10 @@ _int_overlap(ArrayType *a, ArrayType *b)
        pfree(an);
        pfree(bn);
 
-       return result;
+       PG_RETURN_BOOL( result );
 }
 
-bool
+static bool
 inner_int_overlap(ArrayType *a, ArrayType *b)
 {
        int                     na,
@@ -609,9 +668,11 @@ inner_int_overlap(ArrayType *a, ArrayType *b)
        return FALSE;
 }
 
-ArrayType  *
-_int_union(ArrayType *a, ArrayType *b)
+Datum
+_int_union(PG_FUNCTION_ARGS)
 {
+       ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
+       ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
        ArrayType  *result;
        ArrayType  *an,
                           *bn;
@@ -631,10 +692,10 @@ _int_union(ArrayType *a, ArrayType *b)
        if (bn)
                pfree(bn);
 
-       return result;
+       PG_RETURN_POINTER( result );
 }
 
-ArrayType  *
+static ArrayType  *
 inner_int_union(ArrayType *a, ArrayType *b)
 {
        ArrayType  *r = NULL;
@@ -691,15 +752,17 @@ inner_int_union(ArrayType *a, ArrayType *b)
 }
 
 
-ArrayType  *
-_int_inter(ArrayType *a, ArrayType *b)
+Datum
+_int_inter(PG_FUNCTION_ARGS)
 {
+       ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
+       ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
        ArrayType  *result;
        ArrayType  *an,
                           *bn;
 
        if (ARRISNULL(a) || ARRISNULL(b))
-               return new_intArrayType(0);
+               PG_RETURN_POINTER(new_intArrayType(0));
 
        an = copy_intArrayType(a);
        bn = copy_intArrayType(b);
@@ -712,10 +775,10 @@ _int_inter(ArrayType *a, ArrayType *b)
        pfree(an);
        pfree(bn);
 
-       return result;
+       PG_RETURN_POINTER( result );
 }
 
-ArrayType  *
+static ArrayType  *
 inner_int_inter(ArrayType *a, ArrayType *b)
 {
        ArrayType  *r;
@@ -764,7 +827,7 @@ inner_int_inter(ArrayType *a, ArrayType *b)
                return resize_intArrayType(r, dr - ARRPTR(r));
 }
 
-void
+static void
 rt__int_size(ArrayType *a, float *size)
 {
        if (ARRISNULL(a))
@@ -782,11 +845,11 @@ rt__int_size(ArrayType *a, float *size)
 
 /* len >= 2 */
 static bool
-isort(int *a, int len)
+isort(int4 *a, int len)
 {
-       int                     tmp,
+       int4                    tmp,
                                index;
-       int                *cur,
+       int4               *cur,
                           *end;
        bool            r = FALSE;
 
@@ -1006,9 +1069,12 @@ _intbig_inter(ArrayType *a, ArrayType *b)
        return r;
 }
 
-bool *
-g_intbig_same(ArrayType *a, ArrayType *b, bool *result)
+Datum
+g_intbig_same(PG_FUNCTION_ARGS)
 {
+       ArrayType *a = (ArrayType *)PG_GETARG_POINTER(0);
+       ArrayType *b = (ArrayType *)PG_GETARG_POINTER(1);
+       bool *result = (bool *)PG_GETARG_POINTER(2);
        BITVECP         da,
                                db;
        int                     i;
@@ -1016,7 +1082,7 @@ g_intbig_same(ArrayType *a, ArrayType *b, bool *result)
        if (ARRISNULL(a) || ARRISNULL(b))
        {
                *result = (ARRISNULL(a) && ARRISNULL(b)) ? TRUE : FALSE;
-               return result;
+               PG_RETURN_POINTER( result );
        }
 
        da = SIGPTR(a);
@@ -1026,28 +1092,46 @@ g_intbig_same(ArrayType *a, ArrayType *b, bool *result)
        if (da[i] != db[i])
        {
                *result = FALSE;
-               return result;
+               PG_RETURN_POINTER( result );
        }
        );
 
        *result = TRUE;
-       return result;
+       PG_RETURN_POINTER( result );
 }
 
-GISTENTRY  *
-g_intbig_compress(GISTENTRY *entry)
+Datum
+g_intbig_compress(PG_FUNCTION_ARGS)
 {
+       GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
        GISTENTRY  *retval;
        ArrayType  *r,
                           *in;
+       bool maycompress = true;
+       int i;
 
        if (DatumGetPointer(entry->key) != NULL)
                in = (ArrayType *) PG_DETOAST_DATUM(entry->key);
        else
                in = NULL;
 
-       if (!entry->leafkey)
-               return entry;
+       if (!entry->leafkey) {
+               if ( ! ARRISNULL(in) ) {
+                       LOOPBYTE( 
+                               if ( ( ((char*)ARRPTR(in))[i] & 0xff ) != 0xff ) {
+                                       maycompress = false;
+                                       break;
+                               }
+                       ); 
+                       if ( maycompress ) {
+                               retval = palloc(sizeof(GISTENTRY));
+                               r = new_intArrayType(1);
+                               gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
+                               PG_RETURN_POINTER( retval );
+                       }       
+               }
+               PG_RETURN_POINTER( entry );
+       }
 
        retval = palloc(sizeof(GISTENTRY));
 
@@ -1057,7 +1141,7 @@ g_intbig_compress(GISTENTRY *entry)
                        if (in != (ArrayType *) DatumGetPointer(entry->key))
                                pfree(in);
                gistentryinit(*retval, (Datum) 0, entry->rel, entry->page, entry->offset, 0, FALSE);
-               return (retval);
+               PG_RETURN_POINTER (retval);
        }
 
        r = new_intArrayType(SIGLENINT);
@@ -1065,60 +1149,101 @@ g_intbig_compress(GISTENTRY *entry)
                        ARRPTR(in),
                        ARRNELEMS(in));
 
+       LOOPBYTE( 
+               if( ( ((char*)ARRPTR(in))[i] & 0xff ) != 0xff ) {
+                       maycompress = false;
+                       break;
+               }
+       ); 
+
+       if ( maycompress ) {
+               pfree(r);
+               r = new_intArrayType(1);
+       }       
+
        gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
 
        if (in)
-               if (in != (ArrayType *) DatumGetPointer(entry->key))
+               if ( in != (ArrayType *) DatumGetPointer(entry->key))
                        pfree(in);
 
-       return (retval);
+       PG_RETURN_POINTER (retval);
 }
 
-GISTENTRY  *
-g_intbig_decompress(GISTENTRY *entry)
+Datum
+g_intbig_decompress(PG_FUNCTION_ARGS)
 {
+       GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
        ArrayType  *key;
 
-       key = (ArrayType *) PG_DETOAST_DATUM(entry->key);
-       if (key != (ArrayType *) DatumGetPointer(entry->key))
+       if ( DatumGetPointer(entry->key) != NULL )
+               key = (ArrayType *) PG_DETOAST_DATUM(entry->key);
+       else
+               key = NULL;
+
+       if ( key != (ArrayType *) DatumGetPointer(entry->key))
        {
                GISTENTRY  *retval;
 
                retval = palloc(sizeof(GISTENTRY));
 
-               gistentryinit(*retval, PointerGetDatum(key), entry->rel, entry->page, entry->offset, VARSIZE(key), FALSE);
-               return retval;
+               gistentryinit(*retval, PointerGetDatum(key), entry->rel, entry->page, entry->offset, (key) ? VARSIZE(key) : 0, FALSE);
+               PG_RETURN_POINTER( retval );
        }
-       return entry;
-}
+       if ( ! ARRISNULL(key) )
+               if ( ARRNELEMS(key) == 1 ) {
+                       GISTENTRY  *retval;
+                       ArrayType  *newkey;
 
-GIST_SPLITVEC *
-g_intbig_picksplit(bytea *entryvec, GIST_SPLITVEC *v)
-{
-       return _int_common_picksplit(entryvec, v,
-                                                                _intbig_union,
-                                                                _intbig_inter,
-                                                                rt__intbig_size,
-                                                                1.0);
+                       retval = palloc(sizeof(GISTENTRY));
+                       newkey = new_intArrayType(SIGLENINT);
+                       MemSet( (void*)ARRPTR(newkey), 0xff, SIGLEN ); 
 
+                       gistentryinit(*retval, PointerGetDatum(newkey), entry->rel, entry->page, entry->offset, VARSIZE(newkey), FALSE);
+                       PG_RETURN_POINTER( retval );
+               }
+       PG_RETURN_POINTER( entry );
 }
 
-ArrayType  *
-g_intbig_union(bytea *entryvec, int *sizep)
+Datum
+g_intbig_picksplit(PG_FUNCTION_ARGS)
 {
-       return _int_common_union(entryvec, sizep, _intbig_union);
+       PG_RETURN_POINTER( _int_common_picksplit(
+               (bytea *)PG_GETARG_POINTER(0), 
+               (GIST_SPLITVEC *)PG_GETARG_POINTER(1),
+               _intbig_union,
+               _intbig_inter,
+               rt__intbig_size,
+               1.0
+       ) );
 }
 
-float *
-g_intbig_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result)
+Datum
+g_intbig_union(PG_FUNCTION_ARGS)
 {
-       _int_common_penalty(origentry, newentry, result, _intbig_union, rt__intbig_size);
-       return result;
+        PG_RETURN_POINTER( _int_common_union(
+                (bytea *) PG_GETARG_POINTER(0),
+                (int *) PG_GETARG_POINTER(1),
+                _intbig_union
+        ) );
 }
 
-bool
-g_intbig_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy)
+Datum
+g_intbig_penalty(PG_FUNCTION_ARGS)
 {
+       PG_RETURN_POINTER( _int_common_penalty( 
+               (GISTENTRY *)PG_GETARG_POINTER(0), 
+               (GISTENTRY *)PG_GETARG_POINTER(1), 
+               (float *)    PG_GETARG_POINTER(2), 
+               _intbig_union, rt__intbig_size
+       ) );
+}
+
+Datum
+g_intbig_consistent(PG_FUNCTION_ARGS) {
+        GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
+        ArrayType *query = ( ArrayType * )PG_GETARG_POINTER(1);
+        StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
        bool            retval;
        ArrayType  *q;
 
@@ -1147,7 +1272,7 @@ g_intbig_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy)
                        retval = FALSE;
        }
        pfree(q);
-       return (retval);
+       PG_RETURN_BOOL(retval);
 }
 
 /*****************************************************************
@@ -1158,7 +1283,7 @@ g_intbig_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy)
 ** The GiST Union method for _intments
 ** returns the minimal set that encloses all the entries in entryvec
 */
-ArrayType  *
+static ArrayType  *
 _int_common_union(bytea *entryvec, int *sizep, formarray unionf)
 {
        int                     numranges,
@@ -1202,7 +1327,7 @@ _int_common_union(bytea *entryvec, int *sizep, formarray unionf)
  * The GiST Penalty method for _intments *
  *****************************************/
 
-float *
+static float *
 _int_common_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result,
                                        formarray unionf,
                                        formfloat sizef)
@@ -1232,7 +1357,7 @@ _int_common_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result,
 ** The GiST PickSplit method for _intments
 ** We use Guttman's poly time split algorithm
 */
-GIST_SPLITVEC *
+static GIST_SPLITVEC *
 _int_common_picksplit(bytea *entryvec,
                                          GIST_SPLITVEC *v,
                                          formarray unionf,