1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-28 23:42:10 +03:00

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.
This commit is contained in:
Teodor Sigaev
2004-03-30 15:45:33 +00:00
parent 8d9a28eeef
commit f2c064afcb
24 changed files with 185 additions and 195 deletions

View File

@ -22,14 +22,14 @@ btree_decompress(PG_FUNCTION_ARGS)
** The GiST PickSplit method
*/
extern GIST_SPLITVEC *
btree_picksplit(bytea *entryvec, GIST_SPLITVEC *v, BINARY_UNION bu, CMPFUNC cmp)
btree_picksplit(GistEntryVector *entryvec, GIST_SPLITVEC *v, BINARY_UNION bu, CMPFUNC cmp)
{
OffsetNumber i;
RIX *array;
OffsetNumber maxoff;
int nbytes;
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);
@ -43,7 +43,7 @@ btree_picksplit(bytea *entryvec, GIST_SPLITVEC *v, BINARY_UNION bu, CMPFUNC cmp)
for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
{
array[i].index = i;
array[i].r = (char *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[i].key));
array[i].r = (char *) DatumGetPointer((entryvec->vector[i].key));
}
qsort((void *) &array[FirstOffsetNumber], maxoff - FirstOffsetNumber + 1,
sizeof(RIX), cmp);

View File

