Skip to content

Commit f2c064a

Browse files
committed
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.
1 parent 8d9a28e commit f2c064a

File tree

24 files changed

+185
-195
lines changed

24 files changed

+185
-195
lines changed

contrib/btree_gist/btree_common.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ btree_decompress(PG_FUNCTION_ARGS)
2222
** The GiST PickSplit method
2323
*/
2424
extern GIST_SPLITVEC *
25-
btree_picksplit(bytea *entryvec, GIST_SPLITVEC *v, BINARY_UNION bu, CMPFUNC cmp)
25+
btree_picksplit(GistEntryVector *entryvec, GIST_SPLITVEC *v, BINARY_UNION bu, CMPFUNC cmp)
2626
{
2727
OffsetNumber i;
2828
RIX *array;
2929
OffsetNumber maxoff;
3030
int nbytes;
3131

32-
maxoff = ((VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY)) - 1;
32+
maxoff = entryvec->n - 1;
3333
nbytes = (maxoff + 2) * sizeof(OffsetNumber);
3434
v->spl_left = (OffsetNumber *) palloc(nbytes);
3535
v->spl_right = (OffsetNumber *) palloc(nbytes);
@@ -43,7 +43,7 @@ btree_picksplit(bytea *entryvec, GIST_SPLITVEC *v, BINARY_UNION bu, CMPFUNC cmp)
4343
for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
4444
{
4545
array[i].index = i;
46-
array[i].r = (char *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[i].key));
46+
array[i].r = (char *) DatumGetPointer((entryvec->vector[i].key));
4747
}
4848
qsort((void *) &array[FirstOffsetNumber], maxoff - FirstOffsetNumber + 1,
4949
sizeof(RIX), cmp);

contrib/btree_gist/btree_gist.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,5 @@ typedef struct rix
2121
** Common btree-function (for all ops)
2222
*/
2323

