From ade598e043131a002c89421d8ac5e90ab3478ff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E5=81=A5?= Date: Wed, 30 Aug 2023 17:23:10 +0800 Subject: [PATCH] [feature](Nereids): eliminate distinct for max/min/any_value (#23428) eliminate distinct for max/min/any_value function ``` max(distinct value) = max(value) ``` --- .../trees/expressions/functions/agg/AnyValue.java | 2 +- .../nereids/trees/expressions/functions/agg/Max.java | 2 +- .../nereids/trees/expressions/functions/agg/Min.java | 2 +- .../suites/nereids_p0/aggregate/aggregate.groovy | 11 +++++++++++ .../suites/nereids_syntax_p0/analyze_agg.groovy | 4 ++-- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AnyValue.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AnyValue.java index aafc8d35995ed1..c2c0d43660bb2d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AnyValue.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AnyValue.java @@ -51,7 +51,7 @@ public AnyValue(Expression arg) { * constructor with 1 argument. */ public AnyValue(boolean distinct, Expression arg) { - super("any_value", distinct, arg); + super("any_value", false, arg); } /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Max.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Max.java index 02ac778eea7e4e..19cd0190bb6e37 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Max.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Max.java @@ -44,7 +44,7 @@ public Max(boolean distinct, Expression arg) { } private Max(boolean distinct, boolean alwaysNullable, Expression arg) { - super("max", distinct, alwaysNullable, arg); + super("max", false, alwaysNullable, arg); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Min.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Min.java index ef3fd8db3284dd..72b2162eb51f6e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Min.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Min.java @@ -45,7 +45,7 @@ public Min(boolean distinct, Expression arg) { } private Min(boolean distinct, boolean alwaysNullable, Expression arg) { - super("min", distinct, alwaysNullable, arg); + super("min", false, alwaysNullable, arg); } @Override diff --git a/regression-test/suites/nereids_p0/aggregate/aggregate.groovy b/regression-test/suites/nereids_p0/aggregate/aggregate.groovy index e1ae3131b2eda9..f0ba091e045911 100644 --- a/regression-test/suites/nereids_p0/aggregate/aggregate.groovy +++ b/regression-test/suites/nereids_p0/aggregate/aggregate.groovy @@ -317,4 +317,15 @@ suite("aggregate") { sql "select k1 as k, k1 from tempbaseall group by k1 having k1 > 0" sql "select k1 as k, k1 from tempbaseall group by k1 having k > 0" + + // remove distinct for max, min, any_value + def plan = sql( + """explain optimized plan SELECT max(distinct c_bigint), + min(distinct c_bigint), + any_value(distinct c_bigint) + FROM regression_test_nereids_p0_aggregate.${tableName};""" + ).toString() + assertTrue(plan.contains("max(c_bigint")) + assertTrue(plan.contains("min(c_bigint")) + assertTrue(plan.contains("any_value(c_bigint")) } diff --git a/regression-test/suites/nereids_syntax_p0/analyze_agg.groovy b/regression-test/suites/nereids_syntax_p0/analyze_agg.groovy index 2f0b0d01c639c8..55bb2deab2384b 100644 --- a/regression-test/suites/nereids_syntax_p0/analyze_agg.groovy +++ b/regression-test/suites/nereids_syntax_p0/analyze_agg.groovy @@ -70,7 +70,7 @@ suite("analyze_agg") { """ test { - sql "select count(distinct t2.id), max(distinct t2.c) from t2" - exception "max(DISTINCT c#2) can't support multi distinct." + sql "select count(distinct t2.b), variance(distinct t2.c) from t2" + exception "variance(DISTINCT c#2) can't support multi distinct." } } \ No newline at end of file