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 2020/04/24 14:01:45 UTC

[incubator-doris] branch master updated: [SQL] Disable some unsupported syntax (#3357)

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 0e66385  [SQL] Disable some unsupported syntax (#3357)
0e66385 is described below

commit 0e66385235933efc1c09b21d64599eb3873c7f48
Author: yangzhg <78...@qq.com>
AuthorDate: Fri Apr 24 22:01:35 2020 +0800

    [SQL] Disable some unsupported syntax (#3357)
    
    Disable some syntax when subquery is not binary predicate in case when clause.
---
 .../java/org/apache/doris/analysis/CaseExpr.java   |  3 +++
 .../java/org/apache/doris/analysis/SelectStmt.java | 27 +++++++++++++++++-----
 .../org/apache/doris/analysis/SelectStmtTest.java  | 19 +++++++++++++++
 3 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/fe/src/main/java/org/apache/doris/analysis/CaseExpr.java b/fe/src/main/java/org/apache/doris/analysis/CaseExpr.java
index 1d0f9f8..602aabd 100644
--- a/fe/src/main/java/org/apache/doris/analysis/CaseExpr.java
+++ b/fe/src/main/java/org/apache/doris/analysis/CaseExpr.java
@@ -101,6 +101,9 @@ public class CaseExpr extends Expr {
         CaseExpr expr = (CaseExpr) obj;
         return hasCaseExpr == expr.hasCaseExpr && hasElseExpr == expr.hasElseExpr;
     }
+    public boolean hasCaseExpr() {
+        return hasCaseExpr;
+    }
 
     @Override
     public String toSqlImpl() {
diff --git a/fe/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/src/main/java/org/apache/doris/analysis/SelectStmt.java
index d8c3e1f..d70333c 100644
--- a/fe/src/main/java/org/apache/doris/analysis/SelectStmt.java
+++ b/fe/src/main/java/org/apache/doris/analysis/SelectStmt.java
@@ -183,7 +183,7 @@ public class SelectStmt extends QueryStmt {
         baseTblSmap.clear();
         groupingInfo = null;
     }
-    
+
     @Override
     public QueryStmt clone() {
         return new SelectStmt(this);
@@ -1004,8 +1004,8 @@ public class SelectStmt extends QueryStmt {
 
         if (selectList.isDistinct()
                 && (groupByClause != null
-                            || TreeNode.contains(resultExprs, Expr.isAggregatePredicate())
-                            || (havingClauseAfterAnaylzed != null && havingClauseAfterAnaylzed.contains(Expr.isAggregatePredicate())))) {
+                || TreeNode.contains(resultExprs, Expr.isAggregatePredicate())
+                || (havingClauseAfterAnaylzed != null && havingClauseAfterAnaylzed.contains(Expr.isAggregatePredicate())))) {
             throw new AnalysisException("cannot combine SELECT DISTINCT with aggregate functions or GROUP BY");
         }
 
@@ -1388,9 +1388,24 @@ public class SelectStmt extends QueryStmt {
             if (!item.getExpr().contains(Predicates.instanceOf(Subquery.class))) {
                 continue;
             }
-            item.setExpr(rewriteSubquery(item.getExpr(), analyzer));
-        }
+            CaseExpr caseExpr = (CaseExpr) item.getExpr();
 
+            int childIdx = 0;
+            if (caseExpr.hasCaseExpr()
+                    && caseExpr.getChild(childIdx++).contains(Predicates.instanceOf(Subquery.class))) {
+                throw new AnalysisException("Only support subquery in binary predicate in case statement.");
+            }
+            while (childIdx + 2 <= caseExpr.getChildren().size()) {
+                Expr child = caseExpr.getChild(childIdx++);
+                // when
+                if (!(child instanceof BinaryPredicate) && child.contains(Predicates.instanceOf(Subquery.class))) {
+                    throw new AnalysisException("Only support subquery in binary predicate in case statement.");
+                }
+                // then
+                childIdx++;
+            }
+            rewriteSubquery(item.getExpr(), analyzer);
+        }
         selectList.rewriteExprs(rewriter, analyzer);
     }
 
@@ -1435,7 +1450,7 @@ public class SelectStmt extends QueryStmt {
                 throw new AnalysisException("Only support select subquery in case statement.");
             }
             SelectStmt subquery = (SelectStmt) ((Subquery) expr).getStatement();
-            if (subquery.resultExprs.size() != 1) {
+            if (subquery.resultExprs.size() != 1 || !subquery.returnsSingleRow()) {
                 throw new AnalysisException("Only support select subquery produce one column in case statement.");
             }
             subquery.reset();
diff --git a/fe/src/test/java/org/apache/doris/analysis/SelectStmtTest.java b/fe/src/test/java/org/apache/doris/analysis/SelectStmtTest.java
index f58776c..f2d1917 100644
--- a/fe/src/test/java/org/apache/doris/analysis/SelectStmtTest.java
+++ b/fe/src/test/java/org/apache/doris/analysis/SelectStmtTest.java
@@ -92,6 +92,25 @@ public class SelectStmtTest {
         SelectStmt stmt = (SelectStmt) UtFrameUtils.parseAndAnalyzeStmt(sql1, ctx);
         stmt.rewriteExprs(new Analyzer(ctx.getCatalog(), ctx).getExprRewriter());
         Assert.assertTrue(stmt.toSql().contains("`$a$1`.`$c$1` > `k4` THEN `$a$2`.`$c$2` ELSE `$a$3`.`$c$3`"));
+
+        String sql2 = "select case when k1 in (select k1 from db1.tbl1) then \"true\" else k1 end a from db1.tbl1";
+        try {
+            SelectStmt stmt2 = (SelectStmt) UtFrameUtils.parseAndAnalyzeStmt(sql2, ctx);
+            stmt2.rewriteExprs(new Analyzer(ctx.getCatalog(), ctx).getExprRewriter());
+            Assert.fail("syntax not supported.");
+        } catch (AnalysisException e) {
+        } catch (Exception e) {
+            Assert.fail("must be AnalysisException.");
+        }
+        try {
+            String sql3 = "select case k1 when exists (select 1) then \"empty\" else \"p_test\" end a from db1.tbl1";
+            SelectStmt stmt3 = (SelectStmt) UtFrameUtils.parseAndAnalyzeStmt(sql3, ctx);
+            stmt3.rewriteExprs(new Analyzer(ctx.getCatalog(), ctx).getExprRewriter());
+            Assert.fail("syntax not supported.");
+        } catch (AnalysisException e) {
+        } catch (Exception e) {
+            Assert.fail("must be AnalysisException.");
+        }
     }
 
     @Test


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