Skip to content

Commit

Permalink
[enhancement](Nereids) add timestampadd, timestampdiff functions (apa…
Browse files Browse the repository at this point in the history
  • Loading branch information
keanji-x authored Jan 18, 2023
1 parent 2acf634 commit d8f598e
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,13 @@ primaryExpression
startTimestamp=valueExpression COMMA
endTimestamp=valueExpression
RIGHT_PAREN #timestampdiff
| name=(TIMESTAMPADD | ADDDATE | DAYS_ADD | DATE_ADD)
| name=(TIMESTAMPADD | DATEADD)
LEFT_PAREN
unit=datetimeUnit COMMA
startTimestamp=valueExpression COMMA
endTimestamp=valueExpression
RIGHT_PAREN #timestampadd
| name =(ADDDATE | DAYS_ADD | DATE_ADD)
LEFT_PAREN
timestamp=valueExpression COMMA
(INTERVAL unitsAmount=valueExpression unit=datetimeUnit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
import org.apache.doris.nereids.DorisParser.TableAliasContext;
import org.apache.doris.nereids.DorisParser.TableNameContext;
import org.apache.doris.nereids.DorisParser.TableValuedFunctionContext;
import org.apache.doris.nereids.DorisParser.TimestampaddContext;
import org.apache.doris.nereids.DorisParser.TimestampdiffContext;
import org.apache.doris.nereids.DorisParser.TvfPropertyContext;
import org.apache.doris.nereids.DorisParser.TvfPropertyItemContext;
Expand Down Expand Up @@ -164,6 +165,7 @@
import org.apache.doris.nereids.trees.expressions.functions.scalar.SecondsDiff;
import org.apache.doris.nereids.trees.expressions.functions.scalar.SecondsSub;
import org.apache.doris.nereids.trees.expressions.functions.scalar.WeeksAdd;
import org.apache.doris.nereids.trees.expressions.functions.scalar.WeeksDiff;
import org.apache.doris.nereids.trees.expressions.functions.scalar.WeeksSub;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearsAdd;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearsDiff;
Expand Down Expand Up @@ -754,6 +756,8 @@ public Expression visitTimestampdiff(TimestampdiffContext ctx) {
return new YearsDiff(end, start);
} else if ("MONTH".equalsIgnoreCase(unit)) {
return new MonthsDiff(end, start);
} else if ("WEEK".equalsIgnoreCase(unit)) {
return new WeeksDiff(end, start);
} else if ("DAY".equalsIgnoreCase(unit)) {
return new DaysDiff(end, start);
} else if ("HOUR".equalsIgnoreCase(unit)) {
Expand All @@ -764,7 +768,32 @@ public Expression visitTimestampdiff(TimestampdiffContext ctx) {
return new SecondsDiff(end, start);
}
throw new ParseException("Unsupported time stamp diff time unit: " + unit
+ ", supported time unit: YEAR/MONTH/DAY/HOUR/MINUTE/SECOND", ctx);
+ ", supported time unit: YEAR/MONTH/WEEK/DAY/HOUR/MINUTE/SECOND", ctx);

}

@Override
public Expression visitTimestampadd(TimestampaddContext ctx) {
Expression start = (Expression) visit(ctx.startTimestamp);
Expression end = (Expression) visit(ctx.endTimestamp);
String unit = ctx.unit.getText();
if ("YEAR".equalsIgnoreCase(unit)) {
return new YearsAdd(end, start);
} else if ("MONTH".equalsIgnoreCase(unit)) {
return new MonthsAdd(end, start);
} else if ("WEEK".equalsIgnoreCase(unit)) {
return new WeeksAdd(end, start);
} else if ("DAY".equalsIgnoreCase(unit)) {
return new DaysAdd(end, start);
} else if ("HOUR".equalsIgnoreCase(unit)) {
return new HoursAdd(end, start);
} else if ("MINUTE".equalsIgnoreCase(unit)) {
return new MinutesAdd(end, start);
} else if ("SECOND".equalsIgnoreCase(unit)) {
return new SecondsAdd(end, start);
}
throw new ParseException("Unsupported time stamp add time unit: " + unit
+ ", supported time unit: YEAR/MONTH/WEEK/DAY/HOUR/MINUTE/SECOND", ctx);

}

Expand Down
48 changes: 21 additions & 27 deletions regression-test/data/nereids_syntax_p0/test_date_add.out
Original file line number Diff line number Diff line change
@@ -1,31 +1,4 @@
-- This file is automatically generated. You should know what you did if you want to edit this
-- !select --
2020-01-03

-- !select --
2020-01-03

-- !select --
2020-01-03T00:00

-- !select --
2020-01-03T00:00

-- !select --
2020-01-01T02:00

-- !select --
2020-01-01T02:00

-- !select --
2020-01-01T02:00

-- !select --
2020-01-01T02:00

-- !select --
2022-01-01T00:00

-- !select --
2020-01-01T02:00

Expand Down Expand Up @@ -83,3 +56,24 @@
-- !select --
2019-12-31T23:59:56

-- !sql --
2004-02-01T00:00

-- !sql --
2003-03-01T00:00

-- !sql --
2003-02-08T00:00

-- !sql --
2003-02-02T00:00

-- !sql --
2003-02-01T01:00

-- !sql --
2003-02-01T00:01

-- !sql --
2003-02-01T00:00:01

21 changes: 21 additions & 0 deletions regression-test/data/nereids_syntax_p0/test_date_sub.out
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,24 @@
-- !select --
2020-01-01T00:00:04

-- !sql --
3

-- !sql --
-1

-- !sql --
128885

-- !sql --
7689600

-- !sql --
2136

-- !sql --
89

-- !sql --
12

19 changes: 8 additions & 11 deletions regression-test/suites/nereids_syntax_p0/test_date_add.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,6 @@ suite("test_date_add") {
sql "set enable_fallback_to_original_planner=false"
sql "set enable_fold_constant_by_be=false"

qt_select "select TIMESTAMPADD(cast('2020-01-01' as date), interval 2 day)"
qt_select "select TIMESTAMPADD(cast('2020-01-01' as datev2),interval 2 day)"
qt_select "select TIMESTAMPADD(cast('2020-01-01' as datetime), interval 2 day)"
qt_select "select TIMESTAMPADD(cast('2020-01-01' as datetimev2), interval 2 day)"

qt_select "select TIMESTAMPADD(cast('2020-01-01' as date), interval 2 hour)"
qt_select "select TIMESTAMPADD(cast('2020-01-01' as datev2),interval 2 hour)"
qt_select "select TIMESTAMPADD(cast('2020-01-01' as datetime), interval 2 hour)"
qt_select "select TIMESTAMPADD(cast('2020-01-01' as datetimev2), interval 2 hour)"
qt_select "select TIMESTAMPADD('2020-01-01' , interval 2 year)"

qt_select "SELECT DAYS_ADD('2020-01-01', interval 2 hour)"
qt_select "SELECT DAYS_ADD('2020-01-01', interval 2 minute)"
qt_select "SELECT DAYS_ADD('2020-01-01', interval 2 second)"
Expand All @@ -56,4 +45,12 @@ suite("test_date_add") {

qt_select "SELECT SECONDS_ADD('2020-01-01', 2)"
qt_select "SELECT SECONDS_ADD('2020-01-01', -4)"

qt_sql """ SELECT TIMESTAMPADD(YEAR,1,'2003-02-01'); """
qt_sql """ SELECT TIMESTAMPADD(MONTH,1,'2003-02-01'); """
qt_sql """ SELECT TIMESTAMPADD(WEEK,1,'2003-02-01'); """
qt_sql """ SELECT TIMESTAMPADD(DAY,1,'2003-02-01'); """
qt_sql """ SELECT TIMESTAMPADD(HOUR,1,'2003-02-01'); """
qt_sql """ SELECT TIMESTAMPADD(MINUTE,1,'2003-02-01'); """
qt_sql """ SELECT TIMESTAMPADD(SECOND,1,'2003-02-01'); """
}
10 changes: 10 additions & 0 deletions regression-test/suites/nereids_syntax_p0/test_date_sub.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,14 @@ suite("test_date_sub") {

qt_select "SELECT SECONDS_SUB('2020-01-01', 2)"
qt_select "SELECT SECONDS_SUB('2020-01-01', -4)"

// TIMESTAMPDIFF
qt_sql """ SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01') """
qt_sql """ SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01') """
qt_sql """ SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55') """
qt_sql """ SELECT TIMESTAMPDIFF(SECOND,'2003-02-01','2003-05-01') """
qt_sql """ SELECT TIMESTAMPDIFF(HOUR,'2003-02-01','2003-05-01') """
qt_sql """ SELECT TIMESTAMPDIFF(DAY,'2003-02-01','2003-05-01') """
qt_sql """ SELECT TIMESTAMPDIFF(WEEK,'2003-02-01','2003-05-01') """

}

0 comments on commit d8f598e

Please sign in to comment.