]> granicus.if.org Git - postgresql/commitdiff
Avoid GatherMerge crash when there are no workers.
authorRobert Haas <rhaas@postgresql.org>
Sat, 1 Apr 2017 01:15:05 +0000 (21:15 -0400)
committerRobert Haas <rhaas@postgresql.org>
Sat, 1 Apr 2017 01:15:05 +0000 (21:15 -0400)
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

src/backend/executor/nodeGatherMerge.c

index 3f0c3ee4d180187a16b84b509b85b6c2320f4133..62c399e0b18620a397ac2f5c2ce0d68a8a9400a1 100644 (file)
@@ -419,10 +419,9 @@ reread:
 }
 
 /*
- * Clear out the tuple table slots for each gather merge input,
- * and return a cleared slot.
+ * Clear out the tuple table slots for each gather merge input.
  */
-static TupleTableSlot *
+static void
 gather_merge_clear_slots(GatherMergeState *gm_state)
 {
        int                     i;
@@ -437,9 +436,6 @@ gather_merge_clear_slots(GatherMergeState *gm_state)
        pfree(gm_state->gm_tuple_buffers);
        /* Free the binaryheap, which was created for sort */
        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)
        if (binaryheap_empty(gm_state->gm_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
        {