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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]