Just forgotten second attachment.
--
regards,
Andrei Lepikhov
Postgres Professional
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;