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 119b4a5c189 [Fix](Nereids) fix leading left outer join join constraint
collect problem (#31597)
119b4a5c189 is described below
commit 119b4a5c189e8d86029147ffce530195b8c20bc3
Author: LiBinfeng <[email protected]>
AuthorDate: Tue Mar 5 10:39:26 2024 +0800
[Fix](Nereids) fix leading left outer join join constraint collect problem
(#31597)
cherry-pick pr #31387
---
.../rules/analysis/CollectJoinConstraint.java | 3 +
.../data/nereids_p0/hint/fix_leading.out | 194 ++++++++++++++++++++-
.../suites/nereids_p0/hint/fix_leading.groovy | 112 +++++++++++-
3 files changed, 306 insertions(+), 3 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectJoinConstraint.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectJoinConstraint.java
index 42bc6d1f9bc..48d3ef0bfea 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectJoinConstraint.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectJoinConstraint.java
@@ -162,6 +162,9 @@ public class CollectJoinConstraint implements
RewriteRuleFactory {
}
}
}
+ if (minLeftHand == 0L) {
+ minLeftHand = leftHand;
+ }
JoinConstraint newJoinConstraint = new JoinConstraint(minLeftHand,
minRightHand, leftHand, rightHand,
join.getJoinType(), isStrict);
diff --git a/regression-test/data/nereids_p0/hint/fix_leading.out
b/regression-test/data/nereids_p0/hint/fix_leading.out
index a71ca311e75..4eb83a9abd4 100644
--- a/regression-test/data/nereids_p0/hint/fix_leading.out
+++ b/regression-test/data/nereids_p0/hint/fix_leading.out
@@ -4,10 +4,11 @@ PhysicalResultSink
--PhysicalDistribute
----PhysicalProject
------hashJoin[INNER_JOIN](t1.c1 = t3.c3)(t1.c1 = t4.c4)
---------hashJoin[INNER_JOIN](t1.c1 = t2.c2)
+--------NestedLoopJoin[CROSS_JOIN]
----------PhysicalOlapScan[t1]
----------PhysicalDistribute
-------------PhysicalOlapScan[t2]
+------------filter((t2.c2 = t2.c2))
+--------------PhysicalOlapScan[t2]
--------PhysicalDistribute
----------NestedLoopJoin[CROSS_JOIN](t4.c4 = t3.c3)(t3.c3 = t4.c4)
------------PhysicalOlapScan[t3]
@@ -19,3 +20,192 @@ Used: leading({ t1 t2 } { t3 t4 })
UnUsed:
SyntaxError:
+-- !select2_1_1 --
+1876000
+
+-- !select2_1_2 --
+1876000
+
+-- !select2_1_3 --
+1876000
+
+-- !select2_1_4 --
+1876000
+
+-- !select2_1_5 --
+1876000
+
+-- !select2_1_6 --
+1876000
+
+-- !select2_1_7 --
+1876000
+
+-- !select2_1_8 --
+1876000
+
+-- !select2_1_9 --
+1876000
+
+-- !select2_1_10 --
+1876000
+
+-- !select2_1_11 --
+1876000
+
+-- !select2_1_12 --
+1876000
+
+-- !select2_1_13 --
+1876000
+
+-- !select2_2_1 --
+1751202
+
+-- !select2_2_2 --
+1751202
+
+-- !select2_2_3 --
+1751202
+
+-- !select2_2_4 --
+1751202
+
+-- !select2_2_5 --
+1751202
+
+-- !select2_2_6 --
+1751202
+
+-- !select2_2_7 --
+1751202
+
+-- !select2_2_8 --
+1751202
+
+-- !select2_2_9 --
+1751202
+
+-- !select2_2_10 --
+1751202
+
+-- !select2_2_11 --
+1751202
+
+-- !select2_2_12 --
+1751202
+
+-- !select2_2_13 --
+1751202
+
+-- !select2_3_1 --
+816000
+
+-- !select2_3_2 --
+816000
+
+-- !select2_3_3 --
+816000
+
+-- !select2_3_4 --
+816000
+
+-- !select2_3_5 --
+816000
+
+-- !select2_3_6 --
+816000
+
+-- !select2_3_7 --
+816000
+
+-- !select2_3_8 --
+816000
+
+-- !select2_3_9 --
+816000
+
+-- !select2_3_10 --
+816000
+
+-- !select2_3_11 --
+816000
+
+-- !select2_3_12 --
+816000
+
+-- !select2_3_13 --
+816000
+
+-- !select2_4_1 --
+125000
+
+-- !select2_4_2 --
+125000
+
+-- !select2_4_3 --
+125000
+
+-- !select2_4_4 --
+125000
+
+-- !select2_4_5 --
+125000
+
+-- !select2_4_6 --
+125000
+
+-- !select2_4_7 --
+125000
+
+-- !select2_4_8 --
+125000
+
+-- !select2_4_9 --
+125000
+
+-- !select2_4_10 --
+125000
+
+-- !select2_4_11 --
+125000
+
+-- !select2_4_12 --
+125000
+
+-- !select2_4_13 --
+125000
+
+-- !select2_5_1 --
+816000
+
+-- !select2_5_2 --
+816000
+
+-- !select2_5_3 --
+816000
+
+-- !select2_5_5 --
+816000
+
+-- !select2_5_6 --
+816000
+
+-- !select2_5_7 --
+816000
+
+-- !select2_5_8 --
+816000
+
+-- !select2_5_9 --
+816000
+
+-- !select2_5_11 --
+816000
+
+-- !select2_5_12 --
+816000
+
+-- !select2_5_13 --
+816000
+
diff --git a/regression-test/suites/nereids_p0/hint/fix_leading.groovy
b/regression-test/suites/nereids_p0/hint/fix_leading.groovy
index b1da3b44b69..782bfc34647 100644
--- a/regression-test/suites/nereids_p0/hint/fix_leading.groovy
+++ b/regression-test/suites/nereids_p0/hint/fix_leading.groovy
@@ -38,6 +38,116 @@ suite("fix_leading") {
sql """create table t3 (c3 int, c33 int) distributed by hash(c3) buckets 3
properties('replication_num' = '1');"""
sql """create table t4 (c4 int, c44 int) distributed by hash(c4) buckets 3
properties('replication_num' = '1');"""
+ streamLoad {
+ table "t1"
+ db "fix_leading"
+ set 'column_separator', '|'
+ set 'format', 'csv'
+ file 't1.csv'
+ time 10000
+ }
+
+ streamLoad {
+ table "t2"
+ db "fix_leading"
+ set 'column_separator', '|'
+ set 'format', 'csv'
+ file 't2.csv'
+ time 10000
+ }
+
+ streamLoad {
+ table "t3"
+ db "fix_leading"
+ set 'column_separator', '|'
+ set 'format', 'csv'
+ file 't3.csv'
+ time 10000
+ }
+
+ streamLoad {
+ table "t4"
+ db "fix_leading"
+ set 'column_separator', '|'
+ set 'format', 'csv'
+ file 't4.csv'
+ time 10000
+ }
+
// bug fix 1: {t1 t2}{t3 t4} miss levels
- qt_select1 """explain shape plan select /*+ leading({t1 t2}{t3 t4}) */ *
from t1 join t2 on c1 = c2 join t3 on c1 = c3 join t4 on c1 = c4;"""
+ qt_select1 """explain shape plan select /*+ leading({t1 t2}{t3 t4}) */ *
from t1 join t2 on c2 = c2 join t3 on c1 = c3 join t4 on c1 = c4;"""
+
+ // bug fix 2: fix left outer join without edge with other tables
+ // left join + left join
+ qt_select2_1_1 """select count(*) from t1 left join t2 on c2 = c2 left
join t3 on c2 = c3;"""
+ qt_select2_1_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+ qt_select2_1_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+ qt_select2_1_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+ qt_select2_1_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+ qt_select2_1_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+ qt_select2_1_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+ qt_select2_1_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+ qt_select2_1_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+ qt_select2_1_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+ qt_select2_1_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+ qt_select2_1_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+ qt_select2_1_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left
join t2 on c2 = c2 left join t3 on c2 = c3;"""
+
+ // left join + right join
+ qt_select2_2_1 """select count(*) from t1 left join t2 on c2 = c2 right
join t3 on c2 = c3;"""
+ qt_select2_2_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+ qt_select2_2_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+ qt_select2_2_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+ qt_select2_2_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+ qt_select2_2_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+ qt_select2_2_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+ qt_select2_2_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+ qt_select2_2_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+ qt_select2_2_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+ qt_select2_2_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+ qt_select2_2_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+ qt_select2_2_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left
join t2 on c2 = c2 right join t3 on c2 = c3;"""
+
+ // left join + semi join
+ qt_select2_3_1 """select count(*) from t1 left join t2 on c2 = c2 left
semi join t3 on c2 = c3;"""
+ qt_select2_3_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_3_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_3_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_3_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_3_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_3_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_3_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_3_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_3_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_3_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_3_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_3_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+
+ // left join + anti join
+ qt_select2_4_1 """select count(*) from t1 left join t2 on c2 = c2 left
anti join t3 on c2 = c3;"""
+ qt_select2_4_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+ qt_select2_4_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+ qt_select2_4_4 """select /*+ leading(t1 t3 t2) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+ qt_select2_4_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+ qt_select2_4_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+ qt_select2_4_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+ qt_select2_4_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+ qt_select2_4_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+ qt_select2_4_10 """select /*+ leading(t3 t1 t2) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+ qt_select2_4_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+ qt_select2_4_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+ qt_select2_4_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1 left
join t2 on c2 = c2 left anti join t3 on c2 = c3;"""
+
+ // right join + semi join
+ qt_select2_5_1 """select count(*) from t1 right join t2 on c2 = c2 left
semi join t3 on c2 = c3;"""
+ qt_select2_5_2 """select /*+ leading(t1 t2 t3) */ count(*) from t1 right
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_5_3 """select /*+ leading(t1 {t2 t3}) */ count(*) from t1 right
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_5_5 """select /*+ leading(t1 {t2 t2}) */ count(*) from t1 right
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_5_6 """select /*+ leading(t2 t1 t3) */ count(*) from t1 right
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_5_7 """select /*+ leading(t2 {t1 t3}) */ count(*) from t1 right
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_5_8 """select /*+ leading(t2 t3 t1) */ count(*) from t1 right
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_5_9 """select /*+ leading(t2 {t3 t1}) */ count(*) from t1 right
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_5_11 """select /*+ leading(t3 {t1 t2}) */ count(*) from t1
right join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_5_12 """select /*+ leading(t3 t2 t1) */ count(*) from t1 right
join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
+ qt_select2_5_13 """select /*+ leading(t3 {t2 t1}) */ count(*) from t1
right join t2 on c2 = c2 left semi join t3 on c2 = c3;"""
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]