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/07/23 14:59:04 UTC

[doris] branch master updated: [Improvement] Replace `switch` with `constexpr` to boost date functions (#11134)

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 829d534e12 [Improvement] Replace `switch` with `constexpr` to boost date functions (#11134)
829d534e12 is described below

commit 829d534e12ca0e76f836868eeac6378e8c4f801e
Author: Gabriel <ga...@gmail.com>
AuthorDate: Sat Jul 23 22:58:59 2022 +0800

    [Improvement] Replace `switch` with `constexpr` to boost date functions (#11134)
---
 be/src/exprs/cast_functions.cpp                    |  17 +-
 be/src/runtime/datetime_value.h                    |  33 +++-
 .../aggregate_function_window_funnel.h             |   2 +-
 .../function_date_or_datetime_computation.h        |   4 +-
 .../vec/functions/function_datetime_floor_ceil.cpp |   2 +-
 be/src/vec/functions/function_timestamp.cpp        |   4 +-
 be/src/vec/runtime/vdatetime_value.cpp             | 195 +++++++--------------
 be/src/vec/runtime/vdatetime_value.h               |  25 ++-
 be/test/vec/core/block_test.cpp                    |   8 +-
 9 files changed, 112 insertions(+), 178 deletions(-)

diff --git a/be/src/exprs/cast_functions.cpp b/be/src/exprs/cast_functions.cpp
index 2b6d4c8a08..9885d9941e 100644
--- a/be/src/exprs/cast_functions.cpp
+++ b/be/src/exprs/cast_functions.cpp
@@ -34,15 +34,6 @@
 #include "vec/data_types/data_type_decimal.h"
 #include "vec/runtime/vdatetime_value.h"
 
-namespace doris::vectorized {
-template <>
-void doris::vectorized::DateV2Value<doris::vectorized::DateV2ValueType>::convert_date_v2_to_dt(
-        doris::DateTimeValue* dt);
-template <>
-void doris::vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>::convert_date_v2_to_dt(
-        doris::DateTimeValue* dt);
-} // namespace doris::vectorized
-
 namespace doris {
 
 void CastFunctions::init() {}
@@ -626,7 +617,7 @@ DateTimeVal CastFunctions::cast_to_date_val(FunctionContext* ctx, const DateV2Va
     vectorized::DateV2Value<doris::vectorized::DateV2ValueType> datev2_val =
             vectorized::DateV2Value<doris::vectorized::DateV2ValueType>::from_datev2_val(val);
     DateTimeValue datetime_value;
-    datev2_val.convert_date_v2_to_dt(&datetime_value);
+    datetime_value.convert_from_date_v2<doris::vectorized::DateV2ValueType>(&datev2_val);
     DateTimeVal result;
     datetime_value.to_datetime_val(&result);
     return result;
@@ -640,7 +631,7 @@ DateTimeVal CastFunctions::cast_to_date_val(FunctionContext* ctx, const DateTime
             vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>::from_datetimev2_val(
                     val);
     DateTimeValue datetime_value;
-    datev2_val.convert_date_v2_to_dt(&datetime_value);
+    datetime_value.convert_from_date_v2<doris::vectorized::DateTimeV2ValueType>(&datev2_val);
     DateTimeVal result;
     datetime_value.to_datetime_val(&result);
     return result;
@@ -653,7 +644,7 @@ DateTimeVal CastFunctions::cast_to_datetime_val(FunctionContext* ctx, const Date
     vectorized::DateV2Value<doris::vectorized::DateV2ValueType> datev2_val =
             vectorized::DateV2Value<doris::vectorized::DateV2ValueType>::from_datev2_val(val);
     DateTimeValue datetime_value;
-    datev2_val.convert_date_v2_to_dt(&datetime_value);
+    datetime_value.convert_from_date_v2<doris::vectorized::DateV2ValueType>(&datev2_val);
     datetime_value.set_type(TYPE_DATETIME);
     DateTimeVal result;
     datetime_value.to_datetime_val(&result);
@@ -668,7 +659,7 @@ DateTimeVal CastFunctions::cast_to_datetime_val(FunctionContext* ctx, const Date
             vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>::from_datetimev2_val(
                     val);
     DateTimeValue datetime_value;
-    datev2_val.convert_date_v2_to_dt(&datetime_value);
+    datetime_value.convert_from_date_v2<doris::vectorized::DateTimeV2ValueType>(&datev2_val);
     datetime_value.set_type(TYPE_DATETIME);
     DateTimeVal result;
     datetime_value.to_datetime_val(&result);
diff --git a/be/src/runtime/datetime_value.h b/be/src/runtime/datetime_value.h
index 91e0f83c62..36c63df045 100644
--- a/be/src/runtime/datetime_value.h
+++ b/be/src/runtime/datetime_value.h
@@ -565,19 +565,36 @@ public:
                _month > 0 && _day > 0;
     }
 
+    template <typename T>
+    void convert_from_date_v2(doris::vectorized::DateV2Value<T>* dt) {
+        if constexpr (doris::vectorized::DateV2Value<T>::is_datetime) {
+            this->_type = TIME_DATETIME;
+            this->_hour = dt->hour();
+            this->_minute = dt->minute();
+            this->_second = dt->second();
+        } else {
+            this->_type = TIME_DATE;
+            this->_hour = 0;
+            this->_minute = 0;
+            this->_second = 0;
+        }
+        this->_neg = 0;
+        this->_year = dt->year();
+        this->_month = dt->month();
+        this->_day = dt->day();
+        this->_microsecond = 0;
+    }
+
+    template <typename T>
+    void convert_to_date_v2(doris::vectorized::DateV2Value<T>* dt) {
+        dt->set_time(dt->year(), dt->month(), dt->_day, dt->hour(), dt->minute(), dt->second(), 0);
+    }
+
 private:
     // Used to make sure sizeof DateTimeValue
     friend class UnusedClass;
     friend void doris::vectorized::VecDateTimeValue::convert_vec_dt_to_dt(DateTimeValue* dt);
     friend void doris::vectorized::VecDateTimeValue::convert_dt_to_vec_dt(DateTimeValue* dt);
-    friend void doris::vectorized::DateV2Value<
-            doris::vectorized::DateV2ValueType>::convert_date_v2_to_dt(DateTimeValue* dt);
-    friend void doris::vectorized::DateV2Value<
-            doris::vectorized::DateV2ValueType>::convert_dt_to_date_v2(DateTimeValue* dt);
-    friend void doris::vectorized::DateV2Value<
-            doris::vectorized::DateTimeV2ValueType>::convert_date_v2_to_dt(DateTimeValue* dt);
-    friend void doris::vectorized::DateV2Value<
-            doris::vectorized::DateTimeV2ValueType>::convert_dt_to_date_v2(DateTimeValue* dt);
 
     void from_packed_time(int64_t packed_time) {
         _microsecond = packed_time % (1LL << 24);
diff --git a/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h b/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h
index 92eb8d99f0..09f07236b2 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_window_funnel.h
@@ -82,7 +82,7 @@ struct WindowFunnelState {
                 const DateValueType& first_timestamp = events_timestamp[event_idx - 1].value();
                 DateValueType last_timestamp = first_timestamp;
                 TimeInterval interval(SECOND, window, false);
-                last_timestamp.date_add_interval(interval, SECOND);
+                last_timestamp.template date_add_interval<SECOND>(interval);
 
                 if (timestamp <= last_timestamp) {
                     events_timestamp[event_idx] = first_timestamp;
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 107d8db493..ad03133b31 100644
--- a/be/src/vec/functions/function_date_or_datetime_computation.h
+++ b/be/src/vec/functions/function_date_or_datetime_computation.h
@@ -39,12 +39,12 @@ inline ResultType date_time_add(const Arg& t, Int64 delta, bool& is_null) {
     TimeInterval interval(unit, delta, false);
     if constexpr (std::is_same_v<VecDateTimeValue, DateValueType> ||
                   std::is_same_v<DateValueType, ResultDateValueType>) {
-        is_null = !ts_value.date_add_interval(interval, unit);
+        is_null = !(ts_value.template date_add_interval<unit>(interval));
 
         return binary_cast<ResultDateValueType, ResultType>(ts_value);
     } else {
         ResultDateValueType res;
-        is_null = !ts_value.date_add_interval(interval, unit, res);
+        is_null = !(ts_value.template date_add_interval<unit>(interval, res));
 
         return binary_cast<ResultDateValueType, ResultType>(res);
     }
diff --git a/be/src/vec/functions/function_datetime_floor_ceil.cpp b/be/src/vec/functions/function_datetime_floor_ceil.cpp
index 9003b932df..45d1514b49 100644
--- a/be/src/vec/functions/function_datetime_floor_ceil.cpp
+++ b/be/src/vec/functions/function_datetime_floor_ceil.cpp
@@ -239,7 +239,7 @@ struct TimeRound {
                                                    : count);
         bool is_neg = step < 0;
         TimeInterval interval(Impl::Unit, is_neg ? -step : step, is_neg);
-        is_null = !ts1.date_add_interval(interval, Impl::Unit);
+        is_null = !ts1.date_add_interval<Impl::Unit>(interval);
         return;
     }
 
diff --git a/be/src/vec/functions/function_timestamp.cpp b/be/src/vec/functions/function_timestamp.cpp
index 4c3786dfba..ea6defb0dd 100644
--- a/be/src/vec/functions/function_timestamp.cpp
+++ b/be/src/vec/functions/function_timestamp.cpp
@@ -113,7 +113,7 @@ struct MakeDateImpl {
 
                 TimeInterval interval(DAY, r - 1, false);
                 res_val = VecDateTimeValue::from_datetime_val(ts_val);
-                if (!res_val.date_add_interval(interval, DAY)) {
+                if (!res_val.date_add_interval<DAY>(interval)) {
                     null_map[i] = 1;
                     continue;
                 }
@@ -122,7 +122,7 @@ struct MakeDateImpl {
                 DateV2Value<DateV2ValueType>* value = new (&res[i]) DateV2Value<DateV2ValueType>();
                 value->set_time(l, 1, 1);
                 TimeInterval interval(DAY, r - 1, false);
-                if (!value->date_add_interval(interval, DAY, *value)) {
+                if (!value->date_add_interval<DAY>(interval, *value)) {
                     null_map[i] = 1;
                 }
             }
diff --git a/be/src/vec/runtime/vdatetime_value.cpp b/be/src/vec/runtime/vdatetime_value.cpp
index 1b3bcfdb37..880ca20449 100644
--- a/be/src/vec/runtime/vdatetime_value.cpp
+++ b/be/src/vec/runtime/vdatetime_value.cpp
@@ -1465,24 +1465,17 @@ int64_t VecDateTimeValue::second_diff(const DateV2Value<T>& rhs) const {
     return day_diff * 3600 * 24 + time_diff;
 }
 
-bool VecDateTimeValue::date_add_interval(const TimeInterval& interval, TimeUnit unit) {
+template <TimeUnit unit>
+bool VecDateTimeValue::date_add_interval(const TimeInterval& interval) {
     if (!is_valid_date()) return false;
 
     int sign = interval.is_neg ? -1 : 1;
-    switch (unit) {
-    case SECOND:
-    case MINUTE:
-    case HOUR:
-    case SECOND_MICROSECOND:
-    case MINUTE_MICROSECOND:
-    case MINUTE_SECOND:
-    case HOUR_MICROSECOND:
-    case HOUR_SECOND:
-    case HOUR_MINUTE:
-    case DAY_MICROSECOND:
-    case DAY_SECOND:
-    case DAY_MINUTE:
-    case DAY_HOUR: {
+
+    if constexpr ((unit == SECOND) || (unit == MINUTE) || (unit == HOUR) ||
+                  (unit == SECOND_MICROSECOND) || (unit == MINUTE_MICROSECOND) ||
+                  (unit == MINUTE_SECOND) || (unit == HOUR_MICROSECOND) || (unit == HOUR_SECOND) ||
+                  (unit == HOUR_MINUTE) || (unit == DAY_MICROSECOND) || (unit == DAY_SECOND) ||
+                  (unit == DAY_MINUTE) || (unit == DAY_HOUR)) {
         // This may change the day information
 
         int64_t seconds = (_day - 1) * 86400L + _hour * 3600L + _minute * 60 + _second +
@@ -1502,18 +1495,13 @@ bool VecDateTimeValue::date_add_interval(const TimeInterval& interval, TimeUnit
             return false;
         }
         _type = TIME_DATETIME;
-        break;
-    }
-    case DAY:
-    case WEEK: {
+    } else if constexpr ((unit == DAY) || (unit == WEEK)) {
         // This only change day information, not change second information
         int64_t day_nr = daynr() + interval.day * sign;
         if (!get_date_from_daynr(day_nr)) {
             return false;
         }
-        break;
-    }
-    case YEAR: {
+    } else if constexpr (unit == YEAR) {
         // This only change year information
         _year += sign * interval.year;
         if (_year > 9999) {
@@ -1522,11 +1510,7 @@ bool VecDateTimeValue::date_add_interval(const TimeInterval& interval, TimeUnit
         if (_month == 2 && _day == 29 && !doris::is_leap(_year)) {
             _day = 28;
         }
-        break;
-    }
-    case MONTH:
-    case QUARTER:
-    case YEAR_MONTH: {
+    } else if constexpr (unit == QUARTER || unit == MONTH || unit == YEAR_MONTH) {
         // This will change month and year information, maybe date.
         int64_t months = _year * 12 + _month - 1 + sign * (12 * interval.year + interval.month);
         _year = months / 12;
@@ -1540,9 +1524,8 @@ bool VecDateTimeValue::date_add_interval(const TimeInterval& interval, TimeUnit
                 _day++;
             }
         }
-        break;
-    }
     }
+
     return true;
 }
 
@@ -2385,61 +2368,20 @@ bool DateV2Value<T>::get_date_from_daynr(uint64_t daynr) {
 }
 
 template <typename T>
-template <typename TO>
-bool DateV2Value<T>::date_add_interval(const TimeInterval& interval, TimeUnit unit,
-                                       DateV2Value<TO>& to_value) {
+template <TimeUnit unit, typename TO>
+bool DateV2Value<T>::date_add_interval(const TimeInterval& interval, DateV2Value<TO>& to_value) {
     if (!is_valid_date()) return false;
 
-    switch (unit) {
-    case SECOND:
-    case MINUTE:
-    case HOUR:
-    case SECOND_MICROSECOND:
-    case MINUTE_MICROSECOND:
-    case MINUTE_SECOND:
-    case HOUR_MICROSECOND:
-    case HOUR_SECOND:
-    case HOUR_MINUTE:
-    case DAY_MICROSECOND:
-    case DAY_SECOND:
-    case DAY_MINUTE:
-    case DAY_HOUR: {
-        if constexpr (DateV2Value<TO>::is_datetime) {
-            // This may change the day information
-            int64_t seconds = (this->day() - 1) * 86400L + this->hour() * 3600L +
-                              this->minute() * 60 + this->second() + interval.day * 86400 +
-                              interval.hour * 3600 + interval.minute * 60 + interval.second;
-            uint64_t microsecond = interval.microsecond + this->microsecond();
-            if (microsecond > 1000000) {
-                seconds += 1;
-                microsecond %= 1000000;
-            }
-            int64_t days = seconds / 86400;
-            seconds %= 86400L;
-            if (seconds < 0) {
-                seconds += 86400L;
-                days--;
-            }
-            to_value.set_time(seconds / 3600, (seconds / 60) % 60, seconds % 60, microsecond);
-            int64_t day_nr = doris::calc_daynr(this->year(), this->month(), 1) + days;
-            if (!to_value.get_date_from_daynr(day_nr)) {
-                return false;
-            }
-            break;
-        } else {
-            LOG(FATAL) << "Invalid interval to add " << int(unit) << " for date!";
-        }
-    }
-    case DAY:
-    case WEEK: {
-        // This only change day information, not change second information
+    if constexpr ((unit == SECOND) || (unit == MINUTE) || (unit == HOUR) ||
+                  (unit == SECOND_MICROSECOND) || (unit == MINUTE_MICROSECOND) ||
+                  (unit == MINUTE_SECOND) || (unit == HOUR_MICROSECOND) || (unit == HOUR_SECOND) ||
+                  (unit == HOUR_MINUTE) || (unit == DAY_MICROSECOND) || (unit == DAY_SECOND) ||
+                  (unit == DAY_MINUTE) || (unit == DAY_HOUR) || (unit == DAY) || (unit == WEEK)) {
         uint32_t day_nr = daynr() + interval.day;
         if (!to_value.get_date_from_daynr(day_nr)) {
             return false;
         }
-        break;
-    }
-    case YEAR: {
+    } else if constexpr (unit == YEAR) {
         // This only change year information
         to_value.template set_time_unit<TimeUnit::YEAR>(date_v2_value_.year_ + interval.year);
         if (to_value.year() > 9999) {
@@ -2449,11 +2391,7 @@ bool DateV2Value<T>::date_add_interval(const TimeInterval& interval, TimeUnit un
             !doris::is_leap(to_value.year())) {
             to_value.template set_time_unit<TimeUnit::DAY>(28);
         }
-        break;
-    }
-    case MONTH:
-    case QUARTER:
-    case YEAR_MONTH: {
+    } else if constexpr (unit == QUARTER || unit == MONTH || unit == YEAR_MONTH) {
         // This will change month and year information, maybe date.
         int64_t months = date_v2_value_.year_ * 12 + date_v2_value_.month_ - 1 +
                          12 * interval.year + interval.month;
@@ -2468,8 +2406,6 @@ bool DateV2Value<T>::date_add_interval(const TimeInterval& interval, TimeUnit un
                 to_value.template set_time_unit<TimeUnit::DAY>(date_v2_value_.day_ + 1);
             }
         }
-        break;
-    }
     }
     return true;
 }
@@ -2569,38 +2505,6 @@ void DateV2Value<T>::set_time(uint8_t hour, uint8_t minute, uint8_t second, uint
     }
 }
 
-template <typename T>
-void DateV2Value<T>::convert_date_v2_to_dt(doris::DateTimeValue* dt) {
-    if constexpr (is_datetime) {
-        dt->_type = TIME_DATETIME;
-        dt->_hour = this->hour();
-        dt->_minute = this->minute();
-        dt->_second = this->second();
-    } else {
-        dt->_type = TIME_DATE;
-        dt->_hour = 0;
-        dt->_minute = 0;
-        dt->_second = 0;
-    }
-    dt->_neg = 0;
-    dt->_year = date_v2_value_.year_;
-    dt->_month = date_v2_value_.month_;
-    dt->_day = date_v2_value_.day_;
-    dt->_microsecond = 0;
-}
-
-template <typename T>
-void DateV2Value<T>::convert_dt_to_date_v2(doris::DateTimeValue* dt) {
-    date_v2_value_.year_ = dt->_year;
-    date_v2_value_.month_ = dt->_month;
-    date_v2_value_.day_ = dt->_day;
-    if constexpr (is_datetime) {
-        date_v2_value_.hour_ = dt->hour();
-        date_v2_value_.minute_ = dt->minute();
-        date_v2_value_.second_ = dt->second();
-    }
-}
-
 template <typename T>
 bool DateV2Value<T>::to_format_string(const char* format, int len, char* to) const {
     char buf[64];
@@ -3022,21 +2926,44 @@ template int64_t VecDateTimeValue::second_diff<DateV2ValueType>(
 template int64_t VecDateTimeValue::second_diff<DateTimeV2ValueType>(
         const DateV2Value<DateTimeV2ValueType>& rhs) const;
 
-template bool doris::vectorized::DateV2Value<doris::vectorized::DateV2ValueType>::date_add_interval<
-        doris::vectorized::DateTimeV2ValueType>(
-        doris::vectorized::TimeInterval const&, doris::vectorized::TimeUnit,
-        doris::vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>&);
-template bool doris::vectorized::DateV2Value<doris::vectorized::DateV2ValueType>::date_add_interval<
-        doris::vectorized::DateV2ValueType>(
-        doris::vectorized::TimeInterval const&, doris::vectorized::TimeUnit,
-        doris::vectorized::DateV2Value<doris::vectorized::DateV2ValueType>&);
-
-template bool doris::vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>::
-        date_add_interval<doris::vectorized::DateTimeV2ValueType>(
-                doris::vectorized::TimeInterval const&, doris::vectorized::TimeUnit,
-                doris::vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>&);
-template bool doris::vectorized::DateV2Value<doris::vectorized::DateTimeV2ValueType>::
-        date_add_interval<doris::vectorized::DateV2ValueType>(
-                doris::vectorized::TimeInterval const&, doris::vectorized::TimeUnit,
-                doris::vectorized::DateV2Value<doris::vectorized::DateV2ValueType>&);
+#define DELARE_DATE_ADD_INTERVAL(DateValueType1, DateValueType2)                                 \
+    template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval<             \
+            TimeUnit::SECOND, DateValueType2>(doris::vectorized::TimeInterval const&,            \
+                                              doris::vectorized::DateV2Value<DateValueType2>&);  \
+    template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval<             \
+            TimeUnit::MINUTE, DateValueType2>(doris::vectorized::TimeInterval const&,            \
+                                              doris::vectorized::DateV2Value<DateValueType2>&);  \
+    template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval<             \
+            TimeUnit::HOUR, DateValueType2>(doris::vectorized::TimeInterval const&,              \
+                                            doris::vectorized::DateV2Value<DateValueType2>&);    \
+    template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval<             \
+            TimeUnit::DAY, DateValueType2>(doris::vectorized::TimeInterval const&,               \
+                                           doris::vectorized::DateV2Value<DateValueType2>&);     \
+    template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval<             \
+            TimeUnit::MONTH, DateValueType2>(doris::vectorized::TimeInterval const&,             \
+                                             doris::vectorized::DateV2Value<DateValueType2>&);   \
+    template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval<             \
+            TimeUnit::YEAR, DateValueType2>(doris::vectorized::TimeInterval const&,              \
+                                            doris::vectorized::DateV2Value<DateValueType2>&);    \
+    template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval<             \
+            TimeUnit::QUARTER, DateValueType2>(doris::vectorized::TimeInterval const&,           \
+                                               doris::vectorized::DateV2Value<DateValueType2>&); \
+    template bool doris::vectorized::DateV2Value<DateValueType1>::date_add_interval<             \
+            TimeUnit::WEEK, DateValueType2>(doris::vectorized::TimeInterval const&,              \
+                                            doris::vectorized::DateV2Value<DateValueType2>&);
+
+DELARE_DATE_ADD_INTERVAL(DateV2ValueType, DateV2ValueType)
+DELARE_DATE_ADD_INTERVAL(DateV2ValueType, DateTimeV2ValueType)
+DELARE_DATE_ADD_INTERVAL(DateTimeV2ValueType, DateV2ValueType)
+DELARE_DATE_ADD_INTERVAL(DateTimeV2ValueType, DateTimeV2ValueType)
+
+template bool VecDateTimeValue::date_add_interval<TimeUnit::SECOND>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::MINUTE>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::HOUR>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::DAY>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::MONTH>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::YEAR>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::QUARTER>(const TimeInterval& interval);
+template bool VecDateTimeValue::date_add_interval<TimeUnit::WEEK>(const TimeInterval& interval);
+
 } // namespace doris::vectorized
diff --git a/be/src/vec/runtime/vdatetime_value.h b/be/src/vec/runtime/vdatetime_value.h
index 83a37803b5..350b8b7373 100644
--- a/be/src/vec/runtime/vdatetime_value.h
+++ b/be/src/vec/runtime/vdatetime_value.h
@@ -458,7 +458,8 @@ public:
     uint32_t year_week(uint8_t mode) const;
 
     // Add interval
-    bool date_add_interval(const TimeInterval& interval, TimeUnit unit);
+    template <TimeUnit unit>
+    bool date_add_interval(const TimeInterval& interval);
 
     //unix_timestamp is called with a timezone argument,
     //it returns seconds of the value of date literal since '1970-01-01 00:00:00' UTC
@@ -526,17 +527,17 @@ public:
         switch (_type) {
         case TIME_DATE: {
             TimeInterval interval(DAY, 1, false);
-            date_add_interval(interval, DAY);
+            date_add_interval<DAY>(interval);
             break;
         }
         case TIME_DATETIME: {
             TimeInterval interval(SECOND, 1, false);
-            date_add_interval(interval, SECOND);
+            date_add_interval<SECOND>(interval);
             break;
         }
         case TIME_TIME: {
             TimeInterval interval(SECOND, 1, false);
-            date_add_interval(interval, SECOND);
+            date_add_interval<SECOND>(interval);
             break;
         }
         }
@@ -907,11 +908,12 @@ public:
     uint32_t year_week(uint8_t mode) const;
 
     // Add interval
-    template <typename TO>
-    bool date_add_interval(const TimeInterval& interval, TimeUnit unit, DateV2Value<TO>& to_value);
+    template <TimeUnit unit, typename TO>
+    bool date_add_interval(const TimeInterval& interval, DateV2Value<TO>& to_value);
 
-    bool date_add_interval(const TimeInterval& interval, TimeUnit unit) {
-        return this->date_add_interval(interval, unit, *this);
+    template <TimeUnit unit>
+    bool date_add_interval(const TimeInterval& interval) {
+        return this->date_add_interval<unit>(interval, *this);
     }
 
     //unix_timestamp is called with a timezone argument,
@@ -1006,10 +1008,10 @@ public:
     DateV2Value<T>& operator++() {
         if constexpr (is_datetime) {
             TimeInterval interval(SECOND, 1, false);
-            date_add_interval(interval, SECOND, *this);
+            date_add_interval<SECOND>(interval, *this);
         } else {
             TimeInterval interval(DAY, 1, false);
-            date_add_interval(interval, DAY, *this);
+            date_add_interval<DAY>(interval, *this);
         }
         return *this;
     }
@@ -1052,9 +1054,6 @@ public:
         return time_diff;
     }
 
-    void convert_date_v2_to_dt(doris::DateTimeValue* dt);
-    void convert_dt_to_date_v2(doris::DateTimeValue* dt);
-
     bool can_cast_to_date_without_loss_accuracy() {
         return this->hour() == 0 && this->minute() == 0 && this->second() == 0 &&
                this->microsecond() == 0;
diff --git a/be/test/vec/core/block_test.cpp b/be/test/vec/core/block_test.cpp
index 546e120245..a18db4e1e5 100644
--- a/be/test/vec/core/block_test.cpp
+++ b/be/test/vec/core/block_test.cpp
@@ -110,14 +110,14 @@ TEST(BlockTest, RowBatchCovertToBlock) {
         std::string now_time("2020-12-02");
         k7.from_date_str(now_time.c_str(), now_time.size());
         vectorized::TimeInterval time_interval(vectorized::TimeUnit::DAY, k1, false);
-        k7.date_add_interval(time_interval, vectorized::TimeUnit::DAY);
+        k7.date_add_interval<vectorized::TimeUnit::DAY>(time_interval);
         memcpy(tuple->get_slot(slot_desc->tuple_offset()), &k7, column_descs[6].size);
 
         slot_desc = tuple_desc->slots()[7];
         vectorized::DateV2Value<doris::vectorized::DateV2ValueType> k8;
         std::string now_date("2020-12-02");
         k8.from_date_str(now_date.c_str(), now_date.size());
-        k8.date_add_interval(time_interval, vectorized::TimeUnit::DAY, k8);
+        k8.date_add_interval<vectorized::TimeUnit::DAY>(time_interval);
         memcpy(tuple->get_slot(slot_desc->tuple_offset()), &k8, column_descs[7].size);
 
         tuple_row->set_tuple(0, tuple);
@@ -161,7 +161,7 @@ TEST(BlockTest, RowBatchCovertToBlock) {
         std::string now_time("2020-12-02");
         date_time_value.from_date_str(now_time.c_str(), now_time.size());
         vectorized::TimeInterval time_interval(vectorized::TimeUnit::DAY, k1, false);
-        date_time_value.date_add_interval(time_interval, vectorized::TimeUnit::DAY);
+        date_time_value.date_add_interval<vectorized::TimeUnit::DAY>(time_interval);
 
         EXPECT_EQ(k7, date_time_value);
 
@@ -171,7 +171,7 @@ TEST(BlockTest, RowBatchCovertToBlock) {
         vectorized::DateV2Value<doris::vectorized::DateV2ValueType> date_v2_value;
         std::string now_date("2020-12-02");
         date_v2_value.from_date_str(now_date.c_str(), now_date.size());
-        date_v2_value.date_add_interval(time_interval, vectorized::TimeUnit::DAY, date_v2_value);
+        date_v2_value.date_add_interval<vectorized::TimeUnit::DAY>(time_interval);
 
         EXPECT_EQ(k8, date_v2_value);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org