diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 index 4519e9eac5..8f3991084c 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 @@ -175,6 +175,8 @@ CROSS: 'CROSS'; CUBE: 'CUBE'; CURRENT: 'CURRENT'; CURRENT_CATALOG: 'CURRENT_CATALOG'; +CURRENT_DATE: 'CURRENT_DATE'; +CURRENT_TIME: 'CURRENT_TIME'; CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'; CURRENT_USER: 'CURRENT_USER'; DATA: 'DATA'; @@ -332,6 +334,8 @@ LINK: 'LINK'; LIST: 'LIST'; LOAD: 'LOAD'; LOCAL: 'LOCAL'; +LOCALTIME: 'LOCALTIME'; +LOCALTIMESTAMP: 'LOCALTIMESTAMP'; LOCATION: 'LOCATION'; LOCK: 'LOCK'; LOGICAL: 'LOGICAL'; diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 index 2afcc4d524..3f2ae5a87d 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 @@ -663,6 +663,12 @@ primaryExpression (INTERVAL unitsAmount=valueExpression unit=datetimeUnit | unitsAmount=valueExpression) RIGHT_PAREN #dateCeil + | name=CURRENT_DATE #currentDate + | name=CURRENT_TIME #currentTime + | name=CURRENT_TIMESTAMP #currentTimestamp + | name=LOCALTIME #localTime + | name=LOCALTIMESTAMP #localTimestamp + | name=CURRENT_USER #currentUser | CASE whenClause+ (ELSE elseExpression=expression)? END #searchedCase | CASE value=expression whenClause+ (ELSE elseExpression=expression)? END #simpleCase | name=CAST LEFT_PAREN expression AS dataType RIGHT_PAREN #cast @@ -947,7 +953,10 @@ nonReserved | CREATION | CRON | CURRENT_CATALOG + | CURRENT_DATE + | CURRENT_TIME | CURRENT_TIMESTAMP + | CURRENT_USER | DATA | DATE | DATE_ADD @@ -1036,6 +1045,8 @@ nonReserved | LINES | LINK | LOCAL + | LOCALTIME + | LOCALTIMESTAMP | LOCATION | LOCK | LOGICAL diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java index 6da5a04fe1..e427931d5e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java @@ -262,6 +262,9 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.Array; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArraySlice; import org.apache.doris.nereids.trees.expressions.functions.scalar.Char; import org.apache.doris.nereids.trees.expressions.functions.scalar.ConvertTo; +import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentDate; +import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentTime; +import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentUser; import org.apache.doris.nereids.trees.expressions.functions.scalar.DayCeil; import org.apache.doris.nereids.trees.expressions.functions.scalar.DayFloor; import org.apache.doris.nereids.trees.expressions.functions.scalar.DaysAdd; @@ -285,6 +288,7 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthFloor; import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthsAdd; import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthsDiff; import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthsSub; +import org.apache.doris.nereids.trees.expressions.functions.scalar.Now; import org.apache.doris.nereids.trees.expressions.functions.scalar.SecondCeil; import org.apache.doris.nereids.trees.expressions.functions.scalar.SecondFloor; import org.apache.doris.nereids.trees.expressions.functions.scalar.SecondsAdd; @@ -1751,6 +1755,36 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor { + ", supported time unit: YEAR/MONTH/WEEK/DAY/HOUR/MINUTE/SECOND", ctx); } + @Override + public Expression visitCurrentDate(DorisParser.CurrentDateContext ctx) { + return new CurrentDate().alias("CURRENT_DATE"); + } + + @Override + public Expression visitCurrentTime(DorisParser.CurrentTimeContext ctx) { + return new CurrentTime().alias("CURRENT_TIME"); + } + + @Override + public Expression visitCurrentTimestamp(DorisParser.CurrentTimestampContext ctx) { + return new Now().alias("CURRENT_TIMESTAMP"); + } + + @Override + public Expression visitLocalTime(DorisParser.LocalTimeContext ctx) { + return new CurrentTime().alias("LOCALTIME"); + } + + @Override + public Expression visitLocalTimestamp(DorisParser.LocalTimestampContext ctx) { + return new Now().alias("LOCALTIMESTAMP"); + } + + @Override + public Expression visitCurrentUser(DorisParser.CurrentUserContext ctx) { + return new CurrentUser().alias("CURRENT_USER"); + } + @Override public Expression visitDoublePipes(DorisParser.DoublePipesContext ctx) { return ParserUtils.withOrigin(ctx, () -> { diff --git a/regression-test/suites/nereids_p0/datatype/test_date_acquire.groovy b/regression-test/suites/nereids_p0/datatype/test_date_acquire.groovy index b71c371191..a3545f7402 100644 --- a/regression-test/suites/nereids_p0/datatype/test_date_acquire.groovy +++ b/regression-test/suites/nereids_p0/datatype/test_date_acquire.groovy @@ -20,9 +20,12 @@ suite("test_date_acquire") { sql 'set enable_fallback_to_original_planner=false' sql 'set enable_fold_nondeterministic_fn=true' - String res = sql 'explain select now(), now(3), curdate(), current_date(), current_timestamp(), current_timestamp(3)' - res = res.split('VUNION')[1] - assertFalse(res.contains("()") || res.contains("(3)")) + String res1 = sql 'explain select now(), now(3), curdate(), current_date(), current_timestamp(), current_timestamp(3)' + res1 = res1.split('VUNION')[1] + assertFalse(res1.contains("()") || res1.contains("(3)")) + + String res2 = sql 'explain select CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP, CURRENT_USER' + assertTrue(res2.contains("CURRENT_DATE") || res2.contains("CURRENT_TIME") || res2.contains("CURRENT_TIMESTAMP") || res2.contains("LOCALTIME") || res2.contains("LOCALTIMESTAMP") || res2.contains("CURRENT_USER")) sql "set enable_fold_constant_by_be=true"