diff options
author | Matei Zaharia <matei@databricks.com> | 2014-03-21 16:53:18 -0700 |
---|---|---|
committer | Reynold Xin <rxin@apache.org> | 2014-03-21 16:53:18 -0700 |
commit | dab5439a083b5f771d5d5b462d0d517fa8e9aaf2 (patch) | |
tree | 8ec015fb868bd163c5d05d780f4de1007b4be911 /sql/catalyst | |
parent | 2c0aa22e2e26ae35b7d4caa529bc6520e362cc3c (diff) | |
download | spark-dab5439a083b5f771d5d5b462d0d517fa8e9aaf2.tar.gz spark-dab5439a083b5f771d5d5b462d0d517fa8e9aaf2.tar.bz2 spark-dab5439a083b5f771d5d5b462d0d517fa8e9aaf2.zip |
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 <matei@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
Diffstat (limited to 'sql/catalyst')
-rw-r--r-- | sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/SqlParser.scala | 16 |
1 files changed, 14 insertions, 2 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 d3b1070a58..919bf4dbc8 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 += ( "@", "*", "+", "-", "<", "=", "<>", "!=", "<=", ">=", ">", "/", "(", ")", |