|
|
|
@ -7,7 +7,7 @@ |
|
|
|
* |
|
|
|
* |
|
|
|
* |
|
|
|
* |
|
|
|
* IDENTIFICATION |
|
|
|
* IDENTIFICATION |
|
|
|
* $PostgreSQL: pgsql/src/backend/utils/adt/tsgistidx.c,v 1.4 2007/09/11 08:46:29 teodor Exp $ |
|
|
|
* $PostgreSQL: pgsql/src/backend/utils/adt/tsgistidx.c,v 1.5 2007/11/16 00:13:02 momjian Exp $ |
|
|
|
* |
|
|
|
* |
|
|
|
*------------------------------------------------------------------------- |
|
|
|
*------------------------------------------------------------------------- |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@ -30,10 +30,8 @@ |
|
|
|
typedef char BITVEC[SIGLEN]; |
|
|
|
typedef char BITVEC[SIGLEN]; |
|
|
|
typedef char *BITVECP; |
|
|
|
typedef char *BITVECP; |
|
|
|
|
|
|
|
|
|
|
|
#define LOOPBYTE(a) \ |
|
|
|
#define LOOPBYTE \ |
|
|
|
for(i=0;i<SIGLEN;i++) {\
|
|
|
|
for(i=0;i<SIGLEN;i++) |
|
|
|
a;\
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define GETBYTE(x,i) ( *( (BITVECP)(x) + (int)( (i) / BITS_PER_BYTE ) ) ) |
|
|
|
#define GETBYTE(x,i) ( *( (BITVECP)(x) + (int)( (i) / BITS_PER_BYTE ) ) ) |
|
|
|
#define GETBITBYTE(x,i) ( ((char)(x)) >> (i) & 0x01 ) |
|
|
|
#define GETBITBYTE(x,i) ( ((char)(x)) >> (i) & 0x01 ) |
|
|
|
@ -252,10 +250,11 @@ gtsvector_compress(PG_FUNCTION_ARGS) |
|
|
|
SignTSVector *res; |
|
|
|
SignTSVector *res; |
|
|
|
BITVECP sign = GETSIGN(DatumGetPointer(entry->key)); |
|
|
|
BITVECP sign = GETSIGN(DatumGetPointer(entry->key)); |
|
|
|
|
|
|
|
|
|
|
|
LOOPBYTE( |
|
|
|
LOOPBYTE |
|
|
|
if ((sign[i] & 0xff) != 0xff) |
|
|
|
{ |
|
|
|
|
|
|
|
if ((sign[i] & 0xff) != 0xff) |
|
|
|
PG_RETURN_POINTER(retval); |
|
|
|
PG_RETURN_POINTER(retval); |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0); |
|
|
|
len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0); |
|
|
|
res = (SignTSVector *) palloc(len); |
|
|
|
res = (SignTSVector *) palloc(len); |
|
|
|
@ -376,9 +375,8 @@ unionkey(BITVECP sbase, SignTSVector * add) |
|
|
|
if (ISALLTRUE(add)) |
|
|
|
if (ISALLTRUE(add)) |
|
|
|
return 1; |
|
|
|
return 1; |
|
|
|
|
|
|
|
|
|
|
|
LOOPBYTE( |
|
|
|
LOOPBYTE |
|
|
|
sbase[i] |= sadd[i]; |
|
|
|
sbase[i] |= sadd[i]; |
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
@ -446,13 +444,14 @@ gtsvector_same(PG_FUNCTION_ARGS) |
|
|
|
sb = GETSIGN(b); |
|
|
|
sb = GETSIGN(b); |
|
|
|
|
|
|
|
|
|
|
|
*result = true; |
|
|
|
*result = true; |
|
|
|
LOOPBYTE( |
|
|
|
LOOPBYTE |
|
|
|
if (sa[i] != sb[i]) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (sa[i] != sb[i]) |
|
|
|
*result = false; |
|
|
|
{ |
|
|
|
break; |
|
|
|
*result = false; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
@ -487,9 +486,8 @@ sizebitvec(BITVECP sign) |
|
|
|
int4 size = 0, |
|
|
|
int4 size = 0, |
|
|
|
i; |
|
|
|
i; |
|
|
|
|
|
|
|
|
|
|
|
LOOPBYTE( |
|
|
|
LOOPBYTE |
|
|
|
size += number_of_ones[(unsigned char) sign[i]]; |
|
|
|
size += number_of_ones[(unsigned char) sign[i]]; |
|
|
|
); |
|
|
|
|
|
|
|
return size; |
|
|
|
return size; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -500,10 +498,11 @@ hemdistsign(BITVECP a, BITVECP b) |
|
|
|
diff, |
|
|
|
diff, |
|
|
|
dist = 0; |
|
|
|
dist = 0; |
|
|
|
|
|
|
|
|
|
|
|
LOOPBYTE( |
|
|
|
LOOPBYTE |
|
|
|
diff = (unsigned char) (a[i] ^ b[i]); |
|
|
|
{ |
|
|
|
dist += number_of_ones[diff]; |
|
|
|
diff = (unsigned char) (a[i] ^ b[i]); |
|
|
|
); |
|
|
|
dist += number_of_ones[diff]; |
|
|
|
|
|
|
|
} |
|
|
|
return dist; |
|
|
|
return dist; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -760,9 +759,8 @@ gtsvector_picksplit(PG_FUNCTION_ARGS) |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
ptr = cache[j].sign; |
|
|
|
ptr = cache[j].sign; |
|
|
|
LOOPBYTE( |
|
|
|
LOOPBYTE |
|
|
|
union_l[i] |= ptr[i]; |
|
|
|
union_l[i] |= ptr[i]; |
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
*left++ = j; |
|
|
|
*left++ = j; |
|
|
|
v->spl_nleft++; |
|
|
|
v->spl_nleft++; |
|
|
|
@ -777,9 +775,8 @@ gtsvector_picksplit(PG_FUNCTION_ARGS) |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
ptr = cache[j].sign; |
|
|
|
ptr = cache[j].sign; |
|
|
|
LOOPBYTE( |
|
|
|
LOOPBYTE |
|
|
|
union_r[i] |= ptr[i]; |
|
|
|
union_r[i] |= ptr[i]; |
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
*right++ = j; |
|
|
|
*right++ = j; |
|
|
|
v->spl_nright++; |
|
|
|
v->spl_nright++; |
|
|
|
|