diff options
| -rw-r--r-- | src/backend/optimizer/plan/createplan.c | 1 | ||||
| -rw-r--r-- | src/backend/pgxc/pool/execRemote.c | 1 | ||||
| -rw-r--r-- | src/backend/utils/sort/tuplesort.c | 22 | ||||
| -rw-r--r-- | src/include/pgxc/planner.h | 1 | ||||
| -rw-r--r-- | src/include/utils/tuplesort.h | 2 |
5 files changed, 18 insertions, 9 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 757360af85..f7e19fb402 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -6086,6 +6086,7 @@ create_remotegrouping_plan(PlannerInfo *root, Plan *local_plan) remote_sort->numCols = sort_plan->numCols; remote_sort->sortColIdx = sort_plan->sortColIdx; remote_sort->sortOperators = sort_plan->sortOperators; + remote_sort->sortCollations = sort_plan->collations; remote_sort->nullsFirst = sort_plan->nullsFirst; appendStringInfoString(orderby_clause, "ORDER BY "); sep = ""; diff --git a/src/backend/pgxc/pool/execRemote.c b/src/backend/pgxc/pool/execRemote.c index c3bbf6b9a9..2869a232d1 100644 --- a/src/backend/pgxc/pool/execRemote.c +++ b/src/backend/pgxc/pool/execRemote.c @@ -3047,6 +3047,7 @@ do_query(RemoteQueryState *node) sort->numCols, sort->sortColIdx, sort->sortOperators, + sort->sortCollations, sort->nullsFirst, node, work_mem); diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index bdc8342f8c..646f0d05d1 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -912,7 +912,7 @@ tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation, Tuplesortstate * tuplesort_begin_merge(TupleDesc tupDesc, int nkeys, AttrNumber *attNums, - Oid *sortOperators, bool *nullsFirstFlags, + Oid *sortOperators, Oid *sortCollations, bool *nullsFirstFlags, RemoteQueryState *combiner, int workMem) { @@ -954,6 +954,7 @@ tuplesort_begin_merge(TupleDesc tupDesc, { Oid sortFunction; bool reverse; + int flags; AssertArg(attNums[i] != 0); AssertArg(sortOperators[i] != 0); @@ -963,21 +964,26 @@ tuplesort_begin_merge(TupleDesc tupDesc, elog(ERROR, "operator %u is not a valid ordering operator", sortOperators[i]); + + /* We use btree's conventions for encoding directionality */ + flags = 0; + if (reverse) + flags |= SK_BT_DESC; + if (nullsFirstFlags[i]) + flags |= SK_BT_NULLS_FIRST; + /* * We needn't fill in sk_strategy or sk_subtype since these scankeys * will never be passed to an index. */ - ScanKeyInit(&state->scanKeys[i], + ScanKeyEntryInitialize(&state->scanKeys[i], + flags, attNums[i], InvalidStrategy, + InvalidOid, + sortCollations[i], sortFunction, (Datum) 0); - - /* However, we use btree's conventions for encoding directionality */ - if (reverse) - state->scanKeys[i].sk_flags |= SK_BT_DESC; - if (nullsFirstFlags[i]) - state->scanKeys[i].sk_flags |= SK_BT_NULLS_FIRST; } /* diff --git a/src/include/pgxc/planner.h b/src/include/pgxc/planner.h index ffbf0b9eda..f41adb56b2 100644 --- a/src/include/pgxc/planner.h +++ b/src/include/pgxc/planner.h @@ -43,6 +43,7 @@ typedef struct int numCols; /* number of sort-key columns */ AttrNumber *sortColIdx; /* their indexes in the target list */ Oid *sortOperators; /* OIDs of operators to sort them by */ + Oid *sortCollations; bool *nullsFirst; /* NULLS FIRST/LAST directions */ } SimpleSort; diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h index 7689e6e121..f7ef3e5d4a 100644 --- a/src/include/utils/tuplesort.h +++ b/src/include/utils/tuplesort.h @@ -82,7 +82,7 @@ extern Tuplesortstate *tuplesort_begin_datum(Oid datumType, #ifdef PGXC extern Tuplesortstate *tuplesort_begin_merge(TupleDesc tupDesc, int nkeys, AttrNumber *attNums, - Oid *sortOperators, bool *nullsFirstFlags, + Oid *sortOperators, Oid *sortCollations, bool *nullsFirstFlags, RemoteQueryState *combiner, int workMem); #endif |
