You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by we...@apache.org on 2019/03/11 12:40:28 UTC
[spark] branch master updated: [SPARK-27117][SQL]
current_date/current_timestamp should not refer to columns with ansi parser
mode
This is an automated email from the ASF dual-hosted git repository.
wenchen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push:
new 8114b63 [SPARK-27117][SQL] current_date/current_timestamp should not refer to columns with ansi parser mode
8114b63 is described below
commit 8114b63d56f51f7de2e0c27b1244d8d8e3127284
Author: Wenchen Fan <we...@databricks.com>
AuthorDate: Mon Mar 11 20:40:03 2019 +0800
[SPARK-27117][SQL] current_date/current_timestamp should not refer to columns with ansi parser mode
## What changes were proposed in this pull request?
This PR is a followup of https://github.com/apache/spark/pull/19559 .
It revisits https://issues.apache.org/jira/browse/SPARK-27117 , which should be an invalid use case according to the SQL standard.
`current_date/current_timestamp` are reserved keywords, if users want to access columns named `current_date/current_timestamp`, they should quote the name like ```select `current_date` from tbl```
If ansi mode is not enabled(which is the default), this PR won't introduce any changes.
## How was this patch tested?
a new test case
Closes #24039 from cloud-fan/current_datetime.
Authored-by: Wenchen Fan <we...@databricks.com>
Signed-off-by: Wenchen Fan <we...@databricks.com>
---
.../org/apache/spark/sql/catalyst/parser/SqlBase.g4 | 3 ++-
.../org/apache/spark/sql/catalyst/parser/AstBuilder.scala | 15 +++++++++++++++
.../apache/spark/sql/catalyst/parser/ParseDriver.scala | 2 +-
.../spark/sql/catalyst/parser/ExpressionParserSuite.scala | 12 ++++++++++++
4 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 b/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4
index c172799..c61cda8 100644
--- a/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4
+++ b/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4
@@ -603,7 +603,8 @@ valueExpression
;
primaryExpression
- : CASE whenClause+ (ELSE elseExpression=expression)? END #searchedCase
+ : name=(CURRENT_DATE | CURRENT_TIMESTAMP) #currentDatetime
+ | CASE whenClause+ (ELSE elseExpression=expression)? END #searchedCase
| CASE value=expression whenClause+ (ELSE elseExpression=expression)? END #simpleCase
| CAST '(' expression AS dataType ')' #cast
| STRUCT '(' (argument+=namedExpression (',' argument+=namedExpression)*)? ')' #struct
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
index 111057c..4cce1c1 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
@@ -1212,6 +1212,21 @@ class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging
}
}
+ override def visitCurrentDatetime(ctx: CurrentDatetimeContext): Expression = withOrigin(ctx) {
+ if (conf.ansiParserEnabled) {
+ ctx.name.getType match {
+ case SqlBaseParser.CURRENT_DATE =>
+ CurrentDate()
+ case SqlBaseParser.CURRENT_TIMESTAMP =>
+ CurrentTimestamp()
+ }
+ } else {
+ // If the parser is not in ansi mode, we should return `UnresolvedAttribute`, in case there
+ // are columns named `CURRENT_DATE` or `CURRENT_TIMESTAMP`.
+ UnresolvedAttribute.quoted(ctx.name.getText)
+ }
+ }
+
/**
* Create a [[Cast]] expression.
*/
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 446cb09..1d5de0a 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
@@ -133,7 +133,7 @@ class CatalystSqlParser(conf: SQLConf) extends AbstractSqlParser {
/** For test-only. */
object CatalystSqlParser extends AbstractSqlParser {
- val astBuilder = new AstBuilder(new SQLConf())
+ val astBuilder = new AstBuilder(SQLConf.get)
}
/**
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala
index 7541d9d..7ecad59 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/ExpressionParserSuite.scala
@@ -722,4 +722,16 @@ class ExpressionParserSuite extends PlanTest {
}
}
}
+
+ test("current date/timestamp braceless expressions") {
+ withSQLConf(SQLConf.ANSI_SQL_PARSER.key -> "true") {
+ assertEqual("current_date", CurrentDate())
+ assertEqual("current_timestamp", CurrentTimestamp())
+ }
+
+ withSQLConf(SQLConf.ANSI_SQL_PARSER.key -> "false") {
+ assertEqual("current_date", UnresolvedAttribute.quoted("current_date"))
+ assertEqual("current_timestamp", UnresolvedAttribute.quoted("current_timestamp"))
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org