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