You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by rx...@apache.org on 2014/03/22 00:53:33 UTC
git commit: Make SQL keywords case-insensitive
Repository: spark
Updated Branches:
refs/heads/master 2c0aa22e2 -> dab5439a0
Make SQL keywords case-insensitive
This is a bit of a hack that allows all variations of a keyword, but it still seems to produce valid error messages and such.
Author: Matei Zaharia <ma...@databricks.com>
Closes #193 from mateiz/case-insensitive-sql and squashes the following commits:
0ee4ace [Matei Zaharia] Removed unnecessary `+ ""`
e3ed773 [Matei Zaharia] Make SQL keywords case-insensitive
Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/dab5439a
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/dab5439a
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/dab5439a
Branch: refs/heads/master
Commit: dab5439a083b5f771d5d5b462d0d517fa8e9aaf2
Parents: 2c0aa22
Author: Matei Zaharia <ma...@databricks.com>
Authored: Fri Mar 21 16:53:18 2014 -0700
Committer: Reynold Xin <rx...@apache.org>
Committed: Fri Mar 21 16:53:18 2014 -0700
----------------------------------------------------------------------
.../apache/spark/sql/catalyst/SqlParser.scala | 16 +++++++++++--
.../org/apache/spark/sql/SQLQuerySuite.scala | 25 ++++++++++++++++----
2 files changed, 35 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/spark/blob/dab5439a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/SqlParser.scala
----------------------------------------------------------------------
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 d3b1070..919bf4d 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
@@ -51,7 +51,9 @@ class SqlParser extends StandardTokenParsers {
}
protected case class Keyword(str: String)
- protected implicit def asParser(k: Keyword): Parser[String] = k.str
+
+ protected implicit def asParser(k: Keyword): Parser[String] =
+ allCaseVersions(k.str).map(x => x : Parser[String]).reduce(_ | _)
protected class SqlLexical extends StdLexical {
case class FloatLit(chars: String) extends Token {
@@ -133,7 +135,17 @@ class SqlParser extends StandardTokenParsers {
.filter(_.getReturnType == classOf[Keyword])
.map(_.invoke(this).asInstanceOf[Keyword])
- lexical.reserved ++= reservedWords.map(_.str)
+ /** Generate all variations of upper and lower case of a given string */
+ private def allCaseVersions(s: String, prefix: String = ""): Stream[String] = {
+ if (s == "") {
+ Stream(prefix)
+ } else {
+ allCaseVersions(s.tail, prefix + s.head.toLower) ++
+ allCaseVersions(s.tail, prefix + s.head.toUpper)
+ }
+ }
+
+ lexical.reserved ++= reservedWords.flatMap(w => allCaseVersions(w.str))
lexical.delimiters += (
"@", "*", "+", "-", "<", "=", "<>", "!=", "<=", ">=", ">", "/", "(", ")",
http://git-wip-us.apache.org/repos/asf/spark/blob/dab5439a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
----------------------------------------------------------------------
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 656d89c..6371fa2 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
@@ -200,9 +200,9 @@ class SQLQuerySuite extends QueryTest {
sql(
"""
|SELECT * FROM
- | (SELECT * FROM upperCaseData WHERE N <= 4) left FULL OUTER JOIN
- | (SELECT * FROM upperCaseData WHERE N >= 3) right
- | ON left.N = right.N
+ | (SELECT * FROM upperCaseData WHERE N <= 4) leftTable FULL OUTER JOIN
+ | (SELECT * FROM upperCaseData WHERE N >= 3) rightTable
+ | ON leftTable.N = rightTable.N
""".stripMargin),
(1, "A", null, null) ::
(2, "B", null, null) ::
@@ -211,4 +211,21 @@ class SQLQuerySuite extends QueryTest {
(null, null, 5, "E") ::
(null, null, 6, "F") :: Nil)
}
-}
\ No newline at end of file
+
+ test("mixed-case keywords") {
+ checkAnswer(
+ sql(
+ """
+ |SeleCT * from
+ | (select * from upperCaseData WherE N <= 4) leftTable fuLL OUtER joiN
+ | (sElEcT * FROM upperCaseData whERe N >= 3) rightTable
+ | oN leftTable.N = rightTable.N
+ """.stripMargin),
+ (1, "A", null, null) ::
+ (2, "B", null, null) ::
+ (3, "C", 3, "C") ::
+ (4, "D", 4, "D") ::
+ (null, null, 5, "E") ::
+ (null, null, 6, "F") :: Nil)
+ }
+}