aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2016-12-05 15:54:28 -0500
committerRobert Haas <rhaas@postgresql.org>2016-12-05 15:54:28 -0500
commit53c7cff7200b6689b102f2e4a40650cf652dae39 (patch)
tree1004dc36f275250ccf8ce47a2b8236038136a4f2 /src/backend/executor
parent093129c9d9fc231649b3cc27b8086443ccbbbc22 (diff)
downloadpostgresql-53c7cff7200b6689b102f2e4a40650cf652dae39.tar.gz
postgresql-53c7cff7200b6689b102f2e4a40650cf652dae39.zip
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
Diffstat (limited to 'src/backend/executor')
-rw-r--r--src/backend/executor/nodeGather.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c
index 880ca623974..2bdf2231826 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);