aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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")
}
}