diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/Validator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/Validator.java index cd83c87d59..d73a93e308 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/Validator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/Validator.java @@ -19,6 +19,7 @@ package org.apache.doris.nereids.processor.post; import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.trees.expressions.Slot; +import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.physical.PhysicalFilter; import org.apache.doris.nereids.trees.plans.physical.PhysicalProject; @@ -48,6 +49,8 @@ public class Validator extends PlanPostProcessor { @Override public Plan visitPhysicalFilter(PhysicalFilter filter, CascadesContext context) { + Preconditions.checkArgument(filter.getPredicates() != BooleanLiteral.TRUE); + Plan child = filter.child(); // Forbidden filter-project, we must make filter-project -> project-filter. Preconditions.checkArgument(!(child instanceof PhysicalProject)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateFilter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateFilter.java index d8b1b24794..d068025adf 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateFilter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateFilter.java @@ -24,14 +24,22 @@ import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral; import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation; /** - * Eliminate filter false. + * Eliminate filter which is FALSE or TRUE. */ public class EliminateFilter extends OneRewriteRuleFactory { @Override public Rule build() { return logicalFilter() - .when(filter -> filter.getPredicates() == BooleanLiteral.FALSE) - .then(filter -> new LogicalEmptyRelation(filter.getOutput())) + .when(filter -> filter.getPredicates() instanceof BooleanLiteral) + .then(filter -> { + if (filter.getPredicates() == BooleanLiteral.FALSE) { + return new LogicalEmptyRelation(filter.getOutput()); + } else if (filter.getPredicates() == BooleanLiteral.TRUE) { + return filter.child(); + } else { + throw new RuntimeException("predicates is BooleanLiteral but isn't FALSE or TRUE"); + } + }) .toRule(RuleType.ELIMINATE_FILTER); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateFilterTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateFilterTest.java index 1dbb327235..9e920f1b24 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateFilterTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/EliminateFilterTest.java @@ -22,8 +22,9 @@ import org.apache.doris.nereids.rules.Rule; 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.LogicalFilter; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; +import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; +import org.apache.doris.nereids.util.LogicalPlanBuilder; import org.apache.doris.nereids.util.MemoTestUtils; import org.apache.doris.nereids.util.PlanConstructor; @@ -33,20 +34,32 @@ import org.junit.jupiter.api.Test; import java.util.List; -/** - * MergeConsecutiveFilter ut - */ public class EliminateFilterTest { @Test - public void testEliminateFilter() { - LogicalOlapScan scan = PlanConstructor.newLogicalOlapScan(0, "t1", 0); - LogicalFilter filter = new LogicalFilter<>(BooleanLiteral.FALSE, scan); + public void testEliminateFilterFalse() { + LogicalPlan filterFalse = new LogicalPlanBuilder(PlanConstructor.newLogicalOlapScan(0, "t1", 0)) + .filter(BooleanLiteral.FALSE) + .build(); - CascadesContext cascadesContext = MemoTestUtils.createCascadesContext(filter); + CascadesContext cascadesContext = MemoTestUtils.createCascadesContext(filterFalse); List rules = Lists.newArrayList(new EliminateFilter().build()); cascadesContext.topDownRewrite(rules); Plan actual = cascadesContext.getMemo().copyOut(); Assertions.assertTrue(actual instanceof LogicalEmptyRelation); } + + @Test + public void testEliminateFilterTrue() { + LogicalPlan filterFalse = new LogicalPlanBuilder(PlanConstructor.newLogicalOlapScan(0, "t1", 0)) + .filter(BooleanLiteral.TRUE) + .build(); + + CascadesContext cascadesContext = MemoTestUtils.createCascadesContext(filterFalse); + List rules = Lists.newArrayList(new EliminateFilter().build()); + cascadesContext.topDownRewrite(rules); + + Plan actual = cascadesContext.getMemo().copyOut(); + Assertions.assertTrue(actual instanceof LogicalOlapScan); + } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/LogicalPlanBuilder.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/LogicalPlanBuilder.java index 3357394ae0..338116f612 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/LogicalPlanBuilder.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/LogicalPlanBuilder.java @@ -19,8 +19,10 @@ package org.apache.doris.nereids.util; import org.apache.doris.common.Pair; import org.apache.doris.nereids.trees.expressions.EqualTo; +import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.NamedExpression; import org.apache.doris.nereids.trees.plans.JoinType; +import org.apache.doris.nereids.trees.plans.logical.LogicalFilter; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; import org.apache.doris.nereids.trees.plans.logical.LogicalLimit; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; @@ -85,4 +87,10 @@ public class LogicalPlanBuilder { public LogicalPlanBuilder limit(long limit) { return limit(limit, 0); } + + public LogicalPlanBuilder filter(Expression predicate) { + LogicalFilter limitPlan = new LogicalFilter<>(predicate, this.plan); + return from(limitPlan); + } + }