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 ea524cb8bf1 [fix](Nereids) let OrToIn rewritten result have stable 
order (#31797)
ea524cb8bf1 is described below

commit ea524cb8bf158f06d3e9206151d19b161efb09e0
Author: morrySnow <[email protected]>
AuthorDate: Tue Mar 5 19:57:48 2024 +0800

    [fix](Nereids) let OrToIn rewritten result have stable order (#31797)
    
    pick from master #31731
---
 .../apache/doris/nereids/rules/expression/rules/OrToIn.java  | 12 +++++++-----
 .../doris/nereids/rules/expression/rules/SimplifyRange.java  |  2 +-
 .../org/apache/doris/nereids/trees/plans/algebra/Filter.java |  4 +---
 .../data/nereids_ssb_shape_sf100_p0/shape/q3.3.out           |  4 ++--
 .../data/nereids_ssb_shape_sf100_p0/shape/q3.4.out           |  4 ++--
 5 files changed, 13 insertions(+), 13 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java
index aaa077d1994..1db9fc890dc 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OrToIn.java
@@ -29,11 +29,11 @@ import 
org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewri
 import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Maps;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -60,7 +60,7 @@ public class OrToIn extends 
DefaultExpressionRewriter<ExpressionRewriteContext>
 
     public static final OrToIn INSTANCE = new OrToIn();
 
-    private static final int REWRITE_OR_TO_IN_PREDICATE_THRESHOLD = 2;
+    public static final int REWRITE_OR_TO_IN_PREDICATE_THRESHOLD = 2;
 
     @Override
     public Expression rewrite(Expression expr, ExpressionRewriteContext ctx) {
@@ -69,7 +69,9 @@ public class OrToIn extends 
DefaultExpressionRewriter<ExpressionRewriteContext>
 
     @Override
     public Expression visitOr(Or or, ExpressionRewriteContext ctx) {
-        Map<NamedExpression, Set<Literal>> slotNameToLiteral = new HashMap<>();
+        // NOTICE: use linked hash map to avoid unstable order or entry.
+        //  unstable order entry lead to dead loop since return expression 
always un-equals to original one.
+        Map<NamedExpression, Set<Literal>> slotNameToLiteral = 
Maps.newLinkedHashMap();
         List<Expression> expressions = ExpressionUtils.extractDisjunction(or);
         for (Expression expression : expressions) {
             if (expression instanceof EqualTo) {
@@ -125,7 +127,7 @@ public class OrToIn extends 
DefaultExpressionRewriter<ExpressionRewriteContext>
 
     public void addSlotToLiteral(NamedExpression namedExpression, Literal 
literal,
             Map<NamedExpression, Set<Literal>> slotNameToLiteral) {
-        Set<Literal> literals = 
slotNameToLiteral.computeIfAbsent(namedExpression, k -> new HashSet<>());
+        Set<Literal> literals = 
slotNameToLiteral.computeIfAbsent(namedExpression, k -> new LinkedHashSet<>());
         literals.add(literal);
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
index c0cb834b2f4..b5193e77375 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyRange.java
@@ -416,7 +416,7 @@ public class SimplifyRange extends 
AbstractExpressionRewriteRule {
             // They are same processes, so must change synchronously.
             if (values.size() == 1) {
                 return new EqualTo(reference, values.iterator().next());
-            } else if (values.size() == 2) {
+            } else if (values.size() <= 
OrToIn.REWRITE_OR_TO_IN_PREDICATE_THRESHOLD) {
                 Iterator<Literal> iterator = values.iterator();
                 return new Or(new EqualTo(reference, iterator.next()), new 
EqualTo(reference, iterator.next()));
             } else {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Filter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Filter.java
index 626ee2d6b2e..80d614a4c11 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Filter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Filter.java
@@ -20,8 +20,6 @@ package org.apache.doris.nereids.trees.plans.algebra;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
-import com.google.common.base.Suppliers;
-
 import java.util.Set;
 
 /**
@@ -31,6 +29,6 @@ public interface Filter {
     Set<Expression> getConjuncts();
 
     default Expression getPredicate() {
-        return Suppliers.memoize(() -> 
ExpressionUtils.and(getConjuncts().toArray(new Expression[0]))).get();
+        return ExpressionUtils.and(getConjuncts());
     }
 }
diff --git a/regression-test/data/nereids_ssb_shape_sf100_p0/shape/q3.3.out 
b/regression-test/data/nereids_ssb_shape_sf100_p0/shape/q3.3.out
index d7bdbaa77ba..66d311edb31 100644
--- a/regression-test/data/nereids_ssb_shape_sf100_p0/shape/q3.3.out
+++ b/regression-test/data/nereids_ssb_shape_sf100_p0/shape/q3.3.out
@@ -18,11 +18,11 @@ PhysicalResultSink
 ------------------------------PhysicalOlapScan[lineorder]
 ----------------------------PhysicalDistribute
 ------------------------------PhysicalProject
---------------------------------filter(s_city IN ('UNITED KI5', 'UNITED KI1'))
+--------------------------------filter(s_city IN ('UNITED KI1', 'UNITED KI5'))
 ----------------------------------PhysicalOlapScan[supplier]
 ------------------------PhysicalDistribute
 --------------------------PhysicalProject
-----------------------------filter(c_city IN ('UNITED KI5', 'UNITED KI1'))
+----------------------------filter(c_city IN ('UNITED KI1', 'UNITED KI5'))
 ------------------------------PhysicalOlapScan[customer]
 ------------------PhysicalDistribute
 --------------------PhysicalProject
diff --git a/regression-test/data/nereids_ssb_shape_sf100_p0/shape/q3.4.out 
b/regression-test/data/nereids_ssb_shape_sf100_p0/shape/q3.4.out
index ad9c6d46496..6e73de650a5 100644
--- a/regression-test/data/nereids_ssb_shape_sf100_p0/shape/q3.4.out
+++ b/regression-test/data/nereids_ssb_shape_sf100_p0/shape/q3.4.out
@@ -17,7 +17,7 @@ PhysicalResultSink
 ----------------------------PhysicalOlapScan[lineorder]
 --------------------------PhysicalDistribute
 ----------------------------PhysicalProject
-------------------------------filter(s_city IN ('UNITED KI5', 'UNITED KI1'))
+------------------------------filter(s_city IN ('UNITED KI1', 'UNITED KI5'))
 --------------------------------PhysicalOlapScan[supplier]
 ------------------------PhysicalDistribute
 --------------------------PhysicalProject
@@ -25,6 +25,6 @@ PhysicalResultSink
 ------------------------------PhysicalOlapScan[dates]
 ------------------PhysicalDistribute
 --------------------PhysicalProject
-----------------------filter(c_city IN ('UNITED KI5', 'UNITED KI1'))
+----------------------filter(c_city IN ('UNITED KI1', 'UNITED KI5'))
 ------------------------PhysicalOlapScan[customer]
 


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

Reply via email to