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

starocean999 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 90791f0b19 [fix](nereids)fix bug of exists subquery with limit clause 
(#24630)
90791f0b19 is described below

commit 90791f0b190bda23d972a13f93bc0d7ea0b8cd22
Author: starocean999 <40539150+starocean...@users.noreply.github.com>
AuthorDate: Mon Sep 25 17:15:08 2023 +0800

    [fix](nereids)fix bug of exists subquery with limit clause (#24630)
    
    create table t1(c1 int, c2 int);
    create table t2(c1 int, c2 int);
    insert into t1 values (1,1);
    insert into t2 values (1,1);
    
    select * from t1 where exists (select * from t2 where t1.c1 = t2.c1 limit 
0);
    
    the result should be empty set.
---
 .../nereids/rules/analysis/SubExprAnalyzer.java    | 17 ++++++++-
 .../nereids_syntax_p0/sub_query_correlated.out     | 40 ++++++++++++++++++++++
 .../nereids_syntax_p0/sub_query_correlated.groovy  | 33 ++++++++++++++++++
 3 files changed, 89 insertions(+), 1 deletion(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubExprAnalyzer.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubExprAnalyzer.java
index e39ebecaa0..d64a5516f5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubExprAnalyzer.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubExprAnalyzer.java
@@ -29,6 +29,7 @@ import org.apache.doris.nereids.trees.expressions.Not;
 import org.apache.doris.nereids.trees.expressions.ScalarSubquery;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SubqueryExpr;
+import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
 import 
org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewriter;
 import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
 import org.apache.doris.nereids.trees.plans.logical.LogicalLimit;
@@ -72,7 +73,13 @@ class SubExprAnalyzer extends 
DefaultExpressionRewriter<CascadesContext> {
     @Override
     public Expression visitExistsSubquery(Exists exists, CascadesContext 
context) {
         AnalyzedResult analyzedResult = analyzeSubquery(exists);
-
+        if (analyzedResult.rootIsLimitZero()) {
+            return BooleanLiteral.of(exists.isNot());
+        }
+        if (analyzedResult.isCorrelated() && 
analyzedResult.rootIsLimitWithOffset()) {
+            throw new AnalysisException("Unsupported correlated subquery with 
a LIMIT clause with offset > 0 "
+                    + analyzedResult.getLogicalPlan());
+        }
         return new Exists(analyzedResult.getLogicalPlan(),
                 analyzedResult.getCorrelatedSlots(), exists.isNot());
     }
@@ -219,5 +226,13 @@ class SubExprAnalyzer extends 
DefaultExpressionRewriter<CascadesContext> {
         public boolean rootIsLimit() {
             return logicalPlan instanceof LogicalLimit;
         }
+
+        public boolean rootIsLimitWithOffset() {
+            return logicalPlan instanceof LogicalLimit && ((LogicalLimit<?>) 
logicalPlan).getOffset() != 0;
+        }
+
+        public boolean rootIsLimitZero() {
+            return logicalPlan instanceof LogicalLimit && ((LogicalLimit<?>) 
logicalPlan).getLimit() == 0;
+        }
     }
 }
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 162cdb3b95..732a72a390 100644
--- a/regression-test/data/nereids_syntax_p0/sub_query_correlated.out
+++ b/regression-test/data/nereids_syntax_p0/sub_query_correlated.out
@@ -161,6 +161,46 @@
 22     3
 24     4
 
+-- !exist_unCorrelated_limit1 --
+1      2
+1      3
+2      4
+2      5
+3      3
+3      4
+20     2
+22     3
+24     4
+
+-- !exist_corr_limit1 --
+1      2
+1      3
+2      4
+3      3
+3      4
+20     2
+22     3
+24     4
+
+-- !exist_unCorrelated_limit0 --
+
+-- !exist_corr_limit0 --
+
+-- !exist_unCorrelated_limit1_offset1 --
+1      2
+1      3
+2      4
+2      5
+3      3
+3      4
+20     2
+22     3
+24     4
+
+-- !exist_unCorrelated_limit0_offset1 --
+
+-- !exist_corr_limit0_offset1 --
+
 -- !scalar_subquery1 --
 
 -- !scalar_subquery2 --
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 c13cac2d86..482eab7a6a 100644
--- a/regression-test/suites/nereids_syntax_p0/sub_query_correlated.groovy
+++ b/regression-test/suites/nereids_syntax_p0/sub_query_correlated.groovy
@@ -240,6 +240,39 @@ suite ("sub_query_correlated") {
         select * from sub_query_correlated_subquery1 where exists (select 
sub_query_correlated_subquery3.k3 from sub_query_correlated_subquery3) order by 
k1, k2
     """
 
+    qt_exist_unCorrelated_limit1 """
+        select * from sub_query_correlated_subquery1 where exists (select 
sub_query_correlated_subquery3.k3 from sub_query_correlated_subquery3 where 
sub_query_correlated_subquery3.v2 = 2 limit 1) order by k1, k2
+    """
+
+    qt_exist_corr_limit1 """
+        select * from sub_query_correlated_subquery1 where exists (select 
sub_query_correlated_subquery3.k3 from sub_query_correlated_subquery3 where 
sub_query_correlated_subquery1.k2 = sub_query_correlated_subquery3.v2 limit 1) 
order by k1, k2
+    """
+
+    qt_exist_unCorrelated_limit0 """
+        select * from sub_query_correlated_subquery1 where exists (select 
sub_query_correlated_subquery3.k3 from sub_query_correlated_subquery3 where 
sub_query_correlated_subquery3.v2 = 2 limit 0) order by k1, k2
+    """
+
+    qt_exist_corr_limit0 """
+        select * from sub_query_correlated_subquery1 where exists (select 
sub_query_correlated_subquery3.k3 from sub_query_correlated_subquery3 where 
sub_query_correlated_subquery1.k2 = sub_query_correlated_subquery3.v2 limit 0) 
order by k1, k2
+    """
+
+    qt_exist_unCorrelated_limit1_offset1 """
+        select * from sub_query_correlated_subquery1 where exists (select 
sub_query_correlated_subquery3.k3 from sub_query_correlated_subquery3 where 
sub_query_correlated_subquery3.v2 = 2 limit 1 offset 1) order by k1, k2
+    """
+
+    test {
+        sql("select * from sub_query_correlated_subquery1 where exists (select 
sub_query_correlated_subquery3.k3 from sub_query_correlated_subquery3 where 
sub_query_correlated_subquery1.k2 = sub_query_correlated_subquery3.v2 limit 1 
offset 1) order by k1, k2")
+        exception "Unsupported correlated subquery with a LIMIT clause with 
offset > 0"
+    }
+
+    qt_exist_unCorrelated_limit0_offset1 """
+        select * from sub_query_correlated_subquery1 where exists (select 
sub_query_correlated_subquery3.k3 from sub_query_correlated_subquery3 where 
sub_query_correlated_subquery3.v2 = 2 limit 0 offset 1) order by k1, k2
+    """
+
+    qt_exist_corr_limit0_offset1 """
+        select * from sub_query_correlated_subquery1 where exists (select 
sub_query_correlated_subquery3.k3 from sub_query_correlated_subquery3 where 
sub_query_correlated_subquery1.k2 = sub_query_correlated_subquery3.v2 limit 0 
offset 1) order by k1, k2
+    """
+
     //----------complex subqueries----------
     qt_scalar_subquery1 """
         select * from sub_query_correlated_subquery1


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

Reply via email to