This is an automated email from the ASF dual-hosted git repository. morrysnow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 86d7233b06 [fix](nereids) ExtractAndNormalizeWindowExpression rule should push down correct exprs to child (#21827) 86d7233b06 is described below commit 86d7233b060edc05bbf3bfbb52ae416563d0a083 Author: starocean999 <40539150+starocean...@users.noreply.github.com> AuthorDate: Thu Jul 20 11:47:55 2023 +0800 [fix](nereids) ExtractAndNormalizeWindowExpression rule should push down correct exprs to child (#21827) consider the window function: ```sql substr( ref_1.cp_type, sum(CASE WHEN ref_1.cp_type = 0 THEN 3 ELSE 2 END) OVER (), 1) ``` Before the pr, only "CASE WHEN ref_1.cp_type = 0 THEN 3 ELSE 2 END" is pushed down. But both "ref_1.cp_type" and "CASE WHEN ref_1.cp_type = 0 THEN 3 ELSE 2 END" should be pushed down. This pr fix it --- .../rewrite/ExtractAndNormalizeWindowExpression.java | 18 ++++++------------ .../data/nereids_p0/aggregate/agg_window_project.out | 3 +++ .../nereids_p0/aggregate/agg_window_project.groovy | 10 ++++++++++ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java index 946e8ebbec..5181c978ed 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java @@ -34,7 +34,6 @@ import com.google.common.collect.Sets; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -98,21 +97,16 @@ public class ExtractAndNormalizeWindowExpression extends OneRewriteRuleFactory i if (expression.anyMatch(WindowExpression.class::isInstance)) { Set<Slot> inputSlots = Sets.newHashSet(expression.getInputSlots()); Set<WindowExpression> collects = expression.collect(WindowExpression.class::isInstance); - Set<Slot> windowInputSlots = collects.stream() - .flatMap(win -> win.getInputSlots().stream()) - .collect(Collectors.toSet()); // substr( // ref_1.cp_type, - // max( - // cast(ref_1.`cp_catalog_page_number` as int)) over (...) - // ), - // 1) + // sum(CASE WHEN ref_1.cp_type = 0 THEN 3 ELSE 2 END) OVER (), + // 1), // - // in above case, ref_1.cp_type should be pushed down. ref_1.cp_type is in - // substr.inputSlots, but not in windowExpression.inputSlots + // in above case, + // ref_1.cp_type and CASE WHEN ref_1.cp_type = 0 THEN 3 ELSE 2 END + // should be pushed down. // // inputSlots= {ref_1.cp_type} - inputSlots.removeAll(windowInputSlots); return Stream.concat( collects.stream().flatMap(windowExpression -> windowExpression.getExpressionsInWindowSpec().stream() @@ -121,7 +115,7 @@ public class ExtractAndNormalizeWindowExpression extends OneRewriteRuleFactory i .filter(expr -> !expr.isConstant()) ), inputSlots.stream() - ); + ).distinct(); } return ImmutableList.of(expression).stream(); }) diff --git a/regression-test/data/nereids_p0/aggregate/agg_window_project.out b/regression-test/data/nereids_p0/aggregate/agg_window_project.out index 508108c7c5..60f8b9a6f9 100644 --- a/regression-test/data/nereids_p0/aggregate/agg_window_project.out +++ b/regression-test/data/nereids_p0/aggregate/agg_window_project.out @@ -5,3 +5,6 @@ -- !select2 -- 10.00000000000000 +-- !select3 -- +1 + diff --git a/regression-test/suites/nereids_p0/aggregate/agg_window_project.groovy b/regression-test/suites/nereids_p0/aggregate/agg_window_project.groovy index 1ec29524f4..794ccf3002 100644 --- a/regression-test/suites/nereids_p0/aggregate/agg_window_project.groovy +++ b/regression-test/suites/nereids_p0/aggregate/agg_window_project.groovy @@ -64,5 +64,15 @@ suite("agg_window_project") { order_qt_select2 """select b / 1 * 10 from test_window_table;""" + order_qt_select3 """SELECT + CASE + WHEN b != 0 + AND sum(CASE WHEN b = 0 THEN 3 ELSE 2 END) OVER () < 50000 + THEN 1 + ELSE 0 + END AS val + FROM + test_window_table;""" + sql "DROP TABLE IF EXISTS test_window_table;" } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org