fix tuplesort_begin_merge() broken by rework of tuplesort in 9.6
authorTomas Vondra <[email protected]>
Fri, 13 Jan 2017 07:33:30 +0000 (08:33 +0100)
committerTomas Vondra <[email protected]>
Fri, 13 Jan 2017 07:42:13 +0000 (08:42 +0100)
The tuplesort got reworked quite a bit in 9.6, and this function
was subtly broken by the merge. In particular, it

* failed to set 'movetup' to valid function
* beginmerge() was always called with (finalMergeBatch=true)
* multiple arrays were left un-allocated

In total, this was causing segfaults when execRemote used the
merge sort.

src/backend/utils/sort/tuplesort.c

index e5c70de2102a89ed452d10a9a8d3136a3ff3b17b..062f542b546915d90829eb4bd9f2f363b9ffe426 100644 (file)
@@ -1176,6 +1176,7 @@ tuplesort_begin_merge(TupleDesc tupDesc,
        state->writetup = NULL;
        state->readtup = readtup_datanode;
        state->getlen = getlen_datanode;
+       state->movetup = movetup_heap;
 
        state->tupDesc = tupDesc;       /* assume we need not copy tupDesc */
        state->sortKeys = (SortSupport) palloc0(nkeys * sizeof(SortSupportData));
@@ -1207,6 +1208,11 @@ tuplesort_begin_merge(TupleDesc tupDesc,
        state->mergeavailslots = (int *) palloc0(combiner->conn_count * sizeof(int));
        state->mergeavailmem = (int64 *) palloc0(combiner->conn_count * sizeof(int64));
 
+       state->mergetuples = (char **) palloc0(combiner->conn_count * sizeof(char *));
+       state->mergecurrent = (char **) palloc0(combiner->conn_count * sizeof(char *));
+       state->mergetail = (char **) palloc0(combiner->conn_count * sizeof(char *));
+       state->mergeoverflow = (char **) palloc0(combiner->conn_count * sizeof(char *));
+
        state->tp_runs = (int *) palloc0(combiner->conn_count * sizeof(int));
        state->tp_dummy = (int *) palloc0(combiner->conn_count * sizeof(int));
        state->tp_tapenum = (int *) palloc0(combiner->conn_count * sizeof(int));
@@ -1216,7 +1222,7 @@ tuplesort_begin_merge(TupleDesc tupDesc,
                state->tp_runs[i] = 1;
                state->tp_tapenum[i] = i;
        }
-       beginmerge(state, true);        /* finalMergeBatch=true */
+       beginmerge(state, state->tuples);
        state->status = TSS_FINALMERGE;
 
        MemoryContextSwitchTo(oldcontext);