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 3f43d7262b [Bug] (datetimev2) fix bugs for datev2/datetimev2 (#11358)
3f43d7262b is described below

commit 3f43d7262b5b4f97efd8eb88b9ef5fd48c08e852
Author: Gabriel <gabrielleeb...@gmail.com>
AuthorDate: Mon Aug 1 10:29:56 2022 +0800

    [Bug] (datetimev2) fix bugs for datev2/datetimev2 (#11358)
---
 be/src/vec/data_types/data_type_time_v2.cpp        |  2 +-
 be/src/vec/functions/function_cast.h               | 12 +--
 .../vec/functions/function_datetime_floor_ceil.cpp |  8 +-
 be/src/vec/runtime/vdatetime_value.h               | 89 +++++++++++++---------
 .../org/apache/doris/catalog/AggregateType.java    |  4 +
 .../main/java/org/apache/doris/catalog/Type.java   |  2 +
 6 files changed, 72 insertions(+), 45 deletions(-)

diff --git a/be/src/vec/data_types/data_type_time_v2.cpp 
b/be/src/vec/data_types/data_type_time_v2.cpp
index af0f183031..a9f1a27098 100644
--- a/be/src/vec/data_types/data_type_time_v2.cpp
+++ b/be/src/vec/data_types/data_type_time_v2.cpp
@@ -67,7 +67,7 @@ void DataTypeDateV2::cast_to_date(const UInt32 from, Int64& 
to) {
 }
 
 void DataTypeDateV2::cast_to_date_time_v2(const UInt32 from, UInt64& to) {
-    to = (UInt64)from << TIME_PART_LENGTH;
+    to = ((UInt64)from) << TIME_PART_LENGTH;
 }
 
 bool DataTypeDateTimeV2::equals(const IDataType& rhs) const {
diff --git a/be/src/vec/functions/function_cast.h 
b/be/src/vec/functions/function_cast.h
index 5494056fd8..b262ad7a29 100644
--- a/be/src/vec/functions/function_cast.h
+++ b/be/src/vec/functions/function_cast.h
@@ -146,11 +146,13 @@ struct ConvertImpl {
                         }
                     } else if constexpr (IsDateV2Type<ToDataType>) {
                         auto date_v2 = binary_cast<UInt32, 
DateV2Value<DateV2ValueType>>(vec_to[i]);
-                        date_v2.from_date_int64(vec_from[i]);
+                        date_v2.from_date_int64(
+                                reinterpret_cast<const 
VecDateTimeValue&>(vec_from[i]).to_int64());
                     } else if constexpr (IsDateTimeV2Type<ToDataType>) {
                         auto date_v2 =
                                 binary_cast<UInt64, 
DateV2Value<DateTimeV2ValueType>>(vec_to[i]);
-                        date_v2.from_date_int64(vec_from[i]);
+                        date_v2.from_date_int64(
+                                reinterpret_cast<const 
VecDateTimeValue&>(vec_from[i]).to_int64());
                     } else {
                         vec_to[i] =
                                 reinterpret_cast<const 
VecDateTimeValue&>(vec_from[i]).to_int64();
@@ -180,14 +182,14 @@ struct ConvertImpl {
                             DataTypeDateTimeV2::cast_to_date(vec_from[i], 
vec_to[i]);
                         }
                     } else {
-                        if constexpr (IsDateTimeV2Type<ToDataType>) {
+                        if constexpr (IsDateTimeV2Type<FromDataType>) {
                             vec_to[i] = reinterpret_cast<const 
DateV2Value<DateTimeV2ValueType>&>(
                                                 vec_from[i])
-                                                .to_date_int_val();
+                                                .to_int64();
                         } else {
                             vec_to[i] = reinterpret_cast<const 
DateV2Value<DateV2ValueType>&>(
                                                 vec_from[i])
-                                                .to_date_int_val();
+                                                .to_int64();
                         }
                     }
                 } else {
diff --git a/be/src/vec/functions/function_datetime_floor_ceil.cpp 
b/be/src/vec/functions/function_datetime_floor_ceil.cpp
index 98519a3e32..72da82928b 100644
--- a/be/src/vec/functions/function_datetime_floor_ceil.cpp
+++ b/be/src/vec/functions/function_datetime_floor_ceil.cpp
@@ -270,11 +270,11 @@ struct TimeRound {
     static constexpr int8_t FLOOR = 0;
     static constexpr int8_t CEIL = 1;
 
-    static constexpr uint32_t MASK_YEAR_FOR_DATEV2 = -1 >> 23;
-    static constexpr uint32_t MASK_YEAR_MONTH_FOR_DATEV2 = -1 >> 27;
+    static constexpr uint32_t MASK_YEAR_FOR_DATEV2 = ((uint32_t)-1) >> 23;
+    static constexpr uint32_t MASK_YEAR_MONTH_FOR_DATEV2 = ((uint32_t)-1) >> 
27;
 
-    static constexpr uint64_t MASK_YEAR_FOR_DATETIMEV2 = -1 >> 18;
-    static constexpr uint64_t MASK_YEAR_MONTH_FOR_DATETIMEV2 = -1 >> 22;
+    static constexpr uint64_t MASK_YEAR_FOR_DATETIMEV2 = ((uint64_t)-1) >> 18;
+    static constexpr uint64_t MASK_YEAR_MONTH_FOR_DATETIMEV2 = ((uint64_t)-1) 
>> 22;
 
     template <typename NativeType, typename DateValueType>
     static void time_round(const DateValueType& ts2, Int32 period, 
DateValueType& ts1,
diff --git a/be/src/vec/runtime/vdatetime_value.h 
b/be/src/vec/runtime/vdatetime_value.h
index a2d5c2942a..71d02db847 100644
--- a/be/src/vec/runtime/vdatetime_value.h
+++ b/be/src/vec/runtime/vdatetime_value.h
@@ -1006,10 +1006,10 @@ public:
     DateV2Value<T>& operator++() {
         if constexpr (is_datetime) {
             TimeInterval interval(SECOND, 1, false);
-            date_add_interval<SECOND>(interval, *this);
+            date_add_interval<SECOND>(interval);
         } else {
             TimeInterval interval(DAY, 1, false);
-            date_add_interval<DAY>(interval, *this);
+            date_add_interval<DAY>(interval);
         }
         return *this;
     }
@@ -1119,6 +1119,19 @@ public:
             }
         }
     }
+    operator int64_t() const { return to_int64(); }
+
+    int64_t to_int64() const {
+        if constexpr (is_datetime) {
+            return (date_v2_value_.year_ * 10000L + date_v2_value_.month_ * 
100 +
+                    date_v2_value_.day_) *
+                           1000000L +
+                   date_v2_value_.hour_ * 10000 + date_v2_value_.minute_ * 100 
+
+                   date_v2_value_.second_;
+        } else {
+            return date_v2_value_.year_ * 10000 + date_v2_value_.month_ * 100 
+ date_v2_value_.day_;
+        }
+    };
 
 private:
     static uint8_t calc_week(const uint32_t& day_nr, const uint16_t& year, 
const uint8_t& month,
@@ -1230,37 +1243,42 @@ int64_t datetime_diff(const VecDateTimeValue& 
ts_value1, const VecDateTimeValue&
 
 template <TimeUnit unit, typename T0, typename T1>
 int64_t datetime_diff(const DateV2Value<T0>& ts_value1, const DateV2Value<T1>& 
ts_value2) {
-    constexpr uint32_t minus_one = -1;
+    constexpr uint64_t uint64_minus_one = -1;
     switch (unit) {
     case YEAR: {
         int year = (ts_value2.year() - ts_value1.year());
         if constexpr (std::is_same_v<T0, T1>) {
             int year_width =
                     DateV2Value<T0>::is_datetime ? DATETIMEV2_YEAR_WIDTH : 
DATEV2_YEAR_WIDTH;
+            decltype(ts_value2.to_date_int_val()) minus_one = -1;
             if (year > 0) {
-                year -= ((ts_value2.to_date_int_val() & (minus_one >> 
year_width)) -
-                         (ts_value1.to_date_int_val() & (minus_one >> 
year_width))) < 0;
+                year -= ((ts_value2.to_date_int_val() & (minus_one >> 
year_width)) <
+                         (ts_value1.to_date_int_val() & (minus_one >> 
year_width)));
             } else if (year < 0) {
-                year += ((ts_value2.to_date_int_val() & (minus_one >> 
year_width)) -
-                         (ts_value1.to_date_int_val() & (minus_one >> 
year_width))) > 0;
+                year += ((ts_value2.to_date_int_val() & (minus_one >> 
year_width)) >
+                         (ts_value1.to_date_int_val() & (minus_one >> 
year_width)));
             }
         } else if constexpr (std::is_same_v<T0, DateV2ValueType>) {
-            auto ts2_int_value = (uint64_t)ts_value2.to_date_int_val() << 
TIME_PART_LENGTH;
+            auto ts1_int_value = ((uint64_t)ts_value1.to_date_int_val()) << 
TIME_PART_LENGTH;
             if (year > 0) {
-                year -= ((ts2_int_value & (minus_one >> 
DATETIMEV2_YEAR_WIDTH)) -
-                         (ts_value1.to_date_int_val() & (minus_one >> 
DATETIMEV2_YEAR_WIDTH))) < 0;
+                year -= ((ts_value2.to_date_int_val() &
+                          (uint64_minus_one >> DATETIMEV2_YEAR_WIDTH)) <
+                         (ts1_int_value & (uint64_minus_one >> 
DATETIMEV2_YEAR_WIDTH)));
             } else if (year < 0) {
-                year += ((ts2_int_value & (minus_one >> 
DATETIMEV2_YEAR_WIDTH)) -
-                         (ts_value1.to_date_int_val() & (minus_one >> 
DATETIMEV2_YEAR_WIDTH))) > 0;
+                year += ((ts_value2.to_date_int_val() &
+                          (uint64_minus_one >> DATETIMEV2_YEAR_WIDTH)) >
+                         (ts1_int_value & (uint64_minus_one >> 
DATETIMEV2_YEAR_WIDTH)));
             }
         } else {
-            auto ts1_int_value = (uint64_t)ts_value2.to_date_int_val() << 
TIME_PART_LENGTH;
+            auto ts2_int_value = ((uint64_t)ts_value2.to_date_int_val()) << 
TIME_PART_LENGTH;
             if (year > 0) {
-                year -= ((ts_value2.to_date_int_val() & (minus_one >> 
DATETIMEV2_YEAR_WIDTH)) -
-                         (ts1_int_value & (minus_one >> 
DATETIMEV2_YEAR_WIDTH))) < 0;
+                year -= ((ts2_int_value & (uint64_minus_one >> 
DATETIMEV2_YEAR_WIDTH)) <
+                         (ts_value1.to_date_int_val() &
+                          (uint64_minus_one >> DATETIMEV2_YEAR_WIDTH)));
             } else if (year < 0) {
-                year += ((ts_value2.to_date_int_val() & (minus_one >> 
DATETIMEV2_YEAR_WIDTH)) -
-                         (ts1_int_value & (minus_one >> 
DATETIMEV2_YEAR_WIDTH))) > 0;
+                year += ((ts2_int_value & (uint64_minus_one >> 
DATETIMEV2_YEAR_WIDTH)) >
+                         (ts_value1.to_date_int_val() &
+                          (uint64_minus_one >> DATETIMEV2_YEAR_WIDTH)));
             }
         }
 
@@ -1272,34 +1290,35 @@ int64_t datetime_diff(const DateV2Value<T0>& ts_value1, 
const DateV2Value<T1>& t
         if constexpr (std::is_same_v<T0, T1>) {
             int shift_bits = DateV2Value<T0>::is_datetime ? 
DATETIMEV2_YEAR_WIDTH + 5
                                                           : DATEV2_YEAR_WIDTH 
+ 5;
+            decltype(ts_value2.to_date_int_val()) minus_one = -1;
             if (month > 0) {
-                month -= ((ts_value2.to_date_int_val() & (minus_one >> 
shift_bits)) -
-                          (ts_value1.to_date_int_val() & (minus_one >> 
shift_bits))) < 0;
+                month -= ((ts_value2.to_date_int_val() & (minus_one >> 
shift_bits)) <
+                          (ts_value1.to_date_int_val() & (minus_one >> 
shift_bits)));
             } else if (month < 0) {
-                month += ((ts_value2.to_date_int_val() & (minus_one >> 
shift_bits)) -
-                          (ts_value1.to_date_int_val() & (minus_one >> 
shift_bits))) > 0;
+                month += ((ts_value2.to_date_int_val() & (minus_one >> 
shift_bits)) >
+                          (ts_value1.to_date_int_val() & (minus_one >> 
shift_bits)));
             }
         } else if constexpr (std::is_same_v<T0, DateV2ValueType>) {
-            auto ts2_int_value = (uint64_t)ts_value2.to_date_int_val() << 
TIME_PART_LENGTH;
+            auto ts1_int_value = ((uint64_t)ts_value1.to_date_int_val()) << 
TIME_PART_LENGTH;
             if (month > 0) {
-                month -= ((ts2_int_value & (minus_one >> 
DATETIMEV2_YEAR_WIDTH)) -
-                          (ts_value1.to_date_int_val() &
-                           (minus_one >> (DATETIMEV2_YEAR_WIDTH + 5)))) < 0;
+                month -= ((ts_value2.to_date_int_val() &
+                           (uint64_minus_one >> (DATETIMEV2_YEAR_WIDTH + 5))) <
+                          (ts1_int_value & (uint64_minus_one >> 
(DATETIMEV2_YEAR_WIDTH + 5))));
             } else if (month < 0) {
-                month += ((ts2_int_value & (minus_one >> 
DATETIMEV2_YEAR_WIDTH)) -
-                          (ts_value1.to_date_int_val() &
-                           (minus_one >> (DATETIMEV2_YEAR_WIDTH + 5)))) > 0;
+                month += ((ts_value2.to_date_int_val() &
+                           (uint64_minus_one >> (DATETIMEV2_YEAR_WIDTH + 5))) >
+                          (ts1_int_value & (uint64_minus_one >> 
(DATETIMEV2_YEAR_WIDTH + 5))));
             }
         } else {
-            auto ts1_int_value = (uint64_t)ts_value2.to_date_int_val() << 
TIME_PART_LENGTH;
+            auto ts2_int_value = ((uint64_t)ts_value2.to_date_int_val()) << 
TIME_PART_LENGTH;
             if (month > 0) {
-                month -= ((ts_value2.to_date_int_val() &
-                           (minus_one >> (DATETIMEV2_YEAR_WIDTH + 5))) -
-                          (ts1_int_value & (minus_one >> 
DATETIMEV2_YEAR_WIDTH))) < 0;
+                month -= ((ts2_int_value & (uint64_minus_one >> 
(DATETIMEV2_YEAR_WIDTH + 5))) <
+                          (ts_value1.to_date_int_val() &
+                           (uint64_minus_one >> (DATETIMEV2_YEAR_WIDTH + 5))));
             } else if (month < 0) {
-                month += ((ts_value2.to_date_int_val() &
-                           (minus_one >> (DATETIMEV2_YEAR_WIDTH + 5))) -
-                          (ts1_int_value & (minus_one >> 
DATETIMEV2_YEAR_WIDTH))) > 0;
+                month += ((ts2_int_value & (uint64_minus_one >> 
(DATETIMEV2_YEAR_WIDTH + 5))) >
+                          (ts_value1.to_date_int_val() &
+                           (uint64_minus_one >> (DATETIMEV2_YEAR_WIDTH + 5))));
             }
         }
         return month;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateType.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateType.java
index 386e4e6433..fca359d149 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateType.java
@@ -64,6 +64,8 @@ public enum AggregateType {
         primitiveTypeList.add(PrimitiveType.DECIMALV2);
         primitiveTypeList.add(PrimitiveType.DATE);
         primitiveTypeList.add(PrimitiveType.DATETIME);
+        primitiveTypeList.add(PrimitiveType.DATEV2);
+        primitiveTypeList.add(PrimitiveType.DATETIMEV2);
         primitiveTypeList.add(PrimitiveType.CHAR);
         primitiveTypeList.add(PrimitiveType.VARCHAR);
         primitiveTypeList.add(PrimitiveType.STRING);
@@ -80,6 +82,8 @@ public enum AggregateType {
         primitiveTypeList.add(PrimitiveType.DECIMALV2);
         primitiveTypeList.add(PrimitiveType.DATE);
         primitiveTypeList.add(PrimitiveType.DATETIME);
+        primitiveTypeList.add(PrimitiveType.DATEV2);
+        primitiveTypeList.add(PrimitiveType.DATETIMEV2);
         primitiveTypeList.add(PrimitiveType.CHAR);
         primitiveTypeList.add(PrimitiveType.VARCHAR);
         primitiveTypeList.add(PrimitiveType.STRING);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
index 07705d759c..b3e8e744a1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
@@ -1374,6 +1374,8 @@ public abstract class Type {
         compatibilityMatrix[TIME.ordinal()][DECIMAL32.ordinal()] = 
PrimitiveType.INVALID_TYPE;
         compatibilityMatrix[TIME.ordinal()][DECIMAL64.ordinal()] = 
PrimitiveType.INVALID_TYPE;
         compatibilityMatrix[TIME.ordinal()][DECIMAL128.ordinal()] = 
PrimitiveType.INVALID_TYPE;
+        compatibilityMatrix[TIME.ordinal()][DATEV2.ordinal()] = 
PrimitiveType.INVALID_TYPE;
+        compatibilityMatrix[TIME.ordinal()][DATETIMEV2.ordinal()] = 
PrimitiveType.INVALID_TYPE;
 
         compatibilityMatrix[TIMEV2.ordinal()][TIMEV2.ordinal()] = 
PrimitiveType.INVALID_TYPE;
         compatibilityMatrix[TIMEV2.ordinal()][TIME.ordinal()] = 
PrimitiveType.INVALID_TYPE;


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

Reply via email to