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