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: 谢健 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]