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

englefly 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 af3e6f604ae [fix](nereids) prune partition bug in pattern ColA <> ColB 
#25769
af3e6f604ae is described below

commit af3e6f604ae349a698edebf26abfc51f80ab64ed
Author: minghong <[email protected]>
AuthorDate: Thu Oct 26 12:06:37 2023 +0800

    [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"
---
 .../rules/TryEliminateUninterestedPredicates.java  | 22 ++++++++++++++++++++++
 .../rules/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 6db101a4cac..79bd0a54bf5 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 @@ package org.apache.doris.nereids.rules.expression.rules;
 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 class TryEliminateUninterestedPredicates extends 
DefaultExpressionRewrite
         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 85fde57b517..de54a05bc5e 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 @@ class PruneOlapScanPartitionTest extends TestWithFeService 
implements MemoPatter
     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


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to