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 6254258357 [Feature](Nereids) eliminate project when child is empty relation (#16210) 6254258357 is described below commit 625425835740faa3e0d12a038908a8695d648e6e Author: mch_ucchi <41606806+sohardforan...@users.noreply.github.com> AuthorDate: Mon Jan 30 11:28:07 2023 +0800 [Feature](Nereids) eliminate project when child is empty relation (#16210) --- .../rewrite/logical/EliminateUnnecessaryProject.java | 9 ++++++++- .../logical/EliminateUnnecessaryProjectTest.java | 18 ++++++++++++++++++ .../suites/nereids_syntax_p0/explain.groovy | 3 +++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProject.java index 61e1f3c99a..0754e6b6ee 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProject.java @@ -21,6 +21,7 @@ import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.rules.rewrite.RewriteRuleFactory; import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; import com.google.common.collect.ImmutableList; @@ -67,6 +68,12 @@ public class EliminateUnnecessaryProject implements RewriteRuleFactory { } else { return project.child(); } - }))); + }) + ), + RuleType.ELIMINATE_UNNECESSARY_PROJECT.build( + logicalProject(logicalEmptyRelation()) + .then(project -> new LogicalEmptyRelation(project.getProjects())) + ) + ); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProjectTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProjectTest.java index 73369adfdc..4c440e68f8 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProjectTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateUnnecessaryProjectTest.java @@ -19,11 +19,14 @@ package org.apache.doris.nereids.rules.rewrite.logical; import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.rules.Rule; +import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral; import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; +import org.apache.doris.nereids.types.IntegerType; import org.apache.doris.nereids.util.LogicalPlanBuilder; import org.apache.doris.nereids.util.MemoTestUtils; import org.apache.doris.nereids.util.PlanConstructor; @@ -98,6 +101,21 @@ public class EliminateUnnecessaryProjectTest extends TestWithFeService { Assertions.assertTrue(actual instanceof LogicalProject); } + @Test + public void testEliminateProjectWhenEmptyRelationChild() { + LogicalPlan unnecessaryProject = new LogicalPlanBuilder(new LogicalEmptyRelation(ImmutableList.of( + new SlotReference("k1", IntegerType.INSTANCE), + new SlotReference("k2", IntegerType.INSTANCE)))) + .project(ImmutableList.of(1, 0)) + .build(); + CascadesContext cascadesContext = MemoTestUtils.createCascadesContext(unnecessaryProject); + List<Rule> rules = Lists.newArrayList(new EliminateUnnecessaryProject().buildRules()); + cascadesContext.topDownRewrite(rules); + + Plan actual = cascadesContext.getMemo().copyOut(); + Assertions.assertTrue(actual instanceof LogicalEmptyRelation); + } + // TODO: uncomment this after the Elimination project rule is correctly implemented // @Test // public void testEliminationForThoseNeitherDoPruneNorDoExprCalc() { diff --git a/regression-test/suites/nereids_syntax_p0/explain.groovy b/regression-test/suites/nereids_syntax_p0/explain.groovy index 251b490b26..c30245edce 100644 --- a/regression-test/suites/nereids_syntax_p0/explain.groovy +++ b/regression-test/suites/nereids_syntax_p0/explain.groovy @@ -64,4 +64,7 @@ suite("nereids_explain") { """ contains "SlotDescriptor{id=0, col=null, colUniqueId=null, type=FLOAT, nullable=false}" } + + def explainStr = sql("select sum(if(lo_tax=1,lo_tax,0)) from lineorder where false").toString() + assertTrue(!explainStr.contains("projections")) } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org