aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiang-Chi Hsieh <viirya@gmail.com>2016-01-08 09:50:41 -0800
committerDavies Liu <davies.liu@gmail.com>2016-01-08 09:50:41 -0800
commitcfe1ba56e4ab281a9e8eaf419fb7429f93c7a0ce (patch)
tree0b9ea38fac2b799846308ff58c103bf64340c526
parentb9c835337880f57fe8b953962913bcc524162348 (diff)
downloadspark-cfe1ba56e4ab281a9e8eaf419fb7429f93c7a0ce.tar.gz
spark-cfe1ba56e4ab281a9e8eaf419fb7429f93c7a0ce.tar.bz2
spark-cfe1ba56e4ab281a9e8eaf419fb7429f93c7a0ce.zip
[SPARK-12687] [SQL] Support from clause surrounded by `()`.
JIRA: https://issues.apache.org/jira/browse/SPARK-12687 Some queries such as `(select 1 as a) union (select 2 as a)` can't work. This patch fixes it. Author: Liang-Chi Hsieh <viirya@gmail.com> Closes #10660 from viirya/fix-union.
-rw-r--r--sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/FromClauseParser.g2
-rw-r--r--sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/SparkSqlParser.g21
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystQlSuite.scala4
3 files changed, 25 insertions, 2 deletions
diff --git a/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/FromClauseParser.g b/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/FromClauseParser.g
index ba6cfc60f0..972c52e3ff 100644
--- a/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/FromClauseParser.g
+++ b/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/FromClauseParser.g
@@ -151,8 +151,8 @@ fromSource
@after { gParent.popMsg(state); }
:
(LPAREN KW_VALUES) => fromSource0
- | (LPAREN) => LPAREN joinSource RPAREN -> joinSource
| fromSource0
+ | (LPAREN joinSource) => LPAREN joinSource RPAREN -> joinSource
;
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 cf8a56566d..b04bb67777 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
@@ -2216,6 +2216,8 @@ regularBody[boolean topLevel]
selectStatement[boolean topLevel]
:
(
+ (
+ LPAREN
s=selectClause
f=fromClause?
w=whereClause?
@@ -2227,6 +2229,20 @@ selectStatement[boolean topLevel]
sort=sortByClause?
win=window_clause?
l=limitClause?
+ RPAREN
+ |
+ s=selectClause
+ f=fromClause?
+ w=whereClause?
+ g=groupByClause?
+ h=havingClause?
+ o=orderByClause?
+ c=clusterByClause?
+ d=distributeByClause?
+ sort=sortByClause?
+ win=window_clause?
+ l=limitClause?
+ )
-> ^(TOK_QUERY $f? ^(TOK_INSERT ^(TOK_DESTINATION ^(TOK_DIR TOK_TMP_FILE))
$s $w? $g? $h? $o? $c?
$d? $sort? $win? $l?))
@@ -2241,7 +2257,10 @@ selectStatement[boolean topLevel]
setOpSelectStatement[CommonTree t, boolean topLevel]
:
- (u=setOperator b=simpleSelectStatement
+ ((
+ u=setOperator LPAREN b=simpleSelectStatement RPAREN
+ |
+ u=setOperator b=simpleSelectStatement)
-> {$setOpSelectStatement.tree != null && $u.tree.getType()==SparkSqlParser.TOK_UNIONDISTINCT}?
^(TOK_QUERY
^(TOK_FROM
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 0fee97fb07..30978d9b49 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
@@ -28,5 +28,9 @@ class CatalystQlSuite extends PlanTest {
paresr.createPlan("select * from t1 union select * from t2")
paresr.createPlan("select * from t1 except select * from t2")
paresr.createPlan("select * from t1 intersect select * from t2")
+ paresr.createPlan("(select * from t1) union all (select * from t2)")
+ paresr.createPlan("(select * from t1) union distinct (select * from t2)")
+ paresr.createPlan("(select * from t1) union (select * from t2)")
+ paresr.createPlan("select * from ((select * from t1) union (select * from t2)) t")
}
}