postgres.git / summary / log / commit / refs
commit 0e5ff9b9b45a657aea12440478dc002e9b01f138
Author: Tomas Vondra <tomas.vondra@postgresql.org>
Date: Sat Mar 14 14:24:37 2026 +0000
First released in: 14.23, 15.18, 16.14, 17.10, 18.4
Tighten asserts on ParallelWorkerNumber
The comment about ParallelWorkerNumbr in parallel.c says:
In parallel workers, it will be set to a value >= 0 and < the number
of workers before any user code is invoked; each parallel worker will
get a different parallel worker number.
However asserts in various places collecting instrumentation allowed
(ParallelWorkerNumber == num_workers). That would be a bug, as the value
is used as index into an array with num_workers entries.
Fixed by adjusting the asserts accordingly. Backpatch to all supported
versions.
Discussion: https://postgr.es/m/5db067a1-2cdf-4afb-a577-a04f30b69167@vondra.me
Reviewed-by: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Backpatch-through: 14
src/backend/executor/nodeAgg.c | 2 +-
src/backend/executor/nodeBitmapHeapscan.c | 2 +-
src/backend/executor/nodeBitmapIndexscan.c | 2 +-
src/backend/executor/nodeIncrementalSort.c | 2 +-
src/backend/executor/nodeIndexonlyscan.c | 2 +-
src/backend/executor/nodeIndexscan.c | 2 +-
src/backend/executor/nodeMemoize.c | 2 +-
src/backend/executor/nodeSort.c | 2 +-
8 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c
index c50fdef6b38..474888deb2d 100644
--- a/src/backend/executor/nodeAgg.c
+++ b/src/backend/executor/nodeAgg.c
@@ -4413,7 +4413,7 @@ ExecEndAgg(AggState *node)
{
AggregateInstrumentation *si;
- Assert(ParallelWorkerNumber <= node->shared_info->num_workers);
+ Assert(ParallelWorkerNumber < node->shared_info->num_workers);
si = &node->shared_info->sinstrument[ParallelWorkerNumber];
si->hash_batches_used = node->hash_batches_used;
si->hash_disk_used = node->hash_disk_used;
diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c
index bf24f3d7fe0..fd842ad8e22 100644
--- a/src/backend/executor/nodeBitmapHeapscan.c
+++ b/src/backend/executor/nodeBitmapHeapscan.c
@@ -277,7 +277,7 @@ ExecEndBitmapHeapScan(BitmapHeapScanState *node)
{
BitmapHeapScanInstrumentation *si;
- Assert(ParallelWorkerNumber <= node->sinstrument->num_workers);
+ Assert(ParallelWorkerNumber < node->sinstrument->num_workers);
si = &node->sinstrument->sinstrument[ParallelWorkerNumber];
/*
diff --git a/src/backend/executor/nodeBitmapIndexscan.c b/src/backend/executor/nodeBitmapIndexscan.c
index abbb033881a..59a6a16b053 100644
--- a/src/backend/executor/nodeBitmapIndexscan.c
+++ b/src/backend/executor/nodeBitmapIndexscan.c
@@ -192,7 +192,7 @@ ExecEndBitmapIndexScan(BitmapIndexScanState *node)
{
IndexScanInstrumentation *winstrument;
- Assert(ParallelWorkerNumber <= node->biss_SharedInfo->num_workers);
+ Assert(ParallelWorkerNumber < node->biss_SharedInfo->num_workers);
winstrument = &node->biss_SharedInfo->winstrument[ParallelWorkerNumber];
/*
diff --git a/src/backend/executor/nodeIncrementalSort.c b/src/backend/executor/nodeIncrementalSort.c
index 975b0397e7a..941d167e724 100644
--- a/src/backend/executor/nodeIncrementalSort.c
+++ b/src/backend/executor/nodeIncrementalSort.c
@@ -102,7 +102,7 @@
if ((node)->shared_info && (node)->am_worker) \
{ \
Assert(IsParallelWorker()); \
- Assert(ParallelWorkerNumber <= (node)->shared_info->num_workers); \
+ Assert(ParallelWorkerNumber < (node)->shared_info->num_workers); \
instrumentSortedGroup(&(node)->shared_info->sinfo[ParallelWorkerNumber].groupName##GroupInfo, \
(node)->groupName##_state); \
} \
diff --git a/src/backend/executor/nodeIndexonlyscan.c b/src/backend/executor/nodeIndexonlyscan.c
index f464cca9507..a6a00d594c0 100644
--- a/src/backend/executor/nodeIndexonlyscan.c
+++ b/src/backend/executor/nodeIndexonlyscan.c
@@ -423,7 +423,7 @@ ExecEndIndexOnlyScan(IndexOnlyScanState *node)
{
IndexScanInstrumentation *winstrument;
- Assert(ParallelWorkerNumber <= node->ioss_SharedInfo->num_workers);
+ Assert(ParallelWorkerNumber < node->ioss_SharedInfo->num_workers);
winstrument = &node->ioss_SharedInfo->winstrument[ParallelWorkerNumber];
/*
diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c
index 7fcaa37fe62..aff3100f6e2 100644
--- a/src/backend/executor/nodeIndexscan.c
+++ b/src/backend/executor/nodeIndexscan.c
@@ -804,7 +804,7 @@ ExecEndIndexScan(IndexScanState *node)
{
IndexScanInstrumentation *winstrument;
- Assert(ParallelWorkerNumber <= node->iss_SharedInfo->num_workers);
+ Assert(ParallelWorkerNumber < node->iss_SharedInfo->num_workers);
winstrument = &node->iss_SharedInfo->winstrument[ParallelWorkerNumber];
/*
diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c
index 609deb12afb..c0f42a5c19d 100644
--- a/src/backend/executor/nodeMemoize.c
+++ b/src/backend/executor/nodeMemoize.c
@@ -1122,7 +1122,7 @@ ExecEndMemoize(MemoizeState *node)
if (node->stats.mem_peak == 0)
node->stats.mem_peak = node->mem_used;
- Assert(ParallelWorkerNumber <= node->shared_info->num_workers);
+ Assert(ParallelWorkerNumber < node->shared_info->num_workers);
si = &node->shared_info->sinstrument[ParallelWorkerNumber];
memcpy(si, &node->stats, sizeof(MemoizeInstrumentation));
}
diff --git a/src/backend/executor/nodeSort.c b/src/backend/executor/nodeSort.c
index f603337ecd3..c5219fe880b 100644
--- a/src/backend/executor/nodeSort.c
+++ b/src/backend/executor/nodeSort.c
@@ -175,7 +175,7 @@ ExecSort(PlanState *pstate)
TuplesortInstrumentation *si;
Assert(IsParallelWorker());
- Assert(ParallelWorkerNumber <= node->shared_info->num_workers);
+ Assert(ParallelWorkerNumber < node->shared_info->num_workers);
si = &node->shared_info->sinstrument[ParallelWorkerNumber];
tuplesort_get_stats(tuplesortstate, si);
}
[parent: 5b3f63a1bf59]