24-
extern GIST_SPLITVEC *btree_picksplit(bytea *entryvec, GIST_SPLITVEC *v,
24+
extern GIST_SPLITVEC *btree_picksplit(GistEntryVector *entryvec, GIST_SPLITVEC *v,
2525
BINARY_UNION bu, CMPFUNC cmp);

contrib/btree_gist/btree_gist.sql.in

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ RETURNS internal
120120
AS 'MODULE_PATHNAME'
121121
LANGUAGE 'C';
122122

123-
CREATE FUNCTION gint2_union(bytea, internal)
123+
CREATE FUNCTION gint2_union(internal, internal)
124124
RETURNS int4
125125
AS 'MODULE_PATHNAME'
126126
LANGUAGE 'C';
@@ -140,7 +140,7 @@ AS
140140
OPERATOR 4 >= ,
141141
OPERATOR 5 > ,
142142
FUNCTION 1 gint2_consistent (internal, int2, int2),
143-
FUNCTION 2 gint2_union (bytea, internal),
143+
FUNCTION 2 gint2_union (internal, internal),
144144
FUNCTION 3 gint2_compress (internal),
145145
FUNCTION 4 btree_decompress (internal),
146146
FUNCTION 5 gint2_penalty (internal, internal, internal),
@@ -176,7 +176,7 @@ RETURNS internal
176176
AS 'MODULE_PATHNAME'
177177
LANGUAGE 'C';
178178

179-
CREATE FUNCTION gint4_union(bytea, internal)
179+
CREATE FUNCTION gint4_union(internal, internal)
180180
RETURNS int4
181181
AS 'MODULE_PATHNAME'
182182
LANGUAGE 'C';
@@ -196,7 +196,7 @@ AS
196196
OPERATOR 4 >= ,
197197
OPERATOR 5 > ,
198198
FUNCTION 1 gint4_consistent (internal, int4, int2),
199-
FUNCTION 2 gint4_union (bytea, internal),
199+
FUNCTION 2 gint4_union (internal, internal),
200200
FUNCTION 3 gint4_compress (internal),
201201
FUNCTION 4 btree_decompress (internal),
202202
FUNCTION 5 gint4_penalty (internal, internal, internal),
@@ -232,7 +232,7 @@ RETURNS internal
232232
AS 'MODULE_PATHNAME'
233233
LANGUAGE 'C';
234234

235-
CREATE FUNCTION gint8_union(bytea, internal)
235+
CREATE FUNCTION gint8_union(internal, internal)
236236
RETURNS int8key
237237
AS 'MODULE_PATHNAME'
238238
LANGUAGE 'C';
@@ -252,7 +252,7 @@ AS
252252
OPERATOR 4 >= ,
253253
OPERATOR 5 > ,
254254
FUNCTION 1 gint8_consistent (internal, int8, int2),
255-
FUNCTION 2 gint8_union (bytea, internal),
255+
FUNCTION 2 gint8_union (internal, internal),
256256
FUNCTION 3 gint8_compress (internal),
257257
FUNCTION 4 btree_decompress (internal),
258258
FUNCTION 5 gint8_penalty (internal, internal, internal),
@@ -289,7 +289,7 @@ RETURNS internal
289289
AS 'MODULE_PATHNAME'
290290
LANGUAGE 'C';
291291

292-
CREATE FUNCTION gfloat4_union(bytea, internal)
292+
CREATE FUNCTION gfloat4_union(internal, internal)
293293
RETURNS int4
294294
AS 'MODULE_PATHNAME'
295295
LANGUAGE 'C';
@@ -309,7 +309,7 @@ AS
309309
OPERATOR 4 >= ,
310310
OPERATOR 5 > ,
311311
FUNCTION 1 gfloat4_consistent (internal, float4, int2),
312-
FUNCTION 2 gfloat4_union (bytea, internal),
312+
FUNCTION 2 gfloat4_union (internal, internal),
313313
FUNCTION 3 gfloat4_compress (internal),
314314
FUNCTION 4 btree_decompress (internal),
315315
FUNCTION 5 gfloat4_penalty (internal, internal, internal),
@@ -348,7 +348,7 @@ RETURNS internal
348348
AS 'MODULE_PATHNAME'
349349
LANGUAGE 'C';
350350

351-
CREATE FUNCTION gfloat8_union(bytea, internal)
351+
CREATE FUNCTION gfloat8_union(internal, internal)
352352
RETURNS int4
353353
AS 'MODULE_PATHNAME'
354354
LANGUAGE 'C';
@@ -368,7 +368,7 @@ AS
368368
OPERATOR 4 >= ,
369369
OPERATOR 5 > ,
370370
FUNCTION 1 gfloat8_consistent (internal, float8, int2),
371-
FUNCTION 2 gfloat8_union (bytea, internal),
371+
FUNCTION 2 gfloat8_union (internal, internal),
372372
FUNCTION 3 gfloat8_compress (internal),
373373
FUNCTION 4 btree_decompress (internal),
374374
FUNCTION 5 gfloat8_penalty (internal, internal, internal),
@@ -422,7 +422,7 @@ RETURNS internal
422422
AS 'MODULE_PATHNAME'
423423
LANGUAGE 'C';
424424

425-
CREATE FUNCTION gts_union(bytea, internal)
425+
CREATE FUNCTION gts_union(internal, internal)
426426
RETURNS int4
427427
AS 'MODULE_PATHNAME'
428428
LANGUAGE 'C';
@@ -442,7 +442,7 @@ AS
442442
OPERATOR 4 >= ,
443443
OPERATOR 5 > ,
444444
FUNCTION 1 gts_consistent (internal, timestamp, int2),
445-
FUNCTION 2 gts_union (bytea, internal),
445+
FUNCTION 2 gts_union (internal, internal),
446446
FUNCTION 3 gts_compress (internal),
447447
FUNCTION 4 btree_decompress (internal),
448448
FUNCTION 5 gts_penalty (internal, internal, internal),

contrib/btree_gist/btree_num.c.in

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,22 +138,22 @@ g__BTREE_GIST_TYPE2___consistent(PG_FUNCTION_ARGS)
138138
Datum
139139
g__BTREE_GIST_TYPE2___union(PG_FUNCTION_ARGS)
140140
{
141-
bytea *entryvec = (bytea *) PG_GETARG_POINTER(0);
141+
GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
142142
int i,
143143
numranges;
144144
__BTREE_GIST_TYPE__KEY *cur,
145145
*out = palloc(sizeof(__BTREE_GIST_TYPE__KEY));
146146

147-
numranges = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY);
147+
numranges = entryvec->n;
148148
*(int *) PG_GETARG_POINTER(1) = sizeof(__BTREE_GIST_TYPE__KEY);
149149

150-
cur = (__BTREE_GIST_TYPE__KEY *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[0].key));
150+
cur = (__BTREE_GIST_TYPE__KEY *) DatumGetPointer((entryvec->vector[0].key));
151151
out->lower = cur->lower;
152152
out->upper = cur->upper;
153153

