[PATCH v9 3/3] fix the incorrect call to scan_set_tidrange()
Cary Huang <cary.huang@highgo.ca>
From: Cary Huang <cary.huang@highgo.ca>
To:
Date: 2025-08-13T21:26:56Z
Lists: pgsql-hackers
---
src/backend/access/heap/heapam.c | 5 ----
src/backend/access/table/tableam.c | 7 ++++-
src/backend/executor/nodeTidrangescan.c | 37 +++++++++++++++++++++----
src/include/access/tableam.h | 4 ++-
4 files changed, 40 insertions(+), 13 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index d0e650de57..46f5df2ec4 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -492,11 +492,6 @@ heap_setscanlimits(TableScanDesc sscan, BlockNumber startBlk, BlockNumber numBlk
scan->rs_numblocks = numBlks;
/* set the limits in the ParallelBlockTableScanDesc, when present */
-
- /*
- * XXX no lock is being taken here. What guarantees are there that there
- * isn't some worker using the old limits when the new limits are imposed?
- */
if (scan->rs_base.rs_parallel != NULL)
{
ParallelBlockTableScanDesc bpscan;
diff --git a/src/backend/access/table/tableam.c b/src/backend/access/table/tableam.c
index 8036654c77..01ca264ba4 100644
--- a/src/backend/access/table/tableam.c
+++ b/src/backend/access/table/tableam.c
@@ -189,7 +189,8 @@ table_beginscan_parallel(Relation relation, ParallelTableScanDesc pscan)
}
TableScanDesc
-table_beginscan_parallel_tidrange(Relation relation, ParallelTableScanDesc pscan)
+table_beginscan_parallel_tidrange(Relation relation, ParallelTableScanDesc pscan,
+ ItemPointerData * mintid, ItemPointerData * maxtid)
{
Snapshot snapshot;
uint32 flags = SO_TYPE_TIDRANGESCAN | SO_ALLOW_PAGEMODE;
@@ -216,6 +217,10 @@ table_beginscan_parallel_tidrange(Relation relation, ParallelTableScanDesc pscan
sscan = relation->rd_tableam->scan_begin(relation, snapshot, 0, NULL,
pscan, flags);
+ /* Set the TID range if needed */
+ if (mintid && maxtid)
+ relation->rd_tableam->scan_set_tidrange(sscan, mintid, maxtid);
+
return sscan;
}
diff --git a/src/backend/executor/nodeTidrangescan.c b/src/backend/executor/nodeTidrangescan.c
index afa47b01de..eef44e9d78 100644
--- a/src/backend/executor/nodeTidrangescan.c
+++ b/src/backend/executor/nodeTidrangescan.c
@@ -250,9 +250,13 @@ TidRangeNext(TidRangeScanState *node)
}
else
{
- /* rescan with the updated TID range */
- table_rescan_tidrange(scandesc, &node->trss_mintid,
- &node->trss_maxtid);
+ /* rescan with the updated TID range only in non-parallel mode */
+ if (scandesc->rs_parallel == NULL)
+ {
+ /* rescan with the updated TID range */
+ table_rescan_tidrange(scandesc, &node->trss_mintid,
+ &node->trss_maxtid);
+ }
}
node->trss_inScan = true;
@@ -446,8 +450,19 @@ ExecTidRangeScanInitializeDSM(TidRangeScanState *node, ParallelContext *pcxt)
pscan,
estate->es_snapshot);
shm_toc_insert(pcxt->toc, node->ss.ps.plan->plan_node_id, pscan);
- node->ss.ss_currentScanDesc =
- table_beginscan_parallel_tidrange(node->ss.ss_currentRelation, pscan);
+
+ /*
+ * Initialize parallel scan descriptor with given TID range if it can be
+ * evaluated successfully.
+ */
+ if (TidRangeEval(node))
+ node->ss.ss_currentScanDesc =
+ table_beginscan_parallel_tidrange(node->ss.ss_currentRelation, pscan,
+ &node->trss_mintid, &node->trss_maxtid);
+ else
+ node->ss.ss_currentScanDesc =
+ table_beginscan_parallel_tidrange(node->ss.ss_currentRelation, pscan,
+ NULL, NULL);
}
/* ----------------------------------------------------------------
@@ -465,6 +480,11 @@ ExecTidRangeScanReInitializeDSM(TidRangeScanState *node,
pscan = node->ss.ss_currentScanDesc->rs_parallel;
table_parallelscan_reinitialize(node->ss.ss_currentRelation, pscan);
+ /* Set the new TID range if it can be evaluated successfully */
+ if (TidRangeEval(node))
+ node->ss.ss_currentRelation->rd_tableam->scan_set_tidrange(
+ node->ss.ss_currentScanDesc, &node->trss_mintid,
+ &node->trss_maxtid);
}
/* ----------------------------------------------------------------
@@ -480,6 +500,11 @@ ExecTidRangeScanInitializeWorker(TidRangeScanState *node,
ParallelTableScanDesc pscan;
pscan = shm_toc_lookup(pwcxt->toc, node->ss.ps.plan->plan_node_id, false);
+
+ /*
+ * As a worker, there is no need to set TID range as it has already been set
+ * by the leader and available in shared memory.
+ */
node->ss.ss_currentScanDesc =
- table_beginscan_parallel_tidrange(node->ss.ss_currentRelation, pscan);
+ table_beginscan_parallel_tidrange(node->ss.ss_currentRelation, pscan, NULL, NULL);
}
diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h
index 0f46a47c2e..99596d6258 100644
--- a/src/include/access/tableam.h
+++ b/src/include/access/tableam.h
@@ -1133,7 +1133,9 @@ extern TableScanDesc table_beginscan_parallel(Relation relation,
* Caller must hold a suitable lock on the relation.
*/
extern TableScanDesc table_beginscan_parallel_tidrange(Relation relation,
- ParallelTableScanDesc pscan);
+ ParallelTableScanDesc pscan,
+ ItemPointerData * mintid,
+ ItemPointerData * maxtid);
/*
* Restart a parallel scan. Call this in the leader process. Caller is
--
2.17.1
------=_Part_1501398_1464885575.1755122586177
Content-Type: application/octet-stream;
name=v9-0001-v7-parallel-TID-range-scan-patch.patch
Content-Transfer-Encoding: 7bit
X-ZM_AttachId: 139744153861870000
Content-Disposition: attachment;
filename=v9-0001-v7-parallel-TID-range-scan-patch.patch