You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/06/10 11:43:51 UTC

[incubator-doris] branch master updated: [fix](planner) fix don't rewrite nested union statement bug (#8513)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new a7cca930b9 [fix](planner) fix don't rewrite nested union statement bug (#8513)
a7cca930b9 is described below

commit a7cca930b964d96b778381967b257c1aa7222519
Author: shee <13...@users.noreply.github.com>
AuthorDate: Fri Jun 10 19:43:45 2022 +0800

    [fix](planner) fix don't rewrite nested union statement bug (#8513)
    
    Issue Number: close #8512
---
 .../java/org/apache/doris/analysis/StmtRewriter.java | 14 ++++++++++----
 .../java/org/apache/doris/planner/PlannerTest.java   | 20 +++++++++++++++++++-
 2 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java
index 42a0188a84..4f0ea9c059 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java
@@ -321,10 +321,16 @@ public class StmtRewriter {
     private static void rewriteUnionStatement(SetOperationStmt stmt, Analyzer analyzer)
             throws AnalysisException {
         for (SetOperationStmt.SetOperand operand : stmt.getOperands()) {
-            Preconditions.checkState(operand.getQueryStmt() instanceof SelectStmt);
-            QueryStmt rewrittenQueryStmt = StmtRewriter.rewriteSelectStatement(
-                    (SelectStmt) operand.getQueryStmt(), operand.getAnalyzer());
-            operand.setQueryStmt(rewrittenQueryStmt);
+            QueryStmt queryStmt = operand.getQueryStmt();
+            if (queryStmt instanceof SelectStmt) {
+                QueryStmt rewrittenQueryStmt = rewriteSelectStatement((SelectStmt) queryStmt, operand.getAnalyzer());
+                operand.setQueryStmt(rewrittenQueryStmt);
+            } else if (queryStmt instanceof SetOperationStmt) {
+                rewriteUnionStatement((SetOperationStmt) queryStmt, operand.getAnalyzer());
+            } else {
+                throw new IllegalStateException("Rewrite union statement failed. "
+                    + "Because QueryStmt is neither SelectStmt nor SetOperationStmt");
+            }
         }
     }
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java
index 1a4832b420..73fe9bf24b 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java
@@ -70,7 +70,13 @@ public class PlannerTest extends TestWithFeService {
                 + " distributed by hash(k1)"
                 + " properties('replication_num' = '1');";
 
-        createTables(tbl1, tbl2, tbl3, tbl4);
+        String tbl5 = "create table db1.tbl5("
+                        + "k1 int,"
+                        + "k2 int) "
+                        + "DISTRIBUTED BY HASH(k2) "
+                        + "BUCKETS 3 PROPERTIES ('replication_num' = '1');";
+
+        createTables(tbl1, tbl2, tbl3, tbl4, tbl5);
     }
 
     @Test
@@ -494,4 +500,16 @@ public class PlannerTest extends TestWithFeService {
         String plan = planner.getExplainString(fragments, new ExplainOptions(false, false));
         Assertions.assertTrue(plan.contains("PREDICATES: `k1` = 1\n"));
     }
+
+    @Test
+    public void testRewriteNestedUnionStmt() throws Exception {
+        String qSQL = "SELECT k1 FROM db1.tbl5 WHERE k1 IN "
+                + "( SELECT k1 FROM ( SELECT k1 FROM db1.tbl5 ORDER BY k2 DESC, k1 DESC LIMIT 300 INTERSECT "
+                + "(SELECT k1 FROM db1.tbl5 ORDER BY k2 DESC, k1 DESC LIMIT 9 EXCEPT SELECT k1 "
+                + "FROM db1.tbl5 ORDER BY k2 DESC, k1 DESC LIMIT 2) ) t )";
+
+        StmtExecutor stmtExecutor = new StmtExecutor(connectContext, qSQL);
+        stmtExecutor.execute();
+    }
+
 }


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