Tighten asserts on ParallelWorkerNumber

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
This commit is contained in:
Tomas Vondra 2026-03-14 15:24:37 +01:00
parent 6ef36bb358
commit 2fa42feb79
4 changed files with 4 additions and 4 deletions

View 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;

View file

@ -102,7 +102,7 @@
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); \
} \

View 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));
}

View 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);
}