diff options
Diffstat (limited to 'src/backend/optimizer/path/pathkeys.c')
-rw-r--r-- | src/backend/optimizer/path/pathkeys.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c index 8b258cbef92..df966b18f34 100644 --- a/src/backend/optimizer/path/pathkeys.c +++ b/src/backend/optimizer/path/pathkeys.c @@ -1355,7 +1355,8 @@ make_pathkeys_for_sortclauses(PlannerInfo *root, &sortclauses, tlist, false, - &sortable); + &sortable, + false); /* It's caller error if not all clauses were sortable */ Assert(sortable); return result; @@ -1379,13 +1380,17 @@ make_pathkeys_for_sortclauses(PlannerInfo *root, * to remove any clauses that can be proven redundant via the eclass logic. * Even though we'll have to hash in that case, we might as well not hash * redundant columns.) + * + * If set_ec_sortref is true then sets the value of the pathkey's + * EquivalenceClass unless it's already initialized. */ List * make_pathkeys_for_sortclauses_extended(PlannerInfo *root, List **sortclauses, List *tlist, bool remove_redundant, - bool *sortable) + bool *sortable, + bool set_ec_sortref) { List *pathkeys = NIL; ListCell *l; @@ -1409,6 +1414,15 @@ make_pathkeys_for_sortclauses_extended(PlannerInfo *root, sortcl->nulls_first, sortcl->tleSortGroupRef, true); + if (pathkey->pk_eclass->ec_sortref == 0 && set_ec_sortref) + { + /* + * Copy the sortref if it hasn't been set yet. That may happen if + * the EquivalenceClass was constructed from a WHERE clause, i.e. + * it doesn't have a target reference at all. + */ + pathkey->pk_eclass->ec_sortref = sortcl->tleSortGroupRef; + } /* Canonical form eliminates redundant ordering keys */ if (!pathkey_is_redundant(pathkey, pathkeys)) |