summaryrefslogtreecommitdiff
path: root/contrib/cube/cube.c
diff options
context:
space:
mode:
authorTom Lane2001-05-31 18:16:55 +0000
committerTom Lane2001-05-31 18:16:55 +0000
commit3043810d977b8197f9671c98439104db80b8e914 (patch)
tree99be1d86e7f18cf24e2016b5c021c2748dc1a8af /contrib/cube/cube.c
parente1107fc28536bf5f24f388bd701bffb98c09cd06 (diff)
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).
Diffstat (limited to 'contrib/cube/cube.c')
-rw-r--r--contrib/cube/cube.c65
1 files changed, 31 insertions, 34 deletions
diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c
index 4d6169a4802..72f6e5a0695 100644
--- a/contrib/cube/cube.c
+++ b/contrib/cube/cube.c
@@ -45,7 +45,7 @@ NDBOX *g_cube_binary_union(NDBOX * r1, NDBOX * r2, int *sizep);
bool *g_cube_same(NDBOX * b1, NDBOX * b2, bool *result);
/*
-** R-tree suport functions
+** R-tree support functions
*/
bool cube_same(NDBOX * a, NDBOX * b);
bool cube_different(NDBOX * a, NDBOX * b);
@@ -168,13 +168,15 @@ g_cube_consistent(GISTENTRY *entry,
{
/*
- * * if entry is not leaf, use g_cube_internal_consistent, * else use
+ * if entry is not leaf, use g_cube_internal_consistent, else use
* g_cube_leaf_consistent
*/
if (GIST_LEAF(entry))
- return (g_cube_leaf_consistent((NDBOX *) (entry->pred), query, strategy));
+ return g_cube_leaf_consistent((NDBOX *) DatumGetPointer(entry->key),
+ query, strategy);
else
- return (g_cube_internal_consistent((NDBOX *) (entry->pred), query, strategy));
+ return g_cube_internal_consistent((NDBOX *) DatumGetPointer(entry->key),
+ query, strategy);
}
@@ -194,7 +196,7 @@ g_cube_union(bytea *entryvec, int *sizep)
* fprintf(stderr, "union\n");
*/
numranges = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY);
- tmp = (NDBOX *) (((GISTENTRY *) (VARDATA(entryvec)))[0]).pred;
+ tmp = (NDBOX *) DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[0]).key);
/*
* sizep = sizeof(NDBOX); -- NDBOX has variable size
@@ -204,14 +206,8 @@ g_cube_union(bytea *entryvec, int *sizep)
for (i = 1; i < numranges; i++)
{
out = g_cube_binary_union(tmp, (NDBOX *)
- (((GISTENTRY *) (VARDATA(entryvec)))[i]).pred,
+ DatumGetPointer((((GISTENTRY *) (VARDATA(entryvec)))[i]).key),
sizep);
-
- /*
- * fprintf(stderr, "\t%s ^ %s -> %s\n", cube_out(tmp),
- * cube_out((NDBOX *)(((GISTENTRY
- * *)(VARDATA(entryvec)))[i]).pred), cube_out(out));
- */
if (i > 1)
pfree(tmp);
tmp = out;
@@ -243,15 +239,16 @@ g_cube_decompress(GISTENTRY *entry)
float *
g_cube_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result)
{
- Datum ud;
+ NDBOX *ud;
float tmp1,
tmp2;
- ud = (Datum) cube_union((NDBOX *) (origentry->pred), (NDBOX *) (newentry->pred));
- rt_cube_size((NDBOX *) ud, &tmp1);
- rt_cube_size((NDBOX *) (origentry->pred), &tmp2);
+ ud = cube_union((NDBOX *) DatumGetPointer(origentry->key),
+ (NDBOX *) DatumGetPointer(newentry->key));
+ rt_cube_size(ud, &tmp1);
+ rt_cube_size((NDBOX *) DatumGetPointer(origentry->key), &tmp2);
*result = tmp1 - tmp2;
- pfree((char *) ud);
+ pfree(ud);
/*
* fprintf(stderr, "penalty\n"); fprintf(stderr, "\t%g\n", *result);
@@ -308,16 +305,16 @@ g_cube_picksplit(bytea *entryvec,
for (i = FirstOffsetNumber; i < maxoff; i = OffsetNumberNext(i))
{
- datum_alpha = (NDBOX *) (((GISTENTRY *) (VARDATA(entryvec)))[i].pred);
+ datum_alpha = (NDBOX *) DatumGetPointer(((GISTENTRY *) (VARDATA(entryvec)))[i].key);
for (j = OffsetNumberNext(i); j <= maxoff; j = OffsetNumberNext(j))
{
- datum_beta = (NDBOX *) (((GISTENTRY *) (VARDATA(entryvec)))[j].pred);
+ datum_beta = (NDBOX *) DatumGetPointer(((GISTENTRY *) (VARDATA(entryvec)))[j].key);
/* compute the wasted space by unioning these guys */
/* size_waste = size_union - size_inter; */
- union_d = (NDBOX *) cube_union(datum_alpha, datum_beta);
+ union_d = cube_union(datum_alpha, datum_beta);
rt_cube_size(union_d, &size_union);
- inter_d = (NDBOX *) cube_inter(datum_alpha, datum_beta);
+ inter_d = cube_inter(datum_alpha, datum_beta);
rt_cube_size(inter_d, &size_inter);
size_waste = size_union - size_inter;
@@ -346,12 +343,12 @@ g_cube_picksplit(bytea *entryvec,
right = v->spl_right;
v->spl_nright = 0;
- datum_alpha = (NDBOX *) (((GISTENTRY *) (VARDATA(entryvec)))[seed_1].pred);
- datum_l = (NDBOX *) cube_union(datum_alpha, datum_alpha);
- rt_cube_size((NDBOX *) datum_l, &size_l);
- datum_beta = (NDBOX *) (((GISTENTRY *) (VARDATA(entryvec)))[seed_2].pred);;
- datum_r = (NDBOX *) cube_union(datum_beta, datum_beta);
- rt_cube_size((NDBOX *) datum_r, &size_r);
+ datum_alpha = (NDBOX *) DatumGetPointer(((GISTENTRY *) (VARDATA(entryvec)))[seed_1].key);
+ datum_l = cube_union(datum_alpha, datum_alpha);
+ rt_cube_size(datum_l, &size_l);
+ datum_beta = (NDBOX *) DatumGetPointer(((GISTENTRY *) (VARDATA(entryvec)))[seed_2].key);
+ datum_r = cube_union(datum_beta, datum_beta);
+ rt_cube_size(datum_r, &size_r);
/*
* Now split up the regions between the two seeds. An important
@@ -389,11 +386,11 @@ g_cube_picksplit(bytea *entryvec,
}
/* okay, which page needs least enlargement? */
- datum_alpha = (NDBOX *) (((GISTENTRY *) (VARDATA(entryvec)))[i].pred);
- union_dl = (NDBOX *) cube_union(datum_l, datum_alpha);
- union_dr = (NDBOX *) cube_union(datum_r, datum_alpha);
- rt_cube_size((NDBOX *) union_dl, &size_alpha);
- rt_cube_size((NDBOX *) union_dr, &size_beta);
+ datum_alpha = (NDBOX *) DatumGetPointer(((GISTENTRY *) (VARDATA(entryvec)))[i].key);
+ union_dl = cube_union(datum_l, datum_alpha);
+ union_dr = cube_union(datum_r, datum_alpha);
+ rt_cube_size(union_dl, &size_alpha);
+ rt_cube_size(union_dr, &size_beta);
/* pick which page to add it to */
if (size_alpha - size_l < size_beta - size_r)
@@ -417,8 +414,8 @@ g_cube_picksplit(bytea *entryvec,
}
*left = *right = FirstOffsetNumber; /* sentinel value, see dosplit() */
- v->spl_ldatum = (char *) datum_l;
- v->spl_rdatum = (char *) datum_r;
+ v->spl_ldatum = PointerGetDatum(datum_l);
+ v->spl_rdatum = PointerGetDatum(datum_r);
return v;
}