154154
for (i = 1; i < numranges; i++)
155155
{
156-
cur = (__BTREE_GIST_TYPE__KEY *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[i].key));
156+
cur = (__BTREE_GIST_TYPE__KEY *) DatumGetPointer((entryvec->vector[i].key));
157157
if (out->lower > cur->lower)
158158
out->lower = cur->lower;
159159
if (out->upper < cur->upper)
@@ -180,7 +180,7 @@ Datum
180180
g__BTREE_GIST_TYPE2___picksplit(PG_FUNCTION_ARGS)
181181
{
182182
PG_RETURN_POINTER(btree_picksplit(
183-
(bytea *) PG_GETARG_POINTER(0),
183+
(GistEntryVector *) PG_GETARG_POINTER(0),
184184
(GIST_SPLITVEC *) PG_GETARG_POINTER(1),
185185
g__BTREE_GIST_TYPE2___binary_union,
186186
__BTREE_GIST_TYPE2__key_cmp

contrib/btree_gist/btree_ts.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,22 +146,22 @@ gts_consistent(PG_FUNCTION_ARGS)
146146
Datum
147147
gts_union(PG_FUNCTION_ARGS)
148148
{
149-
bytea *entryvec = (bytea *) PG_GETARG_POINTER(0);
149+
GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
150150
int i,
151151
numranges;
152152
TSKEY *cur,
153153
*out = palloc(sizeof(TSKEY));
154154

155-
numranges = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY);
155+
numranges = entryvec->n;
156156
*(int *) PG_GETARG_POINTER(1) = sizeof(TSKEY);
157157

158-
cur = (TSKEY *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[0].key));
158+
cur = (TSKEY *) DatumGetPointer((entryvec->vector[0].key));
159159
out->lower = cur->lower;
160160
out->upper = cur->upper;
161161

162162
for (i = 1; i < numranges; i++)
163163
{
164-
cur = (TSKEY *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[i].key));
164+
cur = (TSKEY *) DatumGetPointer((entryvec->vector[i].key));
165165
if (TSGT(&out->lower, &cur->lower))
166166
out->lower = cur->lower;
167167
if (TSLT(&out->upper, &cur->upper))
@@ -204,7 +204,7 @@ Datum
204204
gts_picksplit(PG_FUNCTION_ARGS)
205205
{
206206
PG_RETURN_POINTER(btree_picksplit(
207-
(bytea *) PG_GETARG_POINTER(0),
207+
(GistEntryVector *) PG_GETARG_POINTER(0),
208208
(GIST_SPLITVEC *) PG_GETARG_POINTER(1),
209209
gts_binary_union,
210210
tskey_cmp

contrib/cube/cube.c

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ bool g_cube_consistent(GISTENTRY *entry, NDBOX * query, StrategyNumber strategy
4646
GISTENTRY *g_cube_compress(GISTENTRY *entry);
4747
GISTENTRY *g_cube_decompress(GISTENTRY *entry);
4848
float *g_cube_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result);
49-
GIST_SPLITVEC *g_cube_picksplit(bytea *entryvec, GIST_SPLITVEC *v);
49+
GIST_SPLITVEC *g_cube_picksplit(GistEntryVector *entryvec, GIST_SPLITVEC *v);
5050
bool g_cube_leaf_consistent(NDBOX * key, NDBOX * query, StrategyNumber strategy);
5151
bool g_cube_internal_consistent(NDBOX * key, NDBOX * query, StrategyNumber strategy);
52-
NDBOX *g_cube_union(bytea *entryvec, int *sizep);
52+
NDBOX *g_cube_union(GistEntryVector *entryvec, int *sizep);
5353
NDBOX *g_cube_binary_union(NDBOX * r1, NDBOX * r2, int *sizep);
5454
bool *g_cube_same(NDBOX * b1, NDBOX * b2, bool *result);
5555

@@ -211,28 +211,26 @@ g_cube_consistent(GISTENTRY *entry,
211211
** returns the minimal bounding box that encloses all the entries in entryvec
212212
*/
213213
NDBOX *
214-
g_cube_union(bytea *entryvec, int *sizep)
214+
g_cube_union(GistEntryVector *entryvec, int *sizep)
215215
{
216-
int numranges,
217-
i;
216+
int i;
218217
NDBOX *out = (NDBOX *) NULL;
219218
NDBOX *tmp;
220219

221220
/*
222221
* fprintf(stderr, "union\n");
223222
*/
224-
numranges = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY);
225-
tmp = (NDBOX *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[0]).key);
223+
tmp = (NDBOX *) DatumGetPointer(entryvec->vector[0].key);
226224

227225
/*
228226
* sizep = sizeof(NDBOX); -- NDBOX has variable size
229227
*/
230228
*sizep = tmp->size;
231229

232-
for (i = 1; i < numranges; i++)
230+
for (i = 1; i < entryvec->n; i++)
233231
{
234232
out = g_cube_binary_union(tmp, (NDBOX *)
235-
DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[i]).key),
233+
DatumGetPointer(entryvec->vector[i].key),
236234
sizep);
237235
if (i > 1)
238236
pfree(tmp);
@@ -289,7 +287,7 @@ g_cube_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result)
289287
** We use Guttman's poly time split algorithm
290288
*/
291289
GIST_SPLITVEC *
292-
g_cube_picksplit(bytea *entryvec,
290+
g_cube_picksplit(GistEntryVector *entryvec,
293291
GIST_SPLITVEC *v)
294292
{
295293
OffsetNumber i,
@@ -321,7 +319,7 @@ g_cube_picksplit(bytea *entryvec,
321319
/*
322320
* fprintf(stderr, "picksplit\n");
323321
*/
324-
maxoff = ((VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY)) - 2;
322+
maxoff = entryvec->n - 2;
325323
nbytes = (maxoff + 2) * sizeof(OffsetNumber);
326324
v->spl_left = (OffsetNumber *) palloc(nbytes);
327325
v->spl_right = (OffsetNumber *) palloc(nbytes);
@@ -331,10 +329,10 @@ g_cube_picksplit(bytea *entryvec,
331329

332330
for (i = FirstOffsetNumber; i < maxoff; i = OffsetNumberNext(i))
333331
{
334-
datum_alpha = (NDBOX *) DatumGetPointer(((GISTENTRY *) (VARDATA(entryvec)))[i].key);
332+
datum_alpha = (NDBOX *) DatumGetPointer(entryvec->vector[i].key);
335333
for (j = OffsetNumberNext(i); j <= maxoff; j = OffsetNumberNext(j))
336334
{
337-
datum_beta = (NDBOX *) DatumGetPointer(((GISTENTRY *) (VARDATA(entryvec)))[j].key);
335+
datum_beta = (NDBOX *) DatumGetPointer(entryvec->vector[j].key);
338336

339337
/* compute the wasted space by unioning these guys */
340338
/* size_waste = size_union - size_inter; */
@@ -369,10 +367,10 @@ g_cube_picksplit(bytea *entryvec,
369367
right = v->spl_right;
370368
v->spl_nright = 0;
371369

372-
datum_alpha = (NDBOX *) DatumGetPointer(((GISTENTRY *) (VARDATA(entryvec)))[seed_1].key);
370+
datum_alpha = (NDBOX *) DatumGetPointer(entryvec->vector[seed_1].key);
373371
datum_l = cube_union(datum_alpha, datum_alpha);
374372
rt_cube_size(datum_l, &size_l);
375-
datum_beta = (NDBOX *) DatumGetPointer(((GISTENTRY *) (VARDATA(entryvec)))[seed_2].key);
373+
datum_beta = (NDBOX *) DatumGetPointer(entryvec->vector[seed_2].key);
376374
datum_r = cube_union(datum_beta, datum_beta);
377375
rt_cube_size(datum_r, &size_r);
378376

@@ -411,7 +409,7 @@ g_cube_picksplit(bytea *entryvec,
411409
}
412410

413411
/* okay, which page needs least enlargement? */
414-
datum_alpha = (NDBOX *) DatumGetPointer(((GISTENTRY *) (VARDATA(entryvec)))[i].key);
412+
datum_alpha = (NDBOX *) DatumGetPointer(entryvec->vector[i].key);
415413
union_dl = cube_union(datum_l, datum_alpha);
416414
union_dr = cube_union(datum_r, datum_alpha);
417415
rt_cube_size(union_dl, &size_alpha);

contrib/cube/cube.sql.in

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ RETURNS internal
324324
AS 'MODULE_PATHNAME'
325325
LANGUAGE 'C';
326326

327-
CREATE OR REPLACE FUNCTION g_cube_union(bytea, internal)
327+
CREATE OR REPLACE FUNCTION g_cube_union(internal, internal)
328328
RETURNS cube
329329
AS 'MODULE_PATHNAME'
330330
LANGUAGE 'C';
@@ -357,7 +357,7 @@ CREATE OPERATOR CLASS gist_cube_ops
357357
OPERATOR 7 @ ,
358358
OPERATOR 8 ~ ,
359359
FUNCTION 1 g_cube_consistent (internal, cube, int4),
360-
FUNCTION 2 g_cube_union (bytea, internal),
360+
FUNCTION 2 g_cube_union (internal, internal),
361361
FUNCTION 3 g_cube_compress (internal),
362362
FUNCTION 4 g_cube_decompress (internal),
363363
FUNCTION 5 g_cube_penalty (internal, internal, internal),

contrib/intarray/_int.sql.in

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ RETURNS internal
327327
AS 'MODULE_PATHNAME'
328328
LANGUAGE 'C';
329329

330-
CREATE FUNCTION g_int_union(bytea, internal)
330+
CREATE FUNCTION g_int_union(internal, internal)
331331
RETURNS _int4
332332
AS 'MODULE_PATHNAME'
333333
LANGUAGE 'C';
@@ -348,7 +348,7 @@ DEFAULT FOR TYPE _int4 USING gist AS
348348
OPERATOR 8 ~,
349349
OPERATOR 20 @@ (_int4, query_int),
350350
FUNCTION 1 g_int_consistent (internal, _int4, int4),
351-
FUNCTION 2 g_int_union (bytea, internal),
351+
FUNCTION 2 g_int_union (internal, internal),
352352
FUNCTION 3 g_int_compress (internal),
353353
FUNCTION 4 g_int_decompress (internal),
354354
FUNCTION 5 g_int_penalty (internal, internal, internal),
@@ -402,7 +402,7 @@ RETURNS internal
402402
AS 'MODULE_PATHNAME'
403403
LANGUAGE 'C';
404404

405-
CREATE FUNCTION g_intbig_union(bytea, internal)
405+
CREATE FUNCTION g_intbig_union(internal, internal)
406406
RETURNS _int4
407407
AS 'MODULE_PATHNAME'
408408
LANGUAGE 'C';
@@ -423,7 +423,7 @@ AS
423423
OPERATOR 8 ~ RECHECK,
424424
OPERATOR 20 @@ (_int4, query_int) RECHECK,
425425
FUNCTION 1 g_intbig_consistent (internal, internal, int4),
426-
FUNCTION 2 g_intbig_union (bytea, internal),
426+
FUNCTION 2 g_intbig_union (internal, internal),
427427
FUNCTION 3 g_intbig_compress (internal),
428428
FUNCTION 4 g_intbig_decompress (internal),
429429
FUNCTION 5 g_intbig_penalty (internal, internal, internal),

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy