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 3ea98b65df [Fix](Nereids) fix nereids failed to parse set operation 
with query in parenthesis (#18062)
3ea98b65df is described below

commit 3ea98b65df504564a0dda879f9eb7928c8f5f634
Author: mch_ucchi <41606806+sohardforan...@users.noreply.github.com>
AuthorDate: Fri Mar 31 15:55:52 2023 +0800

    [Fix](Nereids) fix nereids failed to parse set operation with query in 
parenthesis (#18062)
    
    sql like the format (q1, q2, q3 is a query):
    
    ``` sql
    (q1)
    UNION ALL (q2)
    UNION ALL (q3)
    ORDER BY keys
    ```
    cannot be parsed by nereids, because order will be recognized as an alias 
of query, we add queryOrganization to avoid it.
---
 .../main/antlr4/org/apache/doris/nereids/DorisParser.g4 |  6 ++++--
 .../apache/doris/nereids/parser/LogicalPlanBuilder.java | 11 +++++++----
 .../trees/plans/logical/LogicalSetOperation.java        |  9 +++++----
 .../apache/doris/nereids/parser/NereidsParserTest.java  | 17 +++++++++++++++--
 regression-test/suites/nereids_p0/join/test_join.groovy |  8 ++++----
 .../suites/nereids_p0/union/test_union.groovy           |  1 -
 6 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
index 73dc5079bd..2749ac8d15 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
@@ -68,9 +68,11 @@ planType
     ;
 
 //  -----------------Query-----------------
+// add queryOrganization for parse (q1) union (q2) union (q3) order by keys, 
otherwise 'order' will be recognized to be
+// identifier.
 query
     : {!doris_legacy_SQL_syntax}? cte? queryTerm queryOrganization
-    | {doris_legacy_SQL_syntax}? queryTerm
+    | {doris_legacy_SQL_syntax}? queryTerm queryOrganization
     ;
 
 queryTerm
@@ -186,7 +188,7 @@ queryOrganization
     ;
 
 sortClause
-    : (ORDER BY sortItem (COMMA sortItem)*)
+    : ORDER BY sortItem (COMMA sortItem)*
     ;
 
 sortItem
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index 22dcd3e171..65cdf62ad5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -422,14 +422,17 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
                     .add(rightQuery)
                     .build();
 
+            LogicalPlan plan;
             if (ctx.UNION() != null) {
-                return new LogicalUnion(qualifier, newChildren);
+                plan = new LogicalUnion(qualifier, newChildren);
             } else if (ctx.EXCEPT() != null) {
-                return new LogicalExcept(qualifier, newChildren);
+                plan = new LogicalExcept(qualifier, newChildren);
             } else if (ctx.INTERSECT() != null) {
-                return new LogicalIntersect(qualifier, newChildren);
+                plan = new LogicalIntersect(qualifier, newChildren);
+            } else {
+                throw new ParseException("not support", ctx);
             }
-            throw new ParseException("not support", ctx);
+            return plan;
         });
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSetOperation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSetOperation.java
index 2faeb82f8f..e1a74c0790 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSetOperation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSetOperation.java
@@ -114,12 +114,13 @@ public abstract class LogicalSetOperation extends 
AbstractLogicalPlan implements
         ImmutableList.Builder<NamedExpression> newOutputs = new Builder<>();
         for (Expression expression : leftCastExpressions) {
             if (expression instanceof Cast) {
+                Cast cast = ((Cast) expression);
                 newOutputs.add(new SlotReference(
-                        ((Cast) expression).child().toSql(), 
expression.getDataType(),
-                        ((Cast) expression).child().nullable()));
+                        cast.child().toSql(), expression.getDataType(),
+                        cast.child().nullable()));
             } else if (expression instanceof Slot) {
-                newOutputs.add(new SlotReference(
-                        expression.toSql(), expression.getDataType(), 
expression.nullable()));
+                Slot slot = ((Slot) expression);
+                newOutputs.add(new SlotReference(slot.toSql(), 
slot.getDataType(), slot.nullable()));
             }
         }
         return newOutputs.build();
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
index 07e6b7d448..bade627b9b 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
@@ -267,9 +267,22 @@ public class NereidsParserTest extends ParserTestBase {
         System.out.println(logicalPlan.treeString());
 
         String union1 = "select * from t1 union (select * from t2 union all 
select * from t3)";
-        NereidsParser nereidsParser1 = new NereidsParser();
-        LogicalPlan logicalPlan1 = nereidsParser1.parseSingle(union1);
+        LogicalPlan logicalPlan1 = nereidsParser.parseSingle(union1);
         System.out.println(logicalPlan1.treeString());
