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 47716bce773 [Fix](Nereids) fix leading with multi level of brace pairs
(#35606)
47716bce773 is described below
commit 47716bce773aa0a24fd2fc6db641a99269fbdc68
Author: LiBinfeng <[email protected]>
AuthorDate: Thu May 30 15:46:03 2024 +0800
[Fix](Nereids) fix leading with multi level of brace pairs (#35606)
cherry-pick: #34169
fix leading with multi level of brace pairs. example:
leading(t1 {{t2 t3} {t4 t5}} t6)
can be reduced to
leading(t1 {t2 t3 {t4 t5}} t6)
also update cases which remove project node from explain shape plan
---
.../org/apache/doris/nereids/hint/LeadingHint.java | 44 +-
.../data/nereids_p0/hint/fix_leading.out | 36 +-
.../data/nereids_p0/hint/test_leading.out | 783 +++++++++++++++++++++
.../suites/nereids_p0/hint/fix_leading.groovy | 13 +-
.../suites/nereids_p0/hint/test_leading.groovy | 1 +
5 files changed, 851 insertions(+), 26 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/hint/LeadingHint.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/hint/LeadingHint.java
index a1b1af1609b..92ff5c8bfc2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/hint/LeadingHint.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/hint/LeadingHint.java
@@ -51,7 +51,7 @@ import java.util.Stack;
public class LeadingHint extends Hint {
private String originalString = "";
private final List<String> tablelist = new ArrayList<>();
- private final List<Integer> levellist = new ArrayList<>();
+ private final List<Integer> levelList = new ArrayList<>();
private final Map<RelationId, LogicalPlan> relationIdToScanMap =
Maps.newLinkedHashMap();
@@ -101,18 +101,46 @@ public class LeadingHint extends Hint {
}
} else {
tablelist.add(parameter);
- levellist.add(level);
+ levelList.add(level);
}
lastParameter = parameter;
}
+ normalizeLevelList();
+ }
+
+ private void removeGap(int left, int right, int gap) {
+ for (int i = left; i <= right; i++) {
+ levelList.set(i, levelList.get(i) - (gap - 1));
+ }
+ }
+
+ // when we write leading like: leading(t1 {{t2 t3} {t4 t5}} t6)
+ // levelList would like 0 2 2 3 3 0, it could be reduced to 0 1 1 2 2 0
like leading(t1 {t2 t3 {t4 t5}} t6)
+ // gap is like 0 to 2 or 3 to 0 in upper example, and this function is to
remove gap when we use a lot of braces
+ private void normalizeLevelList() {
+ int leftIndex = 0;
+ // at lease two tables were needed
+ for (int i = 1; i < levelList.size(); i++) {
+ if ((levelList.get(i) - levelList.get(leftIndex)) > 1) {
+ int rightIndex = i;
+ for (int j = i; j < levelList.size(); j++) {
+ if ((levelList.get(rightIndex) - levelList.get(j)) > 1) {
+ removeGap(i, rightIndex, Math.min(levelList.get(i) -
levelList.get(leftIndex),
+ levelList.get(rightIndex) - levelList.get(j)));
+ }
+ rightIndex = j;
+ }
+ }
+ leftIndex = i;
+ }
}
public List<String> getTablelist() {
return tablelist;
}
- public List<Integer> getLevellist() {
- return levellist;
+ public List<Integer> getLevelList() {
+ return levelList;
}
public Map<RelationId, LogicalPlan> getRelationIdToScanMap() {
@@ -450,10 +478,10 @@ public class LeadingHint extends Hint {
}
logicalPlan = makeFilterPlanIfExist(getFilters(), logicalPlan);
assert (logicalPlan != null);
- stack.push(Pair.of(getLevellist().get(index), logicalPlan));
- int stackTopLevel = getLevellist().get(index++);
+ stack.push(Pair.of(getLevelList().get(index), logicalPlan));
+ int stackTopLevel = getLevelList().get(index++);
while (index < getTablelist().size()) {
- int currentLevel = getLevellist().get(index);
+ int currentLevel = getLevelList().get(index);
if (currentLevel == stackTopLevel) {
// should return error if can not found table
logicalPlan =
getLogicalPlanByName(getTablelist().get(index++));
@@ -492,7 +520,7 @@ public class LeadingHint extends Hint {
logicalJoin.setBitmap(LongBitmap.or(getBitmap(newStackTop.second),
getBitmap(logicalPlan)));
if (stackTopLevel > 0) {
if (index < getTablelist().size()) {
- if (stackTopLevel > getLevellist().get(index)) {
+ if (stackTopLevel > getLevelList().get(index)) {
stackTopLevel--;
}
} else {
diff --git a/regression-test/data/nereids_p0/hint/fix_leading.out
b/regression-test/data/nereids_p0/hint/fix_leading.out
index feb69f97783..4a2ceae5c3f 100644
--- a/regression-test/data/nereids_p0/hint/fix_leading.out
+++ b/regression-test/data/nereids_p0/hint/fix_leading.out
@@ -251,28 +251,30 @@ Used: leading(t1 t2 t3 )
UnUsed:
SyntaxError:
--- !select5_1 --
+-- !select6_1 --
PhysicalResultSink
--hashAgg[GLOBAL]
----PhysicalDistribute[DistributionSpecGather]
------hashAgg[LOCAL]
---------PhysicalProject
-----------NestedLoopJoin[LEFT_OUTER_JOIN](t3.c3 > 500)
-------------PhysicalProject
---------------PhysicalOlapScan[t3]
-------------PhysicalDistribute[DistributionSpecReplicated]
---------------PhysicalProject
-----------------NestedLoopJoin[LEFT_OUTER_JOIN](t1.c1 > 500)
-------------------PhysicalProject
---------------------filter((t1.c1 < 200))
-----------------------PhysicalOlapScan[t1]
-------------------PhysicalDistribute[DistributionSpecReplicated]
---------------------PhysicalProject
-----------------------filter((t2.c2 > 500))
-------------------------PhysicalOlapScan[t2]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t6.c6)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2) and (t1.c1 =
t3.c3) and (t1.c1 = t4.c4) and (t1.c1 = t5.c5)) otherCondition=()
+------------PhysicalOlapScan[t1]
+------------PhysicalDistribute[DistributionSpecHash]
+--------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t4.c4) and (t2.c2 =
t5.c5) and (t3.c3 = t4.c4) and (t3.c3 = t5.c5)) otherCondition=()
+----------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))
otherCondition=()
+------------------PhysicalOlapScan[t2]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalOlapScan[t3]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashJoin[INNER_JOIN] hashCondition=((t4.c4 = t5.c5))
otherCondition=()
+--------------------PhysicalOlapScan[t4]
+--------------------PhysicalDistribute[DistributionSpecHash]
+----------------------PhysicalOlapScan[t5]
+----------PhysicalDistribute[DistributionSpecHash]
+------------PhysicalOlapScan[t6]
Hint log:
-Used:
+Used: leading(t1 { { t2 t3 } { t4 t5 } } t6 )
UnUsed:
-SyntaxError: leading(t1 t2) Msg:leading should have all tables in query block,
missing tables: t3
+SyntaxError:
diff --git a/regression-test/data/nereids_p0/hint/test_leading.out
b/regression-test/data/nereids_p0/hint/test_leading.out
index 3271c89c3b2..058fdf8b52f 100644
--- a/regression-test/data/nereids_p0/hint/test_leading.out
+++ b/regression-test/data/nereids_p0/hint/test_leading.out
@@ -2147,3 +2147,786 @@
-- !select88_13 --
119
+-- !select90_1 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=()
+----------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------PhysicalOlapScan[t2]
+
+Hint log:
+Used: [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !select90_3 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+--------------PhysicalOlapScan[t1]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecHash]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: [broadcast]_2 [shuffle]_3
+UnUsed:
+SyntaxError:
+
+-- !select90_5 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[RIGHT_OUTER_JOIN] hashCondition=((t2.c2 = t3.c3))
otherCondition=()
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+--------------PhysicalOlapScan[t1]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecHash]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: [broadcast]_2 [shuffle]_3
+UnUsed:
+SyntaxError:
+
+-- !select92_1 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+------------PhysicalOlapScan[t1]
+------------PhysicalDistribute[DistributionSpecHash]
+--------------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t1 shuffle t2 broadcast t3 )
+UnUsed:
+SyntaxError:
+
+-- !select92_2 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=()
+----------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t2]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t1 shuffle { t2 broadcast t3 } )
+UnUsed:
+SyntaxError:
+
+-- !select92_3 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=()
+----------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t3]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t2]
+
+Hint log:
+Used: leading(t1 shuffle { t3 broadcast t2 } )
+UnUsed:
+SyntaxError:
+
+-- !select92_4 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+------------PhysicalOlapScan[t2]
+------------PhysicalDistribute[DistributionSpecHash]
+--------------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t2 shuffle t1 broadcast t3 )
+UnUsed:
+SyntaxError:
+
+-- !select92_5 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2) and (t2.c2 =
t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t1]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t2 shuffle { t1 broadcast t3 } )
+UnUsed:
+SyntaxError:
+
+-- !select92_6 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2) and (t2.c2 =
t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t3]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t1]
+
+Hint log:
+Used: leading(t2 shuffle { t3 broadcast t1 } )
+UnUsed:
+SyntaxError:
+
+-- !select93_1 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+------------PhysicalOlapScan[t1]
+------------PhysicalDistribute[DistributionSpecHash]
+--------------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t1 t2 broadcast t3 )
+UnUsed:
+SyntaxError:
+
+-- !select93_2 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=()
+----------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t2]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t1 { t2 broadcast t3 } )
+UnUsed:
+SyntaxError:
+
+-- !select93_3 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=()
+----------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t3]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t2]
+
+Hint log:
+Used: leading(t1 { t3 broadcast t2 } )
+UnUsed:
+SyntaxError:
+
+-- !select93_4 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+------------PhysicalOlapScan[t2]
+------------PhysicalDistribute[DistributionSpecHash]
+--------------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t2 t1 broadcast t3 )
+UnUsed:
+SyntaxError:
+
+-- !select93_5 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2) and (t2.c2 =
t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t1]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t2 { t1 broadcast t3 } )
+UnUsed:
+SyntaxError:
+
+-- !select93_6 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2) and (t2.c2 =
t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t3]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t1]
+
+Hint log:
+Used: leading(t2 { t3 broadcast t1 } )
+UnUsed:
+SyntaxError:
+
+-- !select94_2 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+------------PhysicalOlapScan[t1]
+------------PhysicalDistribute[DistributionSpecHash]
+--------------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecHash]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t1 shuffle t2 t3 )
+UnUsed:
+SyntaxError:
+
+-- !select94_2 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=()
+----------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t2]
+--------------PhysicalDistribute[DistributionSpecHash]
+----------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t1 shuffle { t2 t3 } )
+UnUsed:
+SyntaxError:
+
+-- !select94_2 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=()
+----------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t3]
+--------------PhysicalDistribute[DistributionSpecHash]
+----------------PhysicalOlapScan[t2]
+
+Hint log:
+Used: leading(t1 shuffle { t3 t2 } )
+UnUsed:
+SyntaxError:
+
+-- !select94_2 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+------------PhysicalOlapScan[t2]
+------------PhysicalDistribute[DistributionSpecHash]
+--------------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecHash]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t2 shuffle t1 t3 )
+UnUsed:
+SyntaxError:
+
+-- !select94_2 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2) and (t2.c2 =
t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t1]
+--------------PhysicalDistribute[DistributionSpecHash]
+----------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t2 shuffle { t1 t3 } )
+UnUsed:
+SyntaxError:
+
+-- !select94_2 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2) and (t2.c2 =
t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t3.c3))
otherCondition=()
+--------------PhysicalOlapScan[t3]
+--------------PhysicalDistribute[DistributionSpecHash]
+----------------PhysicalOlapScan[t1]
+
+Hint log:
+Used: leading(t2 shuffle { t3 t1 } )
+UnUsed:
+SyntaxError:
+
+-- !select95_1 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+------------PhysicalOlapScan[t1]
+------------PhysicalDistribute[DistributionSpecReplicated]
+--------------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t1 broadcast t2 t3 )
+UnUsed:
+SyntaxError:
+
+-- !select95_4 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+------------PhysicalOlapScan[t2]
+------------PhysicalDistribute[DistributionSpecReplicated]
+--------------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecHash]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t2 broadcast t1 t3 )
+UnUsed:
+SyntaxError:
+
+-- !select95_8 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t3]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+--------------PhysicalOlapScan[t1]
+--------------PhysicalDistribute[DistributionSpecHash]
+----------------PhysicalOlapScan[t2]
+
+Hint log:
+Used: leading(t3 broadcast { t1 t2 } )
+UnUsed:
+SyntaxError:
+
+-- !select95_9 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t3]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+--------------PhysicalOlapScan[t2]
+--------------PhysicalDistribute[DistributionSpecHash]
+----------------PhysicalOlapScan[t1]
+
+Hint log:
+Used: leading(t3 broadcast { t2 t1 } )
+UnUsed:
+SyntaxError:
+
+-- !select96_1 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+------------PhysicalOlapScan[t1]
+------------PhysicalDistribute[DistributionSpecHash]
+--------------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t1 shuffle t2 broadcast t3 )
+UnUsed:
+SyntaxError:
+
+-- !select96_4 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+------------PhysicalOlapScan[t2]
+------------PhysicalDistribute[DistributionSpecHash]
+--------------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t2 shuffle t1 broadcast t3 )
+UnUsed:
+SyntaxError:
+
+-- !select96_8 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t3]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+--------------PhysicalOlapScan[t1]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t2]
+
+Hint log:
+Used: leading(t3 shuffle { t1 broadcast t2 } )
+UnUsed:
+SyntaxError:
+
+-- !select96_9 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t3]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+--------------PhysicalOlapScan[t2]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t1]
+
+Hint log:
+Used: leading(t3 shuffle { t2 broadcast t1 } )
+UnUsed:
+SyntaxError:
+
+-- !select97_1 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+--------------PhysicalOlapScan[t1]
+--------------PhysicalDistribute[DistributionSpecReplicated]
+----------------PhysicalOlapScan[t2]
+----------PhysicalDistribute[DistributionSpecHash]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t1 broadcast t2 shuffle t3 )
+UnUsed:
+SyntaxError:
+
+-- !select97_4 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+------------PhysicalOlapScan[t2]
+------------PhysicalDistribute[DistributionSpecReplicated]
+--------------PhysicalOlapScan[t1]
+----------PhysicalDistribute[DistributionSpecHash]
+------------PhysicalOlapScan[t3]
+
+Hint log:
+Used: leading(t2 broadcast t1 shuffle t3 )
+UnUsed:
+SyntaxError:
+
+-- !select97_8 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t3]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+--------------PhysicalOlapScan[t1]
+--------------PhysicalDistribute[DistributionSpecHash]
+----------------PhysicalOlapScan[t2]
+
+Hint log:
+Used: leading(t3 broadcast { t1 shuffle t2 } )
+UnUsed:
+SyntaxError:
+
+-- !select97_9 --
+PhysicalResultSink
+--hashAgg[GLOBAL]
+----PhysicalDistribute[DistributionSpecGather]
+------hashAgg[LOCAL]
+--------hashJoin[INNER_JOIN] hashCondition=((t2.c2 = t3.c3)) otherCondition=()
+----------PhysicalOlapScan[t3]
+----------PhysicalDistribute[DistributionSpecReplicated]
+------------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2))
otherCondition=()
+--------------PhysicalOlapScan[t2]
+--------------PhysicalDistribute[DistributionSpecHash]
+----------------PhysicalOlapScan[t1]
+
+Hint log:
+Used: leading(t3 broadcast { t2 shuffle t1 } )
+UnUsed:
+SyntaxError:
+
+-- !select100_0 --
+1719
+
+-- !select100_1 --
+1719
+
+-- !select100_2 --
+1980
+
+-- !select100_3 --
+3103
+
+-- !select100_4 --
+3512
+
+-- !select100_5 --
+3472
+
+-- !select100_6 --
+3472
+
+-- !select101_0 --
+3103
+
+-- !select101_1 --
+3103
+
+-- !select101_2 --
+3512
+
+-- !select101_3 --
+3472
+
+-- !select101_4 --
+3472
+
+-- !select102_0 --
+3103
+
+-- !select102_1 --
+3103
+
+-- !select102_2 --
+3103
+
+-- !select102_3 --
+3103
+
+-- !select102_4 --
+3103
+
+-- !select102_5 --
+3103
+
+-- !select102_6 --
+3103
+
+-- !select103_0 --
+3103
+
+-- !select103_1 --
+3103
+
+-- !select103_2 --
+3103
+
+-- !select103_3 --
+3103
+
+-- !select103_4 --
+3103
+
+-- !select103_5 --
+3103
+
+-- !select103_6 --
+3103
+
+-- !select104_0 --
+3103
+
+-- !select104_1 --
+3103
+
+-- !select104_2 --
+3103
+
+-- !select104_3 --
+3103
+
+-- !select104_4 --
+3103
+
+-- !select104_5 --
+3103
+
+-- !select104_6 --
+3103
+
+-- !select105_0 --
+3103
+
+-- !select105_1 --
+3103
+
+-- !select105_2 --
+3103
+
+-- !select105_3 --
+3103
+
+-- !select105_4 --
+3103
+
+-- !select105_5 --
+3103
+
+-- !select105_6 --
+3103
+
+-- !select105_7 --
+3103
+
+-- !select105_8 --
+3103
+
+-- !select105_9 --
+3103
+
+-- !select106_0 --
+3103
+
+-- !select106_1 --
+3103
+
+-- !select106_2 --
+3103
+
+-- !select106_3 --
+3103
+
+-- !select106_4 --
+3103
+
+-- !select106_5 --
+3103
+
+-- !select106_6 --
+3103
+
+-- !select106_7 --
+3103
+
+-- !select106_8 --
+3103
+
+-- !select106_9 --
+3103
+
+-- !select107_0 --
+3103
+
+-- !select107_1 --
+3103
+
+-- !select107_2 --
+3103
+
+-- !select107_3 --
+3103
+
+-- !select107_4 --
+3103
+
+-- !select107_5 --
+3103
+
+-- !select107_6 --
+3103
+
+-- !select107_7 --
+3103
+
+-- !select107_8 --
+3103
+
+-- !select107_9 --
+3103
+
diff --git a/regression-test/suites/nereids_p0/hint/fix_leading.groovy
b/regression-test/suites/nereids_p0/hint/fix_leading.groovy
index b57cb5cc59a..80d8fb72220 100644
--- a/regression-test/suites/nereids_p0/hint/fix_leading.groovy
+++ b/regression-test/suites/nereids_p0/hint/fix_leading.groovy
@@ -26,6 +26,9 @@ suite("fix_leading") {
// setting planner to nereids
sql 'set enable_nereids_planner=true'
sql 'set enable_fallback_to_original_planner=false'
+ sql 'set runtime_filter_mode=OFF'
+ sql "set ignore_shape_nodes='PhysicalProject'"
+
// create tables
sql """drop table if exists t1;"""
@@ -37,6 +40,8 @@ suite("fix_leading") {
sql """create table t2 (c2 int, c22 int) distributed by hash(c2) buckets 3
properties('replication_num' = '1');"""
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');"""
+ sql """create table t5 (c5 int, c55 int) distributed by hash(c5) buckets 3
properties('replication_num' = '1');"""
+ sql """create table t6 (c6 int, c66 int) distributed by hash(c6) buckets 3
properties('replication_num' = '1');"""
streamLoad {
table "t1"
@@ -187,7 +192,13 @@ suite("fix_leading") {
qt_select4_3 """explain shape plan select /*+ leading(t1 t2 t3)*/ count(*)
from t1 left join t2 on c1 > 500 and c2 >500 right join t3 on c3 > 500 and c1 <
200;"""
// check whether we have all tables
- qt_select5_1 """explain shape plan select /*+ leading(t1 t2)*/ count(*)
from t1 left join t2 on c1 > 500 and c2 >500 right join t3 on c3 > 500 and c1 <
200;"""
+ explain {
+ sql """shape plan select /*+ leading(t1 t2)*/ count(*) from t1 left
join t2 on c1 > 500 and c2 >500 right join t3 on c3 > 500 and c1 < 200;"""
+ contains("SyntaxError: leading(t1 t2) Msg:leading should have all
tables in query block, missing tables: t3")
+ }
+
+ // check brace problem
+ qt_select6_1 """explain shape plan select /*+ leading(t1 {{t2 t3}{t4 t5}}
t6) */ count(*) from t1 join t2 on c1 = c2 join t3 on c1 = c3 join t4 on c1 =
c4 join t5 on c1 = c5 join t6 on c1 = c6;"""
// check brace problem
qt_select6_1 """explain shape plan select /*+ leading(t1 {{t2 t3}{t4 t5}}
t6) */ count(*) from t1 join t2 on c1 = c2 join t3 on c1 = c3 join t4 on c1 =
c4 join t5 on c1 = c5 join t6 on c1 = c6;"""
diff --git a/regression-test/suites/nereids_p0/hint/test_leading.groovy
b/regression-test/suites/nereids_p0/hint/test_leading.groovy
index e2227cc357f..8f0ecbc014b 100644
--- a/regression-test/suites/nereids_p0/hint/test_leading.groovy
+++ b/regression-test/suites/nereids_p0/hint/test_leading.groovy
@@ -25,6 +25,7 @@ suite("test_leading") {
// setting planner to nereids
sql 'set enable_nereids_planner=true'
+ sql "set ignore_shape_nodes='PhysicalProject'"
sql 'set enable_fallback_to_original_planner=false'
// create tables
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]