diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/executor/nodeGather.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c index f32da1e2352..db5883d28ef 100644 --- a/src/backend/executor/nodeGather.c +++ b/src/backend/executor/nodeGather.c @@ -359,14 +359,20 @@ gather_readnext(GatherState *gatherstate) continue; } - /* Advance nextreader pointer in round-robin fashion. */ - gatherstate->nextreader = - (gatherstate->nextreader + 1) % gatherstate->nreaders; - /* If we got a tuple, return it. */ if (tup) return tup; + /* + * Advance nextreader pointer in round-robin fashion. Note that we + * only reach this code if we weren't able to get a tuple from the + * current worker. We used to advance the nextreader pointer after + * every tuple, but it turns out to be much more efficient to keep + * reading from the same queue until that would require blocking. + */ + gatherstate->nextreader = + (gatherstate->nextreader + 1) % gatherstate->nreaders; + /* Have we visited every TupleQueueReader? */ if (gatherstate->nextreader == waitpos) { |