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]

Reply via email to