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 dd2c696490f [fix](nereids)FillUpMissingSlots rule didn't process 
standalone having clause correctly #29143 (#29317)
dd2c696490f is described below

commit dd2c696490fc9d8a6d587fcaa49a5cdedf8e1471
Author: starocean999 <[email protected]>
AuthorDate: Fri Dec 29 22:02:18 2023 +0800

    [fix](nereids)FillUpMissingSlots rule didn't process standalone having 
clause correctly #29143 (#29317)
---
 .../nereids/rules/analysis/FillUpMissingSlots.java | 18 ++++++++++++++++
 .../doris/nereids/rules/rewrite/ReorderJoin.java   | 25 +++++++++-------------
 .../suites/nereids_syntax_p0/having.groovy         |  8 +++++++
 3 files changed, 36 insertions(+), 15 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/FillUpMissingSlots.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/FillUpMissingSlots.java
index afee320f6f5..127003f8f67 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/FillUpMissingSlots.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/FillUpMissingSlots.java
@@ -156,6 +156,24 @@ public class FillUpMissingSlots implements 
AnalysisRuleFactory {
                     });
                 })
             ),
+            RuleType.FILL_UP_HAVING_PROJECT.build(
+                    logicalHaving(logicalProject()).then(having -> {
+                        LogicalProject<Plan> project = having.child();
+                        Set<Slot> projectOutputSet = project.getOutputSet();
+                        Set<Slot> notExistedInProject = 
having.getExpressions().stream()
+                                .map(Expression::getInputSlots)
+                                .flatMap(Set::stream)
+                                .filter(s -> !projectOutputSet.contains(s))
+                                .collect(Collectors.toSet());
+                        if (notExistedInProject.size() == 0) {
+                            return null;
+                        }
+                        List<NamedExpression> projects = 
ImmutableList.<NamedExpression>builder()
+                                
.addAll(project.getProjects()).addAll(notExistedInProject).build();
+                        return new 
LogicalProject<>(ImmutableList.copyOf(project.getOutput()),
+                                having.withChildren(new 
LogicalProject<>(projects, project.child())));
+                    })
+            ),
             // Convert having to filter
             RuleType.FILL_UP_HAVING_PROJECT.build(
                 logicalHaving().then(having -> new 
LogicalFilter<>(having.getConjuncts(), having.child()))
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java
index a9e685b1c89..9a5c7d833c6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java
@@ -328,10 +328,12 @@ public class ReorderJoin extends OneRewriteRuleFactory {
             Set<Expression> joinFilter, Set<Integer> usedPlansIndex, Map<Plan, 
JoinHintType> planToHintType) {
         List<Expression> otherJoinConditions = Lists.newArrayList();
         Set<ExprId> leftOutputExprIdSet = left.getOutputExprIdSet();
+        int candidateIndex = 0;
         for (int i = 0; i < candidates.size(); i++) {
             if (usedPlansIndex.contains(i)) {
                 continue;
             }
+            candidateIndex = i;
 
             Plan candidate = candidates.get(i);
             Set<ExprId> rightOutputExprIdSet = candidate.getOutputExprIdSet();
@@ -361,21 +363,14 @@ public class ReorderJoin extends OneRewriteRuleFactory {
         }
         // All { left -> one in [candidates] } is CrossJoin
         // Generate a CrossJoin
-        for (int i = 0; i < candidates.size(); i++) {
-            if (usedPlansIndex.contains(i)) {
-                continue;
-            }
-            usedPlansIndex.add(i);
-            Plan right = candidates.get(i);
-            return new LogicalJoin<>(JoinType.CROSS_JOIN,
-                    ExpressionUtils.EMPTY_CONDITION,
-                    otherJoinConditions,
-                    
JoinHint.fromRightPlanHintType(planToHintType.getOrDefault(right, 
JoinHintType.NONE)),
-                    Optional.empty(),
-                    left, right);
-        }
-
-        throw new RuntimeException("findInnerJoin: can't reach here");
+        usedPlansIndex.add(candidateIndex);
+        Plan right = candidates.get(candidateIndex);
+        return new LogicalJoin<>(JoinType.CROSS_JOIN,
+                ExpressionUtils.EMPTY_CONDITION,
+                otherJoinConditions,
+                
JoinHint.fromRightPlanHintType(planToHintType.getOrDefault(right, 
JoinHintType.NONE)),
+                Optional.empty(),
+                left, right);
     }
 
     private boolean nonJoinAndNonFilter(Plan plan) {
diff --git a/regression-test/suites/nereids_syntax_p0/having.groovy 
b/regression-test/suites/nereids_syntax_p0/having.groovy
index a9a4b3ae253..0caa0c9a78d 100644
--- a/regression-test/suites/nereids_syntax_p0/having.groovy
+++ b/regression-test/suites/nereids_syntax_p0/having.groovy
@@ -68,4 +68,12 @@ suite("test_nereids_having") {
     order_qt_select "SELECT SUM(a1 + a2) FROM test_nereids_having_tbl HAVING 
SUM(a1 + a2) > 0";
     order_qt_select "SELECT SUM(a1 + a2) FROM test_nereids_having_tbl HAVING 
SUM(a1 + a2 + 3) > 0";
     order_qt_select "SELECT COUNT(*) FROM test_nereids_having_tbl HAVING 
COUNT(*) > 0";
+    sql """SELECT alias2.`pk` AS field4
+                        FROM 
+                            (SELECT pk
+                            FROM test_nereids_having_tbl AS SQ1_alias1 ) AS 
alias2
+                        HAVING alias2.`pk` <> 
+                            (SELECT *
+                            FROM 
+                                (SELECT "xAbfcUSAOy") __DORIS_DUAL__ );"""
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to