mirror of
https://github.com/postgres/postgres.git
synced 2025-06-10 09:21:54 +03:00
Fix up several contrib modules that were using varlena datatypes in not-so-obvious
ways. I'm not totally sure that I caught everything, but at least now they pass their regression tests with VARSIZE/SET_VARSIZE defined to reverse byte order.
This commit is contained in:
parent
d1ce4f7396
commit
9f652d430f
@ -2,6 +2,7 @@
|
|||||||
#define __HSTORE_H__
|
#define __HSTORE_H__
|
||||||
|
|
||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
|
|
||||||
#include "funcapi.h"
|
#include "funcapi.h"
|
||||||
#include "access/gist.h"
|
#include "access/gist.h"
|
||||||
#include "access/itup.h"
|
#include "access/itup.h"
|
||||||
@ -23,12 +24,12 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int4 len;
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
int4 size;
|
int4 size;
|
||||||
char data[1];
|
char data[1];
|
||||||
} HStore;
|
} HStore;
|
||||||
|
|
||||||
#define HSHRDSIZE (2*sizeof(int4))
|
#define HSHRDSIZE (VARHDRSZ + sizeof(int4))
|
||||||
#define CALCDATASIZE(x, lenstr) ( (x) * sizeof(HEntry) + HSHRDSIZE + (lenstr) )
|
#define CALCDATASIZE(x, lenstr) ( (x) * sizeof(HEntry) + HSHRDSIZE + (lenstr) )
|
||||||
#define ARRPTR(x) ( (HEntry*) ( (char*)(x) + HSHRDSIZE ) )
|
#define ARRPTR(x) ( (HEntry*) ( (char*)(x) + HSHRDSIZE ) )
|
||||||
#define STRPTR(x) ( (char*)(x) + HSHRDSIZE + ( sizeof(HEntry) * ((HStore*)x)->size ) )
|
#define STRPTR(x) ( (char*)(x) + HSHRDSIZE + ( sizeof(HEntry) * ((HStore*)x)->size ) )
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
#include "access/gist.h"
|
#include "access/gist.h"
|
||||||
#include "access/itup.h"
|
#include "access/itup.h"
|
||||||
/*#include "access/rtree.h"*/
|
|
||||||
#include "crc32.h"
|
#include "crc32.h"
|
||||||
|
|
||||||
/* bigint defines */
|
/* bigint defines */
|
||||||
@ -38,7 +37,7 @@ typedef char *BITVECP;
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int4 len;
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
int4 flag;
|
int4 flag;
|
||||||
char data[1];
|
char data[1];
|
||||||
} GISTTYPE;
|
} GISTTYPE;
|
||||||
@ -47,7 +46,7 @@ typedef struct
|
|||||||
|
|
||||||
#define ISALLTRUE(x) ( ((GISTTYPE*)x)->flag & ALLISTRUE )
|
#define ISALLTRUE(x) ( ((GISTTYPE*)x)->flag & ALLISTRUE )
|
||||||
|
|
||||||
#define GTHDRSIZE ( sizeof(int4)*2 )
|
#define GTHDRSIZE (VARHDRSZ + sizeof(int4))
|
||||||
#define CALCGTSIZE(flag) ( GTHDRSIZE+(((flag) & ALLISTRUE) ? 0 : SIGLEN) )
|
#define CALCGTSIZE(flag) ( GTHDRSIZE+(((flag) & ALLISTRUE) ? 0 : SIGLEN) )
|
||||||
|
|
||||||
#define GETSIGN(x) ( (BITVECP)( (char*)x+GTHDRSIZE ) )
|
#define GETSIGN(x) ( (BITVECP)( (char*)x+GTHDRSIZE ) )
|
||||||
@ -112,14 +111,13 @@ ghstore_compress(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
if (entry->leafkey)
|
if (entry->leafkey)
|
||||||
{
|
{
|
||||||
GISTTYPE *res = (GISTTYPE *) palloc(CALCGTSIZE(0));
|
GISTTYPE *res = (GISTTYPE *) palloc0(CALCGTSIZE(0));
|
||||||
HStore *toastedval = (HStore *) DatumGetPointer(entry->key);
|
HStore *toastedval = (HStore *) DatumGetPointer(entry->key);
|
||||||
HStore *val = (HStore *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
|
HStore *val = (HStore *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
|
||||||
HEntry *ptr = ARRPTR(val);
|
HEntry *ptr = ARRPTR(val);
|
||||||
char *words = STRPTR(val);
|
char *words = STRPTR(val);
|
||||||
|
|
||||||
memset(res, 0, CALCGTSIZE(0));
|
SET_VARSIZE(res, CALCGTSIZE(0));
|
||||||
res->len = CALCGTSIZE(0);
|
|
||||||
|
|
||||||
while (ptr - ARRPTR(val) < val->size)
|
while (ptr - ARRPTR(val) < val->size)
|
||||||
{
|
{
|
||||||
@ -156,7 +154,7 @@ ghstore_compress(PG_FUNCTION_ARGS)
|
|||||||
);
|
);
|
||||||
|
|
||||||
res = (GISTTYPE *) palloc(CALCGTSIZE(ALLISTRUE));
|
res = (GISTTYPE *) palloc(CALCGTSIZE(ALLISTRUE));
|
||||||
res->len = CALCGTSIZE(ALLISTRUE);
|
SET_VARSIZE(res, CALCGTSIZE(ALLISTRUE));
|
||||||
res->flag = ALLISTRUE;
|
res->flag = ALLISTRUE;
|
||||||
|
|
||||||
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
||||||
@ -286,10 +284,11 @@ ghstore_union(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
len = CALCGTSIZE(flag);
|
len = CALCGTSIZE(flag);
|
||||||
result = (GISTTYPE *) palloc(len);
|
result = (GISTTYPE *) palloc(len);
|
||||||
*size = result->len = len;
|
SET_VARSIZE(result, len);
|
||||||
result->flag = flag;
|
result->flag = flag;
|
||||||
if (!ISALLTRUE(result))
|
if (!ISALLTRUE(result))
|
||||||
memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
|
memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
|
||||||
|
*size = len;
|
||||||
|
|
||||||
PG_RETURN_POINTER(result);
|
PG_RETURN_POINTER(result);
|
||||||
}
|
}
|
||||||
@ -383,13 +382,13 @@ ghstore_picksplit(PG_FUNCTION_ARGS)
|
|||||||
if (ISALLTRUE(GETENTRY(entryvec, seed_1)))
|
if (ISALLTRUE(GETENTRY(entryvec, seed_1)))
|
||||||
{
|
{
|
||||||
datum_l = (GISTTYPE *) palloc(GTHDRSIZE);
|
datum_l = (GISTTYPE *) palloc(GTHDRSIZE);
|
||||||
datum_l->len = GTHDRSIZE;
|
SET_VARSIZE(datum_l, GTHDRSIZE);
|
||||||
datum_l->flag = ALLISTRUE;
|
datum_l->flag = ALLISTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
datum_l = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
|
datum_l = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
|
||||||
datum_l->len = GTHDRSIZE + SIGLEN;
|
SET_VARSIZE(datum_l, GTHDRSIZE + SIGLEN);
|
||||||
datum_l->flag = 0;
|
datum_l->flag = 0;
|
||||||
memcpy((void *) GETSIGN(datum_l), (void *) GETSIGN(GETENTRY(entryvec, seed_1)), sizeof(BITVEC))
|
memcpy((void *) GETSIGN(datum_l), (void *) GETSIGN(GETENTRY(entryvec, seed_1)), sizeof(BITVEC))
|
||||||
;
|
;
|
||||||
@ -397,13 +396,13 @@ ghstore_picksplit(PG_FUNCTION_ARGS)
|
|||||||
if (ISALLTRUE(GETENTRY(entryvec, seed_2)))
|
if (ISALLTRUE(GETENTRY(entryvec, seed_2)))
|
||||||
{
|
{
|
||||||
datum_r = (GISTTYPE *) palloc(GTHDRSIZE);
|
datum_r = (GISTTYPE *) palloc(GTHDRSIZE);
|
||||||
datum_r->len = GTHDRSIZE;
|
SET_VARSIZE(datum_r, GTHDRSIZE);
|
||||||
datum_r->flag = ALLISTRUE;
|
datum_r->flag = ALLISTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
datum_r = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
|
datum_r = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
|
||||||
datum_r->len = GTHDRSIZE + SIGLEN;
|
SET_VARSIZE(datum_r, GTHDRSIZE + SIGLEN);
|
||||||
datum_r->flag = 0;
|
datum_r->flag = 0;
|
||||||
memcpy((void *) GETSIGN(datum_r), (void *) GETSIGN(GETENTRY(entryvec, seed_2)), sizeof(BITVEC));
|
memcpy((void *) GETSIGN(datum_r), (void *) GETSIGN(GETENTRY(entryvec, seed_2)), sizeof(BITVEC));
|
||||||
}
|
}
|
||||||
|
@ -363,7 +363,7 @@ hstore_in(PG_FUNCTION_ARGS)
|
|||||||
freeHSParse(&state);
|
freeHSParse(&state);
|
||||||
len = CALCDATASIZE(0, 0);
|
len = CALCDATASIZE(0, 0);
|
||||||
out = palloc(len);
|
out = palloc(len);
|
||||||
out->len = len;
|
SET_VARSIZE(out, len);
|
||||||
out->size = 0;
|
out->size = 0;
|
||||||
PG_RETURN_POINTER(out);
|
PG_RETURN_POINTER(out);
|
||||||
}
|
}
|
||||||
@ -372,7 +372,7 @@ hstore_in(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
len = CALCDATASIZE(state.pcur, buflen);
|
len = CALCDATASIZE(state.pcur, buflen);
|
||||||
out = palloc(len);
|
out = palloc(len);
|
||||||
out->len = len;
|
SET_VARSIZE(out, len);
|
||||||
out->size = state.pcur;
|
out->size = state.pcur;
|
||||||
|
|
||||||
entries = ARRPTR(out);
|
entries = ARRPTR(out);
|
||||||
@ -436,7 +436,7 @@ hstore_out(PG_FUNCTION_ARGS)
|
|||||||
}
|
}
|
||||||
|
|
||||||
buflen = (4 /* " */ + 2 /* => */ + 2 /* , */ ) * in->size +
|
buflen = (4 /* " */ + 2 /* => */ + 2 /* , */ ) * in->size +
|
||||||
2 /* esc */ * (in->len - CALCDATASIZE(in->size, 0));
|
2 /* esc */ * (VARSIZE(in) - CALCDATASIZE(in->size, 0));
|
||||||
|
|
||||||
out = ptr = palloc(buflen);
|
out = ptr = palloc(buflen);
|
||||||
for (i = 0; i < in->size; i++)
|
for (i = 0; i < in->size; i++)
|
||||||
|
@ -105,13 +105,13 @@ delete(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
HStore *hs = PG_GETARG_HS(0);
|
HStore *hs = PG_GETARG_HS(0);
|
||||||
text *key = PG_GETARG_TEXT_P(1);
|
text *key = PG_GETARG_TEXT_P(1);
|
||||||
HStore *out = palloc(hs->len);
|
HStore *out = palloc(VARSIZE(hs));
|
||||||
char *ptrs,
|
char *ptrs,
|
||||||
*ptrd;
|
*ptrd;
|
||||||
HEntry *es,
|
HEntry *es,
|
||||||
*ed;
|
*ed;
|
||||||
|
|
||||||
out->len = hs->len;
|
SET_VARSIZE(out, VARSIZE(hs));
|
||||||
out->size = hs->size; /* temporary! */
|
out->size = hs->size; /* temporary! */
|
||||||
|
|
||||||
ptrs = STRPTR(hs);
|
ptrs = STRPTR(hs);
|
||||||
@ -142,7 +142,7 @@ delete(PG_FUNCTION_ARGS)
|
|||||||
out->size = ed - ARRPTR(out);
|
out->size = ed - ARRPTR(out);
|
||||||
|
|
||||||
memmove(STRPTR(out), ptrd, buflen);
|
memmove(STRPTR(out), ptrd, buflen);
|
||||||
out->len = CALCDATASIZE(out->size, buflen);
|
SET_VARSIZE(out, CALCDATASIZE(out->size, buflen));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -159,7 +159,7 @@ hs_concat(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
HStore *s1 = PG_GETARG_HS(0);
|
HStore *s1 = PG_GETARG_HS(0);
|
||||||
HStore *s2 = PG_GETARG_HS(1);
|
HStore *s2 = PG_GETARG_HS(1);
|
||||||
HStore *out = palloc(s1->len + s2->len);
|
HStore *out = palloc(VARSIZE(s1) + VARSIZE(s2));
|
||||||
char *ps1,
|
char *ps1,
|
||||||
*ps2,
|
*ps2,
|
||||||
*pd;
|
*pd;
|
||||||
@ -167,7 +167,7 @@ hs_concat(PG_FUNCTION_ARGS)
|
|||||||
*es2,
|
*es2,
|
||||||
*ed;
|
*ed;
|
||||||
|
|
||||||
out->len = s1->len + s2->len;
|
SET_VARSIZE(out, VARSIZE(s1) + VARSIZE(s2));
|
||||||
out->size = s1->size + s2->size;
|
out->size = s1->size + s2->size;
|
||||||
|
|
||||||
ps1 = STRPTR(s1);
|
ps1 = STRPTR(s1);
|
||||||
@ -256,7 +256,7 @@ hs_concat(PG_FUNCTION_ARGS)
|
|||||||
out->size = ed - ARRPTR(out);
|
out->size = ed - ARRPTR(out);
|
||||||
|
|
||||||
memmove(STRPTR(out), pd, buflen);
|
memmove(STRPTR(out), pd, buflen);
|
||||||
out->len = CALCDATASIZE(out->size, buflen);
|
SET_VARSIZE(out, CALCDATASIZE(out->size, buflen));
|
||||||
}
|
}
|
||||||
|
|
||||||
PG_FREE_IF_COPY(s1, 0);
|
PG_FREE_IF_COPY(s1, 0);
|
||||||
@ -277,7 +277,7 @@ tconvert(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
len = CALCDATASIZE(1, VARSIZE(key) + VARSIZE(val) - 2 * VARHDRSZ);
|
len = CALCDATASIZE(1, VARSIZE(key) + VARSIZE(val) - 2 * VARHDRSZ);
|
||||||
out = palloc(len);
|
out = palloc(len);
|
||||||
out->len = len;
|
SET_VARSIZE(out, len);
|
||||||
out->size = 1;
|
out->size = 1;
|
||||||
|
|
||||||
ARRPTR(out)->keylen = VARSIZE(key) - VARHDRSZ;
|
ARRPTR(out)->keylen = VARSIZE(key) - VARHDRSZ;
|
||||||
@ -399,8 +399,8 @@ setup_firstcall(FuncCallContext *funcctx, HStore * hs)
|
|||||||
|
|
||||||
st = (AKStore *) palloc(sizeof(AKStore));
|
st = (AKStore *) palloc(sizeof(AKStore));
|
||||||
st->i = 0;
|
st->i = 0;
|
||||||
st->hs = (HStore *) palloc(hs->len);
|
st->hs = (HStore *) palloc(VARSIZE(hs));
|
||||||
memcpy(st->hs, hs, hs->len);
|
memcpy(st->hs, hs, VARSIZE(hs));
|
||||||
|
|
||||||
funcctx->user_fctx = (void *) st;
|
funcctx->user_fctx = (void *) st;
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
@ -568,8 +568,8 @@ each(PG_FUNCTION_ARGS)
|
|||||||
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
|
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
|
||||||
st = (AKStore *) palloc(sizeof(AKStore));
|
st = (AKStore *) palloc(sizeof(AKStore));
|
||||||
st->i = 0;
|
st->i = 0;
|
||||||
st->hs = (HStore *) palloc(hs->len);
|
st->hs = (HStore *) palloc(VARSIZE(hs));
|
||||||
memcpy(st->hs, hs, hs->len);
|
memcpy(st->hs, hs, VARSIZE(hs));
|
||||||
funcctx->user_fctx = (void *) st;
|
funcctx->user_fctx = (void *) st;
|
||||||
|
|
||||||
tupdesc = RelationNameGetTupleDesc("hs_each");
|
tupdesc = RelationNameGetTupleDesc("hs_each");
|
||||||
|
@ -85,7 +85,7 @@ typedef char *BITVECP;
|
|||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int4 len;
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
int4 flag;
|
int4 flag;
|
||||||
char data[1];
|
char data[1];
|
||||||
} GISTTYPE;
|
} GISTTYPE;
|
||||||
@ -94,7 +94,7 @@ typedef struct
|
|||||||
|
|
||||||
#define ISALLTRUE(x) ( ((GISTTYPE*)x)->flag & ALLISTRUE )
|
#define ISALLTRUE(x) ( ((GISTTYPE*)x)->flag & ALLISTRUE )
|
||||||
|
|
||||||
#define GTHDRSIZE ( sizeof(int4)*2 )
|
#define GTHDRSIZE (VARHDRSZ + sizeof(int4))
|
||||||
#define CALCGTSIZE(flag) ( GTHDRSIZE+(((flag) & ALLISTRUE) ? 0 : SIGLEN) )
|
#define CALCGTSIZE(flag) ( GTHDRSIZE+(((flag) & ALLISTRUE) ? 0 : SIGLEN) )
|
||||||
|
|
||||||
#define GETSIGN(x) ( (BITVECP)( (char*)x+GTHDRSIZE ) )
|
#define GETSIGN(x) ( (BITVECP)( (char*)x+GTHDRSIZE ) )
|
||||||
@ -145,12 +145,12 @@ typedef struct ITEM
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int4 len;
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
int4 size;
|
int4 size;
|
||||||
char data[1];
|
char data[1];
|
||||||
} QUERYTYPE;
|
} QUERYTYPE;
|
||||||
|
|
||||||
#define HDRSIZEQT ( 2*sizeof(int4) )
|
#define HDRSIZEQT (VARHDRSZ + sizeof(int4))
|
||||||
#define COMPUTESIZE(size) ( HDRSIZEQT + size * sizeof(ITEM) )
|
#define COMPUTESIZE(size) ( HDRSIZEQT + size * sizeof(ITEM) )
|
||||||
#define GETQUERY(x) (ITEM*)( (char*)(x)+HDRSIZEQT )
|
#define GETQUERY(x) (ITEM*)( (char*)(x)+HDRSIZEQT )
|
||||||
|
|
||||||
|
@ -465,7 +465,7 @@ bqarr_in(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
commonlen = COMPUTESIZE(state.num);
|
commonlen = COMPUTESIZE(state.num);
|
||||||
query = (QUERYTYPE *) palloc(commonlen);
|
query = (QUERYTYPE *) palloc(commonlen);
|
||||||
query->len = commonlen;
|
SET_VARSIZE(query, commonlen);
|
||||||
query->size = state.num;
|
query->size = state.num;
|
||||||
ptr = GETQUERY(query);
|
ptr = GETQUERY(query);
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ g_intbig_compress(PG_FUNCTION_ARGS)
|
|||||||
ArrayType *in = (ArrayType *) PG_DETOAST_DATUM(entry->key);
|
ArrayType *in = (ArrayType *) PG_DETOAST_DATUM(entry->key);
|
||||||
int4 *ptr;
|
int4 *ptr;
|
||||||
int num;
|
int num;
|
||||||
GISTTYPE *res = (GISTTYPE *) palloc(CALCGTSIZE(0));
|
GISTTYPE *res = (GISTTYPE *) palloc0(CALCGTSIZE(0));
|
||||||
|
|
||||||
CHECKARRVALID(in);
|
CHECKARRVALID(in);
|
||||||
if (ARRISVOID(in))
|
if (ARRISVOID(in))
|
||||||
@ -160,8 +160,7 @@ g_intbig_compress(PG_FUNCTION_ARGS)
|
|||||||
ptr = ARRPTR(in);
|
ptr = ARRPTR(in);
|
||||||
num = ARRNELEMS(in);
|
num = ARRNELEMS(in);
|
||||||
}
|
}
|
||||||
memset(res, 0, CALCGTSIZE(0));
|
SET_VARSIZE(res, CALCGTSIZE(0));
|
||||||
res->len = CALCGTSIZE(0);
|
|
||||||
|
|
||||||
while (num--)
|
while (num--)
|
||||||
{
|
{
|
||||||
@ -192,7 +191,7 @@ g_intbig_compress(PG_FUNCTION_ARGS)
|
|||||||
);
|
);
|
||||||
|
|
||||||
res = (GISTTYPE *) palloc(CALCGTSIZE(ALLISTRUE));
|
res = (GISTTYPE *) palloc(CALCGTSIZE(ALLISTRUE));
|
||||||
res->len = CALCGTSIZE(ALLISTRUE);
|
SET_VARSIZE(res, CALCGTSIZE(ALLISTRUE));
|
||||||
res->flag = ALLISTRUE;
|
res->flag = ALLISTRUE;
|
||||||
|
|
||||||
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
||||||
@ -292,10 +291,11 @@ g_intbig_union(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
len = CALCGTSIZE(flag);
|
len = CALCGTSIZE(flag);
|
||||||
result = (GISTTYPE *) palloc(len);
|
result = (GISTTYPE *) palloc(len);
|
||||||
*size = result->len = len;
|
SET_VARSIZE(result, len);
|
||||||
result->flag = flag;
|
result->flag = flag;
|
||||||
if (!ISALLTRUE(result))
|
if (!ISALLTRUE(result))
|
||||||
memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
|
memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
|
||||||
|
*size = len;
|
||||||
|
|
||||||
PG_RETURN_POINTER(result);
|
PG_RETURN_POINTER(result);
|
||||||
}
|
}
|
||||||
@ -389,26 +389,26 @@ g_intbig_picksplit(PG_FUNCTION_ARGS)
|
|||||||
if (ISALLTRUE(GETENTRY(entryvec, seed_1)))
|
if (ISALLTRUE(GETENTRY(entryvec, seed_1)))
|
||||||
{
|
{
|
||||||
datum_l = (GISTTYPE *) palloc(GTHDRSIZE);
|
datum_l = (GISTTYPE *) palloc(GTHDRSIZE);
|
||||||
datum_l->len = GTHDRSIZE;
|
SET_VARSIZE(datum_l, GTHDRSIZE);
|
||||||
datum_l->flag = ALLISTRUE;
|
datum_l->flag = ALLISTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
datum_l = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
|
datum_l = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
|
||||||
datum_l->len = GTHDRSIZE + SIGLEN;
|
SET_VARSIZE(datum_l, GTHDRSIZE + SIGLEN);
|
||||||
datum_l->flag = 0;
|
datum_l->flag = 0;
|
||||||
memcpy((void *) GETSIGN(datum_l), (void *) GETSIGN(GETENTRY(entryvec, seed_1)), sizeof(BITVEC));
|
memcpy((void *) GETSIGN(datum_l), (void *) GETSIGN(GETENTRY(entryvec, seed_1)), sizeof(BITVEC));
|
||||||
}
|
}
|
||||||
if (ISALLTRUE(GETENTRY(entryvec, seed_2)))
|
if (ISALLTRUE(GETENTRY(entryvec, seed_2)))
|
||||||
{
|
{
|
||||||
datum_r = (GISTTYPE *) palloc(GTHDRSIZE);
|
datum_r = (GISTTYPE *) palloc(GTHDRSIZE);
|
||||||
datum_r->len = GTHDRSIZE;
|
SET_VARSIZE(datum_r, GTHDRSIZE);
|
||||||
datum_r->flag = ALLISTRUE;
|
datum_r->flag = ALLISTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
datum_r = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
|
datum_r = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
|
||||||
datum_r->len = GTHDRSIZE + SIGLEN;
|
SET_VARSIZE(datum_r, GTHDRSIZE + SIGLEN);
|
||||||
datum_r->flag = 0;
|
datum_r->flag = 0;
|
||||||
memcpy((void *) GETSIGN(datum_r), (void *) GETSIGN(GETENTRY(entryvec, seed_2)), sizeof(BITVEC));
|
memcpy((void *) GETSIGN(datum_r), (void *) GETSIGN(GETENTRY(entryvec, seed_2)), sizeof(BITVEC));
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ _ltree_compress(PG_FUNCTION_ARGS)
|
|||||||
errmsg("array must not contain nulls")));
|
errmsg("array must not contain nulls")));
|
||||||
|
|
||||||
key = (ltree_gist *) palloc(len);
|
key = (ltree_gist *) palloc(len);
|
||||||
key->len = len;
|
SET_VARSIZE(key, len);
|
||||||
key->flag = 0;
|
key->flag = 0;
|
||||||
|
|
||||||
MemSet(LTG_SIGN(key), 0, ASIGLEN);
|
MemSet(LTG_SIGN(key), 0, ASIGLEN);
|
||||||
@ -124,7 +124,7 @@ _ltree_compress(PG_FUNCTION_ARGS)
|
|||||||
);
|
);
|
||||||
len = LTG_HDRSIZE;
|
len = LTG_HDRSIZE;
|
||||||
key = (ltree_gist *) palloc(len);
|
key = (ltree_gist *) palloc(len);
|
||||||
key->len = len;
|
SET_VARSIZE(key, len);
|
||||||
key->flag = LTG_ALLTRUE;
|
key->flag = LTG_ALLTRUE;
|
||||||
|
|
||||||
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
||||||
@ -204,10 +204,11 @@ _ltree_union(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
len = LTG_HDRSIZE + ((flag & LTG_ALLTRUE) ? 0 : ASIGLEN);
|
len = LTG_HDRSIZE + ((flag & LTG_ALLTRUE) ? 0 : ASIGLEN);
|
||||||
result = (ltree_gist *) palloc(len);
|
result = (ltree_gist *) palloc(len);
|
||||||
*size = result->len = len;
|
SET_VARSIZE(result, len);
|
||||||
result->flag = flag;
|
result->flag = flag;
|
||||||
if (!LTG_ISALLTRUE(result))
|
if (!LTG_ISALLTRUE(result))
|
||||||
memcpy((void *) LTG_SIGN(result), (void *) base, sizeof(ABITVEC));
|
memcpy((void *) LTG_SIGN(result), (void *) base, sizeof(ABITVEC));
|
||||||
|
*size = len;
|
||||||
|
|
||||||
PG_RETURN_POINTER(result);
|
PG_RETURN_POINTER(result);
|
||||||
}
|
}
|
||||||
@ -340,26 +341,26 @@ _ltree_picksplit(PG_FUNCTION_ARGS)
|
|||||||
if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_1)))
|
if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_1)))
|
||||||
{
|
{
|
||||||
datum_l = (ltree_gist *) palloc(LTG_HDRSIZE);
|
datum_l = (ltree_gist *) palloc(LTG_HDRSIZE);
|
||||||
datum_l->len = LTG_HDRSIZE;
|
SET_VARSIZE(datum_l, LTG_HDRSIZE);
|
||||||
datum_l->flag = LTG_ALLTRUE;
|
datum_l->flag = LTG_ALLTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
datum_l = (ltree_gist *) palloc(LTG_HDRSIZE + ASIGLEN);
|
datum_l = (ltree_gist *) palloc(LTG_HDRSIZE + ASIGLEN);
|
||||||
datum_l->len = LTG_HDRSIZE + ASIGLEN;
|
SET_VARSIZE(datum_l, LTG_HDRSIZE + ASIGLEN);
|
||||||
datum_l->flag = 0;
|
datum_l->flag = 0;
|
||||||
memcpy((void *) LTG_SIGN(datum_l), (void *) LTG_SIGN(GETENTRY(entryvec, seed_1)), sizeof(ABITVEC));
|
memcpy((void *) LTG_SIGN(datum_l), (void *) LTG_SIGN(GETENTRY(entryvec, seed_1)), sizeof(ABITVEC));
|
||||||
}
|
}
|
||||||
if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_2)))
|
if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_2)))
|
||||||
{
|
{
|
||||||
datum_r = (ltree_gist *) palloc(LTG_HDRSIZE);
|
datum_r = (ltree_gist *) palloc(LTG_HDRSIZE);
|
||||||
datum_r->len = LTG_HDRSIZE;
|
SET_VARSIZE(datum_r, LTG_HDRSIZE);
|
||||||
datum_r->flag = LTG_ALLTRUE;
|
datum_r->flag = LTG_ALLTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
datum_r = (ltree_gist *) palloc(LTG_HDRSIZE + ASIGLEN);
|
datum_r = (ltree_gist *) palloc(LTG_HDRSIZE + ASIGLEN);
|
||||||
datum_r->len = LTG_HDRSIZE + ASIGLEN;
|
SET_VARSIZE(datum_r, LTG_HDRSIZE + ASIGLEN);
|
||||||
datum_r->flag = 0;
|
datum_r->flag = 0;
|
||||||
memcpy((void *) LTG_SIGN(datum_r), (void *) LTG_SIGN(GETENTRY(entryvec, seed_2)), sizeof(ABITVEC));
|
memcpy((void *) LTG_SIGN(datum_r), (void *) LTG_SIGN(GETENTRY(entryvec, seed_2)), sizeof(ABITVEC));
|
||||||
}
|
}
|
||||||
|
@ -215,8 +215,8 @@ _ltree_extract_isparent(PG_FUNCTION_ARGS)
|
|||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
item = (ltree *) palloc(found->len);
|
item = (ltree *) palloc(VARSIZE(found));
|
||||||
memcpy(item, found, found->len);
|
memcpy(item, found, VARSIZE(found));
|
||||||
|
|
||||||
PG_FREE_IF_COPY(la, 0);
|
PG_FREE_IF_COPY(la, 0);
|
||||||
PG_FREE_IF_COPY(query, 1);
|
PG_FREE_IF_COPY(query, 1);
|
||||||
@ -238,8 +238,8 @@ _ltree_extract_risparent(PG_FUNCTION_ARGS)
|
|||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
item = (ltree *) palloc(found->len);
|
item = (ltree *) palloc(VARSIZE(found));
|
||||||
memcpy(item, found, found->len);
|
memcpy(item, found, VARSIZE(found));
|
||||||
|
|
||||||
PG_FREE_IF_COPY(la, 0);
|
PG_FREE_IF_COPY(la, 0);
|
||||||
PG_FREE_IF_COPY(query, 1);
|
PG_FREE_IF_COPY(query, 1);
|
||||||
@ -261,8 +261,8 @@ _ltq_extract_regex(PG_FUNCTION_ARGS)
|
|||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
item = (ltree *) palloc(found->len);
|
item = (ltree *) palloc(VARSIZE(found));
|
||||||
memcpy(item, found, found->len);
|
memcpy(item, found, VARSIZE(found));
|
||||||
|
|
||||||
PG_FREE_IF_COPY(la, 0);
|
PG_FREE_IF_COPY(la, 0);
|
||||||
PG_FREE_IF_COPY(query, 1);
|
PG_FREE_IF_COPY(query, 1);
|
||||||
@ -284,8 +284,8 @@ _ltxtq_extract_exec(PG_FUNCTION_ARGS)
|
|||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
item = (ltree *) palloc(found->len);
|
item = (ltree *) palloc(VARSIZE(found));
|
||||||
memcpy(item, found, found->len);
|
memcpy(item, found, VARSIZE(found));
|
||||||
|
|
||||||
PG_FREE_IF_COPY(la, 0);
|
PG_FREE_IF_COPY(la, 0);
|
||||||
PG_FREE_IF_COPY(query, 1);
|
PG_FREE_IF_COPY(query, 1);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $PostgreSQL: pgsql/contrib/ltree/ltree.h,v 1.17 2006/10/04 00:29:45 momjian Exp $ */
|
/* $PostgreSQL: pgsql/contrib/ltree/ltree.h,v 1.18 2007/02/28 22:44:38 tgl Exp $ */
|
||||||
|
|
||||||
#ifndef __LTREE_H__
|
#ifndef __LTREE_H__
|
||||||
#define __LTREE_H__
|
#define __LTREE_H__
|
||||||
@ -18,12 +18,12 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int32 len;
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
uint16 numlevel;
|
uint16 numlevel;
|
||||||
char data[1];
|
char data[1];
|
||||||
} ltree;
|
} ltree;
|
||||||
|
|
||||||
#define LTREE_HDRSIZE MAXALIGN( sizeof(int32) + sizeof(uint16) )
|
#define LTREE_HDRSIZE MAXALIGN(VARHDRSZ + sizeof(uint16))
|
||||||
#define LTREE_FIRST(x) ( (ltree_level*)( ((char*)(x))+LTREE_HDRSIZE ) )
|
#define LTREE_FIRST(x) ( (ltree_level*)( ((char*)(x))+LTREE_HDRSIZE ) )
|
||||||
|
|
||||||
|
|
||||||
@ -68,14 +68,14 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int32 len;
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
uint16 numlevel;
|
uint16 numlevel;
|
||||||
uint16 firstgood;
|
uint16 firstgood;
|
||||||
uint16 flag;
|
uint16 flag;
|
||||||
char data[1];
|
char data[1];
|
||||||
} lquery;
|
} lquery;
|
||||||
|
|
||||||
#define LQUERY_HDRSIZE MAXALIGN( sizeof(int32) + 3*sizeof(uint16) )
|
#define LQUERY_HDRSIZE MAXALIGN(VARHDRSZ + 3*sizeof(uint16))
|
||||||
#define LQUERY_FIRST(x) ( (lquery_level*)( ((char*)(x))+LQUERY_HDRSIZE ) )
|
#define LQUERY_FIRST(x) ( (lquery_level*)( ((char*)(x))+LQUERY_HDRSIZE ) )
|
||||||
|
|
||||||
#define LQUERY_HASNOT 0x01
|
#define LQUERY_HASNOT 0x01
|
||||||
@ -105,12 +105,12 @@ typedef struct ITEM
|
|||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int4 len;
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
int4 size;
|
int4 size;
|
||||||
char data[1];
|
char data[1];
|
||||||
} ltxtquery;
|
} ltxtquery;
|
||||||
|
|
||||||
#define HDRSIZEQT MAXALIGN( 2*sizeof(int4) )
|
#define HDRSIZEQT MAXALIGN(VARHDRSZ + sizeof(int4))
|
||||||
#define COMPUTESIZE(size,lenofoperand) ( HDRSIZEQT + (size) * sizeof(ITEM) + (lenofoperand) )
|
#define COMPUTESIZE(size,lenofoperand) ( HDRSIZEQT + (size) * sizeof(ITEM) + (lenofoperand) )
|
||||||
#define GETQUERY(x) (ITEM*)( (char*)(x)+HDRSIZEQT )
|
#define GETQUERY(x) (ITEM*)( (char*)(x)+HDRSIZEQT )
|
||||||
#define GETOPERAND(x) ( (char*)GETQUERY(x) + ((ltxtquery*)x)->size * sizeof(ITEM) )
|
#define GETOPERAND(x) ( (char*)GETQUERY(x) + ((ltxtquery*)x)->size * sizeof(ITEM) )
|
||||||
@ -205,7 +205,7 @@ typedef unsigned char *BITVECP;
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int4 len;
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
uint32 flag;
|
uint32 flag;
|
||||||
char data[1];
|
char data[1];
|
||||||
} ltree_gist;
|
} ltree_gist;
|
||||||
@ -214,14 +214,14 @@ typedef struct
|
|||||||
#define LTG_ALLTRUE 0x02
|
#define LTG_ALLTRUE 0x02
|
||||||
#define LTG_NORIGHT 0x04
|
#define LTG_NORIGHT 0x04
|
||||||
|
|
||||||
#define LTG_HDRSIZE MAXALIGN( sizeof(int4) + sizeof(uint32) )
|
#define LTG_HDRSIZE MAXALIGN(VARHDRSZ + sizeof(uint32))
|
||||||
#define LTG_SIGN(x) ( (BITVECP)( ((char*)(x))+LTG_HDRSIZE ) )
|
#define LTG_SIGN(x) ( (BITVECP)( ((char*)(x))+LTG_HDRSIZE ) )
|
||||||
#define LTG_NODE(x) ( (ltree*)( ((char*)(x))+LTG_HDRSIZE ) )
|
#define LTG_NODE(x) ( (ltree*)( ((char*)(x))+LTG_HDRSIZE ) )
|
||||||
#define LTG_ISONENODE(x) ( ((ltree_gist*)(x))->flag & LTG_ONENODE )
|
#define LTG_ISONENODE(x) ( ((ltree_gist*)(x))->flag & LTG_ONENODE )
|
||||||
#define LTG_ISALLTRUE(x) ( ((ltree_gist*)(x))->flag & LTG_ALLTRUE )
|
#define LTG_ISALLTRUE(x) ( ((ltree_gist*)(x))->flag & LTG_ALLTRUE )
|
||||||
#define LTG_ISNORIGHT(x) ( ((ltree_gist*)(x))->flag & LTG_NORIGHT )
|
#define LTG_ISNORIGHT(x) ( ((ltree_gist*)(x))->flag & LTG_NORIGHT )
|
||||||
#define LTG_LNODE(x) ( (ltree*)( ( ((char*)(x))+LTG_HDRSIZE ) + ( LTG_ISALLTRUE(x) ? 0 : SIGLEN ) ) )
|
#define LTG_LNODE(x) ( (ltree*)( ( ((char*)(x))+LTG_HDRSIZE ) + ( LTG_ISALLTRUE(x) ? 0 : SIGLEN ) ) )
|
||||||
#define LTG_RENODE(x) ( (ltree*)( ((char*)LTG_LNODE(x)) + LTG_LNODE(x)->len) )
|
#define LTG_RENODE(x) ( (ltree*)( ((char*)LTG_LNODE(x)) + VARSIZE(LTG_LNODE(x))) )
|
||||||
#define LTG_RNODE(x) ( LTG_ISNORIGHT(x) ? LTG_LNODE(x) : LTG_RENODE(x) )
|
#define LTG_RNODE(x) ( LTG_ISNORIGHT(x) ? LTG_LNODE(x) : LTG_RENODE(x) )
|
||||||
|
|
||||||
#define LTG_GETLNODE(x) ( LTG_ISONENODE(x) ? LTG_NODE(x) : LTG_LNODE(x) )
|
#define LTG_GETLNODE(x) ( LTG_ISONENODE(x) ? LTG_NODE(x) : LTG_LNODE(x) )
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* GiST support for ltree
|
* GiST support for ltree
|
||||||
* Teodor Sigaev <teodor@stack.net>
|
* Teodor Sigaev <teodor@stack.net>
|
||||||
* $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.19 2006/10/04 00:29:45 momjian Exp $
|
* $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.20 2007/02/28 22:44:38 tgl Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ltree.h"
|
#include "ltree.h"
|
||||||
@ -71,12 +71,12 @@ ltree_compress(PG_FUNCTION_ARGS)
|
|||||||
{ /* ltree */
|
{ /* ltree */
|
||||||
ltree_gist *key;
|
ltree_gist *key;
|
||||||
ltree *val = (ltree *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
|
ltree *val = (ltree *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
|
||||||
int4 len = LTG_HDRSIZE + val->len;
|
int4 len = LTG_HDRSIZE + VARSIZE(val);
|
||||||
|
|
||||||
key = (ltree_gist *) palloc(len);
|
key = (ltree_gist *) palloc(len);
|
||||||
key->len = len;
|
SET_VARSIZE(key, len);
|
||||||
key->flag = LTG_ONENODE;
|
key->flag = LTG_ONENODE;
|
||||||
memcpy((void *) LTG_NODE(key), (void *) val, val->len);
|
memcpy((void *) LTG_NODE(key), (void *) val, VARSIZE(val));
|
||||||
|
|
||||||
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
||||||
gistentryinit(*retval, PointerGetDatum(key),
|
gistentryinit(*retval, PointerGetDatum(key),
|
||||||
@ -225,10 +225,10 @@ ltree_union(PG_FUNCTION_ARGS)
|
|||||||
}
|
}
|
||||||
|
|
||||||
isleqr = (left == right || ISEQ(left, right)) ? true : false;
|
isleqr = (left == right || ISEQ(left, right)) ? true : false;
|
||||||
*size = LTG_HDRSIZE + ((isalltrue) ? 0 : SIGLEN) + left->len + ((isleqr) ? 0 : right->len);
|
*size = LTG_HDRSIZE + ((isalltrue) ? 0 : SIGLEN) + VARSIZE(left) + ((isleqr) ? 0 : VARSIZE(right));
|
||||||
|
|
||||||
result = (ltree_gist *) palloc(*size);
|
result = (ltree_gist *) palloc(*size);
|
||||||
result->len = *size;
|
SET_VARSIZE(result, *size);
|
||||||
result->flag = 0;
|
result->flag = 0;
|
||||||
|
|
||||||
if (isalltrue)
|
if (isalltrue)
|
||||||
@ -236,11 +236,11 @@ ltree_union(PG_FUNCTION_ARGS)
|
|||||||
else
|
else
|
||||||
memcpy((void *) LTG_SIGN(result), base, SIGLEN);
|
memcpy((void *) LTG_SIGN(result), base, SIGLEN);
|
||||||
|
|
||||||
memcpy((void *) LTG_LNODE(result), (void *) left, left->len);
|
memcpy((void *) LTG_LNODE(result), (void *) left, VARSIZE(left));
|
||||||
if (isleqr)
|
if (isleqr)
|
||||||
result->flag |= LTG_NORIGHT;
|
result->flag |= LTG_NORIGHT;
|
||||||
else
|
else
|
||||||
memcpy((void *) LTG_RNODE(result), (void *) right, right->len);
|
memcpy((void *) LTG_RNODE(result), (void *) right, VARSIZE(right));
|
||||||
|
|
||||||
PG_RETURN_POINTER(result);
|
PG_RETURN_POINTER(result);
|
||||||
}
|
}
|
||||||
@ -399,36 +399,36 @@ ltree_picksplit(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
lu_l = LTG_GETLNODE(GETENTRY(entryvec, array[FirstOffsetNumber].index));
|
lu_l = LTG_GETLNODE(GETENTRY(entryvec, array[FirstOffsetNumber].index));
|
||||||
isleqr = (lu_l == lu_r || ISEQ(lu_l, lu_r)) ? true : false;
|
isleqr = (lu_l == lu_r || ISEQ(lu_l, lu_r)) ? true : false;
|
||||||
size = LTG_HDRSIZE + ((lisat) ? 0 : SIGLEN) + lu_l->len + ((isleqr) ? 0 : lu_r->len);
|
size = LTG_HDRSIZE + ((lisat) ? 0 : SIGLEN) + VARSIZE(lu_l) + ((isleqr) ? 0 : VARSIZE(lu_r));
|
||||||
lu = (ltree_gist *) palloc(size);
|
lu = (ltree_gist *) palloc(size);
|
||||||
lu->len = size;
|
SET_VARSIZE(lu, size);
|
||||||
lu->flag = 0;
|
lu->flag = 0;
|
||||||
if (lisat)
|
if (lisat)
|
||||||
lu->flag |= LTG_ALLTRUE;
|
lu->flag |= LTG_ALLTRUE;
|
||||||
else
|
else
|
||||||
memcpy((void *) LTG_SIGN(lu), ls, SIGLEN);
|
memcpy((void *) LTG_SIGN(lu), ls, SIGLEN);
|
||||||
memcpy((void *) LTG_LNODE(lu), (void *) lu_l, lu_l->len);
|
memcpy((void *) LTG_LNODE(lu), (void *) lu_l, VARSIZE(lu_l));
|
||||||
if (isleqr)
|
if (isleqr)
|
||||||
lu->flag |= LTG_NORIGHT;
|
lu->flag |= LTG_NORIGHT;
|
||||||
else
|
else
|
||||||
memcpy((void *) LTG_RNODE(lu), (void *) lu_r, lu_r->len);
|
memcpy((void *) LTG_RNODE(lu), (void *) lu_r, VARSIZE(lu_r));
|
||||||
|
|
||||||
|
|
||||||
ru_l = LTG_GETLNODE(GETENTRY(entryvec, array[1 + ((maxoff - FirstOffsetNumber + 1) / 2)].index));
|
ru_l = LTG_GETLNODE(GETENTRY(entryvec, array[1 + ((maxoff - FirstOffsetNumber + 1) / 2)].index));
|
||||||
isleqr = (ru_l == ru_r || ISEQ(ru_l, ru_r)) ? true : false;
|
isleqr = (ru_l == ru_r || ISEQ(ru_l, ru_r)) ? true : false;
|
||||||
size = LTG_HDRSIZE + ((risat) ? 0 : SIGLEN) + ru_l->len + ((isleqr) ? 0 : ru_r->len);
|
size = LTG_HDRSIZE + ((risat) ? 0 : SIGLEN) + VARSIZE(ru_l) + ((isleqr) ? 0 : VARSIZE(ru_r));
|
||||||
ru = (ltree_gist *) palloc(size);
|
ru = (ltree_gist *) palloc(size);
|
||||||
ru->len = size;
|
SET_VARSIZE(ru, size);
|
||||||
ru->flag = 0;
|
ru->flag = 0;
|
||||||
if (risat)
|
if (risat)
|
||||||
ru->flag |= LTG_ALLTRUE;
|
ru->flag |= LTG_ALLTRUE;
|
||||||
else
|
else
|
||||||
memcpy((void *) LTG_SIGN(ru), rs, SIGLEN);
|
memcpy((void *) LTG_SIGN(ru), rs, SIGLEN);
|
||||||
memcpy((void *) LTG_LNODE(ru), (void *) ru_l, ru_l->len);
|
memcpy((void *) LTG_LNODE(ru), (void *) ru_l, VARSIZE(ru_l));
|
||||||
if (isleqr)
|
if (isleqr)
|
||||||
ru->flag |= LTG_NORIGHT;
|
ru->flag |= LTG_NORIGHT;
|
||||||
else
|
else
|
||||||
memcpy((void *) LTG_RNODE(ru), (void *) ru_r, ru_r->len);
|
memcpy((void *) LTG_RNODE(ru), (void *) ru_r, VARSIZE(ru_r));
|
||||||
|
|
||||||
v->spl_ldatum = PointerGetDatum(lu);
|
v->spl_ldatum = PointerGetDatum(lu);
|
||||||
v->spl_rdatum = PointerGetDatum(ru);
|
v->spl_rdatum = PointerGetDatum(ru);
|
||||||
@ -459,9 +459,9 @@ gist_isparent(ltree_gist * key, ltree * query)
|
|||||||
static ltree *
|
static ltree *
|
||||||
copy_ltree(ltree * src)
|
copy_ltree(ltree * src)
|
||||||
{
|
{
|
||||||
ltree *dst = (ltree *) palloc(src->len);
|
ltree *dst = (ltree *) palloc(VARSIZE(src));
|
||||||
|
|
||||||
memcpy(dst, src, src->len);
|
memcpy(dst, src, VARSIZE(src));
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* in/out function for ltree and lquery
|
* in/out function for ltree and lquery
|
||||||
* Teodor Sigaev <teodor@stack.net>
|
* Teodor Sigaev <teodor@stack.net>
|
||||||
* $PostgreSQL: pgsql/contrib/ltree/ltree_io.c,v 1.13 2006/09/22 21:39:57 tgl Exp $
|
* $PostgreSQL: pgsql/contrib/ltree/ltree_io.c,v 1.14 2007/02/28 22:44:38 tgl Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ltree.h"
|
#include "ltree.h"
|
||||||
@ -119,7 +119,7 @@ ltree_in(PG_FUNCTION_ARGS)
|
|||||||
errdetail("Unexpected end of line.")));
|
errdetail("Unexpected end of line.")));
|
||||||
|
|
||||||
result = (ltree *) palloc(LTREE_HDRSIZE + totallen);
|
result = (ltree *) palloc(LTREE_HDRSIZE + totallen);
|
||||||
result->len = LTREE_HDRSIZE + totallen;
|
SET_VARSIZE(result, LTREE_HDRSIZE + totallen);
|
||||||
result->numlevel = lptr - list;
|
result->numlevel = lptr - list;
|
||||||
curlevel = LTREE_FIRST(result);
|
curlevel = LTREE_FIRST(result);
|
||||||
lptr = list;
|
lptr = list;
|
||||||
@ -144,7 +144,7 @@ ltree_out(PG_FUNCTION_ARGS)
|
|||||||
int i;
|
int i;
|
||||||
ltree_level *curlevel;
|
ltree_level *curlevel;
|
||||||
|
|
||||||
ptr = buf = (char *) palloc(in->len);
|
ptr = buf = (char *) palloc(VARSIZE(in));
|
||||||
curlevel = LTREE_FIRST(in);
|
curlevel = LTREE_FIRST(in);
|
||||||
for (i = 0; i < in->numlevel; i++)
|
for (i = 0; i < in->numlevel; i++)
|
||||||
{
|
{
|
||||||
@ -449,7 +449,7 @@ lquery_in(PG_FUNCTION_ARGS)
|
|||||||
}
|
}
|
||||||
|
|
||||||
result = (lquery *) palloc(totallen);
|
result = (lquery *) palloc(totallen);
|
||||||
result->len = totallen;
|
SET_VARSIZE(result, totallen);
|
||||||
result->numlevel = num;
|
result->numlevel = num;
|
||||||
result->firstgood = 0;
|
result->firstgood = 0;
|
||||||
result->flag = 0;
|
result->flag = 0;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* op function for ltree
|
* op function for ltree
|
||||||
* Teodor Sigaev <teodor@stack.net>
|
* Teodor Sigaev <teodor@stack.net>
|
||||||
* $PostgreSQL: pgsql/contrib/ltree/ltree_op.c,v 1.15 2007/02/27 23:48:06 tgl Exp $
|
* $PostgreSQL: pgsql/contrib/ltree/ltree_op.c,v 1.16 2007/02/28 22:44:38 tgl Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ltree.h"
|
#include "ltree.h"
|
||||||
@ -230,7 +230,7 @@ inner_subltree(ltree * t, int4 startpos, int4 endpos)
|
|||||||
}
|
}
|
||||||
|
|
||||||
res = (ltree *) palloc(LTREE_HDRSIZE + (end - start));
|
res = (ltree *) palloc(LTREE_HDRSIZE + (end - start));
|
||||||
res->len = LTREE_HDRSIZE + (end - start);
|
SET_VARSIZE(res, LTREE_HDRSIZE + (end - start));
|
||||||
res->numlevel = endpos - startpos;
|
res->numlevel = endpos - startpos;
|
||||||
|
|
||||||
memcpy(LTREE_FIRST(res), start, end - start);
|
memcpy(LTREE_FIRST(res), start, end - start);
|
||||||
@ -286,13 +286,14 @@ ltree_concat(ltree * a, ltree * b)
|
|||||||
{
|
{
|
||||||
ltree *r;
|
ltree *r;
|
||||||
|
|
||||||
r = (ltree *) palloc(a->len + b->len - LTREE_HDRSIZE);
|
r = (ltree *) palloc(VARSIZE(a) + VARSIZE(b) - LTREE_HDRSIZE);
|
||||||
r->len = a->len + b->len - LTREE_HDRSIZE;
|
SET_VARSIZE(r, VARSIZE(a) + VARSIZE(b) - LTREE_HDRSIZE);
|
||||||
r->numlevel = a->numlevel + b->numlevel;
|
r->numlevel = a->numlevel + b->numlevel;
|
||||||
|
|
||||||
memcpy(LTREE_FIRST(r), LTREE_FIRST(a), a->len - LTREE_HDRSIZE);
|
memcpy(LTREE_FIRST(r), LTREE_FIRST(a), VARSIZE(a) - LTREE_HDRSIZE);
|
||||||
memcpy(((char *) LTREE_FIRST(r)) + a->len - LTREE_HDRSIZE, LTREE_FIRST(b), b->len -
|
memcpy(((char *) LTREE_FIRST(r)) + VARSIZE(a) - LTREE_HDRSIZE,
|
||||||
LTREE_HDRSIZE);
|
LTREE_FIRST(b),
|
||||||
|
VARSIZE(b) - LTREE_HDRSIZE);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -476,7 +477,7 @@ lca_inner(ltree ** a, int len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
res = (ltree *) palloc(reslen);
|
res = (ltree *) palloc(reslen);
|
||||||
res->len = reslen;
|
SET_VARSIZE(res, reslen);
|
||||||
res->numlevel = num;
|
res->numlevel = num;
|
||||||
|
|
||||||
l1 = LTREE_FIRST(*a);
|
l1 = LTREE_FIRST(*a);
|
||||||
@ -542,7 +543,7 @@ ltree2text(PG_FUNCTION_ARGS)
|
|||||||
ltree_level *curlevel;
|
ltree_level *curlevel;
|
||||||
text *out;
|
text *out;
|
||||||
|
|
||||||
out = (text *) palloc(in->len + VARHDRSZ);
|
out = (text *) palloc(VARSIZE(in) + VARHDRSZ);
|
||||||
ptr = VARDATA(out);
|
ptr = VARDATA(out);
|
||||||
curlevel = LTREE_FIRST(in);
|
curlevel = LTREE_FIRST(in);
|
||||||
for (i = 0; i < in->numlevel; i++)
|
for (i = 0; i < in->numlevel; i++)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* txtquery io
|
* txtquery io
|
||||||
* Teodor Sigaev <teodor@stack.net>
|
* Teodor Sigaev <teodor@stack.net>
|
||||||
* $PostgreSQL: pgsql/contrib/ltree/ltxtquery_io.c,v 1.12 2006/09/22 21:39:57 tgl Exp $
|
* $PostgreSQL: pgsql/contrib/ltree/ltxtquery_io.c,v 1.13 2007/02/28 22:44:38 tgl Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ltree.h"
|
#include "ltree.h"
|
||||||
@ -337,7 +337,7 @@ queryin(char *buf)
|
|||||||
/* make finish struct */
|
/* make finish struct */
|
||||||
commonlen = COMPUTESIZE(state.num, state.sumlen);
|
commonlen = COMPUTESIZE(state.num, state.sumlen);
|
||||||
query = (ltxtquery *) palloc(commonlen);
|
query = (ltxtquery *) palloc(commonlen);
|
||||||
query->len = commonlen;
|
SET_VARSIZE(query, commonlen);
|
||||||
query->size = state.num;
|
query->size = state.num;
|
||||||
ptr = GETQUERY(query);
|
ptr = GETQUERY(query);
|
||||||
|
|
||||||
|
@ -31,12 +31,12 @@ typedef char trgm[3];
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int4 len;
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
uint8 flag;
|
uint8 flag;
|
||||||
char data[1];
|
char data[1];
|
||||||
} TRGM;
|
} TRGM;
|
||||||
|
|
||||||
#define TRGMHRDSIZE (sizeof(int4)+sizeof(uint8))
|
#define TRGMHDRSIZE (VARHDRSZ + sizeof(uint8))
|
||||||
|
|
||||||
/* gist */
|
/* gist */
|
||||||
#define BITBYTE 8
|
#define BITBYTE 8
|
||||||
@ -70,12 +70,13 @@ typedef char *BITVECP;
|
|||||||
#define ISSIGNKEY(x) ( ((TRGM*)x)->flag & SIGNKEY )
|
#define ISSIGNKEY(x) ( ((TRGM*)x)->flag & SIGNKEY )
|
||||||
#define ISALLTRUE(x) ( ((TRGM*)x)->flag & ALLISTRUE )
|
#define ISALLTRUE(x) ( ((TRGM*)x)->flag & ALLISTRUE )
|
||||||
|
|
||||||
#define CALCGTSIZE(flag, len) ( TRGMHRDSIZE + ( ( (flag) & ARRKEY ) ? ((len)*sizeof(trgm)) : (((flag) & ALLISTRUE) ? 0 : SIGLEN) ) )
|
#define CALCGTSIZE(flag, len) ( TRGMHDRSIZE + ( ( (flag) & ARRKEY ) ? ((len)*sizeof(trgm)) : (((flag) & ALLISTRUE) ? 0 : SIGLEN) ) )
|
||||||
#define GETSIGN(x) ( (BITVECP)( (char*)x+TRGMHRDSIZE ) )
|
#define GETSIGN(x) ( (BITVECP)( (char*)x+TRGMHDRSIZE ) )
|
||||||
#define GETARR(x) ( (trgm*)( (char*)x+TRGMHRDSIZE ) )
|
#define GETARR(x) ( (trgm*)( (char*)x+TRGMHDRSIZE ) )
|
||||||
#define ARRNELEM(x) ( ( ((TRGM*)x)->len - TRGMHRDSIZE )/sizeof(trgm) )
|
#define ARRNELEM(x) ( ( VARSIZE(x) - TRGMHDRSIZE )/sizeof(trgm) )
|
||||||
|
|
||||||
extern float4 trgm_limit;
|
extern float4 trgm_limit;
|
||||||
|
|
||||||
TRGM *generate_trgm(char *str, int slen);
|
TRGM *generate_trgm(char *str, int slen);
|
||||||
float4 cnt_sml(TRGM * trg1, TRGM * trg2);
|
float4 cnt_sml(TRGM * trg1, TRGM * trg2);
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ gtrgm_compress(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
|
len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
|
||||||
res = (TRGM *) palloc(len);
|
res = (TRGM *) palloc(len);
|
||||||
res->len = len;
|
SET_VARSIZE(res, len);
|
||||||
res->flag = SIGNKEY | ALLISTRUE;
|
res->flag = SIGNKEY | ALLISTRUE;
|
||||||
|
|
||||||
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
||||||
@ -235,10 +235,11 @@ gtrgm_union(PG_FUNCTION_ARGS)
|
|||||||
flag |= SIGNKEY;
|
flag |= SIGNKEY;
|
||||||
len = CALCGTSIZE(flag, 0);
|
len = CALCGTSIZE(flag, 0);
|
||||||
result = (TRGM *) palloc(len);
|
result = (TRGM *) palloc(len);
|
||||||
*size = result->len = len;
|
SET_VARSIZE(result, len);
|
||||||
result->flag = flag;
|
result->flag = flag;
|
||||||
if (!ISALLTRUE(result))
|
if (!ISALLTRUE(result))
|
||||||
memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
|
memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
|
||||||
|
*size = len;
|
||||||
|
|
||||||
PG_RETURN_POINTER(result);
|
PG_RETURN_POINTER(result);
|
||||||
}
|
}
|
||||||
@ -486,26 +487,26 @@ gtrgm_picksplit(PG_FUNCTION_ARGS)
|
|||||||
if (cache[seed_1].allistrue)
|
if (cache[seed_1].allistrue)
|
||||||
{
|
{
|
||||||
datum_l = (TRGM *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
datum_l = (TRGM *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
||||||
datum_l->len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
|
SET_VARSIZE(datum_l, CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
||||||
datum_l->flag = SIGNKEY | ALLISTRUE;
|
datum_l->flag = SIGNKEY | ALLISTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
datum_l = (TRGM *) palloc(CALCGTSIZE(SIGNKEY, 0));
|
datum_l = (TRGM *) palloc(CALCGTSIZE(SIGNKEY, 0));
|
||||||
datum_l->len = CALCGTSIZE(SIGNKEY, 0);
|
SET_VARSIZE(datum_l, CALCGTSIZE(SIGNKEY, 0));
|
||||||
datum_l->flag = SIGNKEY;
|
datum_l->flag = SIGNKEY;
|
||||||
memcpy((void *) GETSIGN(datum_l), (void *) cache[seed_1].sign, sizeof(BITVEC));
|
memcpy((void *) GETSIGN(datum_l), (void *) cache[seed_1].sign, sizeof(BITVEC));
|
||||||
}
|
}
|
||||||
if (cache[seed_2].allistrue)
|
if (cache[seed_2].allistrue)
|
||||||
{
|
{
|
||||||
datum_r = (TRGM *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
datum_r = (TRGM *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
||||||
datum_r->len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
|
SET_VARSIZE(datum_r, CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
||||||
datum_r->flag = SIGNKEY | ALLISTRUE;
|
datum_r->flag = SIGNKEY | ALLISTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
datum_r = (TRGM *) palloc(CALCGTSIZE(SIGNKEY, 0));
|
datum_r = (TRGM *) palloc(CALCGTSIZE(SIGNKEY, 0));
|
||||||
datum_r->len = CALCGTSIZE(SIGNKEY, 0);
|
SET_VARSIZE(datum_r, CALCGTSIZE(SIGNKEY, 0));
|
||||||
datum_r->flag = SIGNKEY;
|
datum_r->flag = SIGNKEY;
|
||||||
memcpy((void *) GETSIGN(datum_r), (void *) cache[seed_2].sign, sizeof(BITVEC));
|
memcpy((void *) GETSIGN(datum_r), (void *) cache[seed_2].sign, sizeof(BITVEC));
|
||||||
}
|
}
|
||||||
|
@ -70,9 +70,9 @@ generate_trgm(char *str, int slen)
|
|||||||
int wl,
|
int wl,
|
||||||
len;
|
len;
|
||||||
|
|
||||||
trg = (TRGM *) palloc(TRGMHRDSIZE + sizeof(trgm) * (slen / 2 + 1) * 3);
|
trg = (TRGM *) palloc(TRGMHDRSIZE + sizeof(trgm) * (slen / 2 + 1) * 3);
|
||||||
trg->flag = ARRKEY;
|
trg->flag = ARRKEY;
|
||||||
trg->len = TRGMHRDSIZE;
|
SET_VARSIZE(trg, TRGMHDRSIZE);
|
||||||
|
|
||||||
if (slen + LPADDING + RPADDING < 3 || slen == 0)
|
if (slen + LPADDING + RPADDING < 3 || slen == 0)
|
||||||
return trg;
|
return trg;
|
||||||
@ -178,7 +178,7 @@ generate_trgm(char *str, int slen)
|
|||||||
len = unique_array(GETARR(trg), len);
|
len = unique_array(GETARR(trg), len);
|
||||||
}
|
}
|
||||||
|
|
||||||
trg->len = CALCGTSIZE(ARRKEY, len);
|
SET_VARSIZE(trg, CALCGTSIZE(ARRKEY, len));
|
||||||
|
|
||||||
return trg;
|
return trg;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $PostgreSQL: pgsql/contrib/tsearch2/gistidx.c,v 1.15 2006/10/04 00:29:46 momjian Exp $ */
|
/* $PostgreSQL: pgsql/contrib/tsearch2/gistidx.c,v 1.16 2007/02/28 22:44:38 tgl Exp $ */
|
||||||
|
|
||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ gtsvector_compress(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
len = CALCGTSIZE(ARRKEY, val->size);
|
len = CALCGTSIZE(ARRKEY, val->size);
|
||||||
res = (GISTTYPE *) palloc(len);
|
res = (GISTTYPE *) palloc(len);
|
||||||
res->len = len;
|
SET_VARSIZE(res, len);
|
||||||
res->flag = ARRKEY;
|
res->flag = ARRKEY;
|
||||||
arr = GETARR(res);
|
arr = GETARR(res);
|
||||||
len = val->size;
|
len = val->size;
|
||||||
@ -183,17 +183,17 @@ gtsvector_compress(PG_FUNCTION_ARGS)
|
|||||||
*/
|
*/
|
||||||
len = CALCGTSIZE(ARRKEY, len);
|
len = CALCGTSIZE(ARRKEY, len);
|
||||||
res = (GISTTYPE *) repalloc((void *) res, len);
|
res = (GISTTYPE *) repalloc((void *) res, len);
|
||||||
res->len = len;
|
SET_VARSIZE(res, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make signature, if array is too long */
|
/* make signature, if array is too long */
|
||||||
if (res->len > TOAST_INDEX_TARGET)
|
if (VARSIZE(res) > TOAST_INDEX_TARGET)
|
||||||
{
|
{
|
||||||
GISTTYPE *ressign;
|
GISTTYPE *ressign;
|
||||||
|
|
||||||
len = CALCGTSIZE(SIGNKEY, 0);
|
len = CALCGTSIZE(SIGNKEY, 0);
|
||||||
ressign = (GISTTYPE *) palloc(len);
|
ressign = (GISTTYPE *) palloc(len);
|
||||||
ressign->len = len;
|
SET_VARSIZE(ressign, len);
|
||||||
ressign->flag = SIGNKEY;
|
ressign->flag = SIGNKEY;
|
||||||
makesign(GETSIGN(ressign), res);
|
makesign(GETSIGN(ressign), res);
|
||||||
res = ressign;
|
res = ressign;
|
||||||
@ -219,7 +219,7 @@ gtsvector_compress(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
|
len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
|
||||||
res = (GISTTYPE *) palloc(len);
|
res = (GISTTYPE *) palloc(len);
|
||||||
res->len = len;
|
SET_VARSIZE(res, len);
|
||||||
res->flag = SIGNKEY | ALLISTRUE;
|
res->flag = SIGNKEY | ALLISTRUE;
|
||||||
|
|
||||||
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
|
||||||
@ -375,10 +375,11 @@ gtsvector_union(PG_FUNCTION_ARGS)
|
|||||||
flag |= SIGNKEY;
|
flag |= SIGNKEY;
|
||||||
len = CALCGTSIZE(flag, 0);
|
len = CALCGTSIZE(flag, 0);
|
||||||
result = (GISTTYPE *) palloc(len);
|
result = (GISTTYPE *) palloc(len);
|
||||||
*size = result->len = len;
|
SET_VARSIZE(result, len);
|
||||||
result->flag = flag;
|
result->flag = flag;
|
||||||
if (!ISALLTRUE(result))
|
if (!ISALLTRUE(result))
|
||||||
memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
|
memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
|
||||||
|
*size = len;
|
||||||
|
|
||||||
PG_RETURN_POINTER(result);
|
PG_RETURN_POINTER(result);
|
||||||
}
|
}
|
||||||
@ -627,26 +628,26 @@ gtsvector_picksplit(PG_FUNCTION_ARGS)
|
|||||||
if (cache[seed_1].allistrue)
|
if (cache[seed_1].allistrue)
|
||||||
{
|
{
|
||||||
datum_l = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
datum_l = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
||||||
datum_l->len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
|
SET_VARSIZE(datum_l, CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
||||||
datum_l->flag = SIGNKEY | ALLISTRUE;
|
datum_l->flag = SIGNKEY | ALLISTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
datum_l = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY, 0));
|
datum_l = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY, 0));
|
||||||
datum_l->len = CALCGTSIZE(SIGNKEY, 0);
|
SET_VARSIZE(datum_l, CALCGTSIZE(SIGNKEY, 0));
|
||||||
datum_l->flag = SIGNKEY;
|
datum_l->flag = SIGNKEY;
|
||||||
memcpy((void *) GETSIGN(datum_l), (void *) cache[seed_1].sign, sizeof(BITVEC));
|
memcpy((void *) GETSIGN(datum_l), (void *) cache[seed_1].sign, sizeof(BITVEC));
|
||||||
}
|
}
|
||||||
if (cache[seed_2].allistrue)
|
if (cache[seed_2].allistrue)
|
||||||
{
|
{
|
||||||
datum_r = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
datum_r = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
||||||
datum_r->len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
|
SET_VARSIZE(datum_r, CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
|
||||||
datum_r->flag = SIGNKEY | ALLISTRUE;
|
datum_r->flag = SIGNKEY | ALLISTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
datum_r = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY, 0));
|
datum_r = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY, 0));
|
||||||
datum_r->len = CALCGTSIZE(SIGNKEY, 0);
|
SET_VARSIZE(datum_r, CALCGTSIZE(SIGNKEY, 0));
|
||||||
datum_r->flag = SIGNKEY;
|
datum_r->flag = SIGNKEY;
|
||||||
memcpy((void *) GETSIGN(datum_r), (void *) cache[seed_2].sign, sizeof(BITVEC));
|
memcpy((void *) GETSIGN(datum_r), (void *) cache[seed_2].sign, sizeof(BITVEC));
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $PostgreSQL: pgsql/contrib/tsearch2/gistidx.h,v 1.7 2006/03/11 04:38:30 momjian Exp $ */
|
/* $PostgreSQL: pgsql/contrib/tsearch2/gistidx.h,v 1.8 2007/02/28 22:44:38 tgl Exp $ */
|
||||||
|
|
||||||
#ifndef __GISTIDX_H__
|
#ifndef __GISTIDX_H__
|
||||||
#define __GISTIDX_H__
|
#define __GISTIDX_H__
|
||||||
@ -39,7 +39,7 @@ typedef char *BITVECP;
|
|||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int4 len;
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
int4 flag;
|
int4 flag;
|
||||||
char data[1];
|
char data[1];
|
||||||
} GISTTYPE;
|
} GISTTYPE;
|
||||||
@ -52,11 +52,11 @@ typedef struct
|
|||||||
#define ISSIGNKEY(x) ( ((GISTTYPE*)(x))->flag & SIGNKEY )
|
#define ISSIGNKEY(x) ( ((GISTTYPE*)(x))->flag & SIGNKEY )
|
||||||
#define ISALLTRUE(x) ( ((GISTTYPE*)(x))->flag & ALLISTRUE )
|
#define ISALLTRUE(x) ( ((GISTTYPE*)(x))->flag & ALLISTRUE )
|
||||||
|
|
||||||
#define GTHDRSIZE ( sizeof(int4) * 2 )
|
#define GTHDRSIZE ( VARHDRSZ + sizeof(int4) )
|
||||||
#define CALCGTSIZE(flag, len) ( GTHDRSIZE + ( ( (flag) & ARRKEY ) ? ((len)*sizeof(int4)) : (((flag) & ALLISTRUE) ? 0 : SIGLEN) ) )
|
#define CALCGTSIZE(flag, len) ( GTHDRSIZE + ( ( (flag) & ARRKEY ) ? ((len)*sizeof(int4)) : (((flag) & ALLISTRUE) ? 0 : SIGLEN) ) )
|
||||||
|
|
||||||
#define GETSIGN(x) ( (BITVECP)( (char*)(x)+GTHDRSIZE ) )
|
#define GETSIGN(x) ( (BITVECP)( (char*)(x)+GTHDRSIZE ) )
|
||||||
#define GETARR(x) ( (int4*)( (char*)(x)+GTHDRSIZE ) )
|
#define GETARR(x) ( (int4*)( (char*)(x)+GTHDRSIZE ) )
|
||||||
#define ARRNELEM(x) ( ( ((GISTTYPE*)(x))->len - GTHDRSIZE )/sizeof(int4) )
|
#define ARRNELEM(x) ( ( VARSIZE(x) - GTHDRSIZE )/sizeof(int4) )
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -658,7 +658,7 @@ static QUERYTYPE *
|
|||||||
(errmsg("tsearch query doesn't contain lexeme(s): \"%s\"",
|
(errmsg("tsearch query doesn't contain lexeme(s): \"%s\"",
|
||||||
state.buffer)));
|
state.buffer)));
|
||||||
query = (QUERYTYPE *) palloc(HDRSIZEQT);
|
query = (QUERYTYPE *) palloc(HDRSIZEQT);
|
||||||
query->len = HDRSIZEQT;
|
SET_VARSIZE(query, HDRSIZEQT);
|
||||||
query->size = 0;
|
query->size = 0;
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
@ -666,7 +666,7 @@ static QUERYTYPE *
|
|||||||
/* make finish struct */
|
/* make finish struct */
|
||||||
commonlen = COMPUTESIZE(state.num, state.sumlen);
|
commonlen = COMPUTESIZE(state.num, state.sumlen);
|
||||||
query = (QUERYTYPE *) palloc(commonlen);
|
query = (QUERYTYPE *) palloc(commonlen);
|
||||||
query->len = commonlen;
|
SET_VARSIZE(query, commonlen);
|
||||||
query->size = state.num;
|
query->size = state.num;
|
||||||
ptr = GETQUERY(query);
|
ptr = GETQUERY(query);
|
||||||
|
|
||||||
@ -961,7 +961,7 @@ to_tsquery(PG_FUNCTION_ARGS)
|
|||||||
res = clean_fakeval_v2(GETQUERY(query), &len);
|
res = clean_fakeval_v2(GETQUERY(query), &len);
|
||||||
if (!res)
|
if (!res)
|
||||||
{
|
{
|
||||||
query->len = HDRSIZEQT;
|
SET_VARSIZE(query, HDRSIZEQT);
|
||||||
query->size = 0;
|
query->size = 0;
|
||||||
PG_RETURN_POINTER(query);
|
PG_RETURN_POINTER(query);
|
||||||
}
|
}
|
||||||
@ -1016,7 +1016,7 @@ plainto_tsquery(PG_FUNCTION_ARGS)
|
|||||||
res = clean_fakeval_v2(GETQUERY(query), &len);
|
res = clean_fakeval_v2(GETQUERY(query), &len);
|
||||||
if (!res)
|
if (!res)
|
||||||
{
|
{
|
||||||
query->len = HDRSIZEQT;
|
SET_VARSIZE(query, HDRSIZEQT);
|
||||||
query->size = 0;
|
query->size = 0;
|
||||||
PG_RETURN_POINTER(query);
|
PG_RETURN_POINTER(query);
|
||||||
}
|
}
|
||||||
|
@ -28,12 +28,12 @@ typedef struct ITEM
|
|||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int4 len;
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
||||||
int4 size;
|
int4 size;
|
||||||
char data[1];
|
char data[1];
|
||||||
} QUERYTYPE;
|
} QUERYTYPE;
|
||||||
|
|
||||||
#define HDRSIZEQT ( 2 * sizeof(int4) )
|
#define HDRSIZEQT ( VARHDRSZ + sizeof(int4) )
|
||||||
#define COMPUTESIZE(size,lenofoperand) ( HDRSIZEQT + (size) * sizeof(ITEM) + (lenofoperand) )
|
#define COMPUTESIZE(size,lenofoperand) ( HDRSIZEQT + (size) * sizeof(ITEM) + (lenofoperand) )
|
||||||
#define GETQUERY(x) (ITEM*)( (char*)(x)+HDRSIZEQT )
|
#define GETQUERY(x) (ITEM*)( (char*)(x)+HDRSIZEQT )
|
||||||
#define GETOPERAND(x) ( (char*)GETQUERY(x) + ((QUERYTYPE*)(x))->size * sizeof(ITEM) )
|
#define GETOPERAND(x) ( (char*)GETQUERY(x) + ((QUERYTYPE*)(x))->size * sizeof(ITEM) )
|
||||||
|
@ -250,7 +250,7 @@ rewrite_accum(PG_FUNCTION_ARGS)
|
|||||||
if (acc == NULL || PG_ARGISNULL(0))
|
if (acc == NULL || PG_ARGISNULL(0))
|
||||||
{
|
{
|
||||||
acc = (QUERYTYPE *) MEMALLOC(AggMemory, sizeof(QUERYTYPE));
|
acc = (QUERYTYPE *) MEMALLOC(AggMemory, sizeof(QUERYTYPE));
|
||||||
acc->len = HDRSIZEQT;
|
SET_VARSIZE(acc, HDRSIZEQT);
|
||||||
acc->size = 0;
|
acc->size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -287,7 +287,7 @@ rewrite_accum(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
if (!acc->size)
|
if (!acc->size)
|
||||||
{
|
{
|
||||||
if (acc->len > HDRSIZEQT)
|
if (VARSIZE(acc) > HDRSIZEQT)
|
||||||
{
|
{
|
||||||
pfree(elemsp);
|
pfree(elemsp);
|
||||||
PG_RETURN_POINTER(acc);
|
PG_RETURN_POINTER(acc);
|
||||||
@ -328,7 +328,7 @@ rewrite_accum(PG_FUNCTION_ARGS)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
acc = (QUERYTYPE *) MEMALLOC(AggMemory, HDRSIZEQT * 2);
|
acc = (QUERYTYPE *) MEMALLOC(AggMemory, HDRSIZEQT * 2);
|
||||||
acc->len = HDRSIZEQT * 2;
|
SET_VARSIZE(acc, HDRSIZEQT * 2);
|
||||||
acc->size = 0;
|
acc->size = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -353,12 +353,12 @@ rewrite_finish(PG_FUNCTION_ARGS)
|
|||||||
if (acc == NULL || PG_ARGISNULL(0) || acc->size == 0)
|
if (acc == NULL || PG_ARGISNULL(0) || acc->size == 0)
|
||||||
{
|
{
|
||||||
acc = (QUERYTYPE *) palloc(sizeof(QUERYTYPE));
|
acc = (QUERYTYPE *) palloc(sizeof(QUERYTYPE));
|
||||||
acc->len = HDRSIZEQT;
|
SET_VARSIZE(acc, HDRSIZEQT);
|
||||||
acc->size = 0;
|
acc->size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
rewrited = (QUERYTYPE *) palloc(acc->len);
|
rewrited = (QUERYTYPE *) palloc(VARSIZE(acc));
|
||||||
memcpy(rewrited, acc, acc->len);
|
memcpy(rewrited, acc, VARSIZE(acc));
|
||||||
pfree(acc);
|
pfree(acc);
|
||||||
|
|
||||||
PG_RETURN_POINTER(rewrited);
|
PG_RETURN_POINTER(rewrited);
|
||||||
@ -481,7 +481,7 @@ tsquery_rewrite(PG_FUNCTION_ARGS)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rewrited->len = HDRSIZEQT;
|
SET_VARSIZE(rewrited, HDRSIZEQT);
|
||||||
rewrited->size = 0;
|
rewrited->size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -529,7 +529,7 @@ tsquery_rewrite_query(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
if (!tree)
|
if (!tree)
|
||||||
{
|
{
|
||||||
rewrited->len = HDRSIZEQT;
|
SET_VARSIZE(rewrited, HDRSIZEQT);
|
||||||
rewrited->size = 0;
|
rewrited->size = 0;
|
||||||
PG_FREE_IF_COPY(ex, 1);
|
PG_FREE_IF_COPY(ex, 1);
|
||||||
PG_FREE_IF_COPY(subst, 2);
|
PG_FREE_IF_COPY(subst, 2);
|
||||||
|
@ -144,9 +144,9 @@ CompareTSQ(QUERYTYPE * a, QUERYTYPE * b)
|
|||||||
{
|
{
|
||||||
return (a->size < b->size) ? -1 : 1;
|
return (a->size < b->size) ? -1 : 1;
|
||||||
}
|
}
|
||||||
else if (a->len != b->len)
|
else if (VARSIZE(a) != VARSIZE(b))
|
||||||
{
|
{
|
||||||
return (a->len < b->len) ? -1 : 1;
|
return (VARSIZE(a) < VARSIZE(b)) ? -1 : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -260,7 +260,7 @@ QTN2QT(QTNode * in, MemoryType memtype)
|
|||||||
len = COMPUTESIZE(nnode, sumlen);
|
len = COMPUTESIZE(nnode, sumlen);
|
||||||
|
|
||||||
out = (QUERYTYPE *) MEMALLOC(memtype, len);
|
out = (QUERYTYPE *) MEMALLOC(memtype, len);
|
||||||
out->len = len;
|
SET_VARSIZE(out, len);
|
||||||
out->size = nnode;
|
out->size = nnode;
|
||||||
|
|
||||||
state.curitem = GETQUERY(out);
|
state.curitem = GETQUERY(out);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user