34 #define SIGLEN_DEFAULT (31 * 4)
35 #define SIGLEN_MAX GISTMaxIndexKeySize
36 #define GET_SIGLEN() (PG_HAS_OPCLASS_OPTIONS() ? \
37 ((GistTsVectorOptions *) PG_GET_OPCLASS_OPTIONS())->siglen : \
40 #define SIGLENBIT(siglen) ((siglen) * BITS_PER_BYTE)
44 #define LOOPBYTE(siglen) \
45 for (i = 0; i < siglen; i++)
47 #define GETBYTE(x,i) ( *( (BITVECP)(x) + (int)( (i) / BITS_PER_BYTE ) ) )
48 #define GETBITBYTE(x,i) ( ((char)(x)) >> (i) & 0x01 )
49 #define CLRBIT(x,i) GETBYTE(x,i) &= ~( 0x01 << ( (i) % BITS_PER_BYTE ) )
50 #define SETBIT(x,i) GETBYTE(x,i) |= ( 0x01 << ( (i) % BITS_PER_BYTE ) )
51 #define GETBIT(x,i) ( (GETBYTE(x,i) >> ( (i) % BITS_PER_BYTE )) & 0x01 )
53 #define HASHVAL(val, siglen) (((unsigned int)(val)) % SIGLENBIT(siglen))
54 #define HASH(sign, val, siglen) SETBIT((sign), HASHVAL(val, siglen))
56 #define GETENTRY(vec,pos) ((SignTSVector *) DatumGetPointer((vec)->vector[(pos)].key))
71 #define ALLISTRUE 0x04
73 #define ISARRKEY(x) ( ((SignTSVector*)(x))->flag & ARRKEY )
74 #define ISSIGNKEY(x) ( ((SignTSVector*)(x))->flag & SIGNKEY )
75 #define ISALLTRUE(x) ( ((SignTSVector*)(x))->flag & ALLISTRUE )
77 #define GTHDRSIZE ( VARHDRSZ + sizeof(int32) )
78 #define CALCGTSIZE(flag, len) ( GTHDRSIZE + ( ( (flag) & ARRKEY ) ? ((len)*sizeof(int32)) : (((flag) & ALLISTRUE) ? 0 : (len)) ) )
80 #define GETSIGN(x) ( (BITVECP)( (char*)(x)+GTHDRSIZE ) )
81 #define GETSIGLEN(x)( VARSIZE(x) - GTHDRSIZE )
82 #define GETARR(x) ( (int32*)( (char*)(x)+GTHDRSIZE ) )
83 #define ARRNELEM(x) ( ( VARSIZE(x) - GTHDRSIZE )/sizeof(int32) )
91 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
92 errmsg(
"gtsvector_in not implemented")));
96 #define SINGOUTSTR "%d true bits, %d false bits"
97 #define ARROUTSTR "%d unique words"
98 #define EXTRALEN ( 2*13 )
134 return (
a >
b) ? 1 : -1;
145 for (k = 0; k <
len; k++)
232 if ((
sign[
i] & 0xff) != 0xff)
293 while (StopLow < StopHigh)
295 StopMiddle = StopLow + (StopHigh - StopLow) / 2;
296 if (*StopMiddle ==
val->valcrc)
298 else if (*StopMiddle < val->valcrc)
299 StopLow = StopMiddle + 1;
301 StopHigh = StopMiddle;
389 HASH(sbase, ptr[
i], siglen);
405 memset(base, 0, siglen);
407 for (
i = 0;
i < entryvec->
n;
i++)
471 for (
i = 0;
i < lena;
i++)
472 if (ptra[
i] != ptrb[
i])
498 diff = (
unsigned char) (
a[
i] ^
b[
i]);
521 Assert(siglena == siglenb);
551 (
float) (siglenbit + 1);
581 #define WISH_F(a,b,c) (double)( -(double)(((a)-(b))*((a)-(b))*((a)-(b)))*(c) )
594 if (
a->cost ==
b->cost)
597 return (
a->cost >
b->cost) ? 1 : -1;
611 else if (
b->allistrue)
645 maxoff = entryvec->
n - 2;
651 cache_sign =
palloc(siglen * (maxoff + 2));
653 for (
j = 0;
j < maxoff + 2;
j++)
654 cache[
j].
sign = &cache_sign[siglen *
j];
667 if (size_waste > waste)
681 if (seed_1 == 0 || seed_2 == 0)
689 siglen, cache[seed_1].
sign);
691 siglen, cache[seed_2].
sign);
700 costvector[
j - 1].
pos =
j;
701 size_alpha =
hemdistcache(&(cache[seed_1]), &(cache[
j]), siglen);
702 size_beta =
hemdistcache(&(cache[seed_2]), &(cache[
j]), siglen);
703 costvector[
j - 1].
cost =
Abs(size_alpha - size_beta);
707 for (k = 0; k < maxoff; k++)
709 j = costvector[k].
pos;
716 else if (
j == seed_2)
762 union_l[
i] |= ptr[
i];
778 union_r[
i] |= ptr[
i];
#define offsetof(type, field)
#define FLEXIBLE_ARRAY_MEMBER
#define MemSet(start, val, len)
static void PGresult * res
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define PG_FREE_IF_COPY(ptr, n)
#define PG_GETARG_POINTER(n)
#define PG_DETOAST_DATUM(datum)
#define PG_RETURN_DATUM(x)
#define PG_RETURN_POINTER(x)
#define PG_RETURN_BOOL(x)
#define gistentryinit(e, k, r, pg, o, l)
#define TOAST_INDEX_TARGET
Assert(fmt[strlen(fmt) - 1] !='\n')
void pfree(void *pointer)
void * repalloc(void *pointer, Size size)
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
PGDLLIMPORT const uint8 pg_number_of_ones[256]
uint64 pg_popcount(const char *buf, int bytes)
#define INIT_LEGACY_CRC32(crc)
#define COMP_LEGACY_CRC32(crc, data, len)
#define FIN_LEGACY_CRC32(crc)
#define qsort(a, b, c, d)
#define DatumGetPointer(X)
#define SET_VARSIZE(PTR, len)
#define PointerGetDatum(X)
static size_t qunique(void *array, size_t elements, size_t width, int(*compare)(const void *, const void *))
void init_local_reloptions(local_relopts *opts, Size relopt_struct_size)
void add_local_int_reloption(local_relopts *relopts, const char *name, const char *desc, int default_val, int min_val, int max_val, int offset)
#define PG_GETARG_TSQUERY(n)
#define DatumGetTSVector(X)
#define TS_EXEC_PHRASE_NO_POS
static int32 unionkey(BITVECP sbase, SignTSVector *add, int siglen)
#define HASHVAL(val, siglen)
static int hemdistcache(CACHESIGN *a, CACHESIGN *b, int siglen)
Datum gtsvector_penalty(PG_FUNCTION_ARGS)
static int hemdist(SignTSVector *a, SignTSVector *b)
static TSTernaryValue checkcondition_arr(void *checkval, QueryOperand *val, ExecPhraseData *data)
static int32 sizebitvec(BITVECP sign, int siglen)
static int hemdistsign(BITVECP a, BITVECP b, int siglen)
Datum gtsvector_same(PG_FUNCTION_ARGS)
static SignTSVector * gtsvector_alloc(int flag, int len, BITVECP sign)
#define GETENTRY(vec, pos)
Datum gtsvector_picksplit(PG_FUNCTION_ARGS)
static void fillcache(CACHESIGN *item, SignTSVector *key, int siglen)
static int comparecost(const void *va, const void *vb)
Datum gtsvectorin(PG_FUNCTION_ARGS)
Datum gtsvector_compress(PG_FUNCTION_ARGS)
#define CALCGTSIZE(flag, len)
Datum gtsvector_decompress(PG_FUNCTION_ARGS)
Datum gtsvector_consistent(PG_FUNCTION_ARGS)
static void makesign(BITVECP sign, SignTSVector *a, int siglen)
Datum gtsvector_options(PG_FUNCTION_ARGS)
Datum gtsvector_union(PG_FUNCTION_ARGS)
Datum gtsvectorout(PG_FUNCTION_ARGS)
#define SIGLENBIT(siglen)
static int compareint(const void *va, const void *vb)
static TSTernaryValue checkcondition_bit(void *checkval, QueryOperand *val, ExecPhraseData *data)
#define HASH(sign, val, siglen)
Datum gtsvector_consistent_oldsig(PG_FUNCTION_ARGS)
bool TS_execute(QueryItem *curitem, void *arg, uint32 flags, TSExecuteCallback chkcond)