aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/nodeBitmapHeapscan.c
diff options
context:
space:
mode:
authorMelanie Plageman <melanieplageman@gmail.com>2024-12-19 11:55:03 -0500
committerMelanie Plageman <melanieplageman@gmail.com>2024-12-19 11:55:03 -0500
commit754c610e13b820370db4c02010a4c8c5dbd1edbd (patch)
tree3ab0a79e7ffb19dde4db0f8aaf7df83680dd25c4 /src/backend/executor/nodeBitmapHeapscan.c
parent31b0a8f040042c1dfb9ac359fffbb6b8f9375999 (diff)
downloadpostgresql-754c610e13b820370db4c02010a4c8c5dbd1edbd.tar.gz
postgresql-754c610e13b820370db4c02010a4c8c5dbd1edbd.zip
Fix bitmap table scan crash on iterator release
1a0da347a7ac98db replaced Bitmap Table Scan's individual private and shared iterators with a unified iterator. It neglected, however, to check if the iterator had already been cleaned up before doing so on rescan. Add this check both on rescan and end scan to be safe. Reported-by: Richard Guo Author: Richard Guo Discussion: https://postgr.es/m/CAMbWs48nrhcLY1kcd-u9oD%2B6yiS631F_8Fx8ZGsO-BYDwH%2Bbyw%40mail.gmail.com
Diffstat (limited to 'src/backend/executor/nodeBitmapHeapscan.c')
-rw-r--r--src/backend/executor/nodeBitmapHeapscan.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c
index a7cbaf1660e..928c94cab6a 100644
--- a/src/backend/executor/nodeBitmapHeapscan.c
+++ b/src/backend/executor/nodeBitmapHeapscan.c
@@ -572,9 +572,11 @@ ExecReScanBitmapHeapScan(BitmapHeapScanState *node)
if (scan)
{
/*
- * End iteration on iterators saved in scan descriptor.
+ * End iteration on iterators saved in scan descriptor if they have
+ * not already been cleaned up.
*/
- tbm_end_iterate(&scan->st.rs_tbmiterator);
+ if (!tbm_exhausted(&scan->st.rs_tbmiterator))
+ tbm_end_iterate(&scan->st.rs_tbmiterator);
/* rescan to release any page pin */
table_rescan(node->ss.ss_currentScanDesc, NULL);
@@ -654,9 +656,11 @@ ExecEndBitmapHeapScan(BitmapHeapScanState *node)
if (scanDesc)
{
/*
- * End iteration on iterators saved in scan descriptor.
+ * End iteration on iterators saved in scan descriptor if they have
+ * not already been cleaned up.
*/
- tbm_end_iterate(&scanDesc->st.rs_tbmiterator);
+ if (!tbm_exhausted(&scanDesc->st.rs_tbmiterator))
+ tbm_end_iterate(&scanDesc->st.rs_tbmiterator);
/*
* close table scan