]> granicus.if.org Git - postgresql/commitdiff
Ensure gatherstate->nextreader is properly initialized.
authorRobert Haas <rhaas@postgresql.org>
Mon, 5 Dec 2016 20:54:28 +0000 (15:54 -0500)
committerRobert Haas <rhaas@postgresql.org>
Mon, 5 Dec 2016 20:59:02 +0000 (15:59 -0500)
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

index 438d1b24fc2e4be8d1b56206a337269e23c0a8bf..7342aadfbb440a7b2721110c847c6ede7aa61e65 100644 (file)
@@ -172,6 +172,7 @@ ExecGather(GatherState *node)
                        if (pcxt->nworkers_launched > 0)
                        {
                                node->nreaders = 0;
+                               node->nextreader = 0;
                                node->reader =
                                        palloc(pcxt->nworkers_launched * sizeof(TupleQueueReader *));
 
@@ -334,6 +335,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);