postgres.git / summary / log / commit / refs

commit    53c7cff7200b6689b102f2e4a40650cf652dae39
Author:   Robert Haas <rhaas@postgresql.org>
Date:     Mon Dec 05 20:54:28 2016 +0000

    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 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); [parent: 093129c9d9fc]