@ -21,5 +21,5 @@ typedef struct rix
** Common btree-function (for all ops)
*/
extern GIST_SPLITVEC *btree_picksplit(bytea *entryvec, GIST_SPLITVEC *v,
extern GIST_SPLITVEC *btree_picksplit(GistEntryVector *entryvec, GIST_SPLITVEC *v,
BINARY_UNION bu, CMPFUNC cmp);

View File

@ -120,7 +120,7 @@ RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gint2_union(bytea, internal)
CREATE FUNCTION gint2_union(internal, internal)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
@ -140,7 +140,7 @@ AS
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 gint2_consistent (internal, int2, int2),
FUNCTION 2 gint2_union (bytea, internal),
FUNCTION 2 gint2_union (internal, internal),
FUNCTION 3 gint2_compress (internal),
FUNCTION 4 btree_decompress (internal),
FUNCTION 5 gint2_penalty (internal, internal, internal),
@ -176,7 +176,7 @@ RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gint4_union(bytea, internal)
CREATE FUNCTION gint4_union(internal, internal)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
@ -196,7 +196,7 @@ AS
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 gint4_consistent (internal, int4, int2),
FUNCTION 2 gint4_union (bytea, internal),
FUNCTION 2 gint4_union (internal, internal),
FUNCTION 3 gint4_compress (internal),
FUNCTION 4 btree_decompress (internal),
FUNCTION 5 gint4_penalty (internal, internal, internal),
@ -232,7 +232,7 @@ RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gint8_union(bytea, internal)
CREATE FUNCTION gint8_union(internal, internal)
RETURNS int8key
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
@ -252,7 +252,7 @@ AS
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 gint8_consistent (internal, int8, int2),
FUNCTION 2 gint8_union (bytea, internal),
FUNCTION 2 gint8_union (internal, internal),
FUNCTION 3 gint8_compress (internal),
FUNCTION 4 btree_decompress (internal),
FUNCTION 5 gint8_penalty (internal, internal, internal),
@ -289,7 +289,7 @@ RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gfloat4_union(bytea, internal)
CREATE FUNCTION gfloat4_union(internal, internal)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
@ -309,7 +309,7 @@ AS
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 gfloat4_consistent (internal, float4, int2),
FUNCTION 2 gfloat4_union (bytea, internal),
FUNCTION 2 gfloat4_union (internal, internal),
FUNCTION 3 gfloat4_compress (internal),
FUNCTION 4 btree_decompress (internal),
FUNCTION 5 gfloat4_penalty (internal, internal, internal),
@ -348,7 +348,7 @@ RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gfloat8_union(bytea, internal)
CREATE FUNCTION gfloat8_union(internal, internal)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
@ -368,7 +368,7 @@ AS
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 gfloat8_consistent (internal, float8, int2),
FUNCTION 2 gfloat8_union (bytea, internal),
FUNCTION 2 gfloat8_union (internal, internal),
FUNCTION 3 gfloat8_compress (internal),
FUNCTION 4 btree_decompress (internal),
FUNCTION 5 gfloat8_penalty (internal, internal, internal),
@ -422,7 +422,7 @@ RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gts_union(bytea, internal)
CREATE FUNCTION gts_union(internal, internal)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
@ -442,7 +442,7 @@ AS
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 gts_consistent (internal, timestamp, int2),
FUNCTION 2 gts_union (bytea, internal),
FUNCTION 2 gts_union (internal, internal),
FUNCTION 3 gts_compress (internal),
FUNCTION 4 btree_decompress (internal),
FUNCTION 5 gts_penalty (internal, internal, internal),

View File

@ -138,22 +138,22 @@ g__BTREE_GIST_TYPE2___consistent(PG_FUNCTION_ARGS)
Datum
g__BTREE_GIST_TYPE2___union(PG_FUNCTION_ARGS)
{
bytea *entryvec = (bytea *) PG_GETARG_POINTER(0);
GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
int i,
numranges;
__BTREE_GIST_TYPE__KEY *cur,
*out = palloc(sizeof(__BTREE_GIST_TYPE__KEY));
numranges = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY);
numranges = entryvec->n;
*(int *) PG_GETARG_POINTER(1) = sizeof(__BTREE_GIST_TYPE__KEY);
cur = (__BTREE_GIST_TYPE__KEY *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[0].key));
cur = (__BTREE_GIST_TYPE__KEY *) DatumGetPointer((entryvec->vector[0].key));
out->lower = cur->lower;
out->upper = cur->upper;
for (i = 1; i < numranges; i++)
{
cur = (__BTREE_GIST_TYPE__KEY *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[i].key));
cur = (__BTREE_GIST_TYPE__KEY *) DatumGetPointer((entryvec->vector[i].key));
if (out->lower > cur->lower)
out->lower = cur->lower;
if (out->upper < cur->upper)
@ -180,7 +180,7 @@ Datum
g__BTREE_GIST_TYPE2___picksplit(PG_FUNCTION_ARGS)
{
PG_RETURN_POINTER(btree_picksplit(
(bytea *) PG_GETARG_POINTER(0),
(GistEntryVector *) PG_GETARG_POINTER(0),
(GIST_SPLITVEC *) PG_GETARG_POINTER(1),
g__BTREE_GIST_TYPE2___binary_union,
__BTREE_GIST_TYPE2__key_cmp

View File

@ -146,22 +146,22 @@ gts_consistent(PG_FUNCTION_ARGS)
Datum
gts_union(PG_FUNCTION_ARGS)
{
bytea *entryvec = (bytea *) PG_GETARG_POINTER(0);
GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
int i,
numranges;
TSKEY *cur,
*out = palloc(sizeof(TSKEY));
numranges = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY);
numranges = entryvec->n;
*(int *) PG_GETARG_POINTER(1) = sizeof(TSKEY);
cur = (TSKEY *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[0].key));
cur = (TSKEY *) DatumGetPointer((entryvec->vector[0].key));
out->lower = cur->lower;
out->upper = cur->upper;
for (i = 1; i < numranges; i++)
{
cur = (TSKEY *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[i].key));
cur = (TSKEY *) DatumGetPointer((entryvec->vector[i].key));
if (TSGT(&out->lower, &cur->lower))
out->lower = cur->lower;
if (TSLT(&out->upper, &cur->upper))
@ -204,7 +204,7 @@ Datum
gts_picksplit(PG_FUNCTION_ARGS)
{
PG_RETURN_POINTER(btree_picksplit(
(bytea *) PG_GETARG_POINTER(0),
(GistEntryVector *) PG_GETARG_POINTER(0),
(GIST_SPLITVEC *) PG_GETARG_POINTER(1),
gts_binary_union,
tskey_cmp