Commit 25dc142a authored by Robert Haas's avatar Robert Haas

Avoid GatherMerge crash when there are no workers.

It's unnecessary to return an actual slot when we have no tuple.
We can just return NULL, which avoids the risk of indexing into an
array that might not contain any elements.

Rushabh Lathia, per a report from Tomas Vondra

Discussion: http://postgr.es/m/6ecd6f17-0dcf-1de7-ded8-0de7db1ddc88@2ndquadrant.com
parent 7d8f6986
...@@ -419,10 +419,9 @@ reread: ...@@ -419,10 +419,9 @@ reread:
} }
/* /*
* Clear out the tuple table slots for each gather merge input, * Clear out the tuple table slots for each gather merge input.
* and return a cleared slot.
*/ */
static TupleTableSlot * static void
gather_merge_clear_slots(GatherMergeState *gm_state) gather_merge_clear_slots(GatherMergeState *gm_state)
{ {
int i; int i;
...@@ -437,9 +436,6 @@ gather_merge_clear_slots(GatherMergeState *gm_state) ...@@ -437,9 +436,6 @@ gather_merge_clear_slots(GatherMergeState *gm_state)
pfree(gm_state->gm_tuple_buffers); pfree(gm_state->gm_tuple_buffers);
/* Free the binaryheap, which was created for sort */ /* Free the binaryheap, which was created for sort */
binaryheap_free(gm_state->gm_heap); binaryheap_free(gm_state->gm_heap);
/* return any clear slot */
return gm_state->gm_slots[0];
} }
/* /*
...@@ -479,7 +475,8 @@ gather_merge_getnext(GatherMergeState *gm_state) ...@@ -479,7 +475,8 @@ gather_merge_getnext(GatherMergeState *gm_state)
if (binaryheap_empty(gm_state->gm_heap)) if (binaryheap_empty(gm_state->gm_heap))
{ {
/* All the queues are exhausted, and so is the heap */ /* All the queues are exhausted, and so is the heap */
return gather_merge_clear_slots(gm_state); gather_merge_clear_slots(gm_state);
return NULL;
} }
else else
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment