From 53c7cff7200b6689b102f2e4a40650cf652dae39 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 5 Dec 2016 15:54:28 -0500 Subject: [PATCH] Ensure gatherstate->nextreader is properly initialized. The previously code worked OK as long as a Gather node was never rescanned, or if it was rescanned, as long as it got at least as many workers on rescan as it had originally. But if the number of workers ever decreased on a rescan, then it could crash. Andreas Seltenreich --- src/backend/executor/nodeGather.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c index 880ca62397..2bdf223182 100644 --- a/src/backend/executor/nodeGather.c +++ b/src/backend/executor/nodeGather.c @@ -173,6 +173,7 @@ ExecGather(GatherState *node) if (pcxt->nworkers_launched > 0) { node->nreaders = 0; + node->nextreader = 0; node->reader = palloc(pcxt->nworkers_launched * sizeof(TupleQueueReader *)); @@ -335,6 +336,7 @@ gather_readnext(GatherState *gatherstate) CHECK_FOR_INTERRUPTS(); /* Attempt to read a tuple, but don't block if none is available. */ + Assert(gatherstate->nextreader < gatherstate->nreaders); reader = gatherstate->reader[gatherstate->nextreader]; tup = TupleQueueReaderNext(reader, true, &readerdone);