+
+        String union2 = "(SELECT K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11 
FROM test WHERE K1 > 0)"
+                + " UNION ALL (SELECT 1, 2, 3, 4, 3.14, 'HELLO', 'WORLD', 0.0, 
1.1, CAST('1989-03-21' AS DATE), CAST('1989-03-21 13:00:00' AS DATETIME))"
+                + " UNION ALL (SELECT K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, 
K11 FROM baseall WHERE K3 > 0)"
+                + " ORDER BY K1, K2, K3, K4";
+        LogicalPlan logicalPlan2 = nereidsParser.parseSingle(union2);
+        System.out.println(logicalPlan2.treeString());
+
+        String union3 = "select a.k1, a.k2, a.k3, b.k1, b.k2, b.k3 from test a 
left outer join baseall b"
+                + " on a.k1 = b.k1 and a.k2 > b.k2 union (select a.k1, a.k2, 
a.k3, b.k1, b.k2, b.k3"
+                + " from test a right outer join baseall b on a.k1 = b.k1 and 
a.k2 > b.k2)"
+                + " order by isnull(a.k1), 1, 2, 3, 4, 5 limit 65535";
+        LogicalPlan logicalPlan3 = nereidsParser.parseSingle(union3);
+        System.out.println(logicalPlan3.treeString());
     }
 
     @Test
diff --git a/regression-test/suites/nereids_p0/join/test_join.groovy 
b/regression-test/suites/nereids_p0/join/test_join.groovy
index 9593382257..2ea851a372 100644
--- a/regression-test/suites/nereids_p0/join/test_join.groovy
+++ b/regression-test/suites/nereids_p0/join/test_join.groovy
@@ -398,12 +398,12 @@ suite("test_join", "nereids_p0") {
         sql"""select ${s} from ${tbName1} a left outer join ${tbName2} b on 
a.k1 = b.k1 
                  left outer join ${tbName3} c on a.k2 = c.k2 order by 1, 2, 3, 
4, 5 limit 65535"""
     }
-    sql"""select a.k1 k1, a.k2, a.k3, b.k1, b.k2, b.k3 from ${tbName1} a full 
outer join ${tbName2} b 
-             on a.k1 = b.k1 and a.k2 > b.k2 order by isnull(k1), 1, 2, 3, 4, 5 
limit 65535"""
-    sql"""select a.k1 k1, a.k2, a.k3, b.k1, b.k2, b.k3 from ${tbName1} a left 
outer join ${tbName2} b 
+    sql"""select a.k1 k, a.k2, a.k3, b.k1, b.k2, b.k3 from ${tbName1} a full 
outer join ${tbName2} b 
+             on a.k1 = b.k1 and a.k2 > b.k2 order by isnull(k), 1, 2, 3, 4, 5 
limit 65535"""
+    sql"""select a.k1 k, a.k2, a.k3, b.k1, b.k2, b.k3 from ${tbName1} a left 
outer join ${tbName2} b 
              on a.k1 = b.k1 and a.k2 > b.k2 union (select a.k1, a.k2, a.k3, 
b.k1, b.k2, b.k3 
              from ${tbName1} a right outer join ${tbName2} b on a.k1 = b.k1 
and a.k2 > b.k2) 
-             order by isnull(k1), 1, 2, 3, 4, 5 limit 65535"""
+             order by isnull(k), 1, 2, 3, 4, 5 limit 65535"""
     sql"""select count(*) from ${tbName1} a full outer join ${tbName2} b on 
a.k2 = b.k2 and a.k1 > 0 
             full outer join ${tbName3} c on a.k3 = c.k3 and b.k1 = c.k1 and 
c.k3 > 0"""
     sql"""select count(*) from ((select a.k1 as k1, b.k1 as k2, a.k2 as k3, 
b.k2 as k4, a.k3 as k5, b.k3 as k6, c.k1 as k7, c.k2 as k8, c.k3 as k9 from 
${tbName1} a 
diff --git a/regression-test/suites/nereids_p0/union/test_union.groovy 
b/regression-test/suites/nereids_p0/union/test_union.groovy
index 54810f141a..ec2ab9b945 100644
--- a/regression-test/suites/nereids_p0/union/test_union.groovy
+++ b/regression-test/suites/nereids_p0/union/test_union.groovy
@@ -205,7 +205,6 @@ suite("test_union") {
         sql "(select k1, k1 from ${tbName2}) union (select k2, 1 from 
${tbName1}) order by k1"
         check{result, exception, startTime, endTime ->
             assertTrue(exception != null)
-            logger.info(exception.message)
         }
     }
     test {


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

Reply via email to