This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 09886853454 [fix](nereids)should normalize window expression by bottom 
project's output (#31210)
09886853454 is described below

commit 098868534547c721fb3af24650e3287cc8e907f6
Author: starocean999 <40539150+starocean...@users.noreply.github.com>
AuthorDate: Wed Feb 21 17:44:48 2024 +0800

    [fix](nereids)should normalize window expression by bottom project's output 
(#31210)
---
 .../ExtractAndNormalizeWindowExpression.java       | 20 +++++++++++----
 .../nereids_p0/cte/test_cte_filter_pushdown.out    | 18 ++++++++++++++
 .../nereids_p0/cte/test_cte_filter_pushdown.groovy | 29 ++++++++++++++++++++++
 3 files changed, 62 insertions(+), 5 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 f45f7a287e8..4b080fb48fe 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
@@ -19,7 +19,6 @@ package org.apache.doris.nereids.rules.rewrite;
 
 import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
-import 
org.apache.doris.nereids.rules.rewrite.NormalizeToSlot.NormalizeToSlotContext;
 import org.apache.doris.nereids.trees.expressions.Alias;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
@@ -34,6 +33,7 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -79,11 +79,21 @@ public class ExtractAndNormalizeWindowExpression extends 
OneRewriteRuleFactory i
 
             // 2. handle window's outputs and windowExprs
             // need to replace exprs with SlotReference in WindowSpec, due to 
LogicalWindow.getExpressions()
-            List<NamedExpression> normalizedOutputs1 = 
context.normalizeToUseSlotRef(outputs);
+
+            // because alias is pushed down to bottom project
+            // we need replace alias's child expr with corresponding alias's 
slot in output
+            // so create a customNormalizeMap alias's child -> alias.toSlot to 
do it
+            Map<Expression, Slot> customNormalizeMap = toBePushedDown.stream()
+                    .filter(expr -> expr instanceof Alias)
+                    .collect(Collectors.toMap(expr -> ((Alias) expr).child(), 
expr -> ((Alias) expr).toSlot(),
+                            (oldExpr, newExpr) -> oldExpr));
+
+            List<NamedExpression> normalizedOutputs = 
context.normalizeToUseSlotRef(outputs,
+                    (ctx, expr) -> customNormalizeMap.getOrDefault(expr, 
null));
             Set<WindowExpression> normalizedWindows =
-                    ExpressionUtils.collect(normalizedOutputs1, 
WindowExpression.class::isInstance);
+                    ExpressionUtils.collect(normalizedOutputs, 
WindowExpression.class::isInstance);
 
-            existedAlias = ExpressionUtils.collect(normalizedOutputs1, 
Alias.class::isInstance);
+            existedAlias = ExpressionUtils.collect(normalizedOutputs, 
Alias.class::isInstance);
             NormalizeToSlotContext ctxForWindows = 
NormalizeToSlotContext.buildContext(
                     existedAlias, Sets.newHashSet(normalizedWindows));
 
@@ -93,7 +103,7 @@ public class ExtractAndNormalizeWindowExpression extends 
OneRewriteRuleFactory i
                     new 
LogicalWindow<>(ImmutableList.copyOf(normalizedWindowWithAlias), 
normalizedChild);
 
             // 3. handle top projects
-            List<NamedExpression> topProjects = 
ctxForWindows.normalizeToUseSlotRef(normalizedOutputs1);
+            List<NamedExpression> topProjects = 
ctxForWindows.normalizeToUseSlotRef(normalizedOutputs);
             return project.withProjectsAndChild(topProjects, 
normalizedLogicalWindow);
         }).toRule(RuleType.EXTRACT_AND_NORMALIZE_WINDOW_EXPRESSIONS);
     }
diff --git a/regression-test/data/nereids_p0/cte/test_cte_filter_pushdown.out 
b/regression-test/data/nereids_p0/cte/test_cte_filter_pushdown.out
index 0c632f4fc29..36b8737a988 100644
--- a/regression-test/data/nereids_p0/cte/test_cte_filter_pushdown.out
+++ b/regression-test/data/nereids_p0/cte/test_cte_filter_pushdown.out
@@ -41,3 +41,21 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
 --------------filter((m2.k1 = 1))
 ----------------PhysicalCteConsumer ( cteId=CTEId#0 )
 
+-- !cte_filter_pushdown_3 --
+PhysicalResultSink
+--PhysicalDistribute
+----PhysicalProject
+------hashJoin[INNER_JOIN](tmp2.k3 = dd.k3)
+--------PhysicalDistribute
+----------PhysicalProject
+------------filter((tmp2.k3 = 0))
+--------------PhysicalWindow
+----------------PhysicalQuickSort
+------------------PhysicalProject
+--------------------filter((tmp.k1 = 1))
+----------------------PhysicalOlapScan[test]
+--------PhysicalDistribute
+----------PhysicalProject
+------------filter((dd.k3 = 0))
+--------------PhysicalOlapScan[baseall]
+
diff --git 
a/regression-test/suites/nereids_p0/cte/test_cte_filter_pushdown.groovy 
b/regression-test/suites/nereids_p0/cte/test_cte_filter_pushdown.groovy
index 8f08721f6cd..3d65a73f657 100644
--- a/regression-test/suites/nereids_p0/cte/test_cte_filter_pushdown.groovy
+++ b/regression-test/suites/nereids_p0/cte/test_cte_filter_pushdown.groovy
@@ -44,4 +44,33 @@ suite("test_cte_filter_pushdown)") {
            ) temp
            where k1 = 1;
     """
+    sql 'set exec_mem_limit=21G'
+    sql 'set be_number_for_test=3'
+    sql 'set parallel_fragment_exec_instance_num=8; '
+    sql 'set parallel_pipeline_task_num=8; '
+    sql 'set forbid_unknown_col_stats=true'
+    sql 'set enable_nereids_timeout = false'
+    sql 'set enable_runtime_filter_prune=false'
+    sql 'set runtime_filter_mode=off'
+    sql 'set dump_nereids_memo=false'
+    sql "set disable_join_reorder=true"
+    qt_cte_filter_pushdown_3 """
+            explain shape plan
+            with tmp as (
+                select 
+                    k1,
+                    k3,
+                    sum(k2) over (partition by l.k1 order by l.k3 ) pay_num
+                from ( select * from nereids_test_query_db.test)l
+            ),
+            tmp2 as (
+                select 
+                    tt.*
+                from 
+                tmp tt join (select k3 from nereids_test_query_db.baseall ) dd
+                on tt.k3=dd.k3
+            )
+            SELECT * from tmp2
+            where k3=0 and k1=1;
+    """
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to