Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3043810

Browse files
committed
Updates to make GIST work with multi-key indexes (from Oleg Bartunov
and Teodor Sigaev). Declare key values as Datum where appropriate,rather than char* (Tom Lane).
1 parente1107fc commit3043810

File tree

9 files changed

+842
-438
lines changed

9 files changed

+842
-438
lines changed

‎contrib/cube/cube.c

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ NDBOX *g_cube_binary_union(NDBOX * r1, NDBOX * r2, int *sizep);
4545
bool*g_cube_same(NDBOX*b1,NDBOX*b2,bool*result);
4646

4747
/*
48-
** R-treesuport functions
48+
** R-treesupport functions
4949
*/
5050
boolcube_same(NDBOX*a,NDBOX*b);
5151
boolcube_different(NDBOX*a,NDBOX*b);
@@ -168,13 +168,15 @@ g_cube_consistent(GISTENTRY *entry,
168168
{
169169

170170
/*
171-
**if entry is not leaf, use g_cube_internal_consistent, * else use
171+
* if entry is not leaf, use g_cube_internal_consistent, else use
172172
* g_cube_leaf_consistent
173173
*/
174174
if (GIST_LEAF(entry))
175-
return (g_cube_leaf_consistent((NDBOX*) (entry->pred),query,strategy));
175+
returng_cube_leaf_consistent((NDBOX*)DatumGetPointer(entry->key),
176+
query,strategy);
176177
else
177-
return (g_cube_internal_consistent((NDBOX*) (entry->pred),query,strategy));
178+
returng_cube_internal_consistent((NDBOX*)DatumGetPointer(entry->key),
179+
query,strategy);
178180
}
179181

180182

@@ -194,7 +196,7 @@ g_cube_union(bytea *entryvec, int *sizep)
194196
* fprintf(stderr, "union\n");
195197
*/
196198
numranges= (VARSIZE(entryvec)-VARHDRSZ) /sizeof(GISTENTRY);
197-
tmp= (NDBOX*) (((GISTENTRY*) (VARDATA(entryvec)))[0]).pred;
199+
tmp= (NDBOX*)DatumGetPointer((((GISTENTRY*) (VARDATA(entryvec)))[0]).key);
198200

199201
/*
200202
* sizep = sizeof(NDBOX); -- NDBOX has variable size
@@ -204,14 +206,8 @@ g_cube_union(bytea *entryvec, int *sizep)
204206
for (i=1;i<numranges;i++)
205207
{
206208
out=g_cube_binary_union(tmp, (NDBOX*)
207-
(((GISTENTRY*) (VARDATA(entryvec)))[i]).pred,
209+
DatumGetPointer((((GISTENTRY*) (VARDATA(entryvec)))[i]).key),
208210
sizep);
209-
210-
/*
211-
* fprintf(stderr, "\t%s ^ %s -> %s\n", cube_out(tmp),
212-
* cube_out((NDBOX *)(((GISTENTRY
213-
* *)(VARDATA(entryvec)))[i]).pred), cube_out(out));
214-
*/
215211
if (i>1)
216212
pfree(tmp);
217213
tmp=out;
@@ -243,15 +239,16 @@ g_cube_decompress(GISTENTRY *entry)
243239
float*
244240
g_cube_penalty(GISTENTRY*origentry,GISTENTRY*newentry,float*result)
245241
{
246-
Datumud;
242+
NDBOX*ud;
247243
floattmp1,
248244
tmp2;
249245

250-
ud= (Datum)cube_union((NDBOX*) (origentry->pred), (NDBOX*) (newentry->pred));
251-
rt_cube_size((NDBOX*)ud,&tmp1);
252-
rt_cube_size((NDBOX*) (origentry->pred),&tmp2);
246+
ud=cube_union((NDBOX*)DatumGetPointer(origentry->key),
247+
(NDBOX*)DatumGetPointer(newentry->key));
248+
rt_cube_size(ud,&tmp1);
249+
rt_cube_size((NDBOX*)DatumGetPointer(origentry->key),&tmp2);
253250
*result=tmp1-tmp2;
254-
pfree((char*)ud);
251+
pfree(ud);
255252

256253
/*
257254
* fprintf(stderr, "penalty\n"); fprintf(stderr, "\t%g\n", *result);
@@ -308,16 +305,16 @@ g_cube_picksplit(bytea *entryvec,
308305

309306
for (i=FirstOffsetNumber;i<maxoff;i=OffsetNumberNext(i))
310307
{
311-
datum_alpha= (NDBOX*) (((GISTENTRY*) (VARDATA(entryvec)))[i].pred);
308+
datum_alpha= (NDBOX*)DatumGetPointer(((GISTENTRY*) (VARDATA(entryvec)))[i].key);
312309
for (j=OffsetNumberNext(i);j <=maxoff;j=OffsetNumberNext(j))
313310
{
314-
datum_beta= (NDBOX*) (((GISTENTRY*) (VARDATA(entryvec)))[j].pred);
311+
datum_beta= (NDBOX*)DatumGetPointer(((GISTENTRY*) (VARDATA(entryvec)))[j].key);
315312

316313
/* compute the wasted space by unioning these guys */
317314
/* size_waste = size_union - size_inter; */
318-
union_d=(NDBOX*)cube_union(datum_alpha,datum_beta);
315+
union_d=cube_union(datum_alpha,datum_beta);
319316
rt_cube_size(union_d,&size_union);
320-
inter_d=(NDBOX*)cube_inter(datum_alpha,datum_beta);
317+
inter_d=cube_inter(datum_alpha,datum_beta);
321318
rt_cube_size(inter_d,&size_inter);
322319
size_waste=size_union-size_inter;
323320

@@ -346,12 +343,12 @@ g_cube_picksplit(bytea *entryvec,
346343
right=v->spl_right;
347344
v->spl_nright=0;
348345

349-
datum_alpha= (NDBOX*) (((GISTENTRY*) (VARDATA(entryvec)))[seed_1].pred);
350-
datum_l=(NDBOX*)cube_union(datum_alpha,datum_alpha);
351-
rt_cube_size((NDBOX*)datum_l,&size_l);
352-
datum_beta= (NDBOX*) (((GISTENTRY*) (VARDATA(entryvec)))[seed_2].pred);;
353-
datum_r=(NDBOX*)cube_union(datum_beta,datum_beta);
354-
rt_cube_size((NDBOX*)datum_r,&size_r);
346+
datum_alpha= (NDBOX*)DatumGetPointer(((GISTENTRY*) (VARDATA(entryvec)))[seed_1].key);
347+
datum_l=cube_union(datum_alpha,datum_alpha);
348+
rt_cube_size(datum_l,&size_l);
349+
datum_beta= (NDBOX*)DatumGetPointer(((GISTENTRY*) (VARDATA(entryvec)))[seed_2].key);
350+
datum_r=cube_union(datum_beta,datum_beta);
351+
rt_cube_size(datum_r,&size_r);
355352

356353
/*
357354
* Now split up the regions between the two seeds.An important
@@ -389,11 +386,11 @@ g_cube_picksplit(bytea *entryvec,
389386
}
390387

391388
/* okay, which page needs least enlargement? */
392-
datum_alpha= (NDBOX*) (((GISTENTRY*) (VARDATA(entryvec)))[i].pred);
393-
union_dl=(NDBOX*)cube_union(datum_l,datum_alpha);
394-
union_dr=(NDBOX*)cube_union(datum_r,datum_alpha);
395-
rt_cube_size((NDBOX*)union_dl,&size_alpha);
396-
rt_cube_size((NDBOX*)union_dr,&size_beta);
389+
datum_alpha= (NDBOX*)DatumGetPointer(((GISTENTRY*) (VARDATA(entryvec)))[i].key);
390+
union_dl=cube_union(datum_l,datum_alpha);
391+
union_dr=cube_union(datum_r,datum_alpha);
392+
rt_cube_size(union_dl,&size_alpha);
393+
rt_cube_size(union_dr,&size_beta);
397394

398395
/* pick which page to add it to */
399396
if (size_alpha-size_l<size_beta-size_r)
@@ -417,8 +414,8 @@ g_cube_picksplit(bytea *entryvec,
417414
}
418415
*left=*right=FirstOffsetNumber;/* sentinel value, see dosplit() */
419416

420-
v->spl_ldatum=(char*)datum_l;
421-
v->spl_rdatum=(char*)datum_r;
417+
v->spl_ldatum=PointerGetDatum(datum_l);
418+
v->spl_rdatum=PointerGetDatum(datum_r);
422419

423420
returnv;
424421
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp