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 5fb8bfcb270 [fix](Nereids): fill miss slot in having subquery (#27177) 
(#27394)
5fb8bfcb270 is described below

commit 5fb8bfcb2705b955f2660a2d3eeb6557078a41a8
Author: 谢健 <jianx...@gmail.com>
AuthorDate: Thu Nov 23 17:00:49 2023 +0800

    [fix](Nereids): fill miss slot in having subquery (#27177) (#27394)
---
 .../doris/nereids/rules/analysis/SubqueryToApply.java   | 17 ++++++++++++-----
 .../doris/nereids/trees/expressions/InSubquery.java     |  6 ++++++
 .../suites/nereids_p0/subquery/test_subquery.groovy     |  7 +++++++
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubqueryToApply.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubqueryToApply.java
index 2852db11089..1b2f7c898bb 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubqueryToApply.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubqueryToApply.java
@@ -21,11 +21,13 @@ import org.apache.doris.nereids.CascadesContext;
 import org.apache.doris.nereids.StatementContext;
 import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
+import org.apache.doris.nereids.trees.TreeNode;
 import org.apache.doris.nereids.trees.expressions.Alias;
 import org.apache.doris.nereids.trees.expressions.BinaryOperator;
 import org.apache.doris.nereids.trees.expressions.Exists;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.InSubquery;
+import org.apache.doris.nereids.trees.expressions.ListQuery;
 import org.apache.doris.nereids.trees.expressions.MarkJoinSlotReference;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Or;
@@ -73,7 +75,7 @@ public class SubqueryToApply implements AnalysisRuleFactory {
                     LogicalFilter<Plan> filter = ctx.root;
 
                     ImmutableList<Set<SubqueryExpr>> subqueryExprsList = 
filter.getConjuncts().stream()
-                            .<Set<SubqueryExpr>>map(e -> 
e.collect(SubqueryExpr.class::isInstance))
+                            .<Set<SubqueryExpr>>map(e -> 
e.collect(SubqueryToApply::canConvertToSupply))
                             .collect(ImmutableList.toImmutableList());
                     if (subqueryExprsList.stream()
                             
.flatMap(Collection::stream).noneMatch(SubqueryExpr.class::isInstance)) {
@@ -122,7 +124,7 @@ public class SubqueryToApply implements AnalysisRuleFactory 
{
             
RuleType.PROJECT_SUBQUERY_TO_APPLY.build(logicalProject().thenApply(ctx -> {
                 LogicalProject<Plan> project = ctx.root;
                 ImmutableList<Set<SubqueryExpr>> subqueryExprsList = 
project.getProjects().stream()
-                        .<Set<SubqueryExpr>>map(e -> 
e.collect(SubqueryExpr.class::isInstance))
+                        .<Set<SubqueryExpr>>map(e -> 
e.collect(SubqueryToApply::canConvertToSupply))
                         .collect(ImmutableList.toImmutableList());
                 if 
(subqueryExprsList.stream().flatMap(Collection::stream).count() == 0) {
                     return project;
@@ -191,7 +193,7 @@ public class SubqueryToApply implements AnalysisRuleFactory 
{
                     }
 
                     ImmutableList<Set<SubqueryExpr>> subqueryExprsList = 
subqueryConjuncts.stream()
-                            .<Set<SubqueryExpr>>map(e -> 
e.collect(SubqueryExpr.class::isInstance))
+                            .<Set<SubqueryExpr>>map(e -> 
e.collect(SubqueryToApply::canConvertToSupply))
                             .collect(ImmutableList.toImmutableList());
                     ImmutableList.Builder<Expression> newConjuncts = new 
ImmutableList.Builder<>();
                     LogicalPlan applyPlan;
@@ -238,7 +240,7 @@ public class SubqueryToApply implements AnalysisRuleFactory 
{
     private static boolean isValidSubqueryConjunct(Expression expression) {
         // only support 1 subquery expr in the expression
         // don't support expression like subquery1 or subquery2
-        return expression.collectToList(SubqueryExpr.class::isInstance).size() 
== 1;
+        return 
expression.collectToList(SubqueryToApply::canConvertToSupply).size() == 1;
     }
 
     private enum RelatedInfo {
@@ -264,7 +266,7 @@ public class SubqueryToApply implements AnalysisRuleFactory 
{
         Set<Slot> rightOutputSlots = rightChild.getOutputSet();
         for (int i = 0; i < size; ++i) {
             Expression expression = subqueryConjuncts.get(i);
-            List<SubqueryExpr> subqueryExprs = 
expression.collectToList(SubqueryExpr.class::isInstance);
+            List<SubqueryExpr> subqueryExprs = 
expression.collectToList(SubqueryToApply::canConvertToSupply);
             RelatedInfo relatedInfo = RelatedInfo.UnSupported;
             if (subqueryExprs.size() == 1) {
                 SubqueryExpr subqueryExpr = subqueryExprs.get(0);
@@ -307,6 +309,11 @@ public class SubqueryToApply implements 
AnalysisRuleFactory {
         return correlatedInfoList.build();
     }
 
+    private static boolean canConvertToSupply(TreeNode<Expression> expression) 
{
+        // The subquery except ListQuery can be converted to Supply
+        return expression instanceof SubqueryExpr && !(expression instanceof 
ListQuery);
+    }
+
     private LogicalPlan subqueryToApply(List<SubqueryExpr> subqueryExprs, 
LogicalPlan childPlan,
                                         Map<SubqueryExpr, 
Optional<MarkJoinSlotReference>> subqueryToMarkJoinSlot,
                                         CascadesContext ctx,
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/InSubquery.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/InSubquery.java
index 8f9732a2f71..e04d1b2017a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/InSubquery.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/InSubquery.java
@@ -23,6 +23,7 @@ import org.apache.doris.nereids.types.BooleanType;
 import org.apache.doris.nereids.types.DataType;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
 
 import java.util.List;
 import java.util.Objects;
@@ -107,6 +108,11 @@ public class InSubquery extends SubqueryExpr {
         return new InSubquery(children.get(0), (ListQuery) children.get(1), 
isNot);
     }
 
+    @Override
+    public List<Expression> children() {
+        return Lists.newArrayList(compareExpr, listQuery);
+    }
+
     @Override
     public boolean equals(Object o) {
         if (!super.equals(o)) {
diff --git a/regression-test/suites/nereids_p0/subquery/test_subquery.groovy 
b/regression-test/suites/nereids_p0/subquery/test_subquery.groovy
index 01e347031f8..c522adf43e1 100644
--- a/regression-test/suites/nereids_p0/subquery/test_subquery.groovy
+++ b/regression-test/suites/nereids_p0/subquery/test_subquery.groovy
@@ -52,6 +52,13 @@ suite("test_subquery") {
         select * from nereids_test_query_db.baseall where k1 = (select k1 from 
nereids_test_query_db.baseall limit 1)
     """
 
+    // test uncorrelated subquery in having
+    sql """
+        select count(*) from nereids_test_query_db.baseall
+        group by k0 
+        having min(k0) in (select k0 from nereids_test_query_db.baseall)
+    """
+
     // test uncorrelated scalar subquery with more than one return rows
     test {
         sql """


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to