diff options
Diffstat (limited to 'src/backend/access/spgist/spgscan.c')
-rw-r--r-- | src/backend/access/spgist/spgscan.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/backend/access/spgist/spgscan.c b/src/backend/access/spgist/spgscan.c index 620e7461998..8aa28ecbc39 100644 --- a/src/backend/access/spgist/spgscan.c +++ b/src/backend/access/spgist/spgscan.c @@ -30,6 +30,7 @@ typedef void (*storeRes_func) (SpGistScanOpaque so, ItemPointer heapPtr, typedef struct ScanStackEntry { Datum reconstructedValue; /* value reconstructed from parent */ + void *traversalValue; /* opclass-specific traverse value */ int level; /* level of items on this page */ ItemPointerData ptr; /* block and offset to scan from */ } ScanStackEntry; @@ -42,6 +43,9 @@ freeScanStackEntry(SpGistScanOpaque so, ScanStackEntry *stackEntry) if (!so->state.attType.attbyval && DatumGetPointer(stackEntry->reconstructedValue) != NULL) pfree(DatumGetPointer(stackEntry->reconstructedValue)); + if (stackEntry->traversalValue) + pfree(stackEntry->traversalValue); + pfree(stackEntry); } @@ -239,6 +243,7 @@ static bool spgLeafTest(Relation index, SpGistScanOpaque so, SpGistLeafTuple leafTuple, bool isnull, int level, Datum reconstructedValue, + void *traversalValue, Datum *leafValue, bool *recheck) { bool result; @@ -265,6 +270,7 @@ spgLeafTest(Relation index, SpGistScanOpaque so, in.scankeys = so->keyData; in.nkeys = so->numberOfKeys; in.reconstructedValue = reconstructedValue; + in.traversalValue = traversalValue; in.level = level; in.returnData = so->want_itup; in.leafDatum = leafDatum; @@ -365,6 +371,7 @@ redirect: leafTuple, isnull, stackEntry->level, stackEntry->reconstructedValue, + stackEntry->traversalValue, &leafValue, &recheck)) { @@ -411,6 +418,7 @@ redirect: leafTuple, isnull, stackEntry->level, stackEntry->reconstructedValue, + stackEntry->traversalValue, &leafValue, &recheck)) { @@ -456,6 +464,8 @@ redirect: in.scankeys = so->keyData; in.nkeys = so->numberOfKeys; in.reconstructedValue = stackEntry->reconstructedValue; + in.traversalMemoryContext = oldCtx; + in.traversalValue = stackEntry->traversalValue; in.level = stackEntry->level; in.returnData = so->want_itup; in.allTheSame = innerTuple->allTheSame; @@ -523,6 +533,14 @@ redirect: else newEntry->reconstructedValue = (Datum) 0; + /* + * Elements of out.traversalValues should be allocated in + * in.traversalMemoryContext, which is actually a long + * lived context of index scan. + */ + newEntry->traversalValue = (out.traversalValues) ? + out.traversalValues[i] : NULL; + so->scanStack = lcons(newEntry, so->scanStack); } } |