This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 03529e37439 branch-2.1: [fix](nereids) fix join condition with
AddMinMax rule hung #47772 (#47808)
03529e37439 is described below
commit 03529e37439206273381e1437c678ad7a1d4f8f7
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Feb 14 10:20:14 2025 +0800
branch-2.1: [fix](nereids) fix join condition with AddMinMax rule hung
#47772 (#47808)
Cherry-picked from #47772
Co-authored-by: 924060929 <[email protected]>
---
.../rules/expression/ExpressionRewrite.java | 13 +++-
.../data/nereids_syntax_p0/join_condition.out | Bin 0 -> 31842 bytes
.../suites/nereids_syntax_p0/join_condition.groovy | 67 +++++++++++++++++++++
3 files changed, 78 insertions(+), 2 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionRewrite.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionRewrite.java
index 0eb4d3a79a0..0a790fd5864 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionRewrite.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionRewrite.java
@@ -40,6 +40,7 @@ import
org.apache.doris.nereids.trees.plans.logical.LogicalProject;
import org.apache.doris.nereids.trees.plans.logical.LogicalRepeat;
import org.apache.doris.nereids.trees.plans.logical.LogicalSort;
import org.apache.doris.nereids.util.ExpressionUtils;
+import org.apache.doris.nereids.util.Utils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
@@ -204,7 +205,14 @@ public class ExpressionRewrite implements
RewriteRuleFactory {
private Pair<Boolean, List<Expression>>
rewriteConjuncts(List<Expression> conjuncts,
ExpressionRewriteContext context) {
boolean isChanged = false;
- ImmutableList.Builder<Expression> rewrittenConjuncts = new
ImmutableList.Builder<>();
+ // some rules will append new conjunct, we need to distinct it
+ // for example:
+ // pk = 2 or pk < 0
+ // after AddMinMax rule:
+ // (pk = 2 or pk < 0) and pk <= 2
+ //
+ // if not distinct it, the pk <= 2 will generate repeat forever
+ ImmutableSet.Builder<Expression> rewrittenConjuncts = new
ImmutableSet.Builder<>();
for (Expression expr : conjuncts) {
Expression newExpr = rewriter.rewrite(expr, context);
newExpr = newExpr.isNullLiteral() && expr instanceof
EqualPredicate
@@ -214,7 +222,8 @@ public class ExpressionRewrite implements
RewriteRuleFactory {
isChanged = isChanged || !newExpr.equals(expr);
rewrittenConjuncts.addAll(ExpressionUtils.extractConjunction(newExpr));
}
- return Pair.of(isChanged, rewrittenConjuncts.build());
+ ImmutableList<Expression> newConjuncts =
Utils.fastToImmutableList(rewrittenConjuncts.build());
+ return Pair.of(isChanged && !newConjuncts.equals(conjuncts),
newConjuncts);
}
}
diff --git a/regression-test/data/nereids_syntax_p0/join_condition.out
b/regression-test/data/nereids_syntax_p0/join_condition.out
new file mode 100644
index 00000000000..c0d89f66c4f
Binary files /dev/null and
b/regression-test/data/nereids_syntax_p0/join_condition.out differ
diff --git a/regression-test/suites/nereids_syntax_p0/join_condition.groovy
b/regression-test/suites/nereids_syntax_p0/join_condition.groovy
new file mode 100644
index 00000000000..5a8d20d820a
--- /dev/null
+++ b/regression-test/suites/nereids_syntax_p0/join_condition.groovy
@@ -0,0 +1,67 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("join_condition") {
+ multi_sql """
+ drop table if exists
table_9_undef_partitions2_keys3_properties4_distributed_by5;
+ create table
table_9_undef_partitions2_keys3_properties4_distributed_by5 (
+ col_int_undef_signed int/*agg_type_placeholder*/ ,
+ col_varchar_10__undef_signed varchar(10)/*agg_type_placeholder*/ ,
+ pk int/*agg_type_placeholder*/
+ ) engine=olap
+ distributed by hash(pk) buckets 10
+ properties("replication_num" = "1");
+ insert into
table_9_undef_partitions2_keys3_properties4_distributed_by5(pk,col_int_undef_signed,col_varchar_10__undef_signed)
values
(0,0,null),(1,6,null),(2,9,null),(3,2,''),(4,null,'here'),(5,null,'i'),(6,null,'now'),(7,5,'c'),(8,null,'t');
+
+ drop table if exists
table_100_undef_partitions2_keys3_properties4_distributed_by5;
+ create table
table_100_undef_partitions2_keys3_properties4_distributed_by5 (
+ col_int_undef_signed int/*agg_type_placeholder*/ ,
+ col_varchar_10__undef_signed varchar(10)/*agg_type_placeholder*/ ,
+ pk int/*agg_type_placeholder*/
+ ) engine=olap
+ distributed by hash(pk) buckets 10
+ properties("replication_num" = "1");
+ insert into
table_100_undef_partitions2_keys3_properties4_distributed_by5(pk,col_int_undef_signed,col_varchar_10__undef_signed)
values
(0,null,''),(1,null,''),(2,null,''),(3,0,null),(4,7,null),(5,9,'d'),(6,9,null),(7,null,null),(8,null,null),(9,null,''),(10,null,'are'),(11,null,'were'),(12,2,''),(13,null,'one'),(14,null,'ok'),(15,null,'your'),(16,null,''),(17,null,null),(18,4,''),(19,null,null),(20,null,null),(21,null,null),(22,3,''),(23,null,null),(24,8,''),(25,2,'I''m'),(26,nul
[...]
+
+ drop table if exists
table_20_undef_partitions2_keys3_properties4_distributed_by5;
+ create table
table_20_undef_partitions2_keys3_properties4_distributed_by5 (
+ col_int_undef_signed int/*agg_type_placeholder*/ ,
+ col_varchar_10__undef_signed varchar(10)/*agg_type_placeholder*/ ,
+ pk int/*agg_type_placeholder*/
+ ) engine=olap
+ distributed by hash(pk) buckets 10
+ properties("replication_num" = "1");
+ insert into
table_20_undef_partitions2_keys3_properties4_distributed_by5(pk,col_int_undef_signed,col_varchar_10__undef_signed)
values
(0,null,'my'),(1,null,'a'),(2,5,''),(3,0,'that'),(4,0,'want'),(5,null,'g'),(6,null,null),(7,null,''),(8,null,null),(9,3,'b'),(10,null,'her'),(11,6,''),(12,null,'k'),(13,null,'then'),(14,2,null),(15,null,''),(16,null,'g'),(17,null,'x'),(18,null,'d'),(19,null,null);
+
+ drop table if exists
table_8_undef_partitions2_keys3_properties4_distributed_by5;
+ create table
table_8_undef_partitions2_keys3_properties4_distributed_by5 (
+ col_int_undef_signed int/*agg_type_placeholder*/ ,
+ col_varchar_10__undef_signed varchar(10)/*agg_type_placeholder*/ ,
+ pk int/*agg_type_placeholder*/
+ ) engine=olap
+ distributed by hash(pk) buckets 10
+ properties("replication_num" = "1");
+ insert into
table_8_undef_partitions2_keys3_properties4_distributed_by5(pk,col_int_undef_signed,col_varchar_10__undef_signed)
values
(0,3,'s'),(1,8,''),(2,null,null),(3,7,'k'),(4,null,'x'),(5,null,''),(6,null,'will'),(7,null,'so');
+ """
+
+ order_qt_join_with_add_min_max_rule """SELECT * FROM
table_9_undef_partitions2_keys3_properties4_distributed_by5 AS t1
+ LEFT ANTI JOIN
table_100_undef_partitions2_keys3_properties4_distributed_by5 AS t2 ON t2 .
`pk` = 2 OR t2 . `pk` < 0
+ RIGHT ANTI JOIN
table_9_undef_partitions2_keys3_properties4_distributed_by5 AS alias1 ON alias1
. `pk` >= 3
+ CROSS JOIN
table_20_undef_partitions2_keys3_properties4_distributed_by5 AS alias2
+ INNER JOIN
table_8_undef_partitions2_keys3_properties4_distributed_by5 AS alias3 ;
+ """
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]