From fc765fc1f2a40131c9d6d745119178d4dc7530d5 Mon Sep 17 00:00:00 2001 From: Wenchen Fan Date: Sat, 9 Mar 2019 21:18:18 +0800 Subject: [PATCH 1/3] current_date/current_timestamp should not refer to columns with ansi parser mode --- .../apache/spark/sql/catalyst/parser/SqlBase.g4 | 3 ++- .../spark/sql/catalyst/parser/AstBuilder.scala | 15 +++++++++++++++ .../spark/sql/catalyst/parser/ParseDriver.scala | 2 +- .../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 46fff8077e68c..11b88e9b17436 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 111057c9a8b37..c978c20b32242 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): AnyRef = { + 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 446cb0964188a..1d5de0a353304 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 7541d9d089b2c..7ecad5927dc5e 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")) + } + } } From 1c0cbddc38f2448dd61bf8017b177c92d5d625bf Mon Sep 17 00:00:00 2001 From: Wenchen Fan Date: Mon, 11 Mar 2019 13:29:49 +0800 Subject: [PATCH 2/3] addree comment --- .../scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c978c20b32242..b96739c3c3a3d 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,7 +1212,7 @@ class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging } } - override def visitCurrentDatetime(ctx: CurrentDatetimeContext): AnyRef = { + override def visitCurrentDatetime(ctx: CurrentDatetimeContext): AnyRef = withOrigin(ctx) { if (conf.ansiParserEnabled) { ctx.name.getType match { case SqlBaseParser.CURRENT_DATE => From e014ff01eb987414b602376f57905246d3a22b0d Mon Sep 17 00:00:00 2001 From: Wenchen Fan Date: Mon, 11 Mar 2019 15:26:41 +0800 Subject: [PATCH 3/3] one more comment --- .../scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b96739c3c3a3d..4cce1c1c70ade 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,7 +1212,7 @@ class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging } } - override def visitCurrentDatetime(ctx: CurrentDatetimeContext): AnyRef = withOrigin(ctx) { + override def visitCurrentDatetime(ctx: CurrentDatetimeContext): Expression = withOrigin(ctx) { if (conf.ansiParserEnabled) { ctx.name.getType match { case SqlBaseParser.CURRENT_DATE =>