]> 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:30:05 +0000 (15:30 +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 53ead77ece8cb2ff0fc97c243259a4182efb7cc3..bb6f55b2c75477b12c5b75e10cac0d98f43d8c70 100644 (file)
@@ -4317,7 +4317,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 2ce5ed5ec8cd4d94eff2b1e35413d00af5aee907..235fb90564a7019cbc1b0796338e4f0c9fe3ab68 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 45157ffb9c7ab3855294343db2bac54188a9e2d5..79ed1cf7f0c23d8f30b581306f65aabe3ca72482 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 3fc925d7b48e58a774581d43fcceb923ad6210e1..c1b8cc913d5fac1ff1bb66c91e13fc199c78ceff 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);
                }