Repository: spark
Updated Branches:
  refs/heads/master 3d79f1065 -> 55d6fdf22


[SPARK-13321][SQL] Support nested UNION in parser

JIRA: https://issues.apache.org/jira/browse/SPARK-13321

The following SQL can not be parsed with current parser:

    SELECT  `u_1`.`id` FROM (((SELECT  `t0`.`id` FROM `default`.`t0`) UNION ALL 
(SELECT  `t0`.`id` FROM `default`.`t0`)) UNION ALL (SELECT  `t0`.`id` FROM 
`default`.`t0`)) AS u_1

We should fix it.

Author: Liang-Chi Hsieh <[email protected]>

Closes #11204 from viirya/nested-union.


Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/55d6fdf2
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/55d6fdf2
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/55d6fdf2

Branch: refs/heads/master
Commit: 55d6fdf22d1d6379180ac09f364c38982897d9ff
Parents: 3d79f10
Author: Liang-Chi Hsieh <[email protected]>
Authored: Sun Feb 21 19:10:17 2016 -0800
Committer: Reynold Xin <[email protected]>
Committed: Sun Feb 21 19:10:17 2016 -0800

----------------------------------------------------------------------
 .../spark/sql/catalyst/parser/SparkSqlParser.g  | 20 ++++++
 .../spark/sql/catalyst/CatalystQlSuite.scala    | 64 ++++++++++++++++++++
 2 files changed, 84 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/55d6fdf2/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/SparkSqlParser.g
----------------------------------------------------------------------
diff --git 
a/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/SparkSqlParser.g
 
b/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/SparkSqlParser.g
index e1908a8..9aeea69 100644
--- 
a/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/SparkSqlParser.g
+++ 
b/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/SparkSqlParser.g
@@ -2320,6 +2320,26 @@ regularBody[boolean topLevel]
    )
    |
    selectStatement[topLevel]
+   |
+   (LPAREN selectStatement0[true]) => nestedSetOpSelectStatement[topLevel]
+   ;
+
+nestedSetOpSelectStatement[boolean topLevel]
+   :
+   (
+   LPAREN s=selectStatement0[topLevel] RPAREN -> {$s.tree}
+   )
+   (set=setOpSelectStatement[$nestedSetOpSelectStatement.tree, topLevel])
+   -> {set == null}?
+      {$nestedSetOpSelectStatement.tree}
+   -> {$set.tree}
+   ;
+
+selectStatement0[boolean topLevel]
+   :
+   (selectStatement[true]) => selectStatement[topLevel]
+   |
+   (nestedSetOpSelectStatement[true]) => nestedSetOpSelectStatement[topLevel]
    ;
 
 selectStatement[boolean topLevel]

http://git-wip-us.apache.org/repos/asf/spark/blob/55d6fdf2/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystQlSuite.scala
----------------------------------------------------------------------
diff --git 
a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystQlSuite.scala
 
b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystQlSuite.scala
index 42147f5..1d1c0cb 100644
--- 
a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystQlSuite.scala
+++ 
b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystQlSuite.scala
@@ -203,6 +203,70 @@ class CatalystQlSuite extends PlanTest {
       "from windowData")
   }
 
+  test("nesting UNION") {
+    val parsed = parser.parsePlan(
+      """
+       |SELECT  `u_1`.`id` FROM (((SELECT  `t0`.`id` FROM `default`.`t0`)
+       |UNION ALL (SELECT  `t0`.`id` FROM `default`.`t0`)) UNION ALL
+       |(SELECT  `t0`.`id` FROM `default`.`t0`)) AS u_1
+      """.stripMargin)
+
+    val expected = Project(
+      UnresolvedAlias(UnresolvedAttribute("u_1.id"), None) :: Nil,
+      Subquery("u_1",
+        Union(
+          Union(
+            Project(
+              UnresolvedAlias(UnresolvedAttribute("t0.id"), None) :: Nil,
+              UnresolvedRelation(TableIdentifier("t0", Some("default")), 
None)),
+            Project(
+              UnresolvedAlias(UnresolvedAttribute("t0.id"), None) :: Nil,
+              UnresolvedRelation(TableIdentifier("t0", Some("default")), 
None))),
+          Project(
+            UnresolvedAlias(UnresolvedAttribute("t0.id"), None) :: Nil,
+            UnresolvedRelation(TableIdentifier("t0", Some("default")), 
None)))))
+
+    comparePlans(parsed, expected)
+
+    val parsedSame = parser.parsePlan(
+      """
+       |SELECT  `u_1`.`id` FROM ((SELECT  `t0`.`id` FROM `default`.`t0`)
+       |UNION ALL (SELECT  `t0`.`id` FROM `default`.`t0`) UNION ALL
+       |(SELECT  `t0`.`id` FROM `default`.`t0`)) AS u_1
+      """.stripMargin)
+
+    comparePlans(parsedSame, expected)
+
+    val parsed2 = parser.parsePlan(
+      """
+       |SELECT  `u_1`.`id` FROM ((((SELECT  `t0`.`id` FROM `default`.`t0`)
+       |UNION ALL (SELECT  `t0`.`id` FROM `default`.`t0`)) UNION ALL
+       |(SELECT  `t0`.`id` FROM `default`.`t0`))
+       |UNION ALL (SELECT  `t0`.`id` FROM `default`.`t0`)) AS u_1
+      """.stripMargin)
+
+    val expected2 = Project(
+      UnresolvedAlias(UnresolvedAttribute("u_1.id"), None) :: Nil,
+      Subquery("u_1",
+        Union(
+          Union(
+            Union(
+              Project(
+                UnresolvedAlias(UnresolvedAttribute("t0.id"), None) :: Nil,
+                UnresolvedRelation(TableIdentifier("t0", Some("default")), 
None)),
+              Project(
+                UnresolvedAlias(UnresolvedAttribute("t0.id"), None) :: Nil,
+                UnresolvedRelation(TableIdentifier("t0", Some("default")), 
None))),
+            Project(
+              UnresolvedAlias(UnresolvedAttribute("t0.id"), None) :: Nil,
+              UnresolvedRelation(TableIdentifier("t0", Some("default")), 
None))),
+          Project(
+            UnresolvedAlias(UnresolvedAttribute("t0.id"), None) :: Nil,
+            UnresolvedRelation(TableIdentifier("t0", Some("default")), 
None)))))
+
+    comparePlans(parsed2, expected2)
+  }
+
   test("subquery") {
     parser.parsePlan("select (select max(b) from s) ss from t")
     parser.parsePlan("select * from t where a = (select b from s)")


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to