+ HASH( sign, ptr[k] );
+}
+
Datum
gtxtidx_compress(PG_FUNCTION_ARGS) {
GISTENTRY *entry = (GISTENTRY *)PG_GETARG_POINTER(0);
*arr = crc32_sz( (uint8*)&words[ ptr->pos ], ptr->len );
arr++; ptr++;
}
- if ( val != toastedval )
- pfree(val);
len = uniqueint( GETARR(res), val->size );
if ( len != val->size ) {
len = CALCGTSIZE( ARRKEY, len );
res = (GISTTYPE*)repalloc( (void*)res, len );
res->len = len;
- }
+ }
+ if ( val != toastedval )
+ pfree(val);
+
+ /* make signature, if array is too long */
+ if ( res->len > TOAST_INDEX_TARGET ) {
+ GISTTYPE *ressign;
+
+ len = CALCGTSIZE( SIGNKEY, 0 );
+ ressign = (GISTTYPE*)palloc( len );
+ ressign->len = len;
+ ressign->flag = SIGNKEY;
+ makesign( GETSIGN(ressign), res );
+ pfree(res);
+ res = ressign;
+ }
retval = (GISTENTRY*)palloc(sizeof(GISTENTRY));
gistentryinit(*retval, PointerGetDatum(res),
PG_RETURN_POINTER( penalty );
}
-static void
-makesign( BITVECP sign, GISTTYPE *a) {
- int4 k,len = ARRNELEM( a );
- int4 *ptr = GETARR( a );
- MemSet( (void*)sign, 0, sizeof(BITVEC) );
- for(k=0;k
- HASH( sign, ptr[k] );
-}
-
typedef struct {
bool allistrue;
BITVEC sign;
right = v->spl_right;
v->spl_nright = 0;
+ if ( seed_1 == 0 || seed_2 == 0 ) {
+ seed_1 = 1;
+ seed_2 = 2;
+ }
+
/* form initial .. */
if ( cache[seed_1].allistrue ) {
datum_l = (GISTTYPE*)palloc( CALCGTSIZE( SIGNKEY|ALLISTRUE, 0 ) );
and ( tq.typname='query_txt' or tq.typname='mquery_txt' );
INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
- SELECT opcl.oid, 1, false, c.opoid
+ SELECT opcl.oid, 1, true, c.opoid
FROM pg_opclass opcl, txtidx_ops_tmp c
WHERE
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
and c.oprname = '@@';
INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
- SELECT opcl.oid, 2, false, c.opoid
+ SELECT opcl.oid, 2, true, c.opoid
FROM pg_opclass opcl, txtidx_ops_tmp c
WHERE
opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')