[opt](Nereids) add date_add/sub function (#16048)

1. add week_add week_diff function
2. register all date_add/date_diff function
This commit is contained in:
谢健
2023-01-18 17:11:44 +08:00
committed by GitHub
parent 94628f09e9
commit 1fa2b662cf
9 changed files with 322 additions and 25 deletions

View File

@ -107,7 +107,9 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.DayName;
import org.apache.doris.nereids.trees.expressions.functions.scalar.DayOfMonth;
import org.apache.doris.nereids.trees.expressions.functions.scalar.DayOfWeek;
import org.apache.doris.nereids.trees.expressions.functions.scalar.DayOfYear;
import org.apache.doris.nereids.trees.expressions.functions.scalar.DaysAdd;
import org.apache.doris.nereids.trees.expressions.functions.scalar.DaysDiff;
import org.apache.doris.nereids.trees.expressions.functions.scalar.DaysSub;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Dceil;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Degrees;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Dexp;
@ -150,7 +152,9 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.HllHash;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Hour;
import org.apache.doris.nereids.trees.expressions.functions.scalar.HourCeil;
import org.apache.doris.nereids.trees.expressions.functions.scalar.HourFloor;
import org.apache.doris.nereids.trees.expressions.functions.scalar.HoursAdd;
import org.apache.doris.nereids.trees.expressions.functions.scalar.HoursDiff;
import org.apache.doris.nereids.trees.expressions.functions.scalar.HoursSub;
import org.apache.doris.nereids.trees.expressions.functions.scalar.If;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Initcap;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Instr;
@ -200,13 +204,17 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.Md5Sum;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Minute;
import org.apache.doris.nereids.trees.expressions.functions.scalar.MinuteCeil;
import org.apache.doris.nereids.trees.expressions.functions.scalar.MinuteFloor;
import org.apache.doris.nereids.trees.expressions.functions.scalar.MinutesAdd;
import org.apache.doris.nereids.trees.expressions.functions.scalar.MinutesDiff;
import org.apache.doris.nereids.trees.expressions.functions.scalar.MinutesSub;
import org.apache.doris.nereids.trees.expressions.functions.scalar.MoneyFormat;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Month;
import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthCeil;
import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthFloor;
import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthName;
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.MultiMatchAny;
import org.apache.doris.nereids.trees.expressions.functions.scalar.MultiSearchAllPositions;
import org.apache.doris.nereids.trees.expressions.functions.scalar.MurmurHash332;
@ -244,7 +252,9 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.RunningDiffer
import org.apache.doris.nereids.trees.expressions.functions.scalar.Second;
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;
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.Sign;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Sin;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Size;
@ -306,12 +316,16 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.WeekCeil;
import org.apache.doris.nereids.trees.expressions.functions.scalar.WeekFloor;
import org.apache.doris.nereids.trees.expressions.functions.scalar.WeekOfYear;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Weekday;
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.Year;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearCeil;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearFloor;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearWeek;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearsAdd;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearsDiff;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearsSub;
import com.google.common.collect.ImmutableList;
@ -415,7 +429,9 @@ public class BuiltinScalarFunctions implements FunctionHelper {
scalar(DayOfMonth.class, "dayofmonth"),
scalar(DayOfWeek.class, "dayofweek"),
scalar(DayOfYear.class, "dayofyear"),
scalar(DaysAdd.class, "days_add"),
scalar(DaysDiff.class, "days_diff"),
scalar(DaysSub.class, "days_sub"),
scalar(Dceil.class, "dceil"),
scalar(Degrees.class, "degrees"),
scalar(Dexp.class, "dexp"),
@ -458,7 +474,9 @@ public class BuiltinScalarFunctions implements FunctionHelper {
scalar(Hour.class, "hour"),
scalar(HourCeil.class, "hour_ceil"),
scalar(HourFloor.class, "hour_floor"),
scalar(HoursAdd.class, "hours_add"),
scalar(HoursDiff.class, "hours_diff"),
scalar(HoursSub.class, "hours_sub"),
scalar(If.class, "if"),
scalar(Initcap.class, "initcap"),
scalar(Instr.class, "instr"),
@ -508,13 +526,17 @@ public class BuiltinScalarFunctions implements FunctionHelper {
scalar(Minute.class, "minute"),
scalar(MinuteCeil.class, "minute_ceil"),
scalar(MinuteFloor.class, "minute_floor"),
scalar(MinutesAdd.class, "minutes_add"),
scalar(MinutesDiff.class, "minutes_diff"),
scalar(MinutesSub.class, "minutes_sub"),
scalar(MoneyFormat.class, "money_format"),
scalar(Month.class, "month"),
scalar(MonthCeil.class, "month_ceil"),
scalar(MonthFloor.class, "month_floor"),
scalar(MonthName.class, "monthname"),
scalar(MonthsAdd.class, "months_add"),
scalar(MonthsDiff.class, "months_diff"),
scalar(MonthsSub.class, "months_sub"),
scalar(MultiMatchAny.class, "multi_match_any"),
scalar(MultiSearchAllPositions.class, "multi_search_all_positions"),
scalar(MurmurHash332.class, "murmur_hash3_32"),
@ -552,7 +574,9 @@ public class BuiltinScalarFunctions implements FunctionHelper {
scalar(Second.class, "second"),
scalar(SecondCeil.class, "second_ceil"),
scalar(SecondFloor.class, "second_floor"),
scalar(SecondsAdd.class, "seconds_add"),
scalar(SecondsDiff.class, "seconds_diff"),
scalar(SecondsSub.class, "seconds_sub"),
scalar(Sign.class, "sign"),
scalar(Sin.class, "sin"),
scalar(Size.class, "size"),
@ -614,12 +638,16 @@ public class BuiltinScalarFunctions implements FunctionHelper {
scalar(WeekFloor.class, "week_floor"),
scalar(WeekOfYear.class, "weekofyear"),
scalar(Weekday.class, "weekday"),
scalar(WeeksAdd.class, "weeks_add"),
scalar(WeeksDiff.class, "weeks_diff"),
scalar(WeeksSub.class, "weeks_sub"),
scalar(Year.class, "year"),
scalar(YearCeil.class, "year_ceil"),
scalar(YearFloor.class, "year_floor"),
scalar(YearWeek.class, "yearweek"),
scalar(YearsDiff.class, "years_diff")
scalar(YearsAdd.class, "years_add"),
scalar(YearsDiff.class, "years_diff"),
scalar(YearsSub.class, "years_sub")
);
public static final BuiltinScalarFunctions INSTANCE = new BuiltinScalarFunctions();

View File

@ -163,6 +163,8 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.MonthsSub;
import org.apache.doris.nereids.trees.expressions.functions.scalar.SecondsAdd;
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.WeeksSub;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearsAdd;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearsDiff;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearsSub;
@ -774,22 +776,19 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
return new DaysAdd(timeStamp, amount);
}
if ("DAY".equalsIgnoreCase(ctx.unit.getText())) {
return new DaysAdd(timeStamp, amount);
}
if ("MONTH".equalsIgnoreCase(ctx.unit.getText())) {
return new MonthsAdd(timeStamp, amount);
}
if ("Year".equalsIgnoreCase(ctx.unit.getText())) {
return new YearsAdd(timeStamp, amount);
}
if ("Hour".equalsIgnoreCase(ctx.unit.getText())) {
} else if ("MONTH".equalsIgnoreCase(ctx.unit.getText())) {
return new MonthsAdd(timeStamp, amount);
} else if ("WEEK".equalsIgnoreCase(ctx.unit.getText())) {
return new WeeksAdd(timeStamp, amount);
} else if ("DAY".equalsIgnoreCase(ctx.unit.getText())) {
return new DaysAdd(timeStamp, amount);
} else if ("Hour".equalsIgnoreCase(ctx.unit.getText())) {
return new HoursAdd(timeStamp, amount);
}
if ("Minute".equalsIgnoreCase(ctx.unit.getText())) {
} else if ("Minute".equalsIgnoreCase(ctx.unit.getText())) {
return new MinutesAdd(timeStamp, amount);
}
if ("Second".equalsIgnoreCase(ctx.unit.getText())) {
} else if ("Second".equalsIgnoreCase(ctx.unit.getText())) {
return new SecondsAdd(timeStamp, amount);
}
throw new ParseException("Unsupported time unit: " + ctx.unit
@ -808,22 +807,19 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
return new DaysSub(timeStamp, amount);
}
if ("DAY".equalsIgnoreCase(ctx.unit.getText())) {
return new DaysSub(timeStamp, amount);
}
if ("MONTH".equalsIgnoreCase(ctx.unit.getText())) {
return new MonthsSub(timeStamp, amount);
}
if ("Year".equalsIgnoreCase(ctx.unit.getText())) {
return new YearsSub(timeStamp, amount);
}
if ("Hour".equalsIgnoreCase(ctx.unit.getText())) {
} else if ("MONTH".equalsIgnoreCase(ctx.unit.getText())) {
return new MonthsSub(timeStamp, amount);
} else if ("WEEK".equalsIgnoreCase(ctx.unit.getText())) {
return new WeeksSub(timeStamp, amount);
} else if ("DAY".equalsIgnoreCase(ctx.unit.getText())) {
return new DaysSub(timeStamp, amount);
} else if ("Hour".equalsIgnoreCase(ctx.unit.getText())) {
return new HoursSub(timeStamp, amount);
}
if ("Minute".equalsIgnoreCase(ctx.unit.getText())) {
} else if ("Minute".equalsIgnoreCase(ctx.unit.getText())) {
return new MinutesSub(timeStamp, amount);
}
if ("Second".equalsIgnoreCase(ctx.unit.getText())) {
} else if ("Second".equalsIgnoreCase(ctx.unit.getText())) {
return new SecondsSub(timeStamp, amount);
}
throw new ParseException("Unsupported time unit: " + ctx.unit

View File

@ -0,0 +1,77 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package org.apache.doris.nereids.trees.expressions.functions.scalar;
import org.apache.doris.catalog.FunctionSignature;
import org.apache.doris.common.Config;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeType;
import org.apache.doris.nereids.types.DateTimeV2Type;
import org.apache.doris.nereids.types.DateType;
import org.apache.doris.nereids.types.DateV2Type;
import org.apache.doris.nereids.types.IntegerType;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import java.util.List;
/**
* ScalarFunction 'weeks_add'.
*/
public class WeeksAdd extends ScalarFunction implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable {
//When enable_date_conversion is true, we prefer to V2 signature.
// This preference follows original planner. refer to ScalarType.getDefaultDateType()
public static final List<FunctionSignature> SIGNATURES = Config.enable_date_conversion ? ImmutableList.of(
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
.args(DateTimeV2Type.SYSTEM_DEFAULT, IntegerType.INSTANCE),
FunctionSignature.ret(DateV2Type.INSTANCE).args(DateV2Type.INSTANCE, IntegerType.INSTANCE),
FunctionSignature.ret(DateTimeType.INSTANCE).args(DateTimeType.INSTANCE, IntegerType.INSTANCE),
FunctionSignature.ret(DateType.INSTANCE).args(DateType.INSTANCE, IntegerType.INSTANCE)
) : ImmutableList.of(
FunctionSignature.ret(DateTimeType.INSTANCE).args(DateTimeType.INSTANCE, IntegerType.INSTANCE),
FunctionSignature.ret(DateType.INSTANCE).args(DateType.INSTANCE, IntegerType.INSTANCE),
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
.args(DateTimeV2Type.SYSTEM_DEFAULT, IntegerType.INSTANCE),
FunctionSignature.ret(DateV2Type.INSTANCE).args(DateV2Type.INSTANCE, IntegerType.INSTANCE)
);
public WeeksAdd(Expression arg0, Expression arg1) {
super("weeks_add", arg0, arg1);
}
@Override
public WeeksAdd withChildren(List<Expression> children) {
Preconditions.checkArgument(children.size() == 2);
return new WeeksAdd(children.get(0), children.get(1));
}
@Override
public List<FunctionSignature> getSignatures() {
return SIGNATURES;
}
@Override
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitWeeksAdd(this, context);
}
}

View File

@ -0,0 +1,77 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package org.apache.doris.nereids.trees.expressions.functions.scalar;
import org.apache.doris.catalog.FunctionSignature;
import org.apache.doris.common.Config;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeType;
import org.apache.doris.nereids.types.DateTimeV2Type;
import org.apache.doris.nereids.types.DateType;
import org.apache.doris.nereids.types.DateV2Type;
import org.apache.doris.nereids.types.IntegerType;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import java.util.List;
/**
* ScalarFunction 'weeks_sub'.
*/
public class WeeksSub extends ScalarFunction implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable {
//When enable_date_conversion is true, we prefer to V2 signature.
// This preference follows original planner. refer to ScalarType.getDefaultDateType()
public static final List<FunctionSignature> SIGNATURES = Config.enable_date_conversion ? ImmutableList.of(
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
.args(DateTimeV2Type.SYSTEM_DEFAULT, IntegerType.INSTANCE),
FunctionSignature.ret(DateV2Type.INSTANCE).args(DateV2Type.INSTANCE, IntegerType.INSTANCE),
FunctionSignature.ret(DateTimeType.INSTANCE).args(DateTimeType.INSTANCE, IntegerType.INSTANCE),
FunctionSignature.ret(DateType.INSTANCE).args(DateType.INSTANCE, IntegerType.INSTANCE)
) : ImmutableList.of(
FunctionSignature.ret(DateTimeType.INSTANCE).args(DateTimeType.INSTANCE, IntegerType.INSTANCE),
FunctionSignature.ret(DateType.INSTANCE).args(DateType.INSTANCE, IntegerType.INSTANCE),
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
.args(DateTimeV2Type.SYSTEM_DEFAULT, IntegerType.INSTANCE),
FunctionSignature.ret(DateV2Type.INSTANCE).args(DateV2Type.INSTANCE, IntegerType.INSTANCE)
);
public WeeksSub(Expression arg0, Expression arg1) {
super("weeks_sub", arg0, arg1);
}
@Override
public WeeksSub withChildren(List<Expression> children) {
Preconditions.checkArgument(children.size() == 2);
return new WeeksSub(children.get(0), children.get(1));
}
@Override
public List<FunctionSignature> getSignatures() {
return SIGNATURES;
}
@Override
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitWeeksSub(this, context);
}
}

View File

@ -315,7 +315,9 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.WeekCeil;
import org.apache.doris.nereids.trees.expressions.functions.scalar.WeekFloor;
import org.apache.doris.nereids.trees.expressions.functions.scalar.WeekOfYear;
import org.apache.doris.nereids.trees.expressions.functions.scalar.Weekday;
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.Year;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearCeil;
import org.apache.doris.nereids.trees.expressions.functions.scalar.YearFloor;
@ -1525,10 +1527,18 @@ public interface ScalarFunctionVisitor<R, C> {
return visitScalarFunction(weekday, context);
}
default R visitWeeksAdd(WeeksAdd weeksAdd, C context) {
return visitScalarFunction(weeksAdd, context);
}
default R visitWeeksDiff(WeeksDiff weeksDiff, C context) {
return visitScalarFunction(weeksDiff, context);
}
default R visitWeeksSub(WeeksSub weeksSub, C context) {
return visitScalarFunction(weeksSub, context);
}
default R visitYear(Year year, C context) {
return visitScalarFunction(year, context);
}

View File

@ -47,3 +47,39 @@
-- !select --
2019-12-28T00:00
-- !select --
2022-01-01T00:00
-- !select --
2016-01-01T00:00
-- !select --
2020-03-01T00:00
-- !select --
2019-09-01T00:00
-- !select --
2020-01-15T00:00
-- !select --
2019-12-04T00:00
-- !select --
2020-01-01T02:00
-- !select --
2019-12-31T20:00
-- !select --
2020-01-01T00:02
-- !select --
2019-12-31T23:56
-- !select --
2020-01-01T00:00:02
-- !select --
2019-12-31T23:59:56

View File

@ -53,3 +53,39 @@
-- !select --
2020-01-05T00:00
-- !select --
2018-01-01T00:00
-- !select --
2024-01-01T00:00
-- !select --
2019-11-01T00:00
-- !select --
2020-05-01T00:00
-- !select --
2019-12-18T00:00
-- !select --
2020-01-29T00:00
-- !select --
2019-12-31T22:00
-- !select --
2020-01-01T04:00
-- !select --
2019-12-31T23:58
-- !select --
2020-01-01T00:04
-- !select --
2019-12-31T23:59:58
-- !select --
2020-01-01T00:00:04

View File

@ -38,4 +38,22 @@ suite("test_date_add") {
qt_select "SELECT ADDDATE('2020-01-01', interval 2 day)"
qt_select "SELECT DAYS_ADD('2020-01-01', 2)"
qt_select "SELECT DAYS_ADD('2020-01-01', -4)"
qt_select "SELECT YEARS_ADD('2020-01-01', 2)"
qt_select "SELECT YEARS_ADD('2020-01-01', -4)"
qt_select "SELECT MONTHS_ADD('2020-01-01', 2)"
qt_select "SELECT MONTHS_ADD('2020-01-01', -4)"
qt_select "SELECT WEEKS_ADD('2020-01-01', 2)"
qt_select "SELECT WEEKS_ADD('2020-01-01', -4)"
qt_select "SELECT HOURS_ADD('2020-01-01', 2)"
qt_select "SELECT HOURS_ADD('2020-01-01', -4)"
qt_select "SELECT MINUTES_ADD('2020-01-01', 2)"
qt_select "SELECT MINUTES_ADD('2020-01-01', -4)"
qt_select "SELECT SECONDS_ADD('2020-01-01', 2)"
qt_select "SELECT SECONDS_ADD('2020-01-01', -4)"
}

View File

@ -18,6 +18,7 @@
suite("test_date_sub") {
sql "set enable_nereids_planner=true"
sql "set enable_fallback_to_original_planner=false"
sql "set enable_fold_constant_by_be=false"
qt_select "select DAYS_SUB(cast('2020-01-01' as date), interval 2 year)"
qt_select "select DAYS_SUB(cast('2020-01-01' as datev2),interval 2 year)"
@ -39,4 +40,22 @@ suite("test_date_sub") {
qt_select "SELECT SUBDATE('2020-01-01', interval 2 day)"
qt_select "SELECT DAYS_SUB('2020-01-01', 2)"
qt_select "SELECT DAYS_SUB('2020-01-01', -4)"
qt_select "SELECT YEARS_SUB('2020-01-01', 2)"
qt_select "SELECT YEARS_SUB('2020-01-01', -4)"
qt_select "SELECT MONTHS_SUB('2020-01-01', 2)"
qt_select "SELECT MONTHS_SUB('2020-01-01', -4)"
qt_select "SELECT WEEKS_SUB('2020-01-01', 2)"
qt_select "SELECT WEEKS_SUB('2020-01-01', -4)"
qt_select "SELECT HOURS_SUB('2020-01-01', 2)"
qt_select "SELECT HOURS_SUB('2020-01-01', -4)"
qt_select "SELECT MINUTES_SUB('2020-01-01', 2)"
qt_select "SELECT MINUTES_SUB('2020-01-01', -4)"
qt_select "SELECT SECONDS_SUB('2020-01-01', 2)"
qt_select "SELECT SECONDS_SUB('2020-01-01', -4)"
}