18#define LTREE_LABEL_MAX_CHARS 1000
39#define LEVEL_HDRSIZE (offsetof(ltree_level,name))
40#define LEVEL_NEXT(x) ( (ltree_level*)( ((char*)(x)) + MAXALIGN(((ltree_level*)(x))->len + LEVEL_HDRSIZE) ) )
50#define LTREE_HDRSIZE MAXALIGN( offsetof(ltree, data) )
51#define LTREE_FIRST(x) ( (ltree_level*)( ((char*)(x))+LTREE_HDRSIZE ) )
52#define LTREE_MAX_LEVELS PG_UINT16_MAX
71#define LVAR_HDRSIZE MAXALIGN(offsetof(lquery_variant, name))
72#define LVAR_NEXT(x) ( (lquery_variant*)( ((char*)(x)) + MAXALIGN(((lquery_variant*)(x))->len) + LVAR_HDRSIZE ) )
74#define LVAR_ANYEND 0x01
75#define LVAR_INCASE 0x02
76#define LVAR_SUBLEXEME 0x04
99#define LQL_HDRSIZE MAXALIGN( offsetof(lquery_level,variants) )
100#define LQL_NEXT(x) ( (lquery_level*)( ((char*)(x)) + MAXALIGN(((lquery_level*)(x))->totallen) ) )
101#define LQL_FIRST(x) ( (lquery_variant*)( ((char*)(x))+LQL_HDRSIZE ) )
104#define LQL_COUNT 0x20
107#define FLG_CANLOOKSIGN(x) ( ( (x) & ( LQL_NOT | LVAR_ANYEND | LVAR_SUBLEXEME ) ) == 0 )
109#define FLG_CANLOOKSIGN(x) ( ( (x) & ( LQL_NOT | LVAR_ANYEND | LVAR_SUBLEXEME | LVAR_INCASE ) ) == 0 )
111#define LQL_CANLOOKSIGN(x) FLG_CANLOOKSIGN( ((lquery_level*)(x))->flag )
123#define LQUERY_HDRSIZE MAXALIGN( offsetof(lquery, data) )
124#define LQUERY_FIRST(x) ( (lquery_level*)( ((char*)(x))+LQUERY_HDRSIZE ) )
125#define LQUERY_MAX_LEVELS PG_UINT16_MAX
127#define LQUERY_HASNOT 0x01
130#define ISLABEL(x) ( t_isalnum(x) || t_iseq(x, '_') || t_iseq(x, '-') )
162#define HDRSIZEQT MAXALIGN(VARHDRSZ + sizeof(int32))
163#define COMPUTESIZE(size,lenofoperand) ( HDRSIZEQT + (size) * sizeof(ITEM) + (lenofoperand) )
164#define LTXTQUERY_TOO_BIG(size,lenofoperand) \
165 ((size) > (MaxAllocSize - HDRSIZEQT - (lenofoperand)) / sizeof(ITEM))
166#define GETQUERY(x) (ITEM*)( (char*)(x)+HDRSIZEQT )
167#define GETOPERAND(x) ( (char*)GETQUERY(x) + ((ltxtquery*)x)->size * sizeof(ITEM) )
169#define ISOPERATOR(x) ( (x)=='!' || (x)=='&' || (x)=='|' || (x)=='(' || (x)==')' )
208 bool calcnot,
bool (*chkcond) (
void *checkval,
ITEM *
val));
219#define DatumGetLtreeP(X) ((ltree *) PG_DETOAST_DATUM(X))
220#define DatumGetLtreePCopy(X) ((ltree *) PG_DETOAST_DATUM_COPY(X))
221#define PG_GETARG_LTREE_P(n) DatumGetLtreeP(PG_GETARG_DATUM(n))
222#define PG_GETARG_LTREE_P_COPY(n) DatumGetLtreePCopy(PG_GETARG_DATUM(n))
224#define DatumGetLqueryP(X) ((lquery *) PG_DETOAST_DATUM(X))
225#define DatumGetLqueryPCopy(X) ((lquery *) PG_DETOAST_DATUM_COPY(X))
226#define PG_GETARG_LQUERY_P(n) DatumGetLqueryP(PG_GETARG_DATUM(n))
227#define PG_GETARG_LQUERY_P_COPY(n) DatumGetLqueryPCopy(PG_GETARG_DATUM(n))
229#define DatumGetLtxtqueryP(X) ((ltxtquery *) PG_DETOAST_DATUM(X))
230#define DatumGetLtxtqueryPCopy(X) ((ltxtquery *) PG_DETOAST_DATUM_COPY(X))
231#define PG_GETARG_LTXTQUERY_P(n) DatumGetLtxtqueryP(PG_GETARG_DATUM(n))
232#define PG_GETARG_LTXTQUERY_P_COPY(n) DatumGetLtxtqueryPCopy(PG_GETARG_DATUM(n))
237#define SIGLENBIT(siglen) ((siglen) * BITBYTE)
238#define LTREE_SIGLEN_DEFAULT (2 * sizeof(int32))
239#define LTREE_SIGLEN_MAX GISTMaxIndexKeySize
240#define LTREE_GET_SIGLEN() (PG_HAS_OPCLASS_OPTIONS() ? \
241 ((LtreeGistOptions *) PG_GET_OPCLASS_OPTIONS())->siglen : \
242 LTREE_SIGLEN_DEFAULT)
246#define LOOPBYTE(siglen) \
247 for(i = 0; i < (siglen); i++)
249#define GETBYTE(x,i) ( *( (BITVECP)(x) + (int)( (i) / BITBYTE ) ) )
250#define GETBITBYTE(x,i) ( ((unsigned char)(x)) >> i & 0x01 )
251#define CLRBIT(x,i) GETBYTE(x,i) &= ~( 0x01 << ( (i) % BITBYTE ) )
252#define SETBIT(x,i) GETBYTE(x,i) |= ( 0x01 << ( (i) % BITBYTE ) )
253#define GETBIT(x,i) ( (GETBYTE(x,i) >> ( (i) % BITBYTE )) & 0x01 )
255#define HASHVAL(val, siglen) (((unsigned int)(val)) % SIGLENBIT(siglen))
256#define HASH(sign, val, siglen) SETBIT((sign), HASHVAL(val, siglen))
276#define LTG_ONENODE 0x01
277#define LTG_ALLTRUE 0x02
278#define LTG_NORIGHT 0x04
280#define LTG_HDRSIZE MAXALIGN(VARHDRSZ + sizeof(uint32))
281#define LTG_SIGN(x) ( (BITVECP)( ((char*)(x))+LTG_HDRSIZE ) )
282#define LTG_NODE(x) ( (ltree*)( ((char*)(x))+LTG_HDRSIZE ) )
283#define LTG_ISONENODE(x) ( ((ltree_gist*)(x))->flag & LTG_ONENODE )
284#define LTG_ISALLTRUE(x) ( ((ltree_gist*)(x))->flag & LTG_ALLTRUE )
285#define LTG_ISNORIGHT(x) ( ((ltree_gist*)(x))->flag & LTG_NORIGHT )
286#define LTG_LNODE(x, siglen) ( (ltree*)( ( ((char*)(x))+LTG_HDRSIZE ) + ( LTG_ISALLTRUE(x) ? 0 : (siglen) ) ) )
287#define LTG_RENODE(x, siglen) ( (ltree*)( ((char*)LTG_LNODE(x, siglen)) + VARSIZE(LTG_LNODE(x, siglen))) )
288#define LTG_RNODE(x, siglen) ( LTG_ISNORIGHT(x) ? LTG_LNODE(x, siglen) : LTG_RENODE(x, siglen) )
290#define LTG_GETLNODE(x, siglen) ( LTG_ISONENODE(x) ? LTG_NODE(x) : LTG_LNODE(x, siglen) )
291#define LTG_GETRNODE(x, siglen) ( LTG_ISONENODE(x) ? LTG_NODE(x) : LTG_RNODE(x, siglen) )
298#define LTREE_ASIGLEN_DEFAULT (7 * sizeof(int32))
299#define LTREE_ASIGLEN_MAX GISTMaxIndexKeySize
300#define LTREE_GET_ASIGLEN() (PG_HAS_OPCLASS_OPTIONS() ? \
301 ((LtreeGistOptions *) PG_GET_OPCLASS_OPTIONS())->siglen : \
302 LTREE_ASIGLEN_DEFAULT)
303#define ASIGLENBIT(siglen) ((siglen) * BITBYTE)
305#define ALOOPBYTE(siglen) \
306 for (i = 0; i < (siglen); i++)
308#define AHASHVAL(val, siglen) (((unsigned int)(val)) % ASIGLENBIT(siglen))
309#define AHASH(sign, val, siglen) SETBIT((sign), AHASHVAL(val, siglen))
#define FLEXIBLE_ARRAY_MEMBER
bool inner_isparent(const ltree *c, const ltree *p)
bool compare_subnode(ltree_level *t, char *qn, int len, ltree_prefix_eq_func prefix_eq, bool anyend)
PGDLLEXPORT Datum ltree_addtext(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum ltree_addltree(PG_FUNCTION_ARGS)
bool ltree_prefix_eq(const char *a, size_t a_sz, const char *b, size_t b_sz)
PGDLLEXPORT Datum ltxtq_exec(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum ltxtq_rexec(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum ltq_rregex(PG_FUNCTION_ARGS)
ltree * lca_inner(ltree **a, int len)
int ltree_compare(const ltree *a, const ltree *b)
bool ltree_prefix_eq_ci(const char *a, size_t a_sz, const char *b, size_t b_sz)
PGDLLEXPORT Datum _ltq_rregex(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum _ltree_isparent(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum lt_q_rregex(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum ltree_risparent(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum ltree_isparent(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum ltq_regex(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum ltree_textadd(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum _ltree_risparent(PG_FUNCTION_ARGS)
bool(* ltree_prefix_eq_func)(const char *, size_t, const char *, size_t)
PGDLLEXPORT Datum lt_q_regex(PG_FUNCTION_ARGS)
bool ltree_execute(ITEM *curitem, void *checkval, bool calcnot, bool(*chkcond)(void *checkval, ITEM *val))
PGDLLEXPORT Datum _lt_q_regex(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum _ltq_regex(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum _ltxtq_exec(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum _ltxtq_rexec(PG_FUNCTION_ARGS)
PGDLLEXPORT Datum _lt_q_rregex(PG_FUNCTION_ARGS)
ltree_gist * ltree_gist_alloc(bool isalltrue, BITVECP sign, int siglen, ltree *left, ltree *right)
PGDLLEXPORT Datum ltree_in(PG_FUNCTION_ARGS)