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]