From 5228a57ca7e5f76eb13415a411504103907d71f8 Mon Sep 17 00:00:00 2001 From: seawinde Date: Wed, 13 Aug 2025 18:23:30 +0800 Subject: [PATCH 1/2] [fix](mtmv) Fix aggregate function roll up fail when function is always nullable (#52960) ### What problem does this PR solve? Related PR: #36318 Problem Summary: materaialized view def is as fllowing: create materialized view as select k1, k3, sum(k2), count(k4) from ${tblName} group by k1, k3; `sum(k2) ` nullable is true if query is as following, would rewritten fail with err info 'query aggregate function roll up fail', the pr fix this select sum(distinct k1) from agg_use_key_direct --- .../agg_use_key_direct/agg_use_key_direct.out | 2 +- .../mv/agg_variety/agg_variety.groovy | 22 ------------------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/regression-test/data/mv_p0/agg_use_key_direct/agg_use_key_direct.out b/regression-test/data/mv_p0/agg_use_key_direct/agg_use_key_direct.out index 92d3a082eb11e8..d6e17e77bc6c00 100644 --- a/regression-test/data/mv_p0/agg_use_key_direct/agg_use_key_direct.out +++ b/regression-test/data/mv_p0/agg_use_key_direct/agg_use_key_direct.out @@ -12,5 +12,5 @@ -4 -- !select_avg -- --4 +-4.0 diff --git a/regression-test/suites/nereids_rules_p0/mv/agg_variety/agg_variety.groovy b/regression-test/suites/nereids_rules_p0/mv/agg_variety/agg_variety.groovy index 2de47b4bbc2f8e..27a8b693dfe9ac 100644 --- a/regression-test/suites/nereids_rules_p0/mv/agg_variety/agg_variety.groovy +++ b/regression-test/suites/nereids_rules_p0/mv/agg_variety/agg_variety.groovy @@ -130,28 +130,6 @@ suite("agg_variety") { sql """alter table lineitem modify column l_comment set stats ('row_count'='5');""" sql """alter table partsupp modify column ps_comment set stats ('row_count'='2');""" - def check_rewrite_but_not_chose = { mv_sql, query_sql, mv_name -> - - sql """DROP MATERIALIZED VIEW IF EXISTS ${mv_name}""" - sql""" - CREATE MATERIALIZED VIEW ${mv_name} - BUILD IMMEDIATE REFRESH COMPLETE ON MANUAL - DISTRIBUTED BY RANDOM BUCKETS 2 - PROPERTIES ('replication_num' = '1') - AS ${mv_sql} - """ - - def job_name = getJobName(db, mv_name); - waitingMTMVTaskFinished(job_name) - explain { - sql("${query_sql}") - check {result -> - def splitResult = result.split("MaterializedViewRewriteFail") - splitResult.length == 2 ? splitResult[0].contains(mv_name) : false - } - } - } - // query dimension is less then mv def mv1_0 = """ select From 456383b8b0581af934457d6c430768182d404cd7 Mon Sep 17 00:00:00 2001 From: seawinde Date: Thu, 14 Aug 2025 19:43:23 +0800 Subject: [PATCH 2/2] fix code usage --- .../mv/rollup/ContainDistinctFunctionRollupHandler.java | 9 +++++++-- .../mv_p0/agg_use_key_direct/agg_use_key_direct.groovy | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/rollup/ContainDistinctFunctionRollupHandler.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/rollup/ContainDistinctFunctionRollupHandler.java index 63b148dfcd7698..f571f1382a6455 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/rollup/ContainDistinctFunctionRollupHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/rollup/ContainDistinctFunctionRollupHandler.java @@ -50,9 +50,14 @@ public class ContainDistinctFunctionRollupHandler extends AggFunctionRollUpHandl public static final ContainDistinctFunctionRollupHandler INSTANCE = new ContainDistinctFunctionRollupHandler(); public static Set SUPPORTED_AGGREGATE_FUNCTION_SET = ImmutableSet.of( new Max(true, Any.INSTANCE), new Min(true, Any.INSTANCE), + new Max(true, Any.INSTANCE).withAlwaysNullable(true), + new Min(true, Any.INSTANCE).withAlwaysNullable(true), new Max(false, Any.INSTANCE), new Min(false, Any.INSTANCE), - new Count(true, Any.INSTANCE), new Sum(true, Any.INSTANCE), - new Avg(true, Any.INSTANCE)); + new Max(false, Any.INSTANCE).withAlwaysNullable(true), + new Min(false, Any.INSTANCE).withAlwaysNullable(true), + new Count(true, Any.INSTANCE), + new Sum(true, Any.INSTANCE), new Sum(true, Any.INSTANCE).withAlwaysNullable(true), + new Avg(true, Any.INSTANCE), new Avg(true, Any.INSTANCE).withAlwaysNullable(true)); @Override public boolean canRollup(AggregateFunction queryAggregateFunction, diff --git a/regression-test/suites/mv_p0/agg_use_key_direct/agg_use_key_direct.groovy b/regression-test/suites/mv_p0/agg_use_key_direct/agg_use_key_direct.groovy index 855ea157f88284..79d26327f8244d 100644 --- a/regression-test/suites/mv_p0/agg_use_key_direct/agg_use_key_direct.groovy +++ b/regression-test/suites/mv_p0/agg_use_key_direct/agg_use_key_direct.groovy @@ -59,5 +59,5 @@ suite ("agg_use_key_direct") { order_qt_select_min """select min(distinct k3) from agg_use_key_direct""" mv_rewrite_success("""select avg(distinct k3) from agg_use_key_direct""", "common_mv") - order_qt_select_avg """select min(distinct k3) from agg_use_key_direct""" + order_qt_select_avg """select avg(distinct k3) from agg_use_key_direct""" }