]> 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:31:29 +0000 (15:31 +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/nodeIncrementalSort.c
src/backend/executor/nodeMemoize.c
src/backend/executor/nodeSort.c

index 468db94fe5ba07a19842aeb3a841ca956e5953af..1059d265136415bfdf4445e5ec1b2e2b59902906 100644 (file)
@@ -4318,7 +4318,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 7683e3341cde9abbafa18cde1cba1f44a20b3903..ddefb1ac950877f17649807068ba00c1f56003b8 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 3c54ca542149210a1e2f6124d8ff42f497be4efe..732441a398dcb988286cd35070b518dee35a8dbb 100644 (file)
@@ -1109,7 +1109,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 c6c72c6e67852b5fad944a8983e9769d9b9f9e70..e9e58d07338d0c36092a78b08f8dd6ff6f7096d9 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);
                }