You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/07/20 03:48:02 UTC

[doris] branch master updated: [fix](nereids) ExtractAndNormalizeWindowExpression rule should push down correct exprs to child (#21827)

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 <40...@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-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org