diff options
author | Alexander Korotkov | 2024-02-09 10:56:26 +0000 |
---|---|---|
committer | Alexander Korotkov | 2024-02-09 10:56:54 +0000 |
commit | c01f6ef46c8f0ab3faa54e8f040da6e9ddc7fe5b (patch) | |
tree | d4754056f3d78f249135997e04d86d128a505369 /src/test/regress/expected/aggregates.out | |
parent | 6743c5ae64e3c957ef8bd4f8a0daa2ba9959b0b3 (diff) |
Fix usage of aggregate pathkeys in group_keys_reorder_by_pathkeys()
group_keys_reorder_by_pathkeys() function searched for matching pathkeys
within root->group_pathkeys. That could lead to picking an aggregate pathkey
and using its pathkey->pk_eclass->ec_sortref as an argument of
get_sortgroupref_clause_noerr(). Given that ec_sortref of an aggregate pathkey
references aggregate targetlist not query targetlist, this leads to incorrect
query optimization.
Fix this by looking for matching pathkeys only within the first
num_groupby_pathkeys pathkeys.
Reported-by: David G. Johnston
Discussion: https://postgr.es/m/CAKFQuwY3Ek%3DcLThgd8FdaSc5JRDVt0FaV00gMcWra%2BTAR4gGUw%40mail.gmail.com
Author: Andrei Lepikhov, Alexander Korotkov
Diffstat (limited to 'src/test/regress/expected/aggregates.out')
-rw-r--r-- | src/test/regress/expected/aggregates.out | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index 7a73c19314b..f736bab67ef 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -2874,6 +2874,30 @@ SELECT y,x,array_agg(distinct w) FROM btg WHERE y < 0 GROUP BY x,y; RESET enable_incremental_sort; DROP TABLE btg; +-- Check we don't pick aggregate path key instead of grouping path key +CREATE TABLE group_agg_pk AS SELECT + i % 10 AS x, + i % 2 AS y, + i % 2 AS z, + 2 AS w, + i % 10 AS f +FROM generate_series(1,100) AS i; +ANALYZE group_agg_pk; +SET enable_nestloop = off; +SET enable_hashjoin = off; +SELECT + c1.z, c1.w, string_agg(''::text, repeat(''::text, c1.f) ORDER BY c1.x,c1.y) +FROM group_agg_pk c1 JOIN group_agg_pk c2 ON (c1.x = c2.f) +GROUP BY c1.w, c1.z; + z | w | string_agg +---+---+------------ + 0 | 2 | + 1 | 2 | +(2 rows) + +RESET enable_nestloop; +RESET enable_hashjoin; +DROP TABLE group_agg_pk; -- The case, when scanning sort order correspond to aggregate sort order but -- can not be found in the group-by list CREATE TABLE agg_sort_order (c1 int PRIMARY KEY, c2 int); |