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:
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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),
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user