From: Tomas Vondra Date: Fri, 13 Jan 2017 07:33:30 +0000 (+0100) Subject: fix tuplesort_begin_merge() broken by rework of tuplesort in 9.6 X-Git-Tag: XL_10_R1BETA1~470 X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=3a3fe8d23ea32a7860c39dc03c84c7133bcca2dd;p=postgres-xl.git fix tuplesort_begin_merge() broken by rework of tuplesort in 9.6 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. --- diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index e5c70de210..062f542b54 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -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);