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]
