mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
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).
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
@ -34,11 +34,7 @@
|
||||
|
||||
/* useful macros for accessing int4 arrays */
|
||||
#define ARRPTR(x) ( (int4 *) ARR_DATA_PTR(x) )
|
||||
#ifdef PGSQL71
|
||||
#define ARRNELEMS(x) ArrayGetNItems( ARR_NDIM(x), ARR_DIMS(x))
|
||||
#else
|
||||
#define ARRNELEMS(x) getNitems( ARR_NDIM(x), ARR_DIMS(x))
|
||||
#endif
|
||||
|
||||
#define ARRISNULL(x) ( (x) ? ( ( ARR_NDIM(x) == NDIM ) ? ( ( ARRNELEMS( x ) ) ? 0 : 1 ) : 1 ) : 1 )
|
||||
|
||||
@ -228,14 +224,17 @@ g_int_consistent(GISTENTRY *entry,
|
||||
switch (strategy)
|
||||
{
|
||||
case RTOverlapStrategyNumber:
|
||||
retval = (bool) inner_int_overlap((ArrayType *) (entry->pred), query);
|
||||
retval = inner_int_overlap((ArrayType *) DatumGetPointer(entry->key),
|
||||
query);
|
||||
break;
|
||||
case RTSameStrategyNumber:
|
||||
case RTContainsStrategyNumber:
|
||||
retval = (bool) inner_int_contains((ArrayType *) (entry->pred), query);
|
||||
retval = inner_int_contains((ArrayType *) DatumGetPointer(entry->key),
|
||||
query);
|
||||
break;
|
||||
case RTContainedByStrategyNumber:
|
||||
retval = (bool) inner_int_overlap((ArrayType *) (entry->pred), query);
|
||||
retval = inner_int_overlap((ArrayType *) DatumGetPointer(entry->key),
|
||||
query);
|
||||
break;
|
||||
default:
|
||||
retval = FALSE;
|
||||
@ -265,14 +264,10 @@ g_int_compress(GISTENTRY *entry)
|
||||
|
||||
retval = palloc(sizeof(GISTENTRY));
|
||||
|
||||
#ifdef PGSQL71
|
||||
if (entry->pred)
|
||||
r = (ArrayType *) PG_DETOAST_DATUM_COPY(entry->pred);
|
||||
if (DatumGetPointer(entry->key) != NULL)
|
||||
r = (ArrayType *) PG_DETOAST_DATUM_COPY(entry->key);
|
||||
else
|
||||
r = NULL;
|
||||
#else
|
||||
r = copy_intArrayType((ArrayType *) entry->pred);
|
||||
#endif
|
||||
|
||||
if (ARRISNULL(r))
|
||||
{
|
||||
@ -280,10 +275,10 @@ g_int_compress(GISTENTRY *entry)
|
||||
elog(NOTICE, "COMP IN: NULL");
|
||||
#endif
|
||||
if (r)
|
||||
if ((char *) r != (char *) entry->pred)
|
||||
if (r != (ArrayType *) DatumGetPointer(entry->key))
|
||||
pfree(r);
|
||||
|
||||
gistentryinit(*retval, (char *) NULL, entry->rel, entry->page, entry->offset,
|
||||
gistentryinit(*retval, (Datum) 0, entry->rel, entry->page, entry->offset,
|
||||
0, FALSE);
|
||||
return (retval);
|
||||
}
|
||||
@ -322,7 +317,8 @@ g_int_compress(GISTENTRY *entry)
|
||||
r = resize_intArrayType(r, len);
|
||||
}
|
||||
|
||||
gistentryinit(*retval, (char *) r, entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
|
||||
gistentryinit(*retval, PointerGetDatum(r),
|
||||
entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
|
||||
|
||||
return (retval);
|
||||
}
|
||||
@ -340,25 +336,19 @@ g_int_decompress(GISTENTRY *entry)
|
||||
int i,
|
||||
j;
|
||||
|
||||
#ifdef PGSQL71
|
||||
if (entry->pred)
|
||||
in = (ArrayType *) PG_DETOAST_DATUM(entry->pred);
|
||||
if (DatumGetPointer(entry->key) != NULL)
|
||||
in = (ArrayType *) PG_DETOAST_DATUM(entry->key);
|
||||
else
|
||||
in = NULL;
|
||||
#else
|
||||
in = (ArrayType *) entry->pred;
|
||||
#endif
|
||||
|
||||
if (entry->bytes < ARR_OVERHEAD(NDIM) || ARRISNULL(in))
|
||||
{
|
||||
retval = palloc(sizeof(GISTENTRY));
|
||||
|
||||
#ifdef PGSQL71
|
||||
if (in)
|
||||
if ((char *) in != (char *) entry->pred)
|
||||
if (in != (ArrayType *) DatumGetPointer(entry->key))
|
||||
pfree(in);
|
||||
#endif
|
||||
gistentryinit(*retval, (char *) NULL, entry->rel, entry->page, entry->offset, 0, FALSE);
|
||||
gistentryinit(*retval, (Datum) 0, entry->rel, entry->page, entry->offset, 0, FALSE);
|
||||
#ifdef GIST_DEBUG
|
||||
elog(NOTICE, "DECOMP IN: NULL");
|
||||
#endif
|
||||
@ -372,7 +362,7 @@ g_int_decompress(GISTENTRY *entry)
|
||||
if (lenin < 2 * MAXNUMRANGE)
|
||||
{ /* not comressed value */
|
||||
/* sometimes strange bytesize */
|
||||
gistentryinit(*entry, (char *) in, entry->rel, entry->page, entry->offset, VARSIZE(in), FALSE);
|
||||
gistentryinit(*entry, PointerGetDatum(in), entry->rel, entry->page, entry->offset, VARSIZE(in), FALSE);
|
||||
return (entry);
|
||||
}
|
||||
|
||||
@ -390,13 +380,11 @@ g_int_decompress(GISTENTRY *entry)
|
||||
if ((!i) || *(dr - 1) != j)
|
||||
*dr++ = j;
|
||||
|
||||
#ifdef PGSQL71
|
||||
if ((char *) in != (char *) entry->pred)
|
||||
if (in != (ArrayType *) DatumGetPointer(entry->key))
|
||||
pfree(in);
|
||||
#endif
|
||||
retval = palloc(sizeof(GISTENTRY));
|
||||
|
||||
gistentryinit(*retval, (char *) r, entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
|
||||
gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
|
||||
|
||||
return (retval);
|
||||
}
|
||||
@ -835,9 +823,6 @@ new_intArrayType(int num)
|
||||
MemSet(r, 0, nbytes);
|
||||
r->size = nbytes;
|
||||
r->ndim = NDIM;
|
||||
#ifndef PGSQL71
|
||||
SET_LO_FLAG(false, r);
|
||||
#endif
|
||||
*((int *) ARR_DIMS(r)) = num;
|
||||
*((int *) ARR_LBOUND(r)) = 1;
|
||||
|
||||
@ -1056,14 +1041,10 @@ g_intbig_compress(GISTENTRY *entry)
|
||||
ArrayType *r,
|
||||
*in;
|
||||
|
||||
#ifdef PGSQL71
|
||||
if (entry->pred)
|
||||
in = (ArrayType *) PG_DETOAST_DATUM(entry->pred);
|
||||
if (DatumGetPointer(entry->key) != NULL)
|
||||
in = (ArrayType *) PG_DETOAST_DATUM(entry->key);
|
||||
else
|
||||
in = NULL;
|
||||
#else
|
||||
in = (ArrayType *) entry->pred;
|
||||
#endif
|
||||
|
||||
if (!entry->leafkey)
|
||||
return entry;
|
||||
@ -1072,12 +1053,10 @@ g_intbig_compress(GISTENTRY *entry)
|
||||
|
||||
if (ARRISNULL(in))
|
||||
{
|
||||
#ifdef PGSQL71
|
||||
if (in)
|
||||
if ((char *) in != (char *) entry->pred)
|
||||
if (in != (ArrayType *) DatumGetPointer(entry->key))
|
||||
pfree(in);
|
||||
#endif
|
||||
gistentryinit(*retval, (char *) NULL, entry->rel, entry->page, entry->offset, 0, FALSE);
|
||||
gistentryinit(*retval, (Datum) 0, entry->rel, entry->page, entry->offset, 0, FALSE);
|
||||
return (retval);
|
||||
}
|
||||
|
||||
@ -1086,13 +1065,11 @@ g_intbig_compress(GISTENTRY *entry)
|
||||
ARRPTR(in),
|
||||
ARRNELEMS(in));
|
||||
|
||||
gistentryinit(*retval, (char *) r, entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
|
||||
gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page, entry->offset, VARSIZE(r), FALSE);
|
||||
|
||||
#ifdef PGSQL71
|
||||
if (in)
|
||||
if ((char *) in != (char *) entry->pred)
|
||||
if (in != (ArrayType *) DatumGetPointer(entry->key))
|
||||
pfree(in);
|
||||
#endif
|
||||
|
||||
return (retval);
|
||||
}
|
||||
@ -1100,20 +1077,18 @@ g_intbig_compress(GISTENTRY *entry)
|
||||
GISTENTRY *
|
||||
g_intbig_decompress(GISTENTRY *entry)
|
||||
{
|
||||
#ifdef PGSQL71
|
||||
ArrayType *key;
|
||||
|
||||
key = (ArrayType *) PG_DETOAST_DATUM(entry->pred);
|
||||
if ((char *) key != (char *) entry->pred)
|
||||
key = (ArrayType *) PG_DETOAST_DATUM(entry->key);
|
||||
if (key != (ArrayType *) DatumGetPointer(entry->key))
|
||||
{
|
||||
GISTENTRY *retval;
|
||||
|
||||
retval = palloc(sizeof(GISTENTRY));
|
||||
|
||||
gistentryinit(*retval, (char *) key, entry->rel, entry->page, entry->offset, VARSIZE(key), FALSE);
|
||||
gistentryinit(*retval, PointerGetDatum(key), entry->rel, entry->page, entry->offset, VARSIZE(key), FALSE);
|
||||
return retval;
|
||||
}
|
||||
#endif
|
||||
return entry;
|
||||
}
|
||||
|
||||
@ -1159,14 +1134,14 @@ g_intbig_consistent(GISTENTRY *entry, ArrayType *query, StrategyNumber strategy)
|
||||
switch (strategy)
|
||||
{
|
||||
case RTOverlapStrategyNumber:
|
||||
retval = (bool) _intbig_overlap((ArrayType *) (entry->pred), q);
|
||||
retval = _intbig_overlap((ArrayType *) DatumGetPointer(entry->key), q);
|
||||
break;
|
||||
case RTSameStrategyNumber:
|
||||
case RTContainsStrategyNumber:
|
||||
retval = (bool) _intbig_contains((ArrayType *) (entry->pred), q);
|
||||
retval = _intbig_contains((ArrayType *) DatumGetPointer(entry->key), q);
|
||||
break;
|
||||
case RTContainedByStrategyNumber:
|
||||
retval = (bool) _intbig_overlap((ArrayType *) (entry->pred), q);
|
||||
retval = _intbig_overlap((ArrayType *) DatumGetPointer(entry->key), q);
|
||||
break;
|
||||
default:
|
||||
retval = FALSE;
|
||||
@ -1196,12 +1171,12 @@ _int_common_union(bytea *entryvec, int *sizep, formarray unionf)
|
||||
#endif
|
||||
|
||||
numranges = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY);
|
||||
tmp = (ArrayType *) (((GISTENTRY *) (VARDATA(entryvec)))[0]).pred;
|
||||
tmp = (ArrayType *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[0].key);
|
||||
|
||||
for (i = 1; i < numranges; i++)
|
||||
{
|
||||
out = (*unionf) (tmp, (ArrayType *)
|
||||
(((GISTENTRY *) (VARDATA(entryvec)))[i]).pred);
|
||||
DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[i].key));
|
||||
if (i > 1 && tmp)
|
||||
pfree(tmp);
|
||||
tmp = out;
|
||||
@ -1232,18 +1207,19 @@ _int_common_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result,
|
||||
formarray unionf,
|
||||
formfloat sizef)
|
||||
{
|
||||
Datum ud;
|
||||
ArrayType *ud;
|
||||
float tmp1,
|
||||
tmp2;
|
||||
|
||||
#ifdef GIST_DEBUG
|
||||
elog(NOTICE, "penalty");
|
||||
#endif
|
||||
ud = (Datum) (*unionf) ((ArrayType *) (origentry->pred), (ArrayType *) (newentry->pred));
|
||||
(*sizef) ((ArrayType *) ud, &tmp1);
|
||||
(*sizef) ((ArrayType *) (origentry->pred), &tmp2);
|
||||
ud = (*unionf) ((ArrayType *) DatumGetPointer(origentry->key),
|
||||
(ArrayType *) DatumGetPointer(newentry->key));
|
||||
(*sizef) (ud, &tmp1);
|
||||
(*sizef) ((ArrayType *) DatumGetPointer(origentry->key), &tmp2);
|
||||
*result = tmp1 - tmp2;
|
||||
pfree((char *) ud);
|
||||
pfree(ud);
|
||||
|
||||
#ifdef GIST_DEBUG
|
||||
elog(NOTICE, "--penalty\t%g", *result);
|
||||
@ -1304,10 +1280,10 @@ _int_common_picksplit(bytea *entryvec,
|
||||
|
||||
for (i = FirstOffsetNumber; i < maxoff; i = OffsetNumberNext(i))
|
||||
{
|
||||
datum_alpha = (ArrayType *) (((GISTENTRY *) (VARDATA(entryvec)))[i].pred);
|
||||
datum_alpha = (ArrayType *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[i].key);
|
||||
for (j = OffsetNumberNext(i); j <= maxoff; j = OffsetNumberNext(j))
|
||||
{
|
||||
datum_beta = (ArrayType *) (((GISTENTRY *) (VARDATA(entryvec)))[j].pred);
|
||||
datum_beta = (ArrayType *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[j].key);
|
||||
|
||||
/* compute the wasted space by unioning these guys */
|
||||
/* size_waste = size_union - size_inter; */
|
||||
@ -1342,12 +1318,12 @@ _int_common_picksplit(bytea *entryvec,
|
||||
right = v->spl_right;
|
||||
v->spl_nright = 0;
|
||||
|
||||
datum_alpha = (ArrayType *) (((GISTENTRY *) (VARDATA(entryvec)))[seed_1].pred);
|
||||
datum_alpha = (ArrayType *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[seed_1].key);
|
||||
datum_l = copy_intArrayType(datum_alpha);
|
||||
(*sizef) ((ArrayType *) datum_l, &size_l);
|
||||
datum_beta = (ArrayType *) (((GISTENTRY *) (VARDATA(entryvec)))[seed_2].pred);
|
||||
(*sizef) (datum_l, &size_l);
|
||||
datum_beta = (ArrayType *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[seed_2].key);
|
||||
datum_r = copy_intArrayType(datum_beta);
|
||||
(*sizef) ((ArrayType *) datum_r, &size_r);
|
||||
(*sizef) (datum_r, &size_r);
|
||||
|
||||
/*
|
||||
* Now split up the regions between the two seeds. An important
|
||||
@ -1386,11 +1362,11 @@ _int_common_picksplit(bytea *entryvec,
|
||||
}
|
||||
|
||||
/* okay, which page needs least enlargement? */
|
||||
datum_alpha = (ArrayType *) (((GISTENTRY *) (VARDATA(entryvec)))[i].pred);
|
||||
union_dl = (ArrayType *) (*unionf) (datum_l, datum_alpha);
|
||||
union_dr = (ArrayType *) (*unionf) (datum_r, datum_alpha);
|
||||
(*sizef) ((ArrayType *) union_dl, &size_alpha);
|
||||
(*sizef) ((ArrayType *) union_dr, &size_beta);
|
||||
datum_alpha = (ArrayType *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[i].key);
|
||||
union_dl = (*unionf) (datum_l, datum_alpha);
|
||||
union_dr = (*unionf) (datum_r, datum_alpha);
|
||||
(*sizef) (union_dl, &size_alpha);
|
||||
(*sizef) (union_dr, &size_beta);
|
||||
|
||||
/* pick which page to add it to */
|
||||
if (size_alpha - size_l < size_beta - size_r + WISH_F(v->spl_nleft, v->spl_nright, coef))
|
||||
@ -1428,8 +1404,8 @@ _int_common_picksplit(bytea *entryvec,
|
||||
*(right - 1) = InvalidOffsetNumber;
|
||||
}
|
||||
|
||||
v->spl_ldatum = (char *) datum_l;
|
||||
v->spl_rdatum = (char *) datum_r;
|
||||
v->spl_ldatum = PointerGetDatum(datum_l);
|
||||
v->spl_rdatum = PointerGetDatum(datum_r);
|
||||
|
||||
#ifdef GIST_DEBUG
|
||||
elog(NOTICE, "--------ENDpicksplit %d %d", v->spl_nleft, v->spl_nright);
|
||||
|
@ -225,9 +225,9 @@ gseg_consistent(GISTENTRY *entry,
|
||||
* gseg_leaf_consistent
|
||||
*/
|
||||
if (GIST_LEAF(entry))
|
||||
return (gseg_leaf_consistent((SEG *) (entry->pred), query, strategy));
|
||||
return (gseg_leaf_consistent((SEG *) DatumGetPointer(entry->key), query, strategy));
|
||||
else
|
||||
return (gseg_internal_consistent((SEG *) (entry->pred), query, strategy));
|
||||
return (gseg_internal_consistent((SEG *) DatumGetPointer(entry->key), query, strategy));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -247,22 +247,14 @@ gseg_union(bytea *entryvec, int *sizep)
|
||||
#endif
|
||||
|
||||
numranges = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY);
|
||||
tmp = (SEG *) (((GISTENTRY *) (VARDATA(entryvec)))[0]).pred;
|
||||
tmp = (SEG *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[0].key);
|
||||
*sizep = sizeof(SEG);
|
||||
|
||||
for (i = 1; i < numranges; i++)
|
||||
{
|
||||
out = gseg_binary_union(tmp, (SEG *)
|
||||
(((GISTENTRY *) (VARDATA(entryvec)))[i]).pred,
|
||||
DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[i].key),
|
||||
sizep);
|
||||
#ifdef GIST_DEBUG
|
||||
|
||||
/*
|
||||
* fprintf(stderr, "\t%s ^ %s -> %s\n", seg_out(tmp), seg_out((SEG
|
||||
* *)(((GISTENTRY *)(VARDATA(entryvec)))[i]).pred), seg_out(out));
|
||||
*/
|
||||
#endif
|
||||
|
||||
if (i > 1)
|
||||
pfree(tmp);
|
||||
tmp = out;
|
||||
@ -294,15 +286,16 @@ gseg_decompress(GISTENTRY *entry)
|
||||
float *
|
||||
gseg_penalty(GISTENTRY *origentry, GISTENTRY *newentry, float *result)
|
||||
{
|
||||
Datum ud;
|
||||
SEG *ud;
|
||||
float tmp1,
|
||||
tmp2;
|
||||
|
||||
ud = (Datum) seg_union((SEG *) (origentry->pred), (SEG *) (newentry->pred));
|
||||
rt_seg_size((SEG *) ud, &tmp1);
|
||||
rt_seg_size((SEG *) (origentry->pred), &tmp2);
|
||||
ud = seg_union((SEG *) DatumGetPointer(origentry->key),
|
||||
(SEG *) DatumGetPointer(newentry->key));
|
||||
rt_seg_size(ud, &tmp1);
|
||||
rt_seg_size((SEG *) DatumGetPointer(origentry->key), &tmp2);
|
||||
*result = tmp1 - tmp2;
|
||||
pfree((char *) ud);
|
||||
pfree(ud);
|
||||
|
||||
#ifdef GIST_DEBUG
|
||||
fprintf(stderr, "penalty\n");
|
||||
@ -362,16 +355,16 @@ gseg_picksplit(bytea *entryvec,
|
||||
|
||||
for (i = FirstOffsetNumber; i < maxoff; i = OffsetNumberNext(i))
|
||||
{
|
||||
datum_alpha = (SEG *) (((GISTENTRY *) (VARDATA(entryvec)))[i].pred);
|
||||
datum_alpha = (SEG *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[i].key);
|
||||
for (j = OffsetNumberNext(i); j <= maxoff; j = OffsetNumberNext(j))
|
||||
{
|
||||
datum_beta = (SEG *) (((GISTENTRY *) (VARDATA(entryvec)))[j].pred);
|
||||
datum_beta = (SEG *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[j].key);
|
||||
|
||||
/* compute the wasted space by unioning these guys */
|
||||
/* size_waste = size_union - size_inter; */
|
||||
union_d = (SEG *) seg_union(datum_alpha, datum_beta);
|
||||
union_d = seg_union(datum_alpha, datum_beta);
|
||||
rt_seg_size(union_d, &size_union);
|
||||
inter_d = (SEG *) seg_inter(datum_alpha, datum_beta);
|
||||
inter_d = seg_inter(datum_alpha, datum_beta);
|
||||
rt_seg_size(inter_d, &size_inter);
|
||||
size_waste = size_union - size_inter;
|
||||
|
||||
@ -400,12 +393,12 @@ gseg_picksplit(bytea *entryvec,
|
||||
right = v->spl_right;
|
||||
v->spl_nright = 0;
|
||||
|
||||
datum_alpha = (SEG *) (((GISTENTRY *) (VARDATA(entryvec)))[seed_1].pred);
|
||||
datum_l = (SEG *) seg_union(datum_alpha, datum_alpha);
|
||||
rt_seg_size((SEG *) datum_l, &size_l);
|
||||
datum_beta = (SEG *) (((GISTENTRY *) (VARDATA(entryvec)))[seed_2].pred);;
|
||||
datum_r = (SEG *) seg_union(datum_beta, datum_beta);
|
||||
rt_seg_size((SEG *) datum_r, &size_r);
|
||||
datum_alpha = (SEG *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[seed_1].key);
|
||||
datum_l = seg_union(datum_alpha, datum_alpha);
|
||||
rt_seg_size(datum_l, &size_l);
|
||||
datum_beta = (SEG *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[seed_2].key);
|
||||
datum_r = seg_union(datum_beta, datum_beta);
|
||||
rt_seg_size(datum_r, &size_r);
|
||||
|
||||
/*
|
||||
* Now split up the regions between the two seeds. An important
|
||||
@ -443,11 +436,11 @@ gseg_picksplit(bytea *entryvec,
|
||||
}
|
||||
|
||||
/* okay, which page needs least enlargement? */
|
||||
datum_alpha = (SEG *) (((GISTENTRY *) (VARDATA(entryvec)))[i].pred);
|
||||
union_dl = (SEG *) seg_union(datum_l, datum_alpha);
|
||||
union_dr = (SEG *) seg_union(datum_r, datum_alpha);
|
||||
rt_seg_size((SEG *) union_dl, &size_alpha);
|
||||
rt_seg_size((SEG *) union_dr, &size_beta);
|
||||
datum_alpha = (SEG *) DatumGetPointer(((GISTENTRY *) VARDATA(entryvec))[i].key);
|
||||
union_dl = seg_union(datum_l, datum_alpha);
|
||||
union_dr = seg_union(datum_r, datum_alpha);
|
||||
rt_seg_size(union_dl, &size_alpha);
|
||||
rt_seg_size(union_dr, &size_beta);
|
||||
|
||||
/* pick which page to add it to */
|
||||
if (size_alpha - size_l < size_beta - size_r)
|
||||
@ -471,8 +464,8 @@ gseg_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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user