diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c index 1095b73dac..b612420547 100644 --- a/src/backend/optimizer/path/pathkeys.c +++ b/src/backend/optimizer/path/pathkeys.c @@ -432,6 +432,21 @@ group_keys_reorder_by_pathkeys(List *pathkeys, List **group_pathkeys, return n; } +static bool +duplicated_pathkey_combination(List *infos, List *pathkeys) +{ + ListCell *lc; + + foreach (lc, infos) + { + PathKeyInfo *info = lfirst_node(PathKeyInfo, lc); + + if (compare_pathkeys(pathkeys, info->pathkeys) == PATHKEYS_EQUAL) + return true; + } + return false; +} + /* * get_useful_group_keys_orderings * Determine which orderings of GROUP BY keys are potentially interesting. @@ -491,7 +506,7 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path) if (n > 0 && (enable_incremental_sort || n == root->num_groupby_pathkeys) && - compare_pathkeys(pathkeys, root->group_pathkeys) != PATHKEYS_EQUAL) + !duplicated_pathkey_combination(infos, pathkeys)) { info = makeNode(PathKeyInfo); info->pathkeys = pathkeys; @@ -514,8 +529,9 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path) &clauses, root->num_groupby_pathkeys); - if (n > 0 && compare_pathkeys(pathkeys, root->group_pathkeys) != PATHKEYS_EQUAL && - (enable_incremental_sort || n == list_length(root->sort_pathkeys))) + if (n > 0 && + (enable_incremental_sort || n == list_length(root->sort_pathkeys)) && + !duplicated_pathkey_combination(infos, pathkeys)) { info = makeNode(PathKeyInfo); info->pathkeys = pathkeys;