diff options
| author | Teodor Sigaev | 2004-03-30 15:45:33 +0000 |
|---|---|---|
| committer | Teodor Sigaev | 2004-03-30 15:45:33 +0000 |
| commit | f2c064afcbfad4999d7e9ccb644a8aa99463a1ac (patch) | |
| tree | a630e42b10478f1d88b637a96114945016faa2e0 /contrib/ltree | |
| parent | 8d9a28eeefc477638cca58d0685635271eae49d6 (diff) | |
Cleanup vectors of GISTENTRY and eliminate problem with 64-bit strict-aligned
boxes. Change interface to user-defined GiST support methods union and
picksplit. Now instead of bytea struct it used special GistEntryVector
structure.
Diffstat (limited to 'contrib/ltree')
| -rw-r--r-- | contrib/ltree/_ltree_gist.c | 13 | ||||
| -rw-r--r-- | contrib/ltree/ltree.sql.in | 8 | ||||
| -rw-r--r-- | contrib/ltree/ltree_gist.c | 11 |
3 files changed, 15 insertions, 17 deletions
diff --git a/contrib/ltree/_ltree_gist.c b/contrib/ltree/_ltree_gist.c index 412fafa1ff..f1b2efb157 100644 --- a/contrib/ltree/_ltree_gist.c +++ b/contrib/ltree/_ltree_gist.c @@ -29,7 +29,7 @@ Datum _ltree_picksplit(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(_ltree_consistent); Datum _ltree_consistent(PG_FUNCTION_ARGS); -#define GETENTRY(vec,pos) ((ltree_gist *) DatumGetPointer(((GISTENTRY *) VARDATA(vec))[(pos)].key)) +#define GETENTRY(vec,pos) ((ltree_gist *) DatumGetPointer((vec)->vector[(pos)].key)) #define NEXTVAL(x) ( (ltree*)( (char*)(x) + INTALIGN( VARSIZE(x) ) ) ) #define SUMBIT(val) ( \ GETBITBYTE(val,0) + \ @@ -172,16 +172,15 @@ unionkey(BITVECP sbase, ltree_gist * add) Datum _ltree_union(PG_FUNCTION_ARGS) { - bytea *entryvec = (bytea *) PG_GETARG_POINTER(0); + GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); int *size = (int *) PG_GETARG_POINTER(1); ABITVEC base; - int4 len = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY); - int4 i; + int4 i,len; int4 flag = 0; ltree_gist *result; MemSet((void *) base, 0, sizeof(ABITVEC)); - for (i = 0; i < len; i++) + for (i = 0; i < entryvec->n; i++) { if (unionkey(base, GETENTRY(entryvec, i))) { @@ -264,7 +263,7 @@ comparecost(const void *a, const void *b) Datum _ltree_picksplit(PG_FUNCTION_ARGS) { - bytea *entryvec = (bytea *) PG_GETARG_POINTER(0); + GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1); OffsetNumber k, j; @@ -287,7 +286,7 @@ _ltree_picksplit(PG_FUNCTION_ARGS) ltree_gist *_k, *_j; - maxoff = ((VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY)) - 2; + maxoff = entryvec->n - 2; nbytes = (maxoff + 2) * sizeof(OffsetNumber); v->spl_left = (OffsetNumber *) palloc(nbytes); v->spl_right = (OffsetNumber *) palloc(nbytes); diff --git a/contrib/ltree/ltree.sql.in b/contrib/ltree/ltree.sql.in index 7d8bdc3524..e80c391ab0 100644 --- a/contrib/ltree/ltree.sql.in +++ b/contrib/ltree/ltree.sql.in @@ -499,7 +499,7 @@ CREATE FUNCTION ltree_penalty(internal,internal,internal) RETURNS internal as 'MODULE_PATHNAME' language 'C' with(isstrict); CREATE FUNCTION ltree_picksplit(internal, internal) RETURNS internal as 'MODULE_PATHNAME' language 'C'; -CREATE FUNCTION ltree_union(bytea, internal) +CREATE FUNCTION ltree_union(internal, internal) RETURNS int4 as 'MODULE_PATHNAME' language 'C'; CREATE FUNCTION ltree_same(internal, internal, internal) RETURNS internal as 'MODULE_PATHNAME' language 'C'; @@ -520,7 +520,7 @@ CREATE OPERATOR CLASS gist_ltree_ops OPERATOR 16 ? (ltree, _lquery) , OPERATOR 17 ? (_lquery, ltree) , FUNCTION 1 ltree_consistent (internal, internal, int2), - FUNCTION 2 ltree_union (bytea, internal), + FUNCTION 2 ltree_union (internal, internal), FUNCTION 3 ltree_compress (internal), FUNCTION 4 ltree_decompress (internal), FUNCTION 5 ltree_penalty (internal, internal, internal), @@ -825,7 +825,7 @@ CREATE FUNCTION _ltree_picksplit(internal, internal) RETURNS internal AS 'MODULE_PATHNAME' LANGUAGE 'C'; -CREATE FUNCTION _ltree_union(bytea, internal) +CREATE FUNCTION _ltree_union(internal, internal) RETURNS int4 AS 'MODULE_PATHNAME' LANGUAGE 'C'; @@ -845,7 +845,7 @@ CREATE OPERATOR CLASS gist__ltree_ops OPERATOR 16 ? (_ltree, _lquery) RECHECK , OPERATOR 17 ? (_lquery, _ltree) RECHECK , FUNCTION 1 _ltree_consistent (internal, internal, int2), - FUNCTION 2 _ltree_union (bytea, internal), + FUNCTION 2 _ltree_union (internal, internal), FUNCTION 3 _ltree_compress (internal), FUNCTION 4 ltree_decompress (internal), FUNCTION 5 _ltree_penalty (internal, internal, internal), diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c index 65f408cd93..eb091f9927 100644 --- a/contrib/ltree/ltree_gist.c +++ b/contrib/ltree/ltree_gist.c @@ -58,7 +58,7 @@ PG_FUNCTION_INFO_V1(ltree_consistent); Datum ltree_consistent(PG_FUNCTION_ARGS); #define ISEQ(a,b) ( (a)->numlevel == (b)->numlevel && ltree_compare(a,b)==0 ) -#define GETENTRY(vec,pos) ((ltree_gist *) DatumGetPointer(((GISTENTRY *) VARDATA(vec))[(pos)].key)) +#define GETENTRY(vec,pos) ((ltree_gist *) DatumGetPointer((vec)->vector[(pos)].key)) Datum ltree_compress(PG_FUNCTION_ARGS) @@ -166,10 +166,9 @@ hashing(BITVECP sign, ltree * t) Datum ltree_union(PG_FUNCTION_ARGS) { - bytea *entryvec = (bytea *) PG_GETARG_POINTER(0); + GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); int *size = (int *) PG_GETARG_POINTER(1); BITVEC base; - int4 len = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY); int4 i, j; ltree_gist *result, @@ -181,7 +180,7 @@ ltree_union(PG_FUNCTION_ARGS) bool isleqr; MemSet((void *) base, 0, sizeof(BITVEC)); - for (j = 0; j < len; j++) + for (j = 0; j < entryvec->n; j++) { cur = GETENTRY(entryvec, j); if (LTG_ISONENODE(cur)) @@ -285,7 +284,7 @@ treekey_cmp(const void *a, const void *b) Datum ltree_picksplit(PG_FUNCTION_ARGS) { - bytea *entryvec = (bytea *) PG_GETARG_POINTER(0); + GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1); OffsetNumber j; int4 i; @@ -307,7 +306,7 @@ ltree_picksplit(PG_FUNCTION_ARGS) memset((void *) ls, 0, sizeof(BITVEC)); memset((void *) rs, 0, sizeof(BITVEC)); - maxoff = ((VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY)) - 1; + maxoff = entryvec->n - 1; nbytes = (maxoff + 2) * sizeof(OffsetNumber); v->spl_left = (OffsetNumber *) palloc(nbytes); v->spl_right = (OffsetNumber *) palloc(nbytes); |
