diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c index 919d54dd79..1095b73dac 100644 --- a/src/backend/optimizer/path/pathkeys.c +++ b/src/backend/optimizer/path/pathkeys.c @@ -489,8 +489,9 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path) n = group_keys_reorder_by_pathkeys(path->pathkeys, &pathkeys, &clauses, root->num_groupby_pathkeys); - if (n > 0 && compare_pathkeys(pathkeys, root->group_pathkeys) != PATHKEYS_EQUAL && - (enable_incremental_sort || n == list_length(path->pathkeys))) + if (n > 0 && + (enable_incremental_sort || n == root->num_groupby_pathkeys) && + compare_pathkeys(pathkeys, root->group_pathkeys) != PATHKEYS_EQUAL) { info = makeNode(PathKeyInfo); info->pathkeys = pathkeys; diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index ca38e78f21..67dd20f375 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -2856,6 +2856,23 @@ explain (COSTS OFF) SELECT x,w FROM btg GROUP BY w,x,y,z ORDER BY x*x,z; -> Index Scan using abc on btg (8 rows) +SET enable_incremental_sort = off; +-- The case when the number of incoming subtree path keys is more than +-- the number of grouping keys. +CREATE INDEX idx_y_x_z ON btg(y,x,w); +EXPLAIN (VERBOSE, COSTS OFF) +SELECT y,x,array_agg(distinct w) FROM btg WHERE y < 0 GROUP BY x,y; + QUERY PLAN +----------------------------------------------------- + GroupAggregate + Output: y, x, array_agg(DISTINCT w) + Group Key: btg.y, btg.x + -> Index Only Scan using idx_y_x_z on public.btg + Output: y, x, w + Index Cond: (btg.y < 0) +(6 rows) + +RESET enable_incremental_sort; DROP TABLE btg; -- The case, when scanning sort order correspond to aggregate sort order but -- can not be found in the group-by list diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql index 9880a188d3..524bdfa67d 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -1182,7 +1182,6 @@ SELECT balk(hundred) FROM tenk1; ROLLBACK; -- GROUP BY optimization by reorder columns - CREATE TABLE btg AS SELECT i % 100 AS x, i % 100 AS y, @@ -1223,8 +1222,11 @@ explain (COSTS OFF) SELECT x,y FROM btg GROUP BY w,x,z,y ORDER BY y,x,z,w; explain (COSTS OFF) SELECT x,w FROM btg GROUP BY w,x,y,z ORDER BY x*x,z; SET enable_incremental_sort = off; -EXPLAIN (VERBOSE, COSTS ON) -SELECT x,y, array_agg(z) FROM btg WHERE x < 2 GROUP BY y,x; +-- The case when the number of incoming subtree path keys is more than +-- the number of grouping keys. +CREATE INDEX idx_y_x_z ON btg(y,x,w); +EXPLAIN (VERBOSE, COSTS OFF) +SELECT y,x,array_agg(distinct w) FROM btg WHERE y < 0 GROUP BY x,y; RESET enable_incremental_sort; DROP TABLE btg;