You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/12/05 09:59:53 UTC
[doris] branch master updated: [refactor](date function) simplify function template arguments (#14814)
This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 016e47b857 [refactor](date function) simplify function template arguments (#14814)
016e47b857 is described below
commit 016e47b857a21d6d0b77fd3ad0d3364a59a67d0d
Author: Gabriel <ga...@gmail.com>
AuthorDate: Mon Dec 5 17:59:47 2022 +0800
[refactor](date function) simplify function template arguments (#14814)
---
.../function_date_or_datetime_computation.cpp | 99 ++++-----
.../function_date_or_datetime_computation.h | 224 +++++++++++----------
.../function_date_or_datetime_computation_v2.cpp | 174 +++++++---------
3 files changed, 231 insertions(+), 266 deletions(-)
diff --git a/be/src/vec/functions/function_date_or_datetime_computation.cpp b/be/src/vec/functions/function_date_or_datetime_computation.cpp
index 02dd86b58e..abaef68c4c 100644
--- a/be/src/vec/functions/function_date_or_datetime_computation.cpp
+++ b/be/src/vec/functions/function_date_or_datetime_computation.cpp
@@ -21,63 +21,48 @@
namespace doris::vectorized {
-using FunctionAddSeconds = FunctionDateOrDateTimeComputation<
- AddSecondsImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionAddMinutes = FunctionDateOrDateTimeComputation<
- AddMinutesImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionAddHours =
- FunctionDateOrDateTimeComputation<AddHoursImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionAddDays =
- FunctionDateOrDateTimeComputation<AddDaysImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionAddWeeks =
- FunctionDateOrDateTimeComputation<AddWeeksImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionAddMonths =
- FunctionDateOrDateTimeComputation<AddMonthsImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionAddQuarters = FunctionDateOrDateTimeComputation<
- AddQuartersImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionAddYears =
- FunctionDateOrDateTimeComputation<AddYearsImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-
-using FunctionSubSeconds = FunctionDateOrDateTimeComputation<
- SubtractSecondsImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionSubMinutes = FunctionDateOrDateTimeComputation<
- SubtractMinutesImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionSubHours = FunctionDateOrDateTimeComputation<
- SubtractHoursImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionSubDays = FunctionDateOrDateTimeComputation<
- SubtractDaysImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionSubWeeks = FunctionDateOrDateTimeComputation<
- SubtractWeeksImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionSubMonths = FunctionDateOrDateTimeComputation<
- SubtractMonthsImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionSubQuarters = FunctionDateOrDateTimeComputation<
- SubtractQuartersImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-using FunctionSubYears = FunctionDateOrDateTimeComputation<
- SubtractYearsImpl<DataTypeDateTime, Int64, DataTypeDateTime>>;
-
-using FunctionDateDiff = FunctionDateOrDateTimeComputation<DateDiffImpl<
- VecDateTimeValue, VecDateTimeValue, DataTypeDateTime, DataTypeDateTime, Int64, Int64>>;
-using FunctionTimeDiff = FunctionDateOrDateTimeComputation<TimeDiffImpl<
- VecDateTimeValue, VecDateTimeValue, DataTypeDateTime, DataTypeDateTime, Int64, Int64>>;
-using FunctionYearsDiff = FunctionDateOrDateTimeComputation<YearsDiffImpl<
- VecDateTimeValue, VecDateTimeValue, DataTypeDateTime, DataTypeDateTime, Int64, Int64>>;
-using FunctionMonthsDiff = FunctionDateOrDateTimeComputation<MonthsDiffImpl<
- VecDateTimeValue, VecDateTimeValue, DataTypeDateTime, DataTypeDateTime, Int64, Int64>>;
-using FunctionDaysDiff = FunctionDateOrDateTimeComputation<DaysDiffImpl<
- VecDateTimeValue, VecDateTimeValue, DataTypeDateTime, DataTypeDateTime, Int64, Int64>>;
-using FunctionWeeksDiff = FunctionDateOrDateTimeComputation<WeeksDiffImpl<
- VecDateTimeValue, VecDateTimeValue, DataTypeDateTime, DataTypeDateTime, Int64, Int64>>;
-using FunctionHoursDiff = FunctionDateOrDateTimeComputation<HoursDiffImpl<
- VecDateTimeValue, VecDateTimeValue, DataTypeDateTime, DataTypeDateTime, Int64, Int64>>;
-using FunctionMinutesDiff = FunctionDateOrDateTimeComputation<MintueSDiffImpl<
- VecDateTimeValue, VecDateTimeValue, DataTypeDateTime, DataTypeDateTime, Int64, Int64>>;
-using FunctionSecondsDiff = FunctionDateOrDateTimeComputation<SecondsDiffImpl<
- VecDateTimeValue, VecDateTimeValue, DataTypeDateTime, DataTypeDateTime, Int64, Int64>>;
-
-using FunctionToYearWeekTwoArgs = FunctionDateOrDateTimeComputation<
- ToYearWeekTwoArgsImpl<VecDateTimeValue, DataTypeDateTime, Int64>>;
-using FunctionToWeekTwoArgs = FunctionDateOrDateTimeComputation<
- ToWeekTwoArgsImpl<VecDateTimeValue, DataTypeDateTime, Int64>>;
+using FunctionAddSeconds = FunctionDateOrDateTimeComputation<AddSecondsImpl<DataTypeDateTime>>;
+using FunctionAddMinutes = FunctionDateOrDateTimeComputation<AddMinutesImpl<DataTypeDateTime>>;
+using FunctionAddHours = FunctionDateOrDateTimeComputation<AddHoursImpl<DataTypeDateTime>>;
+using FunctionAddDays = FunctionDateOrDateTimeComputation<AddDaysImpl<DataTypeDateTime>>;
+using FunctionAddWeeks = FunctionDateOrDateTimeComputation<AddWeeksImpl<DataTypeDateTime>>;
+using FunctionAddMonths = FunctionDateOrDateTimeComputation<AddMonthsImpl<DataTypeDateTime>>;
+using FunctionAddQuarters = FunctionDateOrDateTimeComputation<AddQuartersImpl<DataTypeDateTime>>;
+using FunctionAddYears = FunctionDateOrDateTimeComputation<AddYearsImpl<DataTypeDateTime>>;
+
+using FunctionSubSeconds = FunctionDateOrDateTimeComputation<SubtractSecondsImpl<DataTypeDateTime>>;
+using FunctionSubMinutes = FunctionDateOrDateTimeComputation<SubtractMinutesImpl<DataTypeDateTime>>;
+using FunctionSubHours = FunctionDateOrDateTimeComputation<SubtractHoursImpl<DataTypeDateTime>>;
+using FunctionSubDays = FunctionDateOrDateTimeComputation<SubtractDaysImpl<DataTypeDateTime>>;
+using FunctionSubWeeks = FunctionDateOrDateTimeComputation<SubtractWeeksImpl<DataTypeDateTime>>;
+using FunctionSubMonths = FunctionDateOrDateTimeComputation<SubtractMonthsImpl<DataTypeDateTime>>;
+using FunctionSubQuarters =
+ FunctionDateOrDateTimeComputation<SubtractQuartersImpl<DataTypeDateTime>>;
+using FunctionSubYears = FunctionDateOrDateTimeComputation<SubtractYearsImpl<DataTypeDateTime>>;
+
+using FunctionDateDiff =
+ FunctionDateOrDateTimeComputation<DateDiffImpl<DataTypeDateTime, DataTypeDateTime>>;
+using FunctionTimeDiff =
+ FunctionDateOrDateTimeComputation<TimeDiffImpl<DataTypeDateTime, DataTypeDateTime>>;
+using FunctionYearsDiff =
+ FunctionDateOrDateTimeComputation<YearsDiffImpl<DataTypeDateTime, DataTypeDateTime>>;
+using FunctionMonthsDiff =
+ FunctionDateOrDateTimeComputation<MonthsDiffImpl<DataTypeDateTime, DataTypeDateTime>>;
+using FunctionDaysDiff =
+ FunctionDateOrDateTimeComputation<DaysDiffImpl<DataTypeDateTime, DataTypeDateTime>>;
+using FunctionWeeksDiff =
+ FunctionDateOrDateTimeComputation<WeeksDiffImpl<DataTypeDateTime, DataTypeDateTime>>;
+using FunctionHoursDiff =
+ FunctionDateOrDateTimeComputation<HoursDiffImpl<DataTypeDateTime, DataTypeDateTime>>;
+using FunctionMinutesDiff =
+ FunctionDateOrDateTimeComputation<MintueSDiffImpl<DataTypeDateTime, DataTypeDateTime>>;
+using FunctionSecondsDiff =
+ FunctionDateOrDateTimeComputation<SecondsDiffImpl<DataTypeDateTime, DataTypeDateTime>>;
+
+using FunctionToYearWeekTwoArgs =
+ FunctionDateOrDateTimeComputation<ToYearWeekTwoArgsImpl<DataTypeDateTime>>;
+using FunctionToWeekTwoArgs =
+ FunctionDateOrDateTimeComputation<ToWeekTwoArgsImpl<DataTypeDateTime>>;
struct NowFunctionName {
static constexpr auto name = "now";
diff --git a/be/src/vec/functions/function_date_or_datetime_computation.h b/be/src/vec/functions/function_date_or_datetime_computation.h
index a22bc1a357..4900f1a48a 100644
--- a/be/src/vec/functions/function_date_or_datetime_computation.h
+++ b/be/src/vec/functions/function_date_or_datetime_computation.h
@@ -32,8 +32,8 @@
#include "vec/runtime/vdatetime_value.h"
namespace doris::vectorized {
-template <TimeUnit unit, typename Arg, typename DateValueType, typename ResultDateValueType,
- typename ResultType>
+template <TimeUnit unit, typename DateValueType, typename ResultDateValueType, typename ResultType,
+ typename Arg>
extern ResultType date_time_add(const Arg& t, Int64 delta, bool& is_null) {
auto ts_value = binary_cast<Arg, DateValueType>(t);
TimeInterval interval(unit, delta, false);
@@ -51,9 +51,20 @@ extern ResultType date_time_add(const Arg& t, Int64 delta, bool& is_null) {
}
#define ADD_TIME_FUNCTION_IMPL(CLASS, NAME, UNIT) \
- template <typename DateType, typename ArgType, typename ResultType> \
+ template <typename DateType> \
struct CLASS { \
- using ReturnType = ResultType; \
+ using ReturnType = std::conditional_t< \
+ std::is_same_v<DateType, DataTypeDate> || \
+ std::is_same_v<DateType, DataTypeDateTime>, \
+ DataTypeDateTime, \
+ std::conditional_t< \
+ std::is_same_v<DateType, DataTypeDateV2>, \
+ std::conditional_t<TimeUnit::UNIT == TimeUnit::HOUR || \
+ TimeUnit::UNIT == TimeUnit::MINUTE || \
+ TimeUnit::UNIT == TimeUnit::SECOND || \
+ TimeUnit::UNIT == TimeUnit::SECOND_MICROSECOND, \
+ DataTypeDateTimeV2, DataTypeDateV2>, \
+ DataTypeDateTimeV2>>; \
using ReturnNativeType = std::conditional_t< \
std::is_same_v<DateType, DataTypeDate> || \
std::is_same_v<DateType, DataTypeDateTime>, \
@@ -66,12 +77,18 @@ extern ResultType date_time_add(const Arg& t, Int64 delta, bool& is_null) {
TimeUnit::UNIT == TimeUnit::SECOND_MICROSECOND, \
UInt64, UInt32>, \
UInt64>>; \
+ using InputNativeType = std::conditional_t< \
+ std::is_same_v<DateType, DataTypeDate> || \
+ std::is_same_v<DateType, DataTypeDateTime>, \
+ Int64, \
+ std::conditional_t<std::is_same_v<DateType, DataTypeDateV2>, UInt32, UInt64>>; \
static constexpr auto name = #NAME; \
static constexpr auto is_nullable = true; \
- static inline ReturnNativeType execute(const ArgType& t, Int64 delta, bool& is_null) { \
+ static inline ReturnNativeType execute(const InputNativeType& t, Int64 delta, \
+ bool& is_null) { \
if constexpr (std::is_same_v<DateType, DataTypeDate> || \
std::is_same_v<DateType, DataTypeDateTime>) { \
- return date_time_add<TimeUnit::UNIT, ArgType, doris::vectorized::VecDateTimeValue, \
+ return date_time_add<TimeUnit::UNIT, doris::vectorized::VecDateTimeValue, \
doris::vectorized::VecDateTimeValue, ReturnNativeType>( \
t, delta, is_null); \
} else if constexpr (std::is_same_v<DateType, DataTypeDateV2>) { \
@@ -79,17 +96,17 @@ extern ResultType date_time_add(const Arg& t, Int64 delta, bool& is_null) {
TimeUnit::UNIT == TimeUnit::MINUTE || \
TimeUnit::UNIT == TimeUnit::SECOND || \
TimeUnit::UNIT == TimeUnit::SECOND_MICROSECOND) { \
- return date_time_add<TimeUnit::UNIT, ArgType, DateV2Value<DateV2ValueType>, \
+ return date_time_add<TimeUnit::UNIT, DateV2Value<DateV2ValueType>, \
DateV2Value<DateTimeV2ValueType>, ReturnNativeType>( \
t, delta, is_null); \
} else { \
- return date_time_add<TimeUnit::UNIT, ArgType, DateV2Value<DateV2ValueType>, \
+ return date_time_add<TimeUnit::UNIT, DateV2Value<DateV2ValueType>, \
DateV2Value<DateV2ValueType>, ReturnNativeType>(t, delta, \
is_null); \
} \
\
} else { \
- return date_time_add<TimeUnit::UNIT, ArgType, DateV2Value<DateTimeV2ValueType>, \
+ return date_time_add<TimeUnit::UNIT, DateV2Value<DateTimeV2ValueType>, \
DateV2Value<DateTimeV2ValueType>, ReturnNativeType>(t, delta, \
is_null); \
} \
@@ -108,25 +125,33 @@ ADD_TIME_FUNCTION_IMPL(AddWeeksImpl, weeks_add, WEEK);
ADD_TIME_FUNCTION_IMPL(AddMonthsImpl, months_add, MONTH);
ADD_TIME_FUNCTION_IMPL(AddYearsImpl, years_add, YEAR);
-template <typename DateType, typename ArgType, typename ResultType>
+template <typename DateType>
struct AddQuartersImpl {
- using ReturnType = ResultType;
+ using ReturnType =
+ std::conditional_t<std::is_same_v<DateType, DataTypeDate> ||
+ std::is_same_v<DateType, DataTypeDateTime>,
+ DataTypeDateTime,
+ std::conditional_t<std::is_same_v<DateType, DataTypeDateV2>,
+ DataTypeDateV2, DataTypeDateTimeV2>>;
+ using InputNativeType = std::conditional_t<
+ std::is_same_v<DateType, DataTypeDate> || std::is_same_v<DateType, DataTypeDateTime>,
+ Int64, std::conditional_t<std::is_same_v<DateType, DataTypeDateV2>, UInt32, UInt64>>;
using ReturnNativeType = std::conditional_t<
std::is_same_v<DateType, DataTypeDate> || std::is_same_v<DateType, DataTypeDateTime>,
Int64, std::conditional_t<std::is_same_v<DateType, DataTypeDateV2>, UInt32, UInt64>>;
static constexpr auto name = "quarters_add";
static constexpr auto is_nullable = true;
- static inline ReturnNativeType execute(const ArgType& t, Int64 delta, bool& is_null) {
+ static inline ReturnNativeType execute(const InputNativeType& t, Int64 delta, bool& is_null) {
if constexpr (std::is_same_v<DateType, DataTypeDate> ||
std::is_same_v<DateType, DataTypeDateTime>) {
- return date_time_add<TimeUnit::MONTH, ArgType, doris::vectorized::VecDateTimeValue,
+ return date_time_add<TimeUnit::MONTH, doris::vectorized::VecDateTimeValue,
doris::vectorized::VecDateTimeValue, ReturnNativeType>(t, delta,
is_null);
} else if constexpr (std::is_same_v<DateType, DataTypeDateV2>) {
- return date_time_add<TimeUnit::MONTH, ArgType, DateV2Value<DateV2ValueType>,
+ return date_time_add<TimeUnit::MONTH, DateV2Value<DateV2ValueType>,
DateV2Value<DateV2ValueType>, ReturnNativeType>(t, delta, is_null);
} else {
- return date_time_add<TimeUnit::MONTH, ArgType, DateV2Value<DateTimeV2ValueType>,
+ return date_time_add<TimeUnit::MONTH, DateV2Value<DateTimeV2ValueType>,
DateV2Value<DateTimeV2ValueType>, ReturnNativeType>(t, delta,
is_null);
}
@@ -135,11 +160,12 @@ struct AddQuartersImpl {
static DataTypes get_variadic_argument_types() { return {std::make_shared<DateType>()}; }
};
-template <typename Transform, typename DateType, typename ArgType, typename ResultType>
+template <typename Transform, typename DateType>
struct SubtractIntervalImpl {
- using ReturnType = ResultType;
+ using ReturnType = typename Transform::ReturnType;
+ using InputNativeType = typename Transform::InputNativeType;
static constexpr auto is_nullable = true;
- static inline Int64 execute(const ArgType& t, Int64 delta, bool& is_null) {
+ static inline Int64 execute(const InputNativeType& t, Int64 delta, bool& is_null) {
return Transform::execute(t, -delta, is_null);
}
@@ -148,108 +174,81 @@ struct SubtractIntervalImpl {
}
};
-template <typename DateType, typename ArgType, typename ResultType>
-struct SubtractSecondsImpl : SubtractIntervalImpl<AddSecondsImpl<DateType, ArgType, ResultType>,
- DateType, ArgType, ResultType> {
+template <typename DateType>
+struct SubtractSecondsImpl : SubtractIntervalImpl<AddSecondsImpl<DateType>, DateType> {
static constexpr auto name = "seconds_sub";
};
-template <typename DateType, typename ArgType, typename ResultType>
-struct SubtractMinutesImpl : SubtractIntervalImpl<AddMinutesImpl<DateType, ArgType, ResultType>,
- DateType, ArgType, ResultType> {
+template <typename DateType>
+struct SubtractMinutesImpl : SubtractIntervalImpl<AddMinutesImpl<DateType>, DateType> {
static constexpr auto name = "minutes_sub";
};
-template <typename DateType, typename ArgType, typename ResultType>
-struct SubtractHoursImpl : SubtractIntervalImpl<AddHoursImpl<DateType, ArgType, ResultType>,
- DateType, ArgType, ResultType> {
+template <typename DateType>
+struct SubtractHoursImpl : SubtractIntervalImpl<AddHoursImpl<DateType>, DateType> {
static constexpr auto name = "hours_sub";
};
-template <typename DateType, typename ArgType, typename ResultType>
-struct SubtractDaysImpl : SubtractIntervalImpl<AddDaysImpl<DateType, ArgType, ResultType>, DateType,
- ArgType, ResultType> {
+template <typename DateType>
+struct SubtractDaysImpl : SubtractIntervalImpl<AddDaysImpl<DateType>, DateType> {
static constexpr auto name = "days_sub";
};
-template <typename DateType, typename ArgType, typename ResultType>
-struct SubtractWeeksImpl : SubtractIntervalImpl<AddWeeksImpl<DateType, ArgType, ResultType>,
- DateType, ArgType, ResultType> {
+template <typename DateType>
+struct SubtractWeeksImpl : SubtractIntervalImpl<AddWeeksImpl<DateType>, DateType> {
static constexpr auto name = "weeks_sub";
};
-template <typename DateType, typename ArgType, typename ResultType>
-struct SubtractMonthsImpl : SubtractIntervalImpl<AddMonthsImpl<DateType, ArgType, ResultType>,
- DateType, ArgType, ResultType> {
+template <typename DateType>
+struct SubtractMonthsImpl : SubtractIntervalImpl<AddMonthsImpl<DateType>, DateType> {
static constexpr auto name = "months_sub";
};
-template <typename DateType, typename ArgType, typename ResultType>
-struct SubtractQuartersImpl : SubtractIntervalImpl<AddQuartersImpl<DateType, ArgType, ResultType>,
- DateType, ArgType, ResultType> {
+template <typename DateType>
+struct SubtractQuartersImpl : SubtractIntervalImpl<AddQuartersImpl<DateType>, DateType> {
static constexpr auto name = "quarters_sub";
};
-template <typename DateType, typename ArgType, typename ResultType>
-struct SubtractYearsImpl : SubtractIntervalImpl<AddYearsImpl<DateType, ArgType, ResultType>,
- DateType, ArgType, ResultType> {
+template <typename DateType>
+struct SubtractYearsImpl : SubtractIntervalImpl<AddYearsImpl<DateType>, DateType> {
static constexpr auto name = "years_sub";
};
-template <typename DateValueType1, typename DateValueType2, typename DateType1, typename DateType2,
- typename ArgType1, typename ArgType2>
-struct DateDiffImpl {
- using ReturnType = DataTypeInt32;
- static constexpr auto name = "datediff";
- static constexpr auto is_nullable = false;
- static inline Int32 execute(const ArgType1& t0, const ArgType2& t1, bool& is_null) {
- const auto& ts0 = reinterpret_cast<const DateValueType1&>(t0);
- const auto& ts1 = reinterpret_cast<const DateValueType2&>(t1);
- is_null = !ts0.is_valid_date() || !ts1.is_valid_date();
- return ts0.daynr() - ts1.daynr();
- }
-
- static DataTypes get_variadic_argument_types() {
- return {std::make_shared<DateType1>(), std::make_shared<DateType2>()};
- }
-};
-
-template <typename DateValueType1, typename DateValueType2, typename DateType1, typename DateType2,
- typename ArgType1, typename ArgType2>
-struct TimeDiffImpl {
- using ReturnType = DataTypeFloat64;
- static constexpr auto name = "timediff";
- static constexpr auto is_nullable = false;
- static inline double execute(const ArgType1& t0, const ArgType2& t1, bool& is_null) {
- const auto& ts0 = reinterpret_cast<const DateValueType1&>(t0);
- const auto& ts1 = reinterpret_cast<const DateValueType2&>(t1);
- is_null = !ts0.is_valid_date() || !ts1.is_valid_date();
- return ts0.second_diff(ts1);
- }
-
- static DataTypes get_variadic_argument_types() {
- return {std::make_shared<DateType1>(), std::make_shared<DateType2>()};
- }
-};
+#define DECLARE_DATE_FUNCTIONS(NAME, FN_NAME, RETURN_TYPE, STMT) \
+ template <typename DateType1, typename DateType2> \
+ struct NAME { \
+ using ArgType1 = std::conditional_t< \
+ std::is_same_v<DateType1, DataTypeDateV2>, UInt32, \
+ std::conditional_t<std::is_same_v<DateType1, DataTypeDateTimeV2>, UInt64, Int64>>; \
+ using ArgType2 = std::conditional_t< \
+ std::is_same_v<DateType2, DataTypeDateV2>, UInt32, \
+ std::conditional_t<std::is_same_v<DateType2, DataTypeDateTimeV2>, UInt64, Int64>>; \
+ using DateValueType1 = std::conditional_t< \
+ std::is_same_v<DateType1, DataTypeDateV2>, DateV2Value<DateV2ValueType>, \
+ std::conditional_t<std::is_same_v<DateType1, DataTypeDateTimeV2>, \
+ DateV2Value<DateTimeV2ValueType>, VecDateTimeValue>>; \
+ using DateValueType2 = std::conditional_t< \
+ std::is_same_v<DateType2, DataTypeDateV2>, DateV2Value<DateV2ValueType>, \
+ std::conditional_t<std::is_same_v<DateType2, DataTypeDateTimeV2>, \
+ DateV2Value<DateTimeV2ValueType>, VecDateTimeValue>>; \
+ using ReturnType = RETURN_TYPE; \
+ static constexpr auto name = #FN_NAME; \
+ static constexpr auto is_nullable = false; \
+ static inline Int32 execute(const ArgType1& t0, const ArgType2& t1, bool& is_null) { \
+ const auto& ts0 = reinterpret_cast<const DateValueType1&>(t0); \
+ const auto& ts1 = reinterpret_cast<const DateValueType2&>(t1); \
+ is_null = !ts0.is_valid_date() || !ts1.is_valid_date(); \
+ return STMT; \
+ } \
+ static DataTypes get_variadic_argument_types() { \
+ return {std::make_shared<DateType1>(), std::make_shared<DateType2>()}; \
+ } \
+ };
+DECLARE_DATE_FUNCTIONS(DateDiffImpl, datediff, DataTypeInt32, (ts0.daynr() - ts1.daynr()));
+DECLARE_DATE_FUNCTIONS(TimeDiffImpl, timediff, DataTypeFloat64, ts0.second_diff(ts1));
-#define TIME_DIFF_FUNCTION_IMPL(CLASS, NAME, UNIT) \
- template <typename DateValueType1, typename DateValueType2, typename DateType1, \
- typename DateType2, typename ArgType1, typename ArgType2> \
- struct CLASS { \
- using ReturnType = DataTypeInt64; \
- static constexpr auto name = #NAME; \
- static constexpr auto is_nullable = false; \
- static inline Int64 execute(const ArgType1& t0, const ArgType2& t1, bool& is_null) { \
- const auto& ts0 = reinterpret_cast<const DateValueType1&>(t0); \
- const auto& ts1 = reinterpret_cast<const DateValueType2&>(t1); \
- is_null = !ts0.is_valid_date() || !ts1.is_valid_date(); \
- return datetime_diff<TimeUnit::UNIT>(ts1, ts0); \
- } \
- \
- static DataTypes get_variadic_argument_types() { \
- return {std::make_shared<DateType1>(), std::make_shared<DateType2>()}; \
- } \
- }
+#define TIME_DIFF_FUNCTION_IMPL(CLASS, NAME, UNIT) \
+ DECLARE_DATE_FUNCTIONS(CLASS, NAME, DataTypeInt64, datetime_diff<TimeUnit::UNIT>(ts1, ts0))
TIME_DIFF_FUNCTION_IMPL(YearsDiffImpl, years_diff, YEAR);
TIME_DIFF_FUNCTION_IMPL(MonthsDiffImpl, months_diff, MONTH);
@@ -259,20 +258,27 @@ TIME_DIFF_FUNCTION_IMPL(HoursDiffImpl, hours_diff, HOUR);
TIME_DIFF_FUNCTION_IMPL(MintueSDiffImpl, minutes_diff, MINUTE);
TIME_DIFF_FUNCTION_IMPL(SecondsDiffImpl, seconds_diff, SECOND);
-#define TIME_FUNCTION_TWO_ARGS_IMPL(CLASS, NAME, FUNCTION) \
- template <typename DateValueType, typename DateType, typename ArgType> \
- struct CLASS { \
- using ReturnType = DataTypeInt32; \
- static constexpr auto name = #NAME; \
- static constexpr auto is_nullable = false; \
- static inline int64_t execute(const ArgType& t0, const Int32 mode, bool& is_null) { \
- const auto& ts0 = reinterpret_cast<const DateValueType&>(t0); \
- is_null = !ts0.is_valid_date(); \
- return ts0.FUNCTION; \
- } \
- static DataTypes get_variadic_argument_types() { \
- return {std::make_shared<DateType>(), std::make_shared<DataTypeInt32>()}; \
- } \
+#define TIME_FUNCTION_TWO_ARGS_IMPL(CLASS, NAME, FUNCTION) \
+ template <typename DateType> \
+ struct CLASS { \
+ using ArgType = std::conditional_t< \
+ std::is_same_v<DateType, DataTypeDateV2>, UInt32, \
+ std::conditional_t<std::is_same_v<DateType, DataTypeDateTimeV2>, UInt64, Int64>>; \
+ using DateValueType = std::conditional_t< \
+ std::is_same_v<DateType, DataTypeDateV2>, DateV2Value<DateV2ValueType>, \
+ std::conditional_t<std::is_same_v<DateType, DataTypeDateTimeV2>, \
+ DateV2Value<DateTimeV2ValueType>, VecDateTimeValue>>; \
+ using ReturnType = DataTypeInt32; \
+ static constexpr auto name = #NAME; \
+ static constexpr auto is_nullable = false; \
+ static inline int64_t execute(const ArgType& t0, const Int32 mode, bool& is_null) { \
+ const auto& ts0 = reinterpret_cast<const DateValueType&>(t0); \
+ is_null = !ts0.is_valid_date(); \
+ return ts0.FUNCTION; \
+ } \
+ static DataTypes get_variadic_argument_types() { \
+ return {std::make_shared<DateType>(), std::make_shared<DataTypeInt32>()}; \
+ } \
}
TIME_FUNCTION_TWO_ARGS_IMPL(ToYearWeekTwoArgsImpl, yearweek, year_week(mysql_week_mode(mode)));
diff --git a/be/src/vec/functions/function_date_or_datetime_computation_v2.cpp b/be/src/vec/functions/function_date_or_datetime_computation_v2.cpp
index ced2b2d70c..23d7f296dc 100644
--- a/be/src/vec/functions/function_date_or_datetime_computation_v2.cpp
+++ b/be/src/vec/functions/function_date_or_datetime_computation_v2.cpp
@@ -20,102 +20,76 @@
namespace doris::vectorized {
-using FunctionAddSecondsV2 = FunctionDateOrDateTimeComputation<
- AddSecondsImpl<DataTypeDateV2, UInt32, DataTypeDateTimeV2>>;
-using FunctionAddMinutesV2 = FunctionDateOrDateTimeComputation<
- AddMinutesImpl<DataTypeDateV2, UInt32, DataTypeDateTimeV2>>;
-using FunctionAddHoursV2 =
- FunctionDateOrDateTimeComputation<AddHoursImpl<DataTypeDateV2, UInt32, DataTypeDateTimeV2>>;
-using FunctionAddDaysV2 =
- FunctionDateOrDateTimeComputation<AddDaysImpl<DataTypeDateV2, UInt32, DataTypeDateV2>>;
-using FunctionAddWeeksV2 =
- FunctionDateOrDateTimeComputation<AddWeeksImpl<DataTypeDateV2, UInt32, DataTypeDateV2>>;
-using FunctionAddMonthsV2 =
- FunctionDateOrDateTimeComputation<AddMonthsImpl<DataTypeDateV2, UInt32, DataTypeDateV2>>;
-using FunctionAddQuartersV2 =
- FunctionDateOrDateTimeComputation<AddQuartersImpl<DataTypeDateV2, UInt32, DataTypeDateV2>>;
-using FunctionAddYearsV2 =
- FunctionDateOrDateTimeComputation<AddYearsImpl<DataTypeDateV2, UInt32, DataTypeDateV2>>;
-
-using FunctionSubSecondsV2 = FunctionDateOrDateTimeComputation<
- SubtractSecondsImpl<DataTypeDateV2, UInt32, DataTypeDateTimeV2>>;
-using FunctionSubMinutesV2 = FunctionDateOrDateTimeComputation<
- SubtractMinutesImpl<DataTypeDateV2, UInt32, DataTypeDateTimeV2>>;
-using FunctionSubHoursV2 = FunctionDateOrDateTimeComputation<
- SubtractHoursImpl<DataTypeDateV2, UInt32, DataTypeDateTimeV2>>;
-using FunctionSubDaysV2 =
- FunctionDateOrDateTimeComputation<SubtractDaysImpl<DataTypeDateV2, UInt32, DataTypeDateV2>>;
-using FunctionSubWeeksV2 = FunctionDateOrDateTimeComputation<
- SubtractWeeksImpl<DataTypeDateV2, UInt32, DataTypeDateV2>>;
-using FunctionSubMonthsV2 = FunctionDateOrDateTimeComputation<
- SubtractMonthsImpl<DataTypeDateV2, UInt32, DataTypeDateV2>>;
-using FunctionSubQuartersV2 = FunctionDateOrDateTimeComputation<
- SubtractQuartersImpl<DataTypeDateV2, UInt32, DataTypeDateV2>>;
-using FunctionSubYearsV2 = FunctionDateOrDateTimeComputation<
- SubtractYearsImpl<DataTypeDateV2, UInt32, DataTypeDateV2>>;
-
-using FunctionToYearWeekTwoArgsV2 = FunctionDateOrDateTimeComputation<
- ToYearWeekTwoArgsImpl<DateV2Value<DateV2ValueType>, DataTypeDateV2, UInt32>>;
-using FunctionToWeekTwoArgsV2 = FunctionDateOrDateTimeComputation<
- ToWeekTwoArgsImpl<DateV2Value<DateV2ValueType>, DataTypeDateV2, UInt32>>;
-
-using FunctionDatetimeV2AddSeconds = FunctionDateOrDateTimeComputation<
- AddSecondsImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2AddMinutes = FunctionDateOrDateTimeComputation<
- AddMinutesImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2AddHours = FunctionDateOrDateTimeComputation<
- AddHoursImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2AddDays = FunctionDateOrDateTimeComputation<
- AddDaysImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2AddWeeks = FunctionDateOrDateTimeComputation<
- AddWeeksImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2AddMonths = FunctionDateOrDateTimeComputation<
- AddMonthsImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2AddQuarters = FunctionDateOrDateTimeComputation<
- AddQuartersImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2AddYears = FunctionDateOrDateTimeComputation<
- AddYearsImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-
-using FunctionDatetimeV2SubSeconds = FunctionDateOrDateTimeComputation<
- SubtractSecondsImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2SubMinutes = FunctionDateOrDateTimeComputation<
- SubtractMinutesImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2SubHours = FunctionDateOrDateTimeComputation<
- SubtractHoursImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2SubDays = FunctionDateOrDateTimeComputation<
- SubtractDaysImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2SubWeeks = FunctionDateOrDateTimeComputation<
- SubtractWeeksImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2SubMonths = FunctionDateOrDateTimeComputation<
- SubtractMonthsImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2SubQuarters = FunctionDateOrDateTimeComputation<
- SubtractQuartersImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-using FunctionDatetimeV2SubYears = FunctionDateOrDateTimeComputation<
- SubtractYearsImpl<DataTypeDateTimeV2, UInt64, DataTypeDateTimeV2>>;
-
-#define FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, TYPE1, TYPE2, ARG1, ARG2, DATE_VALUE1, \
- DATE_VALUE2) \
- using NAME##_##TYPE1##_##TYPE2 = FunctionDateOrDateTimeComputation< \
- IMPL<DATE_VALUE1, DATE_VALUE2, TYPE1, TYPE2, ARG1, ARG2>>;
-
-#define ALL_FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL) \
- FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateTimeV2, DataTypeDateTimeV2, UInt64, \
- UInt64, DateV2Value<DateTimeV2ValueType>, \
- DateV2Value<DateTimeV2ValueType>) \
- FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateTimeV2, DataTypeDateV2, UInt64, UInt32, \
- DateV2Value<DateTimeV2ValueType>, DateV2Value<DateV2ValueType>) \
- FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateV2, DataTypeDateTimeV2, UInt32, UInt64, \
- DateV2Value<DateV2ValueType>, DateV2Value<DateTimeV2ValueType>) \
- FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateTimeV2, DataTypeDateTime, UInt64, Int64, \
- DateV2Value<DateTimeV2ValueType>, VecDateTimeValue) \
- FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateTime, DataTypeDateTimeV2, Int64, UInt64, \
- VecDateTimeValue, DateV2Value<DateTimeV2ValueType>) \
- FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateTime, DataTypeDateV2, Int64, UInt32, \
- VecDateTimeValue, DateV2Value<DateV2ValueType>) \
- FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateV2, DataTypeDateTime, UInt32, Int64, \
- DateV2Value<DateV2ValueType>, VecDateTimeValue) \
- FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateV2, DataTypeDateV2, UInt32, UInt32, \
- DateV2Value<DateV2ValueType>, DateV2Value<DateV2ValueType>)
+using FunctionAddSecondsV2 = FunctionDateOrDateTimeComputation<AddSecondsImpl<DataTypeDateV2>>;
+using FunctionAddMinutesV2 = FunctionDateOrDateTimeComputation<AddMinutesImpl<DataTypeDateV2>>;
+using FunctionAddHoursV2 = FunctionDateOrDateTimeComputation<AddHoursImpl<DataTypeDateV2>>;
+using FunctionAddDaysV2 = FunctionDateOrDateTimeComputation<AddDaysImpl<DataTypeDateV2>>;
+using FunctionAddWeeksV2 = FunctionDateOrDateTimeComputation<AddWeeksImpl<DataTypeDateV2>>;
+using FunctionAddMonthsV2 = FunctionDateOrDateTimeComputation<AddMonthsImpl<DataTypeDateV2>>;
+using FunctionAddQuartersV2 = FunctionDateOrDateTimeComputation<AddQuartersImpl<DataTypeDateV2>>;
+using FunctionAddYearsV2 = FunctionDateOrDateTimeComputation<AddYearsImpl<DataTypeDateV2>>;
+
+using FunctionSubSecondsV2 = FunctionDateOrDateTimeComputation<SubtractSecondsImpl<DataTypeDateV2>>;
+using FunctionSubMinutesV2 = FunctionDateOrDateTimeComputation<SubtractMinutesImpl<DataTypeDateV2>>;
+using FunctionSubHoursV2 = FunctionDateOrDateTimeComputation<SubtractHoursImpl<DataTypeDateV2>>;
+using FunctionSubDaysV2 = FunctionDateOrDateTimeComputation<SubtractDaysImpl<DataTypeDateV2>>;
+using FunctionSubWeeksV2 = FunctionDateOrDateTimeComputation<SubtractWeeksImpl<DataTypeDateV2>>;
+using FunctionSubMonthsV2 = FunctionDateOrDateTimeComputation<SubtractMonthsImpl<DataTypeDateV2>>;
+using FunctionSubQuartersV2 =
+ FunctionDateOrDateTimeComputation<SubtractQuartersImpl<DataTypeDateV2>>;
+using FunctionSubYearsV2 = FunctionDateOrDateTimeComputation<SubtractYearsImpl<DataTypeDateV2>>;
+
+using FunctionToYearWeekTwoArgsV2 =
+ FunctionDateOrDateTimeComputation<ToYearWeekTwoArgsImpl<DataTypeDateV2>>;
+using FunctionToWeekTwoArgsV2 =
+ FunctionDateOrDateTimeComputation<ToWeekTwoArgsImpl<DataTypeDateV2>>;
+
+using FunctionDatetimeV2AddSeconds =
+ FunctionDateOrDateTimeComputation<AddSecondsImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2AddMinutes =
+ FunctionDateOrDateTimeComputation<AddMinutesImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2AddHours =
+ FunctionDateOrDateTimeComputation<AddHoursImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2AddDays =
+ FunctionDateOrDateTimeComputation<AddDaysImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2AddWeeks =
+ FunctionDateOrDateTimeComputation<AddWeeksImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2AddMonths =
+ FunctionDateOrDateTimeComputation<AddMonthsImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2AddQuarters =
+ FunctionDateOrDateTimeComputation<AddQuartersImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2AddYears =
+ FunctionDateOrDateTimeComputation<AddYearsImpl<DataTypeDateTimeV2>>;
+
+using FunctionDatetimeV2SubSeconds =
+ FunctionDateOrDateTimeComputation<SubtractSecondsImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2SubMinutes =
+ FunctionDateOrDateTimeComputation<SubtractMinutesImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2SubHours =
+ FunctionDateOrDateTimeComputation<SubtractHoursImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2SubDays =
+ FunctionDateOrDateTimeComputation<SubtractDaysImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2SubWeeks =
+ FunctionDateOrDateTimeComputation<SubtractWeeksImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2SubMonths =
+ FunctionDateOrDateTimeComputation<SubtractMonthsImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2SubQuarters =
+ FunctionDateOrDateTimeComputation<SubtractQuartersImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2SubYears =
+ FunctionDateOrDateTimeComputation<SubtractYearsImpl<DataTypeDateTimeV2>>;
+
+#define FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, TYPE1, TYPE2) \
+ using NAME##_##TYPE1##_##TYPE2 = FunctionDateOrDateTimeComputation<IMPL<TYPE1, TYPE2>>;
+
+#define ALL_FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL) \
+ FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateTimeV2, DataTypeDateTimeV2) \
+ FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateTimeV2, DataTypeDateV2) \
+ FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateV2, DataTypeDateTimeV2) \
+ FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateTimeV2, DataTypeDateTime) \
+ FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateTime, DataTypeDateTimeV2) \
+ FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateTime, DataTypeDateV2) \
+ FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateV2, DataTypeDateTime) \
+ FUNCTION_DATEV2_WITH_TWO_ARGS(NAME, IMPL, DataTypeDateV2, DataTypeDateV2)
ALL_FUNCTION_DATEV2_WITH_TWO_ARGS(FunctionDatetimeV2DateDiff, DateDiffImpl)
ALL_FUNCTION_DATEV2_WITH_TWO_ARGS(FunctionDatetimeV2TimeDiff, TimeDiffImpl)
@@ -127,10 +101,10 @@ ALL_FUNCTION_DATEV2_WITH_TWO_ARGS(FunctionDatetimeV2MinutesDiff, MintueSDiffImpl
ALL_FUNCTION_DATEV2_WITH_TWO_ARGS(FunctionDatetimeV2SecondsDiff, SecondsDiffImpl)
ALL_FUNCTION_DATEV2_WITH_TWO_ARGS(FunctionDatetimeV2DaysDiff, DaysDiffImpl)
-using FunctionDatetimeV2ToYearWeekTwoArgs = FunctionDateOrDateTimeComputation<
- ToYearWeekTwoArgsImpl<DateV2Value<DateTimeV2ValueType>, DataTypeDateTimeV2, UInt64>>;
-using FunctionDatetimeV2ToWeekTwoArgs = FunctionDateOrDateTimeComputation<
- ToWeekTwoArgsImpl<DateV2Value<DateTimeV2ValueType>, DataTypeDateTimeV2, UInt64>>;
+using FunctionDatetimeV2ToYearWeekTwoArgs =
+ FunctionDateOrDateTimeComputation<ToYearWeekTwoArgsImpl<DataTypeDateTimeV2>>;
+using FunctionDatetimeV2ToWeekTwoArgs =
+ FunctionDateOrDateTimeComputation<ToWeekTwoArgsImpl<DataTypeDateTimeV2>>;
void register_function_date_time_computation_v2(SimpleFunctionFactory& factory) {
factory.register_function<FunctionAddSecondsV2>();
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org