aboutsummaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorWenchen Fan <cloud0fan@outlook.com>2015-07-06 13:26:46 -0700
committerReynold Xin <rxin@databricks.com>2015-07-06 13:26:46 -0700
commit0e194645f42be0d6ac9b5a712f8fc1798418736d (patch)
tree49d5b3ff8e8b561758f33b626b9309d342a0982b /sql
parent293225e0cd9318ad368dde30ac6a17725d33ebb6 (diff)
downloadspark-0e194645f42be0d6ac9b5a712f8fc1798418736d.tar.gz
spark-0e194645f42be0d6ac9b5a712f8fc1798418736d.tar.bz2
spark-0e194645f42be0d6ac9b5a712f8fc1798418736d.zip
[SPARK-8837][SPARK-7114][SQL] support using keyword in column name
Author: Wenchen Fan <cloud0fan@outlook.com> Closes #7237 from cloud-fan/parser and squashes the following commits: e7b49bb [Wenchen Fan] support using keyword in column name
Diffstat (limited to 'sql')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/SqlParser.scala28
-rw-r--r--sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala9
2 files changed, 27 insertions, 10 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/SqlParser.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/SqlParser.scala
index 8d02fbf4f9..e8e9b9802e 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/SqlParser.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/SqlParser.scala
@@ -287,15 +287,18 @@ class SqlParser extends AbstractSparkSQLParser with DataTypeParser {
throw new AnalysisException(s"invalid function approximate($floatLit) $udfName")
}
}
- | CASE ~> expression.? ~ rep1(WHEN ~> expression ~ (THEN ~> expression)) ~
- (ELSE ~> expression).? <~ END ^^ {
- case casePart ~ altPart ~ elsePart =>
- val branches = altPart.flatMap { case whenExpr ~ thenExpr =>
- Seq(whenExpr, thenExpr)
- } ++ elsePart
- casePart.map(CaseKeyWhen(_, branches)).getOrElse(CaseWhen(branches))
- }
- )
+ | CASE ~> whenThenElse ^^ CaseWhen
+ | CASE ~> expression ~ whenThenElse ^^
+ { case keyPart ~ branches => CaseKeyWhen(keyPart, branches) }
+ )
+
+ protected lazy val whenThenElse: Parser[List[Expression]] =
+ rep1(WHEN ~> expression ~ (THEN ~> expression)) ~ (ELSE ~> expression).? <~ END ^^ {
+ case altPart ~ elsePart =>
+ altPart.flatMap { case whenExpr ~ thenExpr =>
+ Seq(whenExpr, thenExpr)
+ } ++ elsePart
+ }
protected lazy val cast: Parser[Expression] =
CAST ~ "(" ~> expression ~ (AS ~> dataType) <~ ")" ^^ {
@@ -354,6 +357,11 @@ class SqlParser extends AbstractSparkSQLParser with DataTypeParser {
protected lazy val signedPrimary: Parser[Expression] =
sign ~ primary ^^ { case s ~ e => if (s == "-") UnaryMinus(e) else e}
+ protected lazy val attributeName: Parser[String] = acceptMatch("attribute name", {
+ case lexical.Identifier(str) => str
+ case lexical.Keyword(str) if !lexical.delimiters.contains(str) => str
+ })
+
protected lazy val primary: PackratParser[Expression] =
( literal
| expression ~ ("[" ~> expression <~ "]") ^^
@@ -364,9 +372,9 @@ class SqlParser extends AbstractSparkSQLParser with DataTypeParser {
| "(" ~> expression <~ ")"
| function
| dotExpressionHeader
- | ident ^^ {case i => UnresolvedAttribute.quoted(i)}
| signedPrimary
| "~" ~> expression ^^ BitwiseNot
+ | attributeName ^^ UnresolvedAttribute.quoted
)
protected lazy val dotExpressionHeader: Parser[Expression] =
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
index cc6af1ccc1..12ad019e8b 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
@@ -1458,4 +1458,13 @@ class SQLQuerySuite extends QueryTest with BeforeAndAfterAll with SQLTestUtils {
checkAnswer(sql("SELECT * FROM t ORDER BY NULL"), Seq(Row(1, 2), Row(1, 2)))
}
}
+
+ test("SPARK-8837: use keyword in column name") {
+ withTempTable("t") {
+ val df = Seq(1 -> "a").toDF("count", "sort")
+ checkAnswer(df.filter("count > 0"), Row(1, "a"))
+ df.registerTempTable("t")
+ checkAnswer(sql("select count, sort from t"), Row(1, "a"))
+ }
+ }
}