On Fri, Nov 1, 2024 at 5:08 PM jian he <jian.universal...@gmail.com> wrote: > just a quick reply while testing v4-0001. > tests copy from src/test/regress/sql/partition_aggregate.sql first 40 lines. > > drop table if exists pagg_tab; > CREATE TABLE pagg_tab (a int, b int, c text, d int) PARTITION BY > LIST(c collate "C"); > CREATE TABLE pagg_tab_p1 PARTITION OF pagg_tab FOR VALUES IN ('0000', > '0001', '0002', '0003', '0004'); > CREATE TABLE pagg_tab_p2 PARTITION OF pagg_tab FOR VALUES IN ('0005', > '0006', '0007', '0008'); > CREATE TABLE pagg_tab_p3 PARTITION OF pagg_tab FOR VALUES IN ('0009', > '0010', '0011'); > INSERT INTO pagg_tab SELECT (i % 20), (i % 30), to_char(i % 12, > 'FM0000'), i % 30 FROM generate_series(0, 2999) i; > ANALYZE pagg_tab; > > EXPLAIN (COSTS OFF, settings) > SELECT a, sum(b), avg(b), count(*), max(b) FROM pagg_tab GROUP BY a; > > > QUERY PLAN > > ----------------------------------------------------------------------------------------------------------------------------------------------------------- > Finalize HashAggregate > Group Key: pagg_tab.a > -> Append > -> Partial HashAggregate > Group Key: pagg_tab.a > -> Seq Scan on pagg_tab_p1 pagg_tab > -> Partial HashAggregate > Group Key: pagg_tab_1.a > -> Seq Scan on pagg_tab_p2 pagg_tab_1 > -> Partial HashAggregate > Group Key: pagg_tab_2.a > -> Seq Scan on pagg_tab_p3 pagg_tab_2 > Settings: enable_partitionwise_aggregate = 'on', > enable_partitionwise_join = 'on', max_parallel_workers_per_gather = > '0', enable_increm > ental_sort = 'off' > > > > drop table if exists pagg_tab; > CREATE TABLE pagg_tab (a text, b int, c text, d int) PARTITION BY > LIST(c collate "C"); > CREATE TABLE pagg_tab_p1 PARTITION OF pagg_tab FOR VALUES IN ('0000', > '0001', '0002', '0003', '0004'); > CREATE TABLE pagg_tab_p2 PARTITION OF pagg_tab FOR VALUES IN ('0005', > '0006', '0007', '0008'); > CREATE TABLE pagg_tab_p3 PARTITION OF pagg_tab FOR VALUES IN ('0009', > '0010', '0011'); > INSERT INTO pagg_tab SELECT (i % 20)::text, (i % 30), to_char(i % 12, > 'FM0000'), i % 30 FROM generate_series(0, 2999) i; > ANALYZE pagg_tab; > EXPLAIN (COSTS OFF, settings) > SELECT a, sum(b), avg(b), count(*), max(b) FROM pagg_tab GROUP BY a; > > > QUERY PLAN > > ----------------------------------------------------------------------------------------------------------------------------------------------------------- > HashAggregate > Group Key: pagg_tab.a > -> Append > -> Seq Scan on pagg_tab_p1 pagg_tab_1 > -> Seq Scan on pagg_tab_p2 pagg_tab_2 > -> Seq Scan on pagg_tab_p3 pagg_tab_3 > Settings: enable_partitionwise_aggregate = 'on', > enable_partitionwise_join = 'on', max_parallel_workers_per_gather = > '0', enable_increm > ental_sort = 'off' > > > it seems "PARTITION BY LIST(c collate "C");" collation compare with > "GROUP BY a;". > set collation_incompatible returned true. > make it cannot do PARTITIONWISE_AGGREGATE_PARTIAL. > > but here "group by a", "a" is text data type, we can still do > PARTITIONWISE_AGGREGATE_PARTIAL > ?
Good catch. Looks like I added a bug in group_by_has_partkey() -- collation_incompatible should be set only when a grouping expression matches a partition key. -- Thanks, Amit Langote
v5-0002-Disallow-partitionwise-join-when-collation-doesn-.patch
Description: Binary data
v5-0001-Disallow-partitionwise-grouping-when-collation-do.patch
Description: Binary data