1
#include "btree_gist.h"
2
#include "btree_utils_num.h"
3
#include "utils/date.h"
6
gbt_num_compress(GISTENTRY *retval, GISTENTRY *entry, const gbtree_ninfo * tinfo)
19
GBT_NUMKEY *r = (GBT_NUMKEY *) palloc(2 * tinfo->size);
25
v.i2 = DatumGetInt16(entry->key);
29
v.i4 = DatumGetInt32(entry->key);
33
v.i4 = DatumGetObjectId(entry->key);
37
v.dt = DatumGetDateADT(entry->key);
41
leaf = DatumGetPointer(entry->key);
44
memset((void *) &r[0], 0, 2 * tinfo->size);
45
memcpy((void *) &r[0], leaf, tinfo->size);
46
memcpy((void *) &r[tinfo->size], leaf, tinfo->size);
47
retval = palloc(sizeof(GISTENTRY));
48
gistentryinit(*retval, PointerGetDatum(r), entry->rel, entry->page,
49
entry->offset, (2 * tinfo->size), FALSE);
61
** The GiST union method for numerical values
65
gbt_num_union(GBT_NUMKEY * out, const GistEntryVector *entryvec, const gbtree_ninfo * tinfo)
73
numranges = entryvec->n;
74
cur = (GBT_NUMKEY *) DatumGetPointer((entryvec->vector[0].key));
77
o.lower = &((GBT_NUMKEY *) out)[0];
78
o.upper = &((GBT_NUMKEY *) out)[tinfo->size];
80
memcpy((void *) out, (void *) cur, 2 * tinfo->size);
82
for (i = 1; i < numranges; i++)
84
cur = (GBT_NUMKEY *) DatumGetPointer((entryvec->vector[i].key));
86
c.upper = &cur[tinfo->size];
87
if ((*tinfo->f_gt) (o.lower, c.lower)) /* out->lower > cur->lower */
88
memcpy((void *) o.lower, (void *) c.lower, tinfo->size);
89
if ((*tinfo->f_lt) (o.upper, c.upper)) /* out->upper < cur->upper */
90
memcpy((void *) o.upper, (void *) c.upper, tinfo->size);
99
** The GiST same method for numerical values
103
gbt_num_same(const GBT_NUMKEY * a, const GBT_NUMKEY * b, const gbtree_ninfo * tinfo)
109
b1.lower = &(((GBT_NUMKEY *) a)[0]);
110
b1.upper = &(((GBT_NUMKEY *) a)[tinfo->size]);
111
b2.lower = &(((GBT_NUMKEY *) b)[0]);
112
b2.upper = &(((GBT_NUMKEY *) b)[tinfo->size]);
115
(*tinfo->f_eq) (b1.lower, b2.lower) &&
116
(*tinfo->f_eq) (b1.upper, b2.upper)
125
gbt_num_bin_union(Datum *u, GBT_NUMKEY * e, const gbtree_ninfo * tinfo)
131
rd.upper = &e[tinfo->size];
133
if (!DatumGetPointer(*u))
135
*u = PointerGetDatum(palloc(2 * tinfo->size));
136
memcpy((void *) &(((GBT_NUMKEY *) DatumGetPointer(*u))[0]), (void *) rd.lower, tinfo->size);
137
memcpy((void *) &(((GBT_NUMKEY *) DatumGetPointer(*u))[tinfo->size]), (void *) rd.upper, tinfo->size);
143
ur.lower = &(((GBT_NUMKEY *) DatumGetPointer(*u))[0]);
144
ur.upper = &(((GBT_NUMKEY *) DatumGetPointer(*u))[tinfo->size]);
145
if ((*tinfo->f_gt) ((void *) ur.lower, (void *) rd.lower))
146
memcpy((void *) ur.lower, (void *) rd.lower, tinfo->size);
147
if ((*tinfo->f_lt) ((void *) ur.upper, (void *) rd.upper))
148
memcpy((void *) ur.upper, (void *) rd.upper, tinfo->size);
155
** The GiST consistent method
160
const GBT_NUMKEY_R * key,
162
const StrategyNumber *strategy,
164
const gbtree_ninfo * tinfo
172
case BTLessEqualStrategyNumber:
173
retval = (*tinfo->f_ge) (query, key->lower);
175
case BTLessStrategyNumber:
177
retval = (*tinfo->f_gt) (query, key->lower);
179
retval = (*tinfo->f_ge) (query, key->lower);
181
case BTEqualStrategyNumber:
183
retval = (*tinfo->f_eq) (query, key->lower);
185
retval = (*tinfo->f_le) (key->lower, query) && (*tinfo->f_le) (query, key->upper);
187
case BTGreaterStrategyNumber:
189
retval = (*tinfo->f_lt) (query, key->upper);
191
retval = (*tinfo->f_le) (query, key->upper);
193
case BTGreaterEqualStrategyNumber:
194
retval = (*tinfo->f_le) (query, key->upper);
205
gbt_num_picksplit(const GistEntryVector *entryvec, GIST_SPLITVEC *v,
206
const gbtree_ninfo * tinfo)
209
maxoff = entryvec->n - 1;
213
arr = (Nsrt *) palloc((maxoff + 1) * sizeof(Nsrt));
214
nbytes = (maxoff + 2) * sizeof(OffsetNumber);
215
v->spl_left = (OffsetNumber *) palloc(nbytes);
216
v->spl_right = (OffsetNumber *) palloc(nbytes);
217
v->spl_ldatum = PointerGetDatum(0);
218
v->spl_rdatum = PointerGetDatum(0);
224
for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
226
arr[i].t = (GBT_NUMKEY *) DatumGetPointer((entryvec->vector[i].key));
229
qsort((void *) &arr[FirstOffsetNumber], maxoff - FirstOffsetNumber + 1, sizeof(Nsrt), tinfo->f_cmp);
231
/* We do simply create two parts */
233
for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
235
if (i <= (maxoff - FirstOffsetNumber + 1) / 2)
237
gbt_num_bin_union(&v->spl_ldatum, arr[i].t, tinfo);
238
v->spl_left[v->spl_nleft] = arr[i].i;
243
gbt_num_bin_union(&v->spl_rdatum, arr[i].t, tinfo);
244
v->spl_right[v->spl_nright] = arr[i].i;