]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Tighten asserts on ParallelWorkerNumber
authorTomas Vondra <tomas.vondra@postgresql.org>
Sat, 14 Mar 2026 14:24:37 +0000 (15:24 +0100)
committerTomas Vondra <tomas.vondra@postgresql.org>
Sat, 14 Mar 2026 14:26:39 +0000 (15:26 +0100)
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
src/backend/executor/nodeBitmapHeapscan.c
src/backend/executor/nodeBitmapIndexscan.c
src/backend/executor/nodeIncrementalSort.c
src/backend/executor/nodeIndexonlyscan.c
src/backend/executor/nodeIndexscan.c
src/backend/executor/nodeMemoize.c
src/backend/executor/nodeSort.c

index 7d487a165fa50c1f517bcc0945bcd2aa1b655cdb..fd5b5104c56658a8495689584e33c79887960811 100644 (file)
@@ -4407,7 +4407,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;
index e0b6df6476765a65e5a7647ef702cbf9e2e5089b..74eac93284e01456232c9022fd7ea41ed781cdc0 100644 (file)
@@ -276,7 +276,7 @@ ExecEndBitmapHeapScan(BitmapHeapScanState *node)
        {
                BitmapHeapScanInstrumentation *si;
 
-               Assert(ParallelWorkerNumber <= node->sinstrument->num_workers);
+               Assert(ParallelWorkerNumber < node->sinstrument->num_workers);
                si = &node->sinstrument->sinstrument[ParallelWorkerNumber];
 
                /*
index 058a59ef5e7575c7ed184f69606889e591f66eaf..e08b1c43ace26a89ae341b7a72eb75811cec31ee 100644 (file)
@@ -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];
 
                /*
index 3e6a79ea0c0b93b76fd854016b90ea27c0fa857e..1d831049b65aa15b85d31e9523869bd32d3474a5 100644 (file)
                        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); \
                        } \
index c2d09374517e3ce45fc2e32f3906b201a5c35fe7..9e8ea8ddf220220455b2ccda3644ccc9e34fe6b7 100644 (file)
@@ -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];
 
                /*
index a616abff04cf03122b21bbec5f52f92e458dfdcf..4513b1f7a901768ed1d8d37853fc3b41614c8deb 100644 (file)
@@ -802,7 +802,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];
 
                /*
index edf52efd4c3c9bdd0adf6ee891ad5a21bddd27ac..fdca97d7426f10c4b75f8a8599064797954ca8f0 100644 (file)
@@ -1123,7 +1123,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));
        }
index fd3a48ba54615e3070e92a8f27c48ad26052f826..e02313f7813e119a6435db3514c75b968f2371bf 100644 (file)
@@ -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);
                }