From 412bc34894061c1ced6f6928f97069c202c663e2 Mon Sep 17 00:00:00 2001 From: minghong Date: Thu, 26 Oct 2023 12:06:37 +0800 Subject: [PATCH] [fix](nereids) prune partition bug in pattern ColA <> ColB #25769 in predicate rewrite phase, we eliminate some conjuncts which contains un-interested columns. for example: T (a, b) partition by (a) interest cols: a uninsterest cols: b for parition prune, filter "a=1 and a>b" is equivalent to "a=1", filter "a=1 or a>b" is equivalent to "TRUE" --- .../TryEliminateUninterestedPredicates.java | 22 +++++++++++++++++++ .../rewrite/PruneOlapScanPartitionTest.java | 2 ++ 2 files changed, 24 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TryEliminateUninterestedPredicates.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TryEliminateUninterestedPredicates.java index 6db101a4cac2ed..79bd0a54bf5830 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TryEliminateUninterestedPredicates.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/TryEliminateUninterestedPredicates.java @@ -20,6 +20,7 @@ import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext; import org.apache.doris.nereids.rules.expression.rules.TryEliminateUninterestedPredicates.Context; +import org.apache.doris.nereids.trees.expressions.And; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral; @@ -104,6 +105,27 @@ public Expression visit(Expression originExpr, Context parentContext) { return expr; } + @Override + public Expression visitAnd(And and, Context parentContext) { + Expression left = and.left(); + Context leftContext = new Context(); + Expression newLeft = this.visit(left, leftContext); + if (leftContext.childrenContainsNonInterestedSlots) { + newLeft = BooleanLiteral.TRUE; + } + + Expression right = and.right(); + Context rightContext = new Context(); + Expression newRight = this.visit(right, rightContext); + if (rightContext.childrenContainsNonInterestedSlots) { + newRight = BooleanLiteral.TRUE; + } + Expression expr = new And(newLeft, newRight).accept(FoldConstantRuleOnFE.INSTANCE, expressionRewriteContext); + parentContext.childrenContainsInterestedSlots = + rightContext.childrenContainsInterestedSlots || leftContext.childrenContainsInterestedSlots; + return expr; + } + @Override public Expression visitSlot(Slot slot, Context context) { boolean isInterestedSlot = interestedSlots.contains(slot); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneOlapScanPartitionTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneOlapScanPartitionTest.java index 85fde57b517fa2..de54a05bc5e8c8 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneOlapScanPartitionTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneOlapScanPartitionTest.java @@ -228,6 +228,8 @@ public void prunePartitionWithOrPredicate() { public void canNotPruneComplexPredicate() { test("test_range_parts", "(part = 10) or (part + id = 1)", 4); test("test_range_parts", "(part + id = 1) and (part = 4)", 1); + test("test_range_parts", "(part = 2) and (part <> id)", 1); + test("test_range_parts", "(part = 2) or (part <> id)", 4); } @Test