aboutsummaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorHerman van Hovell <hvanhovell@questtec.nl>2016-02-11 08:30:58 +0100
committerHerman van Hovell <hvanhovell@questtec.nl>2016-02-11 08:30:58 +0100
commit1842c55d89ae99a610a955ce61633a9084e000f2 (patch)
treec152c037530586180f9fa54121e8b2a701e2f20d /sql
parent8f744fe3d931c2380613b8e5bafa1bb1fd292839 (diff)
downloadspark-1842c55d89ae99a610a955ce61633a9084e000f2.tar.gz
spark-1842c55d89ae99a610a955ce61633a9084e000f2.tar.bz2
spark-1842c55d89ae99a610a955ce61633a9084e000f2.zip
[SPARK-13276] Catch bad characters at the end of a Table Identifier/Expression string
The parser currently parses the following strings without a hitch: * Table Identifier: * `a.b.c` should fail, but results in the following table identifier `a.b` * `table!#` should fail, but results in the following table identifier `table` * Expression * `1+2 r+e` should fail, but results in the following expression `1 + 2` This PR fixes this by adding terminated rules for both expression parsing and table identifier parsing. cc cloud-fan (we discussed this in https://github.com/apache/spark/pull/10649) jayadevanmurali (this causes your PR https://github.com/apache/spark/pull/11051 to fail) Author: Herman van Hovell <hvanhovell@questtec.nl> Closes #11159 from hvanhovell/SPARK-13276.
Diffstat (limited to 'sql')
-rw-r--r--sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/SparkSqlParser.g12
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/ParseDriver.scala4
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/CatalystQlSuite.scala5
3 files changed, 17 insertions, 4 deletions
diff --git a/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/SparkSqlParser.g b/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/SparkSqlParser.g
index 9935678ca2..9f2a5eb35c 100644
--- a/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/SparkSqlParser.g
+++ b/sql/catalyst/src/main/antlr3/org/apache/spark/sql/catalyst/parser/SparkSqlParser.g
@@ -722,6 +722,18 @@ statement
| (KW_SET)=> KW_SET -> ^(TOK_SETCONFIG)
;
+// Rule for expression parsing
+singleNamedExpression
+ :
+ namedExpression EOF
+ ;
+
+// Rule for table name parsing
+singleTableName
+ :
+ tableName EOF
+ ;
+
explainStatement
@init { pushMsg("explain statement", state); }
@after { popMsg(state); }
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/ParseDriver.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/ParseDriver.scala
index f8e4f21451..9ff41f5bec 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/ParseDriver.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/ParseDriver.scala
@@ -35,12 +35,12 @@ object ParseDriver extends Logging {
/** Create an Expression ASTNode from a SQL command. */
def parseExpression(command: String, conf: ParserConf): ASTNode = parse(command, conf) { parser =>
- parser.namedExpression().getTree
+ parser.singleNamedExpression().getTree
}
/** Create an TableIdentifier ASTNode from a SQL command. */
def parseTableName(command: String, conf: ParserConf): ASTNode = parse(command, conf) { parser =>
- parser.tableName().getTree
+ parser.singleTableName().getTree
}
private def parse(
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 6d25de98ce..682b77dc65 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
@@ -134,14 +134,15 @@ class CatalystQlSuite extends PlanTest {
Literal("o") ::
UnresolvedFunction("o", UnresolvedAttribute("bar") :: Nil, false) ::
Nil, false)))
+
+ intercept[AnalysisException](parser.parseExpression("1 - f('o', o(bar)) hello * world"))
}
test("table identifier") {
assert(TableIdentifier("q") === parser.parseTableIdentifier("q"))
assert(TableIdentifier("q", Some("d")) === parser.parseTableIdentifier("d.q"))
intercept[AnalysisException](parser.parseTableIdentifier(""))
- // TODO parser swallows third identifier.
- // intercept[AnalysisException](parser.parseTableIdentifier("d.q.g"))
+ intercept[AnalysisException](parser.parseTableIdentifier("d.q.g"))
}
test("parse union/except/intersect") {