This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new dc7e5ca039 [fix](nereids) uncorrelated subquery can't get the correct 
result (#12421)
dc7e5ca039 is described below

commit dc7e5ca039548c037d400c5caea3ad89d3ed2e5a
Author: zhengshiJ <32082872+zhengs...@users.noreply.github.com>
AuthorDate: Fri Sep 9 18:08:34 2022 +0800

    [fix](nereids) uncorrelated subquery can't get the correct result (#12421)
    
    When the current non-correlated subquery is executed, an error will be 
reported that the corresponding column cannot be found.
    The reason is that the tupleID of the child obtained in 
visitPhysicalNestedLoopJoin is not consistent with the child.
    
    The non-correlated subquery will trigger this bug because it uses crossJoin.
    At the same time, sub-query regression tests for non-associative and 
complex scenarios have been added
    
    Co-authored-by: morrySnow <morrys...@126.com>
---
 .../glue/translator/PhysicalPlanTranslator.java    |  28 +++---
 .../glue/translator/PlanTranslatorContext.java     |  15 ++-
 .../rules/rewrite/logical/InApplyToJoin.java       |   7 +-
 .../rules/rewrite/logical/ScalarApplyToJoin.java   |   8 +-
 .../trees/expressions/AssertNumRowsElement.java    |   5 +-
 .../trees/plans/logical/LogicalAssertNumRows.java  |   4 +-
 .../apache/doris/planner/AssertNumRowsNode.java    |   6 +-
 .../org/apache/doris/planner/CrossJoinNode.java    |  19 ++++
 .../nereids_syntax_p0/sub_query_correlated.out     | 107 +++++++++++++++++++--
 .../nereids_syntax_p0/sub_query_correlated.groovy  |  97 ++++++++++---------
 10 files changed, 205 insertions(+), 91 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index fea1194fba..7219a435a5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -90,6 +90,7 @@ import com.google.common.collect.Sets;
 import org.apache.commons.collections.CollectionUtils;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -463,18 +464,16 @@ public class PhysicalPlanTranslator extends 
DefaultPlanVisitor<PlanFragment, Pla
         // but BE need left child's output must be before right child's output.
         // So we need to swap the output order of left and right child if 
necessary.
         // TODO: revert this after Nereids could ensure the output order is 
correct.
-        TupleDescriptor leftChildOutputTupleDesc = 
leftPlanRoot.getOutputTupleDesc();
-        TupleDescriptor leftTuple =
-                leftChildOutputTupleDesc != null ? leftChildOutputTupleDesc : 
context.getTupleDesc(leftPlanRoot);
-        TupleDescriptor rightChildOutputTupleDesc = 
rightPlanRoot.getOutputTupleDesc();
-        TupleDescriptor rightTuple =
-                rightChildOutputTupleDesc != null ? rightChildOutputTupleDesc 
: context.getTupleDesc(rightPlanRoot);
+        List<TupleDescriptor> leftTuples = context.getTupleDesc(leftPlanRoot);
+        List<TupleDescriptor> rightTuples = 
context.getTupleDesc(rightPlanRoot);
         TupleDescriptor outputDescriptor = context.generateTupleDesc();
         Map<ExprId, SlotReference> slotReferenceMap = Maps.newHashMap();
         hashJoin.getOutput().stream()
                 .map(SlotReference.class::cast)
                 .forEach(s -> slotReferenceMap.put(s.getExprId(), s));
-        List<Expr> srcToOutput = Stream.concat(leftTuple.getSlots().stream(), 
rightTuple.getSlots().stream())
+        List<Expr> srcToOutput = Stream.concat(leftTuples.stream(), 
rightTuples.stream())
+                .map(TupleDescriptor::getSlots)
+                .flatMap(Collection::stream)
                 .map(sd -> context.findExprId(sd.getId()))
                 .map(slotReferenceMap::get)
                 .filter(Objects::nonNull)
@@ -512,12 +511,19 @@ public class PhysicalPlanTranslator extends 
DefaultPlanVisitor<PlanFragment, Pla
         PlanNode leftFragmentPlanRoot = leftFragment.getPlanRoot();
         PlanNode rightFragmentPlanRoot = rightFragment.getPlanRoot();
         if (JoinUtils.shouldNestedLoopJoin(nestedLoopJoin)) {
-            CrossJoinNode crossJoinNode =
-                    new CrossJoinNode(context.nextPlanNodeId(), 
leftFragmentPlanRoot, rightFragmentPlanRoot, null);
+            List<TupleDescriptor> leftTuples = 
context.getTupleDesc(leftFragmentPlanRoot);
+            List<TupleDescriptor> rightTuples = 
context.getTupleDesc(rightFragmentPlanRoot);
+            List<TupleId> tupleIds = Stream.concat(leftTuples.stream(), 
rightTuples.stream())
+                    .map(TupleDescriptor::getId)
+                    .collect(Collectors.toList());
+
+            CrossJoinNode crossJoinNode = new 
CrossJoinNode(context.nextPlanNodeId(),
+                    leftFragmentPlanRoot, rightFragmentPlanRoot, tupleIds);
             rightFragment.getPlanRoot().setCompactData(false);
             crossJoinNode.setChild(0, leftFragment.getPlanRoot());
             connectChildFragment(crossJoinNode, 1, leftFragment, 
rightFragment, context);
             leftFragment.setPlanRoot(crossJoinNode);
+
             return leftFragment;
         } else {
             throw new RuntimeException("Physical nested loop join could not 
execute with equal join condition.");
@@ -650,9 +656,9 @@ public class PhysicalPlanTranslator extends 
DefaultPlanVisitor<PlanFragment, Pla
             PlanTranslatorContext context) {
         PlanFragment inputFragment = assertNumRows.child(0).accept(this, 
context);
         //create assertNode
-        PlanNode child = inputFragment.getPlanRoot();
         AssertNumRowsNode assertNumRowsNode = new 
AssertNumRowsNode(context.nextPlanNodeId(),
-                child, 
ExpressionTranslator.translateAssert(assertNumRows.getAssertNumRowsElement()));
+                inputFragment.getPlanRoot(),
+                
ExpressionTranslator.translateAssert(assertNumRows.getAssertNumRowsElement()));
         PlanFragment mergeFragment = createParentFragment(inputFragment, 
DataPartition.UNPARTITIONED, context);
         mergeFragment.addPlanRoot(assertNumRowsNode);
         return mergeFragment;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
index 24b21d5f0d..a3f442640e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
@@ -39,6 +39,7 @@ import com.google.common.collect.Maps;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * Context of physical plan.
@@ -132,15 +133,11 @@ public class PlanTranslatorContext {
         return slotDescriptor;
     }
 
-    /**
-     * in Nereids, all node only has one TupleDescriptor, so we can use the 
first one.
-     *
-     * @param planNode the node to get the TupleDescriptor
-     *
-     * @return plan node's tuple descriptor
-     */
-    public TupleDescriptor getTupleDesc(PlanNode planNode) {
-        return descTable.getTupleDesc(planNode.getOutputTupleIds().get(0));
+    public List<TupleDescriptor> getTupleDesc(PlanNode planNode) {
+        if (planNode.getOutputTupleDesc() != null) {
+            return Lists.newArrayList(planNode.getOutputTupleDesc());
+        }
+        return 
planNode.getOutputTupleIds().stream().map(this::getTupleDesc).collect(Collectors.toList());
     }
 
     public TupleDescriptor getTupleDesc(TupleId tupleId) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InApplyToJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InApplyToJoin.java
index baf459c983..6a354d0b4b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InApplyToJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InApplyToJoin.java
@@ -26,7 +26,6 @@ import org.apache.doris.nereids.trees.expressions.InSubquery;
 import org.apache.doris.nereids.trees.plans.JoinType;
 import org.apache.doris.nereids.trees.plans.logical.LogicalApply;
 import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
-import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.collect.Lists;
@@ -54,15 +53,13 @@ public class InApplyToJoin extends OneRewriteRuleFactory {
                         apply.right().getOutput().get(0));
             }
 
-            LogicalJoin newJoin;
             if (((InSubquery) apply.getSubqueryExpr()).isNot()) {
-                newJoin = new LogicalJoin<>(JoinType.LEFT_ANTI_JOIN, 
Lists.newArrayList(), Optional.of(predicate),
+                return new LogicalJoin<>(JoinType.LEFT_ANTI_JOIN, 
Lists.newArrayList(), Optional.of(predicate),
                         apply.left(), apply.right());
             } else {
-                newJoin = new LogicalJoin<>(JoinType.LEFT_SEMI_JOIN, 
Lists.newArrayList(), Optional.of(predicate),
+                return new LogicalJoin<>(JoinType.LEFT_SEMI_JOIN, 
Lists.newArrayList(), Optional.of(predicate),
                         apply.left(), apply.right());
             }
-            return new LogicalProject(apply.left().getOutput(), newJoin);
         }).toRule(RuleType.IN_APPLY_TO_JOIN);
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ScalarApplyToJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ScalarApplyToJoin.java
index 944f9c89a8..775628cc7b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ScalarApplyToJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/ScalarApplyToJoin.java
@@ -21,19 +21,15 @@ import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.rules.rewrite.OneRewriteRuleFactory;
 import org.apache.doris.nereids.trees.expressions.AssertNumRowsElement;
-import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.plans.JoinType;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalApply;
 import org.apache.doris.nereids.trees.plans.logical.LogicalAssertNumRows;
 import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
 import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
-import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 
 import com.google.common.collect.Lists;
 
-import java.util.List;
-
 /**
  * Convert scalarApply to LogicalJoin.
  *
@@ -58,10 +54,8 @@ public class ScalarApplyToJoin extends OneRewriteRuleFactory 
{
                         1, apply.getSubqueryExpr().toString(),
                         AssertNumRowsElement.Assertion.EQ),
                 (LogicalPlan) apply.right());
-        LogicalJoin newJoin = new LogicalJoin<>(JoinType.CROSS_JOIN,
+        return new LogicalJoin<>(JoinType.CROSS_JOIN,
                 (LogicalPlan) apply.left(), assertNumRows);
-        List<Slot> projects = ((LogicalPlan) apply.left()).getOutput();
-        return new LogicalProject(projects, newJoin);
     }
 
     private Plan correlatedToJoin(LogicalApply apply) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AssertNumRowsElement.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AssertNumRowsElement.java
index 60ae3a2e35..391d5fdbae 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AssertNumRowsElement.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AssertNumRowsElement.java
@@ -73,9 +73,10 @@ public class AssertNumRowsElement extends Expression 
implements LeafExpression {
 
     @Override
     public String toString() {
-        return Utils.toSqlString("desiredNumOfRows: ",
+        return Utils.toSqlString("AssertNumRowsElement",
+                "desiredNumOfRows: ",
                 Long.toString(desiredNumOfRows),
-                "assertion: " + assertion);
+                "assertion: ", assertion);
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAssertNumRows.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAssertNumRows.java
index f4063eba53..ebeaad9748 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAssertNumRows.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAssertNumRows.java
@@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -59,7 +60,8 @@ public class LogicalAssertNumRows<CHILD_TYPE extends Plan> 
extends LogicalUnary<
 
     @Override
     public String toString() {
-        return "LogicalAssertNumRows (" + assertNumRowsElement + ")";
+        return Utils.toSqlString("LogicalAssertNumRows",
+                "assertNumRowsElement", assertNumRowsElement);
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java
index 969995e4b5..251cc48225 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java
@@ -49,7 +49,11 @@ public class AssertNumRowsNode extends PlanNode {
         this.subqueryString = assertNumRowsElement.getSubqueryString();
         this.assertion = assertNumRowsElement.getAssertion();
         this.children.add(input);
-        this.tupleIds.addAll(input.getTupleIds());
+        if (input.getOutputTupleDesc() != null) {
+            this.tupleIds.add(input.getOutputTupleDesc().getId());
+        } else {
+            this.tupleIds.addAll(input.getTupleIds());
+        }
         this.tblRefIds.addAll(input.getTblRefIds());
         this.nullableTupleIds.addAll(input.getNullableTupleIds());
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/CrossJoinNode.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/CrossJoinNode.java
index ac8554c662..2e06155698 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/CrossJoinNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/CrossJoinNode.java
@@ -19,6 +19,7 @@ package org.apache.doris.planner;
 
 import org.apache.doris.analysis.Analyzer;
 import org.apache.doris.analysis.TableRef;
+import org.apache.doris.analysis.TupleId;
 import org.apache.doris.common.UserException;
 import org.apache.doris.statistics.StatisticalType;
 import org.apache.doris.statistics.StatsRecursiveDerive;
@@ -30,6 +31,8 @@ import com.google.common.base.MoreObjects;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+import java.util.List;
+
 /**
  * Cross join between left child and right child.
  */
@@ -57,6 +60,22 @@ public class CrossJoinNode extends PlanNode {
         nullableTupleIds.addAll(inner.getNullableTupleIds());
     }
 
+    /**
+     * Only for Nereids.
+     */
+    public CrossJoinNode(PlanNodeId id, PlanNode outer, PlanNode inner, 
List<TupleId> tupleIds) {
+        super(id, "CROSS JOIN", StatisticalType.CROSS_JOIN_NODE);
+        this.innerRef = null;
+        this.tupleIds.addAll(tupleIds);
+        children.add(outer);
+        children.add(inner);
+
+        // Inherits all the nullable tuple from the children
+        // Mark tuples that form the "nullable" side of the outer join as 
nullable.
+        nullableTupleIds.addAll(outer.getNullableTupleIds());
+        nullableTupleIds.addAll(inner.getNullableTupleIds());
+    }
+
     public TableRef getInnerRef() {
         return innerRef;
     }
diff --git a/regression-test/data/nereids_syntax_p0/sub_query_correlated.out 
b/regression-test/data/nereids_syntax_p0/sub_query_correlated.out
index 9f77c5c293..fb748d2daa 100644
--- a/regression-test/data/nereids_syntax_p0/sub_query_correlated.out
+++ b/regression-test/data/nereids_syntax_p0/sub_query_correlated.out
@@ -28,28 +28,40 @@
 22     3
 24     4
 
--- !not_in_uncorr --
+-- !in_subquery_corr --
+3      3
+
+-- !not_exist_corr --
+2      5
+
+-- !exist_corr --
 1      3
 1      2
+2      4
+3      4
+3      3
 20     2
 22     3
 24     4
 
--- !in_subquery_corr --
-3      3
+-- !in_with_in_and_scalar --
 
--- !in_subquery_uncorr --
+-- !exist_and_not_exist --
+
+-- !scalar_unCorrelated --
+1      3
+1      2
 2      5
 2      4
 3      4
 3      3
 
--- !not_exist_corr --
-2      5
+-- !scalar_equal_to_uncorr --
 
--- !exist_corr --
+-- !not_scalar_unCorrelated --
 1      3
 1      2
+2      5
 2      4
 3      4
 3      3
@@ -57,9 +69,16 @@
 22     3
 24     4
 
--- !in_with_in_and_scalar --
-
--- !exist_and_not_exist --
+-- !scalar_not_equal_uncorr --
+1      3
+1      2
+2      5
+2      4
+3      4
+3      3
+20     2
+22     3
+24     4
 
 -- !in_unCorrelated --
 2      5
@@ -67,6 +86,12 @@
 3      4
 3      3
 
+-- !in_subquery_uncorr --
+2      5
+2      4
+3      4
+3      3
+
 -- !not_in_unCorrelated --
 1      3
 1      2
@@ -74,6 +99,57 @@
 22     3
 24     4
 
+-- !not_in_uncorr --
+1      3
+1      2
+20     2
+22     3
+24     4
+
+-- !exist_unCorrelated --
+1      3
+1      2
+2      5
+2      4
+3      4
+3      3
+20     2
+22     3
+24     4
+
+-- !exist_uncorr --
+1      3
+1      2
+2      5
+2      4
+3      4
+3      3
+20     2
+22     3
+24     4
+
+-- !not_exists_unCorrelated --
+1      3
+1      2
+2      5
+2      4
+3      4
+3      3
+20     2
+22     3
+24     4
+
+-- !not_exist_uncorr --
+1      3
+1      2
+2      5
+2      4
+3      4
+3      3
+20     2
+22     3
+24     4
+
 -- !alias_scalar --
 1      3
 1      2
@@ -104,3 +180,14 @@
 -- !alias_not_exist --
 2      5
 
+-- !scalar_subquery --
+
+-- !in_subquery --
+1      abc     2       3       4
+1      abcd    3       3       4
+
+-- !exist_subquery --
+2      uvw     3       4       2
+2      uvw     3       4       2
+2      xyz     2       4       2
+
diff --git 
a/regression-test/suites/nereids_syntax_p0/sub_query_correlated.groovy 
b/regression-test/suites/nereids_syntax_p0/sub_query_correlated.groovy
index 2ceff3492e..5818ffa874 100644
--- a/regression-test/suites/nereids_syntax_p0/sub_query_correlated.groovy
+++ b/regression-test/suites/nereids_syntax_p0/sub_query_correlated.groovy
@@ -89,11 +89,7 @@ suite ("sub_query_correlated") {
         insert into subquery4 values (5,4), (5,2), (8,3), (5,4), (6,7), (8,9)
     """
 
-    // The query result is not necessarily correct, because there are some 
problems in the current new optimizer,
-    // just verify that the subquery de-nesting function can support the 
following scenarios,
-    // and the out file will be updated later
-
-    // unstable
+    //------------------Correlated-----------------
     qt_scalar_less_than_corr """
         select * from subquery1 where subquery1.k1 < (select sum(subquery3.k3) 
from subquery3 where subquery3.v2 = subquery1.k2) order by k1
     """
@@ -101,54 +97,26 @@ suite ("sub_query_correlated") {
     qt_scalar_not_equal_corr """
         select * from subquery1 where subquery1.k1 != (select 
sum(subquery3.k3) from subquery3 where subquery3.v2 = subquery1.k2) order by k1
     """
-
-    //qt_scalar_not_equal_uncorr """
-    /*sql """
-        select * from subquery1 where subquery1.k1 != (select 
sum(subquery3.k3) from subquery3) order by k1
-    """*/
     
     qt_scalar_equal_to_corr """
         select * from subquery1 where subquery1.k1 = (select sum(subquery3.k3) 
from subquery3 where subquery3.v2 = subquery1.k2) order by k1
     """
-
-    //qt_scalar_equal_to_uncorr """
-    /*sql """
-        select * from subquery1 where subquery1.k1 = (select sum(subquery3.k3) 
from subquery3) order by k1
-    """*/
     
     qt_not_in_corr """
         select * from subquery1 where subquery1.k1 not in (select subquery3.k3 
from subquery3 where subquery3.v2 = subquery1.k2) order by k1
     """
-
-    qt_not_in_uncorr """
-        select * from subquery1 where subquery1.k1 not in (select subquery3.k3 
from subquery3) order by k1
-    """
     
     qt_in_subquery_corr """
         select * from subquery1 where subquery1.k1 in (select subquery3.k3 
from subquery3 where subquery3.v2 = subquery1.k2) order by k1 
     """
-
-    qt_in_subquery_uncorr """
-        select * from subquery1 where subquery1.k1 in (select subquery3.k3 
from subquery3) order by k1
-    """
     
     qt_not_exist_corr """
         select * from subquery1 where not exists (select subquery3.k3 from 
subquery3 where subquery1.k2 = subquery3.v2) order by k1
     """
 
-    //qt_not_exist_uncorr """
-    /*sql """
-        select * from subquery1 where not exists (select subquery3.k3 from 
subquery3) order by k1
-    """*/
-
     qt_exist_corr """
         select * from subquery1 where exists (select subquery3.k3 from 
subquery3 where subquery1.k2 = subquery3.v2) order by k1
     """
-
-    //qt_exist_uncorr """
-    /*sql """
-        select * from subquery1 where exists (select subquery3.k3 from 
subquery3) order by k1
-    """*/
     
     qt_in_with_in_and_scalar """
         select * from subquery1 where subquery1.k1 in (
@@ -163,33 +131,53 @@ suite ("sub_query_correlated") {
     """
 
     //------------------unCorrelated-----------------
-    //qt_scalar_unCorrelated
-    /*sql """
+    qt_scalar_unCorrelated """
         select * from subquery1 where subquery1.k1 < (select sum(subquery3.k3) 
from subquery3 where subquery3.v2 = 2) order by k1
-    """*/
+    """
 
-    //qt_not_scalar_unCorrelated
-    /*sql """
+    qt_scalar_equal_to_uncorr """
+        select * from subquery1 where subquery1.k1 = (select sum(subquery3.k3) 
from subquery3) order by k1
+    """
+
+    qt_not_scalar_unCorrelated """
         select * from subquery1 where subquery1.k1 != (select 
sum(subquery3.k3) from subquery3 where subquery3.v2 = 2) order by k1
-    """*/
+    """
+
+    qt_scalar_not_equal_uncorr """
+        select * from subquery1 where subquery1.k1 != (select 
sum(subquery3.k3) from subquery3) order by k1
+    """
 
     qt_in_unCorrelated """
         select * from subquery1 where subquery1.k1 in (select subquery3.k3 
from subquery3 where subquery3.v2 = 2) order by k1
     """
 
+    qt_in_subquery_uncorr """
+        select * from subquery1 where subquery1.k1 in (select subquery3.k3 
from subquery3) order by k1
+    """
+
     qt_not_in_unCorrelated """
         select * from subquery1 where subquery1.k1 not in (select subquery3.k3 
from subquery3 where subquery3.v2 = 2) order by k1
     """
 
-    //qt_exist_unCorrelated
-    /*sql """
+    qt_not_in_uncorr """
+        select * from subquery1 where subquery1.k1 not in (select subquery3.k3 
from subquery3) order by k1
+    """
+
+    qt_exist_unCorrelated """
         select * from subquery1 where exists (select subquery3.k3 from 
subquery3 where subquery3.v2 = 2) order by k1
-    """*/
+    """
+
+    qt_exist_uncorr """
+        select * from subquery1 where exists (select subquery3.k3 from 
subquery3) order by k1
+    """
 
-    //qt_not_exists_unCorrelated
-    /*sql """
+    qt_not_exists_unCorrelated """
         select * from subquery1 where not exists (select subquery3.k3 from 
subquery3 where subquery3.v2 = 2) order by k1
-    """*/
+    """
+
+    qt_not_exist_uncorr """
+        select * from subquery1 where not exists (select subquery3.k3 from 
subquery3) order by k1
+    """
 
     //----------with subquery alias----------
     qt_alias_scalar """
@@ -221,4 +209,23 @@ suite ("sub_query_correlated") {
             where not exists (select aa from
                 (select k1 as aa from subquery3 where subquery1.k2 = 
subquery3.v2) subquery3) order by k1
     """
+
+    //----------complex subqueries----------
+    qt_scalar_subquery """
+        select * from subquery1
+            where k1 = (select sum(k1) from subquery3 where subquery1.k1 = 
subquery3.v1 and subquery3.v2 = 2)
+            order by k1
+    """
+
+    qt_in_subquery """
+        select * from subquery3
+            where (k1 = 1 or k1 = 2 or k1 = 3) and v1 in (select k1 from 
subquery1 where subquery1.k2 = subquery3.v2 and subquery1.k1 = 3)
+            order by k1
+    """
+
+    qt_exist_subquery """
+        select * from subquery3
+            where k1 = 2 and exists (select * from subquery1 where 
subquery1.k1 = subquery3.v2 and subquery1.k2 = 4)
+            order by k1;
+    """
 }


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

Reply via email to