aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTeodor Sigaev <teodor@sigaev.ru>2016-03-30 18:38:53 +0300
committerTeodor Sigaev <teodor@sigaev.ru>2016-03-30 18:38:53 +0300
commit87545f541278ffde4fa1ccf396affbc4e9d59a23 (patch)
tree64d67a07f8f1c4c8b10684e88ac0099ada07ab01 /src
parentccd6eb49a4ae924290ab7eba5540218f5beb48b8 (diff)
downloadpostgresql-87545f541278ffde4fa1ccf396affbc4e9d59a23.tar.gz
postgresql-87545f541278ffde4fa1ccf396affbc4e9d59a23.zip
Use traversalValue in SP-GiST range opclass.
Author: Alexander Lebedev
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/rangetypes_spgist.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/backend/utils/adt/rangetypes_spgist.c b/src/backend/utils/adt/rangetypes_spgist.c
index 57fd1bc38e2..7d35d581126 100644
--- a/src/backend/utils/adt/rangetypes_spgist.c
+++ b/src/backend/utils/adt/rangetypes_spgist.c
@@ -310,14 +310,12 @@ spg_range_quad_inner_consistent(PG_FUNCTION_ARGS)
spgInnerConsistentOut *out = (spgInnerConsistentOut *) PG_GETARG_POINTER(1);
int which;
int i;
+ MemoryContext oldCtx;
/*
* For adjacent search we need also previous centroid (if any) to improve
* the precision of the consistent check. In this case needPrevious flag
- * is set and centroid is passed into reconstructedValues. This is not the
- * intended purpose of reconstructedValues (because we already have the
- * full value available at the leaf), but it's a convenient place to store
- * state while traversing the tree.
+ * is set and centroid is passed into traversalValue.
*/
bool needPrevious = false;
@@ -565,9 +563,9 @@ spg_range_quad_inner_consistent(PG_FUNCTION_ARGS)
* for lower or upper bounds to be adjacent. Deserialize
* previous centroid range if present for checking this.
*/
- if (in->reconstructedValue != (Datum) 0)
+ if (in->traversalValue != (Datum) 0)
{
- prevCentroid = DatumGetRangeType(in->reconstructedValue);
+ prevCentroid = DatumGetRangeType(in->traversalValue);
range_deserialize(typcache, prevCentroid,
&prevLower, &prevUpper, &prevEmpty);
}
@@ -746,19 +744,37 @@ spg_range_quad_inner_consistent(PG_FUNCTION_ARGS)
/* We must descend into the quadrant(s) identified by 'which' */
out->nodeNumbers = (int *) palloc(sizeof(int) * in->nNodes);
if (needPrevious)
- out->reconstructedValues = (Datum *) palloc(sizeof(Datum) * in->nNodes);
+ out->traversalValues = (void **) palloc(sizeof(void *) * in->nNodes);
out->nNodes = 0;
+
+ /*
+ * Elements of traversalValues should be allocated in
+ * traversalMemoryContext
+ */
+ oldCtx = MemoryContextSwitchTo(in->traversalMemoryContext);
+
for (i = 1; i <= in->nNodes; i++)
{
if (which & (1 << i))
{
/* Save previous prefix if needed */
if (needPrevious)
- out->reconstructedValues[out->nNodes] = in->prefixDatum;
- out->nodeNumbers[out->nNodes++] = i - 1;
+ {
+ Datum previousCentroid;
+
+ /* We know, that in->prefixDatum in this place is varlena,
+ * because it's range
+ */
+ previousCentroid = datumCopy(in->prefixDatum, false, -1);
+ out->traversalValues[out->nNodes] = (void *)previousCentroid;
+ }
+ out->nodeNumbers[out->nNodes] = i - 1;
+ out->nNodes++;
}
}
+ MemoryContextSwitchTo(oldCtx);
+
PG_RETURN_VOID();
}