]> 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:34:37 +0000 (15:34 +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 1fdfbd1eea7e9fb3cced884fd440a5c739b0c9ac..425f4d17419036c31e70d688ea479a51428280a6 100644 (file)
@@ -4386,7 +4386,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 ed56bcad3354f3b06fa3b951fa1af4158f069931..90354ead5ecf34eed3d2a4aae540f8c7539647ff 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 4543cea9c20490ab181961e26c876ad56ca78774..1be3bdd55f4a5d70cac3c8a89f9f82fe782c18d5 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 b99027e0d7f4e26e7b6bdacc6faf6eeeb0df5a1d..025a350073b2b8f42e8406ca955f20dca531a69c 100644 (file)
@@ -134,7 +134,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);
                }