This is an automated email from the ASF dual-hosted git repository.
kxiao 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 e6f71c842fd [Fix](Nereids) fix leading syntax problems and data
mismatched problem (#32286) (#32382)
e6f71c842fd is described below
commit e6f71c842fd1608debf8d16b38887b2c36d1ddd9
Author: LiBinfeng <[email protected]>
AuthorDate: Tue Mar 19 20:40:24 2024 +0800
[Fix](Nereids) fix leading syntax problems and data mismatched problem
(#32286) (#32382)
---
.../java/org/apache/doris/nereids/hint/LeadingHint.java | 5 +++++
.../nereids/rules/analysis/CollectJoinConstraint.java | 12 +++++++++---
.../rules/analysis/EliminateLogicalSelectHint.java | 12 +++++++++++-
regression-test/data/nereids_p0/hint/fix_leading.out | 17 +++++++++++++++++
.../suites/nereids_p0/hint/fix_leading.groovy | 16 ++++++++++++++++
5 files changed, 58 insertions(+), 4 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 4d1abbbf951..39c1eab1383 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
@@ -494,6 +494,11 @@ public class LeadingHint extends Hint {
stackTopLevel = currentLevel;
}
}
+ if (stack.size() > 1) {
+ this.setStatus(HintStatus.SYNTAX_ERROR);
+ this.setErrorMessage("please check your brace pairs in leading");
+ return null;
+ }
LogicalJoin finalJoin = (LogicalJoin) stack.pop().second;
// we want all filters been remove
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 48d3ef0bfea..eaab0e3e11f 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
@@ -58,6 +58,9 @@ public class CollectJoinConstraint implements
RewriteRuleFactory {
leading.setStatus(Hint.HintStatus.UNUSED);
leading.setErrorMessage("condition does not matched
joinType");
}
+ Long leftHand =
LongBitmap.computeTableBitmap(join.left().getInputRelations());
+ Long rightHand =
LongBitmap.computeTableBitmap(join.right().getInputRelations());
+ join.setBitmap(LongBitmap.or(leftHand, rightHand));
List<Expression> expressions = join.getHashJoinConjuncts();
Long totalFilterBitMap = 0L;
Long nonNullableSlotBitMap = 0L;
@@ -66,6 +69,9 @@ public class CollectJoinConstraint implements
RewriteRuleFactory {
nonNullableSlotBitMap =
LongBitmap.or(nonNullableSlotBitMap, nonNullable);
Long filterBitMap = calSlotsTableBitMap(leading,
expression.getInputSlots(), false);
totalFilterBitMap = LongBitmap.or(totalFilterBitMap,
filterBitMap);
+ if (join.getJoinType().isLeftJoin()) {
+ filterBitMap = LongBitmap.or(filterBitMap, rightHand);
+ }
leading.getFilters().add(Pair.of(filterBitMap,
expression));
leading.putConditionJoinType(expression,
join.getJoinType());
}
@@ -75,12 +81,12 @@ public class CollectJoinConstraint implements
RewriteRuleFactory {
nonNullableSlotBitMap =
LongBitmap.or(nonNullableSlotBitMap, nonNullable);
Long filterBitMap = calSlotsTableBitMap(leading,
expression.getInputSlots(), false);
totalFilterBitMap = LongBitmap.or(totalFilterBitMap,
filterBitMap);
+ if (join.getJoinType().isLeftJoin()) {
+ filterBitMap = LongBitmap.or(filterBitMap, rightHand);
+ }
leading.getFilters().add(Pair.of(filterBitMap,
expression));
leading.putConditionJoinType(expression,
join.getJoinType());
}
- Long leftHand =
LongBitmap.computeTableBitmap(join.left().getInputRelations());
- Long rightHand =
LongBitmap.computeTableBitmap(join.right().getInputRelations());
- join.setBitmap(LongBitmap.or(leftHand, rightHand));
collectJoinConstraintList(leading, leftHand, rightHand, join,
totalFilterBitMap, nonNullableSlotBitMap);
return ctx.root;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/EliminateLogicalSelectHint.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/EliminateLogicalSelectHint.java
index 73bb42ccf0c..06d85e660b0 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/EliminateLogicalSelectHint.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/EliminateLogicalSelectHint.java
@@ -121,9 +121,19 @@ public class EliminateLogicalSelectHint extends
OneRewriteRuleFactory {
context.setLeadingJoin(false);
return;
}
- hint.setStatus(Hint.HintStatus.SUCCESS);
statementContext.addHint(hint);
context.getHintMap().put("Leading", hint);
+ if (hint.getTablelist().size() < 2) {
+ hint.setStatus(Hint.HintStatus.SYNTAX_ERROR);
+
context.getHintMap().get("Leading").setStatus(Hint.HintStatus.UNUSED);
+ hint.setErrorMessage("less than two tables is not allowed in
leading clause");
+ statementContext.addHint(hint);
+ context.setLeadingJoin(false);
+ return;
+ }
+ if (!hint.isSyntaxError()) {
+ hint.setStatus(Hint.HintStatus.SUCCESS);
+ }
if (hints.get("ordered") != null ||
ConnectContext.get().getSessionVariable().isDisableJoinReorder()) {
context.setLeadingJoin(false);
hint.setStatus(Hint.HintStatus.UNUSED);
diff --git a/regression-test/data/nereids_p0/hint/fix_leading.out
b/regression-test/data/nereids_p0/hint/fix_leading.out
index 4eb83a9abd4..95e8befe6d9 100644
--- a/regression-test/data/nereids_p0/hint/fix_leading.out
+++ b/regression-test/data/nereids_p0/hint/fix_leading.out
@@ -209,3 +209,20 @@ SyntaxError:
-- !select2_5_13 --
816000
+-- !select3_1 --
+1719
+
+-- !select3_2 --
+1719
+
+-- !select3_3 --
+1719
+
+-- !select3_4 --
+5169
+
+-- !select4_1 --
+1000
+
+-- !select4_2 --
+1000
diff --git a/regression-test/suites/nereids_p0/hint/fix_leading.groovy
b/regression-test/suites/nereids_p0/hint/fix_leading.groovy
index 782bfc34647..583a21d8700 100644
--- a/regression-test/suites/nereids_p0/hint/fix_leading.groovy
+++ b/regression-test/suites/nereids_p0/hint/fix_leading.groovy
@@ -150,4 +150,20 @@ suite("fix_leading") {
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;"""
+
+ // check only one table used in leading
+ qt_select3_1 """select /*+ leading(t1) */ count(*) from t1 join t2 on c1 =
c2;"""
+
+ // check only one table used in leading and add brace
+ qt_select3_2 """select /*+ leading({t1}) */ count(*) from t1 join t2 on c1
= c2;"""
+
+ // check mistake usage of brace
+ qt_select3_3 """select /*+ leading(t1 {t2}) */ count(*) from t1 join t2 on
c1 = c2;"""
+
+ // check using subquery alias to cte in cte query
+ qt_select3_4 """with cte as (select c1 from t1) select count(*) from t1
join (select /*+ leading(cte t2) */ c2 from t2 join cte on c2 = cte.c1) as
alias on t1.c1 = alias.c2;"""
+
+ // check left right join result
+ qt_select4_1 """select count(*) from t1 left join t2 on c1 > 500 and c2
>500 right join t3 on c3 > 500 and c1 < 200;"""
+ qt_select4_2 """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;"""
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]