aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/access/gin/ginget.c10
-rw-r--r--src/backend/access/gin/ginscan.c16
-rw-r--r--src/include/access/gin_private.h1
3 files changed, 20 insertions, 7 deletions
diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c
index f78c9fcc9c7..96c1cb971e4 100644
--- a/src/backend/access/gin/ginget.c
+++ b/src/backend/access/gin/ginget.c
@@ -560,6 +560,10 @@ startScan(IndexScanDesc scan)
}
}
+ /*
+ * Now that we have the estimates for the entry frequencies, finish
+ * initializing the scan keys.
+ */
for (i = 0; i < so->nkeys; i++)
startScanKey(ginstate, so, so->keys + i);
}
@@ -1763,7 +1767,6 @@ scanPendingInsert(IndexScanDesc scan, TIDBitmap *tbm, int64 *ntids)
}
-#define GinIsNewKey(s) ( ((GinScanOpaque) scan->opaque)->keys == NULL )
#define GinIsVoidRes(s) ( ((GinScanOpaque) scan->opaque)->isVoidRes )
Datum
@@ -1771,6 +1774,7 @@ gingetbitmap(PG_FUNCTION_ARGS)
{
IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0);
TIDBitmap *tbm = (TIDBitmap *) PG_GETARG_POINTER(1);
+ GinScanOpaque so = (GinScanOpaque) scan->opaque;
int64 ntids;
ItemPointerData iptr;
bool recheck;
@@ -1778,8 +1782,8 @@ gingetbitmap(PG_FUNCTION_ARGS)
/*
* Set up the scan keys, and check for unsatisfiable query.
*/
- if (GinIsNewKey(scan))
- ginNewScanKey(scan);
+ ginFreeScanKeys(so); /* there should be no keys yet, but just to be sure */
+ ginNewScanKey(scan);
if (GinIsVoidRes(scan))
PG_RETURN_INT64(0);
diff --git a/src/backend/access/gin/ginscan.c b/src/backend/access/gin/ginscan.c
index 66c62b2e32a..0b9c450b89e 100644
--- a/src/backend/access/gin/ginscan.c
+++ b/src/backend/access/gin/ginscan.c
@@ -163,6 +163,10 @@ ginFillScanKey(GinScanOpaque so, OffsetNumber attnum,
key->curItemMatches = false;
key->recheckCurItem = false;
key->isFinished = false;
+ key->nrequired = 0;
+ key->nadditional = 0;
+ key->requiredEntries = NULL;
+ key->additionalEntries = NULL;
ginInitConsistentFunction(ginstate, key);
@@ -223,8 +227,8 @@ ginFillScanKey(GinScanOpaque so, OffsetNumber attnum,
}
}
-static void
-freeScanKeys(GinScanOpaque so)
+void
+ginFreeScanKeys(GinScanOpaque so)
{
uint32 i;
@@ -237,6 +241,10 @@ freeScanKeys(GinScanOpaque so)
pfree(key->scanEntry);
pfree(key->entryRes);
+ if (key->requiredEntries)
+ pfree(key->requiredEntries);
+ if (key->additionalEntries)
+ pfree(key->additionalEntries);
}
pfree(so->keys);
@@ -416,7 +424,7 @@ ginrescan(PG_FUNCTION_ARGS)
/* remaining arguments are ignored */
GinScanOpaque so = (GinScanOpaque) scan->opaque;
- freeScanKeys(so);
+ ginFreeScanKeys(so);
if (scankey && scan->numberOfKeys > 0)
{
@@ -434,7 +442,7 @@ ginendscan(PG_FUNCTION_ARGS)
IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0);
GinScanOpaque so = (GinScanOpaque) scan->opaque;
- freeScanKeys(so);
+ ginFreeScanKeys(so);
MemoryContextDelete(so->tempCtx);
diff --git a/src/include/access/gin_private.h b/src/include/access/gin_private.h
index d179319b1e5..000dda11b45 100644
--- a/src/include/access/gin_private.h
+++ b/src/include/access/gin_private.h
@@ -890,6 +890,7 @@ extern Datum ginrescan(PG_FUNCTION_ARGS);
extern Datum ginmarkpos(PG_FUNCTION_ARGS);
extern Datum ginrestrpos(PG_FUNCTION_ARGS);
extern void ginNewScanKey(IndexScanDesc scan);
+extern void ginFreeScanKeys(GinScanOpaque so);
/* ginget.c */
extern Datum gingetbitmap(PG_FUNCTION_ARGS);