From 9f652d430fbd1e757caaec9fe64d3e94c8693158 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 28 Feb 2007 22:44:38 +0000 Subject: [PATCH] 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. --- contrib/hstore/hstore.h | 5 +++-- contrib/hstore/hstore_gist.c | 23 ++++++++++---------- contrib/hstore/hstore_io.c | 6 +++--- contrib/hstore/hstore_op.c | 22 +++++++++---------- contrib/intarray/_int.h | 8 +++---- contrib/intarray/_int_bool.c | 2 +- contrib/intarray/_intbig_gist.c | 18 ++++++++-------- contrib/ltree/_ltree_gist.c | 15 ++++++------- contrib/ltree/_ltree_op.c | 16 +++++++------- contrib/ltree/ltree.h | 20 +++++++++--------- contrib/ltree/ltree_gist.c | 36 ++++++++++++++++---------------- contrib/ltree/ltree_io.c | 8 +++---- contrib/ltree/ltree_op.c | 19 +++++++++-------- contrib/ltree/ltxtquery_io.c | 4 ++-- contrib/pg_trgm/trgm.h | 13 ++++++------ contrib/pg_trgm/trgm_gist.c | 13 ++++++------ contrib/pg_trgm/trgm_op.c | 6 +++--- contrib/tsearch2/gistidx.c | 23 ++++++++++---------- contrib/tsearch2/gistidx.h | 8 +++---- contrib/tsearch2/query.c | 8 +++---- contrib/tsearch2/query.h | 4 ++-- contrib/tsearch2/query_rewrite.c | 16 +++++++------- contrib/tsearch2/query_support.c | 4 ++-- contrib/tsearch2/query_util.c | 2 +- 24 files changed, 152 insertions(+), 147 deletions(-) diff --git a/contrib/hstore/hstore.h b/contrib/hstore/hstore.h index 20ae203416..a601906764 100644 --- a/contrib/hstore/hstore.h +++ b/contrib/hstore/hstore.h @@ -2,6 +2,7 @@ #define __HSTORE_H__ #include "postgres.h" + #include "funcapi.h" #include "access/gist.h" #include "access/itup.h" @@ -23,12 +24,12 @@ typedef struct typedef struct { - int4 len; + int32 vl_len_; /* varlena header (do not touch directly!) */ int4 size; char data[1]; } HStore; -#define HSHRDSIZE (2*sizeof(int4)) +#define HSHRDSIZE (VARHDRSZ + sizeof(int4)) #define CALCDATASIZE(x, lenstr) ( (x) * sizeof(HEntry) + HSHRDSIZE + (lenstr) ) #define ARRPTR(x) ( (HEntry*) ( (char*)(x) + HSHRDSIZE ) ) #define STRPTR(x) ( (char*)(x) + HSHRDSIZE + ( sizeof(HEntry) * ((HStore*)x)->size ) ) diff --git a/contrib/hstore/hstore_gist.c b/contrib/hstore/hstore_gist.c index 4220a5541d..c3923dacf2 100644 --- a/contrib/hstore/hstore_gist.c +++ b/contrib/hstore/hstore_gist.c @@ -2,7 +2,6 @@ #include "access/gist.h" #include "access/itup.h" -/*#include "access/rtree.h"*/ #include "crc32.h" /* bigint defines */ @@ -38,7 +37,7 @@ typedef char *BITVECP; typedef struct { - int4 len; + int32 vl_len_; /* varlena header (do not touch directly!) */ int4 flag; char data[1]; } GISTTYPE; @@ -47,7 +46,7 @@ typedef struct #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 GETSIGN(x) ( (BITVECP)( (char*)x+GTHDRSIZE ) ) @@ -112,14 +111,13 @@ ghstore_compress(PG_FUNCTION_ARGS) if (entry->leafkey) { - GISTTYPE *res = (GISTTYPE *) palloc(CALCGTSIZE(0)); + GISTTYPE *res = (GISTTYPE *) palloc0(CALCGTSIZE(0)); HStore *toastedval = (HStore *) DatumGetPointer(entry->key); HStore *val = (HStore *) DatumGetPointer(PG_DETOAST_DATUM(entry->key)); HEntry *ptr = ARRPTR(val); char *words = STRPTR(val); - memset(res, 0, CALCGTSIZE(0)); - res->len = CALCGTSIZE(0); + SET_VARSIZE(res, CALCGTSIZE(0)); while (ptr - ARRPTR(val) < val->size) { @@ -156,7 +154,7 @@ ghstore_compress(PG_FUNCTION_ARGS) ); res = (GISTTYPE *) palloc(CALCGTSIZE(ALLISTRUE)); - res->len = CALCGTSIZE(ALLISTRUE); + SET_VARSIZE(res, CALCGTSIZE(ALLISTRUE)); res->flag = ALLISTRUE; retval = (GISTENTRY *) palloc(sizeof(GISTENTRY)); @@ -286,10 +284,11 @@ ghstore_union(PG_FUNCTION_ARGS) len = CALCGTSIZE(flag); result = (GISTTYPE *) palloc(len); - *size = result->len = len; + SET_VARSIZE(result, len); result->flag = flag; if (!ISALLTRUE(result)) memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC)); + *size = len; PG_RETURN_POINTER(result); } @@ -383,13 +382,13 @@ ghstore_picksplit(PG_FUNCTION_ARGS) if (ISALLTRUE(GETENTRY(entryvec, seed_1))) { datum_l = (GISTTYPE *) palloc(GTHDRSIZE); - datum_l->len = GTHDRSIZE; + SET_VARSIZE(datum_l, GTHDRSIZE); datum_l->flag = ALLISTRUE; } else { datum_l = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN); - datum_l->len = GTHDRSIZE + SIGLEN; + SET_VARSIZE(datum_l, GTHDRSIZE + SIGLEN); datum_l->flag = 0; 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))) { datum_r = (GISTTYPE *) palloc(GTHDRSIZE); - datum_r->len = GTHDRSIZE; + SET_VARSIZE(datum_r, GTHDRSIZE); datum_r->flag = ALLISTRUE; } else { datum_r = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN); - datum_r->len = GTHDRSIZE + SIGLEN; + SET_VARSIZE(datum_r, GTHDRSIZE + SIGLEN); datum_r->flag = 0; memcpy((void *) GETSIGN(datum_r), (void *) GETSIGN(GETENTRY(entryvec, seed_2)), sizeof(BITVEC)); } diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c index ac5df49223..6a395a2b86 100644 --- a/contrib/hstore/hstore_io.c +++ b/contrib/hstore/hstore_io.c @@ -363,7 +363,7 @@ hstore_in(PG_FUNCTION_ARGS) freeHSParse(&state); len = CALCDATASIZE(0, 0); out = palloc(len); - out->len = len; + SET_VARSIZE(out, len); out->size = 0; PG_RETURN_POINTER(out); } @@ -372,7 +372,7 @@ hstore_in(PG_FUNCTION_ARGS) len = CALCDATASIZE(state.pcur, buflen); out = palloc(len); - out->len = len; + SET_VARSIZE(out, len); out->size = state.pcur; entries = ARRPTR(out); @@ -436,7 +436,7 @@ hstore_out(PG_FUNCTION_ARGS) } 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); for (i = 0; i < in->size; i++) diff --git a/contrib/hstore/hstore_op.c b/contrib/hstore/hstore_op.c index f16a58988e..ef3eb86ca3 100644 --- a/contrib/hstore/hstore_op.c +++ b/contrib/hstore/hstore_op.c @@ -105,13 +105,13 @@ delete(PG_FUNCTION_ARGS) { HStore *hs = PG_GETARG_HS(0); text *key = PG_GETARG_TEXT_P(1); - HStore *out = palloc(hs->len); + HStore *out = palloc(VARSIZE(hs)); char *ptrs, *ptrd; HEntry *es, *ed; - out->len = hs->len; + SET_VARSIZE(out, VARSIZE(hs)); out->size = hs->size; /* temporary! */ ptrs = STRPTR(hs); @@ -142,7 +142,7 @@ delete(PG_FUNCTION_ARGS) out->size = ed - ARRPTR(out); 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 *s2 = PG_GETARG_HS(1); - HStore *out = palloc(s1->len + s2->len); + HStore *out = palloc(VARSIZE(s1) + VARSIZE(s2)); char *ps1, *ps2, *pd; @@ -167,7 +167,7 @@ hs_concat(PG_FUNCTION_ARGS) *es2, *ed; - out->len = s1->len + s2->len; + SET_VARSIZE(out, VARSIZE(s1) + VARSIZE(s2)); out->size = s1->size + s2->size; ps1 = STRPTR(s1); @@ -256,7 +256,7 @@ hs_concat(PG_FUNCTION_ARGS) out->size = ed - ARRPTR(out); memmove(STRPTR(out), pd, buflen); - out->len = CALCDATASIZE(out->size, buflen); + SET_VARSIZE(out, CALCDATASIZE(out->size, buflen)); } PG_FREE_IF_COPY(s1, 0); @@ -277,7 +277,7 @@ tconvert(PG_FUNCTION_ARGS) len = CALCDATASIZE(1, VARSIZE(key) + VARSIZE(val) - 2 * VARHDRSZ); out = palloc(len); - out->len = len; + SET_VARSIZE(out, len); out->size = 1; ARRPTR(out)->keylen = VARSIZE(key) - VARHDRSZ; @@ -399,8 +399,8 @@ setup_firstcall(FuncCallContext *funcctx, HStore * hs) st = (AKStore *) palloc(sizeof(AKStore)); st->i = 0; - st->hs = (HStore *) palloc(hs->len); - memcpy(st->hs, hs, hs->len); + st->hs = (HStore *) palloc(VARSIZE(hs)); + memcpy(st->hs, hs, VARSIZE(hs)); funcctx->user_fctx = (void *) st; MemoryContextSwitchTo(oldcontext); @@ -568,8 +568,8 @@ each(PG_FUNCTION_ARGS) oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); st = (AKStore *) palloc(sizeof(AKStore)); st->i = 0; - st->hs = (HStore *) palloc(hs->len); - memcpy(st->hs, hs, hs->len); + st->hs = (HStore *) palloc(VARSIZE(hs)); + memcpy(st->hs, hs, VARSIZE(hs)); funcctx->user_fctx = (void *) st; tupdesc = RelationNameGetTupleDesc("hs_each"); diff --git a/contrib/intarray/_int.h b/contrib/intarray/_int.h index cee970d1b1..97e6fe642f 100644 --- a/contrib/intarray/_int.h +++ b/contrib/intarray/_int.h @@ -85,7 +85,7 @@ typedef char *BITVECP; */ typedef struct { - int4 len; + int32 vl_len_; /* varlena header (do not touch directly!) */ int4 flag; char data[1]; } GISTTYPE; @@ -94,7 +94,7 @@ typedef struct #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 GETSIGN(x) ( (BITVECP)( (char*)x+GTHDRSIZE ) ) @@ -145,12 +145,12 @@ typedef struct ITEM typedef struct { - int4 len; + int32 vl_len_; /* varlena header (do not touch directly!) */ int4 size; char data[1]; } QUERYTYPE; -#define HDRSIZEQT ( 2*sizeof(int4) ) +#define HDRSIZEQT (VARHDRSZ + sizeof(int4)) #define COMPUTESIZE(size) ( HDRSIZEQT + size * sizeof(ITEM) ) #define GETQUERY(x) (ITEM*)( (char*)(x)+HDRSIZEQT ) diff --git a/contrib/intarray/_int_bool.c b/contrib/intarray/_int_bool.c index b6a5d1b1e8..2a9d80bfdb 100644 --- a/contrib/intarray/_int_bool.c +++ b/contrib/intarray/_int_bool.c @@ -465,7 +465,7 @@ bqarr_in(PG_FUNCTION_ARGS) commonlen = COMPUTESIZE(state.num); query = (QUERYTYPE *) palloc(commonlen); - query->len = commonlen; + SET_VARSIZE(query, commonlen); query->size = state.num; ptr = GETQUERY(query); diff --git a/contrib/intarray/_intbig_gist.c b/contrib/intarray/_intbig_gist.c index cb80d8f6f2..ffbbe71a95 100644 --- a/contrib/intarray/_intbig_gist.c +++ b/contrib/intarray/_intbig_gist.c @@ -147,7 +147,7 @@ g_intbig_compress(PG_FUNCTION_ARGS) ArrayType *in = (ArrayType *) PG_DETOAST_DATUM(entry->key); int4 *ptr; int num; - GISTTYPE *res = (GISTTYPE *) palloc(CALCGTSIZE(0)); + GISTTYPE *res = (GISTTYPE *) palloc0(CALCGTSIZE(0)); CHECKARRVALID(in); if (ARRISVOID(in)) @@ -160,8 +160,7 @@ g_intbig_compress(PG_FUNCTION_ARGS) ptr = ARRPTR(in); num = ARRNELEMS(in); } - memset(res, 0, CALCGTSIZE(0)); - res->len = CALCGTSIZE(0); + SET_VARSIZE(res, CALCGTSIZE(0)); while (num--) { @@ -192,7 +191,7 @@ g_intbig_compress(PG_FUNCTION_ARGS) ); res = (GISTTYPE *) palloc(CALCGTSIZE(ALLISTRUE)); - res->len = CALCGTSIZE(ALLISTRUE); + SET_VARSIZE(res, CALCGTSIZE(ALLISTRUE)); res->flag = ALLISTRUE; retval = (GISTENTRY *) palloc(sizeof(GISTENTRY)); @@ -292,10 +291,11 @@ g_intbig_union(PG_FUNCTION_ARGS) len = CALCGTSIZE(flag); result = (GISTTYPE *) palloc(len); - *size = result->len = len; + SET_VARSIZE(result, len); result->flag = flag; if (!ISALLTRUE(result)) memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC)); + *size = len; PG_RETURN_POINTER(result); } @@ -389,26 +389,26 @@ g_intbig_picksplit(PG_FUNCTION_ARGS) if (ISALLTRUE(GETENTRY(entryvec, seed_1))) { datum_l = (GISTTYPE *) palloc(GTHDRSIZE); - datum_l->len = GTHDRSIZE; + SET_VARSIZE(datum_l, GTHDRSIZE); datum_l->flag = ALLISTRUE; } else { datum_l = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN); - datum_l->len = GTHDRSIZE + SIGLEN; + SET_VARSIZE(datum_l, GTHDRSIZE + SIGLEN); datum_l->flag = 0; memcpy((void *) GETSIGN(datum_l), (void *) GETSIGN(GETENTRY(entryvec, seed_1)), sizeof(BITVEC)); } if (ISALLTRUE(GETENTRY(entryvec, seed_2))) { datum_r = (GISTTYPE *) palloc(GTHDRSIZE); - datum_r->len = GTHDRSIZE; + SET_VARSIZE(datum_r, GTHDRSIZE); datum_r->flag = ALLISTRUE; } else { datum_r = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN); - datum_r->len = GTHDRSIZE + SIGLEN; + SET_VARSIZE(datum_r, GTHDRSIZE + SIGLEN); datum_r->flag = 0; memcpy((void *) GETSIGN(datum_r), (void *) GETSIGN(GETENTRY(entryvec, seed_2)), sizeof(BITVEC)); } diff --git a/contrib/ltree/_ltree_gist.c b/contrib/ltree/_ltree_gist.c index 0bac647547..4ce8864fb3 100644 --- a/contrib/ltree/_ltree_gist.c +++ b/contrib/ltree/_ltree_gist.c @@ -94,7 +94,7 @@ _ltree_compress(PG_FUNCTION_ARGS) errmsg("array must not contain nulls"))); key = (ltree_gist *) palloc(len); - key->len = len; + SET_VARSIZE(key, len); key->flag = 0; MemSet(LTG_SIGN(key), 0, ASIGLEN); @@ -124,7 +124,7 @@ _ltree_compress(PG_FUNCTION_ARGS) ); len = LTG_HDRSIZE; key = (ltree_gist *) palloc(len); - key->len = len; + SET_VARSIZE(key, len); key->flag = LTG_ALLTRUE; retval = (GISTENTRY *) palloc(sizeof(GISTENTRY)); @@ -204,10 +204,11 @@ _ltree_union(PG_FUNCTION_ARGS) len = LTG_HDRSIZE + ((flag & LTG_ALLTRUE) ? 0 : ASIGLEN); result = (ltree_gist *) palloc(len); - *size = result->len = len; + SET_VARSIZE(result, len); result->flag = flag; if (!LTG_ISALLTRUE(result)) memcpy((void *) LTG_SIGN(result), (void *) base, sizeof(ABITVEC)); + *size = len; PG_RETURN_POINTER(result); } @@ -340,26 +341,26 @@ _ltree_picksplit(PG_FUNCTION_ARGS) if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_1))) { datum_l = (ltree_gist *) palloc(LTG_HDRSIZE); - datum_l->len = LTG_HDRSIZE; + SET_VARSIZE(datum_l, LTG_HDRSIZE); datum_l->flag = LTG_ALLTRUE; } else { 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; memcpy((void *) LTG_SIGN(datum_l), (void *) LTG_SIGN(GETENTRY(entryvec, seed_1)), sizeof(ABITVEC)); } if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_2))) { datum_r = (ltree_gist *) palloc(LTG_HDRSIZE); - datum_r->len = LTG_HDRSIZE; + SET_VARSIZE(datum_r, LTG_HDRSIZE); datum_r->flag = LTG_ALLTRUE; } else { 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; memcpy((void *) LTG_SIGN(datum_r), (void *) LTG_SIGN(GETENTRY(entryvec, seed_2)), sizeof(ABITVEC)); } diff --git a/contrib/ltree/_ltree_op.c b/contrib/ltree/_ltree_op.c index ff8eec793a..f93d2bb888 100644 --- a/contrib/ltree/_ltree_op.c +++ b/contrib/ltree/_ltree_op.c @@ -215,8 +215,8 @@ _ltree_extract_isparent(PG_FUNCTION_ARGS) PG_RETURN_NULL(); } - item = (ltree *) palloc(found->len); - memcpy(item, found, found->len); + item = (ltree *) palloc(VARSIZE(found)); + memcpy(item, found, VARSIZE(found)); PG_FREE_IF_COPY(la, 0); PG_FREE_IF_COPY(query, 1); @@ -238,8 +238,8 @@ _ltree_extract_risparent(PG_FUNCTION_ARGS) PG_RETURN_NULL(); } - item = (ltree *) palloc(found->len); - memcpy(item, found, found->len); + item = (ltree *) palloc(VARSIZE(found)); + memcpy(item, found, VARSIZE(found)); PG_FREE_IF_COPY(la, 0); PG_FREE_IF_COPY(query, 1); @@ -261,8 +261,8 @@ _ltq_extract_regex(PG_FUNCTION_ARGS) PG_RETURN_NULL(); } - item = (ltree *) palloc(found->len); - memcpy(item, found, found->len); + item = (ltree *) palloc(VARSIZE(found)); + memcpy(item, found, VARSIZE(found)); PG_FREE_IF_COPY(la, 0); PG_FREE_IF_COPY(query, 1); @@ -284,8 +284,8 @@ _ltxtq_extract_exec(PG_FUNCTION_ARGS) PG_RETURN_NULL(); } - item = (ltree *) palloc(found->len); - memcpy(item, found, found->len); + item = (ltree *) palloc(VARSIZE(found)); + memcpy(item, found, VARSIZE(found)); PG_FREE_IF_COPY(la, 0); PG_FREE_IF_COPY(query, 1); diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h index 1ff5707fb1..d627c45bd3 100644 --- a/contrib/ltree/ltree.h +++ b/contrib/ltree/ltree.h @@ -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__ #define __LTREE_H__ @@ -18,12 +18,12 @@ typedef struct typedef struct { - int32 len; + int32 vl_len_; /* varlena header (do not touch directly!) */ uint16 numlevel; char data[1]; } 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 ) ) @@ -68,14 +68,14 @@ typedef struct typedef struct { - int32 len; + int32 vl_len_; /* varlena header (do not touch directly!) */ uint16 numlevel; uint16 firstgood; uint16 flag; char data[1]; } 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_HASNOT 0x01 @@ -105,12 +105,12 @@ typedef struct ITEM */ typedef struct { - int4 len; + int32 vl_len_; /* varlena header (do not touch directly!) */ int4 size; char data[1]; } ltxtquery; -#define HDRSIZEQT MAXALIGN( 2*sizeof(int4) ) +#define HDRSIZEQT MAXALIGN(VARHDRSZ + sizeof(int4)) #define COMPUTESIZE(size,lenofoperand) ( HDRSIZEQT + (size) * sizeof(ITEM) + (lenofoperand) ) #define GETQUERY(x) (ITEM*)( (char*)(x)+HDRSIZEQT ) #define GETOPERAND(x) ( (char*)GETQUERY(x) + ((ltxtquery*)x)->size * sizeof(ITEM) ) @@ -205,7 +205,7 @@ typedef unsigned char *BITVECP; typedef struct { - int4 len; + int32 vl_len_; /* varlena header (do not touch directly!) */ uint32 flag; char data[1]; } ltree_gist; @@ -214,14 +214,14 @@ typedef struct #define LTG_ALLTRUE 0x02 #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_NODE(x) ( (ltree*)( ((char*)(x))+LTG_HDRSIZE ) ) #define LTG_ISONENODE(x) ( ((ltree_gist*)(x))->flag & LTG_ONENODE ) #define LTG_ISALLTRUE(x) ( ((ltree_gist*)(x))->flag & LTG_ALLTRUE ) #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_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_GETLNODE(x) ( LTG_ISONENODE(x) ? LTG_NODE(x) : LTG_LNODE(x) ) diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c index 0239c5fe99..b74110d8f5 100644 --- a/contrib/ltree/ltree_gist.c +++ b/contrib/ltree/ltree_gist.c @@ -1,7 +1,7 @@ /* * GiST support for ltree * Teodor Sigaev - * $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" @@ -71,12 +71,12 @@ ltree_compress(PG_FUNCTION_ARGS) { /* ltree */ ltree_gist *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->len = len; + SET_VARSIZE(key, len); 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)); gistentryinit(*retval, PointerGetDatum(key), @@ -225,10 +225,10 @@ ltree_union(PG_FUNCTION_ARGS) } 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->len = *size; + SET_VARSIZE(result, *size); result->flag = 0; if (isalltrue) @@ -236,11 +236,11 @@ ltree_union(PG_FUNCTION_ARGS) else 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) result->flag |= LTG_NORIGHT; else - memcpy((void *) LTG_RNODE(result), (void *) right, right->len); + memcpy((void *) LTG_RNODE(result), (void *) right, VARSIZE(right)); PG_RETURN_POINTER(result); } @@ -399,36 +399,36 @@ ltree_picksplit(PG_FUNCTION_ARGS) lu_l = LTG_GETLNODE(GETENTRY(entryvec, array[FirstOffsetNumber].index)); 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->len = size; + SET_VARSIZE(lu, size); lu->flag = 0; if (lisat) lu->flag |= LTG_ALLTRUE; else 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) lu->flag |= LTG_NORIGHT; 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)); 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->len = size; + SET_VARSIZE(ru, size); ru->flag = 0; if (risat) ru->flag |= LTG_ALLTRUE; else 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) ru->flag |= LTG_NORIGHT; 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_rdatum = PointerGetDatum(ru); @@ -459,9 +459,9 @@ gist_isparent(ltree_gist * key, ltree * query) static ltree * 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; } diff --git a/contrib/ltree/ltree_io.c b/contrib/ltree/ltree_io.c index eb22894079..a6cb357d27 100644 --- a/contrib/ltree/ltree_io.c +++ b/contrib/ltree/ltree_io.c @@ -1,7 +1,7 @@ /* * in/out function for ltree and lquery * Teodor Sigaev - * $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" @@ -119,7 +119,7 @@ ltree_in(PG_FUNCTION_ARGS) errdetail("Unexpected end of line."))); result = (ltree *) palloc(LTREE_HDRSIZE + totallen); - result->len = LTREE_HDRSIZE + totallen; + SET_VARSIZE(result, LTREE_HDRSIZE + totallen); result->numlevel = lptr - list; curlevel = LTREE_FIRST(result); lptr = list; @@ -144,7 +144,7 @@ ltree_out(PG_FUNCTION_ARGS) int i; ltree_level *curlevel; - ptr = buf = (char *) palloc(in->len); + ptr = buf = (char *) palloc(VARSIZE(in)); curlevel = LTREE_FIRST(in); for (i = 0; i < in->numlevel; i++) { @@ -449,7 +449,7 @@ lquery_in(PG_FUNCTION_ARGS) } result = (lquery *) palloc(totallen); - result->len = totallen; + SET_VARSIZE(result, totallen); result->numlevel = num; result->firstgood = 0; result->flag = 0; diff --git a/contrib/ltree/ltree_op.c b/contrib/ltree/ltree_op.c index 5f80394a71..be2733273f 100644 --- a/contrib/ltree/ltree_op.c +++ b/contrib/ltree/ltree_op.c @@ -1,7 +1,7 @@ /* * op function for ltree * Teodor Sigaev - * $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" @@ -230,7 +230,7 @@ inner_subltree(ltree * t, int4 startpos, int4 endpos) } res = (ltree *) palloc(LTREE_HDRSIZE + (end - start)); - res->len = LTREE_HDRSIZE + (end - start); + SET_VARSIZE(res, LTREE_HDRSIZE + (end - start)); res->numlevel = endpos - startpos; memcpy(LTREE_FIRST(res), start, end - start); @@ -286,13 +286,14 @@ ltree_concat(ltree * a, ltree * b) { ltree *r; - r = (ltree *) palloc(a->len + b->len - LTREE_HDRSIZE); - r->len = a->len + b->len - LTREE_HDRSIZE; + r = (ltree *) palloc(VARSIZE(a) + VARSIZE(b) - LTREE_HDRSIZE); + SET_VARSIZE(r, VARSIZE(a) + VARSIZE(b) - LTREE_HDRSIZE); r->numlevel = a->numlevel + b->numlevel; - memcpy(LTREE_FIRST(r), LTREE_FIRST(a), a->len - LTREE_HDRSIZE); - memcpy(((char *) LTREE_FIRST(r)) + a->len - LTREE_HDRSIZE, LTREE_FIRST(b), b->len - - LTREE_HDRSIZE); + memcpy(LTREE_FIRST(r), LTREE_FIRST(a), VARSIZE(a) - LTREE_HDRSIZE); + memcpy(((char *) LTREE_FIRST(r)) + VARSIZE(a) - LTREE_HDRSIZE, + LTREE_FIRST(b), + VARSIZE(b) - LTREE_HDRSIZE); return r; } @@ -476,7 +477,7 @@ lca_inner(ltree ** a, int len) } res = (ltree *) palloc(reslen); - res->len = reslen; + SET_VARSIZE(res, reslen); res->numlevel = num; l1 = LTREE_FIRST(*a); @@ -542,7 +543,7 @@ ltree2text(PG_FUNCTION_ARGS) ltree_level *curlevel; text *out; - out = (text *) palloc(in->len + VARHDRSZ); + out = (text *) palloc(VARSIZE(in) + VARHDRSZ); ptr = VARDATA(out); curlevel = LTREE_FIRST(in); for (i = 0; i < in->numlevel; i++) diff --git a/contrib/ltree/ltxtquery_io.c b/contrib/ltree/ltxtquery_io.c index ca6325adf7..904d4490dc 100644 --- a/contrib/ltree/ltxtquery_io.c +++ b/contrib/ltree/ltxtquery_io.c @@ -1,7 +1,7 @@ /* * txtquery io * Teodor Sigaev - * $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" @@ -337,7 +337,7 @@ queryin(char *buf) /* make finish struct */ commonlen = COMPUTESIZE(state.num, state.sumlen); query = (ltxtquery *) palloc(commonlen); - query->len = commonlen; + SET_VARSIZE(query, commonlen); query->size = state.num; ptr = GETQUERY(query); diff --git a/contrib/pg_trgm/trgm.h b/contrib/pg_trgm/trgm.h index b7674c52b5..bc2a4dc44a 100644 --- a/contrib/pg_trgm/trgm.h +++ b/contrib/pg_trgm/trgm.h @@ -31,12 +31,12 @@ typedef char trgm[3]; typedef struct { - int4 len; + int32 vl_len_; /* varlena header (do not touch directly!) */ uint8 flag; char data[1]; } TRGM; -#define TRGMHRDSIZE (sizeof(int4)+sizeof(uint8)) +#define TRGMHDRSIZE (VARHDRSZ + sizeof(uint8)) /* gist */ #define BITBYTE 8 @@ -70,12 +70,13 @@ typedef char *BITVECP; #define ISSIGNKEY(x) ( ((TRGM*)x)->flag & SIGNKEY ) #define ISALLTRUE(x) ( ((TRGM*)x)->flag & ALLISTRUE ) -#define CALCGTSIZE(flag, len) ( TRGMHRDSIZE + ( ( (flag) & ARRKEY ) ? ((len)*sizeof(trgm)) : (((flag) & ALLISTRUE) ? 0 : SIGLEN) ) ) -#define GETSIGN(x) ( (BITVECP)( (char*)x+TRGMHRDSIZE ) ) -#define GETARR(x) ( (trgm*)( (char*)x+TRGMHRDSIZE ) ) -#define ARRNELEM(x) ( ( ((TRGM*)x)->len - TRGMHRDSIZE )/sizeof(trgm) ) +#define CALCGTSIZE(flag, len) ( TRGMHDRSIZE + ( ( (flag) & ARRKEY ) ? ((len)*sizeof(trgm)) : (((flag) & ALLISTRUE) ? 0 : SIGLEN) ) ) +#define GETSIGN(x) ( (BITVECP)( (char*)x+TRGMHDRSIZE ) ) +#define GETARR(x) ( (trgm*)( (char*)x+TRGMHDRSIZE ) ) +#define ARRNELEM(x) ( ( VARSIZE(x) - TRGMHDRSIZE )/sizeof(trgm) ) extern float4 trgm_limit; + TRGM *generate_trgm(char *str, int slen); float4 cnt_sml(TRGM * trg1, TRGM * trg2); diff --git a/contrib/pg_trgm/trgm_gist.c b/contrib/pg_trgm/trgm_gist.c index 41a827ae0c..476cb1b976 100644 --- a/contrib/pg_trgm/trgm_gist.c +++ b/contrib/pg_trgm/trgm_gist.c @@ -120,7 +120,7 @@ gtrgm_compress(PG_FUNCTION_ARGS) len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0); res = (TRGM *) palloc(len); - res->len = len; + SET_VARSIZE(res, len); res->flag = SIGNKEY | ALLISTRUE; retval = (GISTENTRY *) palloc(sizeof(GISTENTRY)); @@ -235,10 +235,11 @@ gtrgm_union(PG_FUNCTION_ARGS) flag |= SIGNKEY; len = CALCGTSIZE(flag, 0); result = (TRGM *) palloc(len); - *size = result->len = len; + SET_VARSIZE(result, len); result->flag = flag; if (!ISALLTRUE(result)) memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC)); + *size = len; PG_RETURN_POINTER(result); } @@ -486,26 +487,26 @@ gtrgm_picksplit(PG_FUNCTION_ARGS) if (cache[seed_1].allistrue) { 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; } else { datum_l = (TRGM *) palloc(CALCGTSIZE(SIGNKEY, 0)); - datum_l->len = CALCGTSIZE(SIGNKEY, 0); + SET_VARSIZE(datum_l, CALCGTSIZE(SIGNKEY, 0)); datum_l->flag = SIGNKEY; memcpy((void *) GETSIGN(datum_l), (void *) cache[seed_1].sign, sizeof(BITVEC)); } if (cache[seed_2].allistrue) { 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; } else { datum_r = (TRGM *) palloc(CALCGTSIZE(SIGNKEY, 0)); - datum_r->len = CALCGTSIZE(SIGNKEY, 0); + SET_VARSIZE(datum_r, CALCGTSIZE(SIGNKEY, 0)); datum_r->flag = SIGNKEY; memcpy((void *) GETSIGN(datum_r), (void *) cache[seed_2].sign, sizeof(BITVEC)); } diff --git a/contrib/pg_trgm/trgm_op.c b/contrib/pg_trgm/trgm_op.c index e247756a39..e9afef4b21 100644 --- a/contrib/pg_trgm/trgm_op.c +++ b/contrib/pg_trgm/trgm_op.c @@ -70,9 +70,9 @@ generate_trgm(char *str, int slen) int wl, 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->len = TRGMHRDSIZE; + SET_VARSIZE(trg, TRGMHDRSIZE); if (slen + LPADDING + RPADDING < 3 || slen == 0) return trg; @@ -178,7 +178,7 @@ generate_trgm(char *str, int slen) len = unique_array(GETARR(trg), len); } - trg->len = CALCGTSIZE(ARRKEY, len); + SET_VARSIZE(trg, CALCGTSIZE(ARRKEY, len)); return trg; } diff --git a/contrib/tsearch2/gistidx.c b/contrib/tsearch2/gistidx.c index a4d9b2312e..14fdecb0b8 100644 --- a/contrib/tsearch2/gistidx.c +++ b/contrib/tsearch2/gistidx.c @@ -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" @@ -163,7 +163,7 @@ gtsvector_compress(PG_FUNCTION_ARGS) len = CALCGTSIZE(ARRKEY, val->size); res = (GISTTYPE *) palloc(len); - res->len = len; + SET_VARSIZE(res, len); res->flag = ARRKEY; arr = GETARR(res); len = val->size; @@ -183,17 +183,17 @@ gtsvector_compress(PG_FUNCTION_ARGS) */ len = CALCGTSIZE(ARRKEY, len); res = (GISTTYPE *) repalloc((void *) res, len); - res->len = len; + SET_VARSIZE(res, len); } /* make signature, if array is too long */ - if (res->len > TOAST_INDEX_TARGET) + if (VARSIZE(res) > TOAST_INDEX_TARGET) { GISTTYPE *ressign; len = CALCGTSIZE(SIGNKEY, 0); ressign = (GISTTYPE *) palloc(len); - ressign->len = len; + SET_VARSIZE(ressign, len); ressign->flag = SIGNKEY; makesign(GETSIGN(ressign), res); res = ressign; @@ -219,7 +219,7 @@ gtsvector_compress(PG_FUNCTION_ARGS) len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0); res = (GISTTYPE *) palloc(len); - res->len = len; + SET_VARSIZE(res, len); res->flag = SIGNKEY | ALLISTRUE; retval = (GISTENTRY *) palloc(sizeof(GISTENTRY)); @@ -375,10 +375,11 @@ gtsvector_union(PG_FUNCTION_ARGS) flag |= SIGNKEY; len = CALCGTSIZE(flag, 0); result = (GISTTYPE *) palloc(len); - *size = result->len = len; + SET_VARSIZE(result, len); result->flag = flag; if (!ISALLTRUE(result)) memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC)); + *size = len; PG_RETURN_POINTER(result); } @@ -627,26 +628,26 @@ gtsvector_picksplit(PG_FUNCTION_ARGS) if (cache[seed_1].allistrue) { 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; } else { datum_l = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY, 0)); - datum_l->len = CALCGTSIZE(SIGNKEY, 0); + SET_VARSIZE(datum_l, CALCGTSIZE(SIGNKEY, 0)); datum_l->flag = SIGNKEY; memcpy((void *) GETSIGN(datum_l), (void *) cache[seed_1].sign, sizeof(BITVEC)); } if (cache[seed_2].allistrue) { 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; } else { datum_r = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY, 0)); - datum_r->len = CALCGTSIZE(SIGNKEY, 0); + SET_VARSIZE(datum_r, CALCGTSIZE(SIGNKEY, 0)); datum_r->flag = SIGNKEY; memcpy((void *) GETSIGN(datum_r), (void *) cache[seed_2].sign, sizeof(BITVEC)); } diff --git a/contrib/tsearch2/gistidx.h b/contrib/tsearch2/gistidx.h index 9545946e31..5362584b80 100644 --- a/contrib/tsearch2/gistidx.h +++ b/contrib/tsearch2/gistidx.h @@ -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__ #define __GISTIDX_H__ @@ -39,7 +39,7 @@ typedef char *BITVECP; */ typedef struct { - int4 len; + int32 vl_len_; /* varlena header (do not touch directly!) */ int4 flag; char data[1]; } GISTTYPE; @@ -52,11 +52,11 @@ typedef struct #define ISSIGNKEY(x) ( ((GISTTYPE*)(x))->flag & SIGNKEY ) #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 GETSIGN(x) ( (BITVECP)( (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 diff --git a/contrib/tsearch2/query.c b/contrib/tsearch2/query.c index eb2d30e159..62a305ed1e 100644 --- a/contrib/tsearch2/query.c +++ b/contrib/tsearch2/query.c @@ -658,7 +658,7 @@ static QUERYTYPE * (errmsg("tsearch query doesn't contain lexeme(s): \"%s\"", state.buffer))); query = (QUERYTYPE *) palloc(HDRSIZEQT); - query->len = HDRSIZEQT; + SET_VARSIZE(query, HDRSIZEQT); query->size = 0; return query; } @@ -666,7 +666,7 @@ static QUERYTYPE * /* make finish struct */ commonlen = COMPUTESIZE(state.num, state.sumlen); query = (QUERYTYPE *) palloc(commonlen); - query->len = commonlen; + SET_VARSIZE(query, commonlen); query->size = state.num; ptr = GETQUERY(query); @@ -961,7 +961,7 @@ to_tsquery(PG_FUNCTION_ARGS) res = clean_fakeval_v2(GETQUERY(query), &len); if (!res) { - query->len = HDRSIZEQT; + SET_VARSIZE(query, HDRSIZEQT); query->size = 0; PG_RETURN_POINTER(query); } @@ -1016,7 +1016,7 @@ plainto_tsquery(PG_FUNCTION_ARGS) res = clean_fakeval_v2(GETQUERY(query), &len); if (!res) { - query->len = HDRSIZEQT; + SET_VARSIZE(query, HDRSIZEQT); query->size = 0; PG_RETURN_POINTER(query); } diff --git a/contrib/tsearch2/query.h b/contrib/tsearch2/query.h index b4d586a684..44f8701213 100644 --- a/contrib/tsearch2/query.h +++ b/contrib/tsearch2/query.h @@ -28,12 +28,12 @@ typedef struct ITEM */ typedef struct { - int4 len; + int32 vl_len_; /* varlena header (do not touch directly!) */ int4 size; char data[1]; } QUERYTYPE; -#define HDRSIZEQT ( 2 * sizeof(int4) ) +#define HDRSIZEQT ( VARHDRSZ + sizeof(int4) ) #define COMPUTESIZE(size,lenofoperand) ( HDRSIZEQT + (size) * sizeof(ITEM) + (lenofoperand) ) #define GETQUERY(x) (ITEM*)( (char*)(x)+HDRSIZEQT ) #define GETOPERAND(x) ( (char*)GETQUERY(x) + ((QUERYTYPE*)(x))->size * sizeof(ITEM) ) diff --git a/contrib/tsearch2/query_rewrite.c b/contrib/tsearch2/query_rewrite.c index 63d8140a6c..0604a49927 100644 --- a/contrib/tsearch2/query_rewrite.c +++ b/contrib/tsearch2/query_rewrite.c @@ -250,7 +250,7 @@ rewrite_accum(PG_FUNCTION_ARGS) if (acc == NULL || PG_ARGISNULL(0)) { acc = (QUERYTYPE *) MEMALLOC(AggMemory, sizeof(QUERYTYPE)); - acc->len = HDRSIZEQT; + SET_VARSIZE(acc, HDRSIZEQT); acc->size = 0; } @@ -287,7 +287,7 @@ rewrite_accum(PG_FUNCTION_ARGS) if (!acc->size) { - if (acc->len > HDRSIZEQT) + if (VARSIZE(acc) > HDRSIZEQT) { pfree(elemsp); PG_RETURN_POINTER(acc); @@ -328,7 +328,7 @@ rewrite_accum(PG_FUNCTION_ARGS) else { acc = (QUERYTYPE *) MEMALLOC(AggMemory, HDRSIZEQT * 2); - acc->len = HDRSIZEQT * 2; + SET_VARSIZE(acc, HDRSIZEQT * 2); acc->size = 0; } } @@ -353,12 +353,12 @@ rewrite_finish(PG_FUNCTION_ARGS) if (acc == NULL || PG_ARGISNULL(0) || acc->size == 0) { acc = (QUERYTYPE *) palloc(sizeof(QUERYTYPE)); - acc->len = HDRSIZEQT; + SET_VARSIZE(acc, HDRSIZEQT); acc->size = 0; } - rewrited = (QUERYTYPE *) palloc(acc->len); - memcpy(rewrited, acc, acc->len); + rewrited = (QUERYTYPE *) palloc(VARSIZE(acc)); + memcpy(rewrited, acc, VARSIZE(acc)); pfree(acc); PG_RETURN_POINTER(rewrited); @@ -481,7 +481,7 @@ tsquery_rewrite(PG_FUNCTION_ARGS) } else { - rewrited->len = HDRSIZEQT; + SET_VARSIZE(rewrited, HDRSIZEQT); rewrited->size = 0; } @@ -529,7 +529,7 @@ tsquery_rewrite_query(PG_FUNCTION_ARGS) if (!tree) { - rewrited->len = HDRSIZEQT; + SET_VARSIZE(rewrited, HDRSIZEQT); rewrited->size = 0; PG_FREE_IF_COPY(ex, 1); PG_FREE_IF_COPY(subst, 2); diff --git a/contrib/tsearch2/query_support.c b/contrib/tsearch2/query_support.c index dfdd714073..0fc6fe334d 100644 --- a/contrib/tsearch2/query_support.c +++ b/contrib/tsearch2/query_support.c @@ -144,9 +144,9 @@ CompareTSQ(QUERYTYPE * a, QUERYTYPE * b) { 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 { diff --git a/contrib/tsearch2/query_util.c b/contrib/tsearch2/query_util.c index efa74fe053..083d173d13 100644 --- a/contrib/tsearch2/query_util.c +++ b/contrib/tsearch2/query_util.c @@ -260,7 +260,7 @@ QTN2QT(QTNode * in, MemoryType memtype) len = COMPUTESIZE(nnode, sumlen); out = (QUERYTYPE *) MEMALLOC(memtype, len); - out->len = len; + SET_VARSIZE(out, len); out->size = nnode; state.curitem = GETQUERY(out); -- 2.40.0