aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiang-Chi Hsieh <viirya@gmail.com>2016-01-08 21:48:06 -0800
committerDavies Liu <davies.liu@gmail.com>2016-01-08 21:48:06 -0800
commit95cd5d95ce8aec8b2462204c791ba927326305ba (patch)
treec11f8689044f78bc4f68d264e7229e74749c0497
parent090d691323063c436601943506baac3ec5255dd9 (diff)
downloadspark-95cd5d95ce8aec8b2462204c791ba927326305ba.tar.gz
spark-95cd5d95ce8aec8b2462204c791ba927326305ba.tar.bz2
spark-95cd5d95ce8aec8b2462204c791ba927326305ba.zip
[SPARK-12577] [SQL] Better support of parentheses in partition by and order by clause of window function's over clause
JIRA: https://issues.apache.org/jira/browse/SPARK-12577 Author: Liang-Chi Hsieh <viirya@gmail.com> Closes #10620 from viirya/fix-parentheses.
-rw-r--r--sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/ExpressionParser.g7
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystQlSuite.scala36
2 files changed, 32 insertions, 11 deletions
diff --git a/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/ExpressionParser.g b/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/ExpressionParser.g
index cad770122d..aabb5d4958 100644
--- a/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/ExpressionParser.g
+++ b/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/ExpressionParser.g
@@ -223,7 +223,12 @@ precedenceUnaryPrefixExpression
;
precedenceUnarySuffixExpression
- : precedenceUnaryPrefixExpression (a=KW_IS nullCondition)?
+ :
+ (
+ (LPAREN precedenceUnaryPrefixExpression RPAREN) => LPAREN precedenceUnaryPrefixExpression (a=KW_IS nullCondition)? RPAREN
+ |
+ precedenceUnaryPrefixExpression (a=KW_IS nullCondition)?
+ )
-> {$a != null}? ^(TOK_FUNCTION nullCondition precedenceUnaryPrefixExpression)
-> precedenceUnaryPrefixExpression
;
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 30978d9b49..d7204c3488 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
@@ -20,17 +20,33 @@ package org.apache.spark.sql.catalyst
import org.apache.spark.sql.catalyst.plans.PlanTest
class CatalystQlSuite extends PlanTest {
+ val parser = new CatalystQl()
test("parse union/except/intersect") {
- val paresr = new CatalystQl()
- 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 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")
+ parser.createPlan("select * from t1 union all select * from t2")
+ parser.createPlan("select * from t1 union distinct select * from t2")
+ parser.createPlan("select * from t1 union select * from t2")
+ parser.createPlan("select * from t1 except select * from t2")
+ parser.createPlan("select * from t1 intersect select * from t2")
+ parser.createPlan("(select * from t1) union all (select * from t2)")
+ parser.createPlan("(select * from t1) union distinct (select * from t2)")
+ parser.createPlan("(select * from t1) union (select * from t2)")
+ parser.createPlan("select * from ((select * from t1) union (select * from t2)) t")
+ }
+
+ test("window function: better support of parentheses") {
+ parser.createPlan("select sum(product + 1) over (partition by ((1) + (product / 2)) " +
+ "order by 2) from windowData")
+ parser.createPlan("select sum(product + 1) over (partition by (1 + (product / 2)) " +
+ "order by 2) from windowData")
+ parser.createPlan("select sum(product + 1) over (partition by ((product / 2) + 1) " +
+ "order by 2) from windowData")
+
+ parser.createPlan("select sum(product + 1) over (partition by ((product) + (1)) order by 2) " +
+ "from windowData")
+ parser.createPlan("select sum(product + 1) over (partition by ((product) + 1) order by 2) " +
+ "from windowData")
+ parser.createPlan("select sum(product + 1) over (partition by (product + (1)) order by 2) " +
+ "from windowData")
}
}