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;

Reply via email to