]> 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:27:56 +0000 (15:27 +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 c50fdef6b38f0119b3f1c97064691a9ce09825cf..474888deb2d62d7d03c14114fb370ea3b16e1bca 100644 (file)
@@ -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;
index bf24f3d7fe0a803081a52cd38a13dc0cfc16c1b5..fd842ad8e226523914626bdc33df434dbb8ac4dc 100644 (file)
@@ -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];
 
                /*
index abbb033881a2295068a5df41dc26766817bf76fa..59a6a16b0536837444e16aa4d09c05b91a8ad4ed 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 975b0397e7aa88796634aebb175ac50290558120..941d167e72401be75842700520c695730fcf7dc3 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 f464cca9507a54b2b36c09ca3453c97333797f3e..a6a00d594c09c647e7f3cd49930e5e4e6206468b 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 7fcaa37fe6253cea398ad07068474f3cafd23f79..aff3100f6e250f98aad58a22ca5638c7902d2555 100644 (file)
@@ -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];
 
                /*
index 609deb12afb2aa9132627fc035a41178504dbd76..c0f42a5c19ddd99915248bf6d792f55f04fe0e55 100644 (file)
@@ -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));
        }
index f603337ecd34495fc4d7a75968396ae68e5b3982..c5219fe880b05aad65d508545584107c245e6bff 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);
                }