Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangstar333 committed Feb 6, 2025
1 parent 6a79540 commit d314a61
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 9 deletions.
36 changes: 27 additions & 9 deletions be/src/vec/functions/function_cast.h
Original file line number Diff line number Diff line change
Expand Up @@ -406,8 +406,26 @@ struct ConvertImpl {
IsDateV2Type<ToDataType>) {
DataTypeDateTimeV2::cast_to_date_v2(vec_from[i], vec_to[i]);
} else {
UInt32 scale = additions;
vec_to[i] = ToFieldType(vec_from[i] / std::pow(10, 6 - scale));
DCHECK(IsDateTimeV2Type<FromDataType>);
DCHECK(IsDateTimeV2Type<ToDataType>);
UInt32 to_scale = additions;
auto from_scale = named_from.type->get_scale();
auto& to_value = (DateV2Value<DateTimeV2ValueType>&)(vec_to[i]);
auto from_value = binary_cast<UInt64, DateV2Value<DateTimeV2ValueType>>(
vec_from[i]);
UInt64 microsecond = 0;
if (from_scale < to_scale) {
// scale up no need to do anything
microsecond = from_value.microsecond();
} else {
// scale down should clear the low bits to 0
auto factor = (UInt64)std::pow(10, 6 - to_scale);
microsecond = (from_value.microsecond() / factor) * factor;
}
to_value.unchecked_set_time(from_value.year(), from_value.month(),
from_value.day(), from_value.hour(),
from_value.minute(), from_value.second(),
microsecond);
}
} else if constexpr (IsTimeType<ToDataType>) {
if constexpr (IsDateTimeType<ToDataType> && IsDateV2Type<FromDataType>) {
Expand Down Expand Up @@ -453,8 +471,8 @@ struct ConvertImpl {
block.get_by_position(result).column =
ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
return Status::OK();
} else if constexpr ((std::is_same_v<FromDataType, DataTypeIPv4>)&&(
std::is_same_v<ToDataType, DataTypeIPv6>)) {
} else if constexpr ((std::is_same_v<FromDataType, DataTypeIPv4>) &&
(std::is_same_v<ToDataType, DataTypeIPv6>)) {
for (size_t i = 0; i < size; ++i) {
map_ipv4_to_ipv6(vec_from[i], reinterpret_cast<UInt8*>(&vec_to[i]));
}
Expand Down Expand Up @@ -1588,11 +1606,11 @@ class FunctionCast final : public IFunctionBase {
/// that will not throw an exception but return NULL in case of malformed input.
function = FunctionConvertFromString<DataType, NameCast>::create();
} else if (requested_result_is_nullable &&
(IsTimeType<DataType> || IsTimeV2Type<DataType>)&&!(
check_and_get_data_type<DataTypeDateTime>(from_type.get()) ||
check_and_get_data_type<DataTypeDate>(from_type.get()) ||
check_and_get_data_type<DataTypeDateV2>(from_type.get()) ||
check_and_get_data_type<DataTypeDateTimeV2>(from_type.get()))) {
(IsTimeType<DataType> || IsTimeV2Type<DataType>) &&
!(check_and_get_data_type<DataTypeDateTime>(from_type.get()) ||
check_and_get_data_type<DataTypeDate>(from_type.get()) ||
check_and_get_data_type<DataTypeDateV2>(from_type.get()) ||
check_and_get_data_type<DataTypeDateTimeV2>(from_type.get()))) {
function = FunctionConvertToTimeType<DataType, NameCast>::create();
} else {
function = FunctionTo<DataType>::Type::create();
Expand Down
27 changes: 27 additions & 0 deletions regression-test/data/datatype_p0/datetimev2/test_exprs.out
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,30 @@ false
2022-01-01T11:11:11.111 2022-01-01T11:11:11.911
2022-01-01T11:11:11.222 2022-01-01T11:11:12.022

-- !sql_cast_datetimev2_1 --
true

-- !sql_cast_datetimev2_2 --
true

-- !sql_cast_datetimev2_3 --
true

-- !sql_cast_datetimev2_4 --
true

-- !sql_cast_datetimev2_5 --
true

-- !sql_cast_datetimev2_6 --
true

-- !sql_cast_datetimev2_7 --
true

-- !sql_cast_datetimev2_8 --
true

-- !sql_cast_datetimev2_9 --
true

13 changes: 13 additions & 0 deletions regression-test/suites/datatype_p0/datetimev2/test_exprs.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,17 @@ suite("test_exprs") {
qt_sql_milliseconds_sub_datetimev2_3 " select col,milliseconds_sub(col, -200) col1 from ${table1} order by col1; "
// 2.2 Negative microseconds delta affects second change
qt_sql_milliseconds_sub_datetimev2_4 " select col,milliseconds_sub(col, -800) col1 from ${table1} order by col1; "

sql "set debug_skip_fold_constant = true;"
qt_sql_cast_datetimev2_1 " select cast(cast('2022-01-01 11:11:11.123456' as datetime(6)) as datetime(0)) = cast('2022-01-01 11:11:11' as datetime(0)); "
qt_sql_cast_datetimev2_2 " select cast(cast('2022-01-01 11:11:11.123456' as datetime(6)) as datetime(1)) = cast('2022-01-01 11:11:11.123' as datetime(1)); "
qt_sql_cast_datetimev2_3 " select cast(cast('2022-01-01 11:11:11.123456' as datetime(6)) as datetime(2)) = cast('2022-01-01 11:11:11.123' as datetime(2)); "
qt_sql_cast_datetimev2_4 " select cast(cast('2022-01-01 11:11:11.123456' as datetime(6)) as datetime(3)) = cast('2022-01-01 11:11:11.1234' as datetime(3)); "
qt_sql_cast_datetimev2_5 " select cast(cast('2022-01-01 11:11:11.123456' as datetime(6)) as datetime(4)) = cast('2022-01-01 11:11:11.12341' as datetime(4)); "
qt_sql_cast_datetimev2_6 " select cast(cast('2022-01-01 11:11:11.123456' as datetime(6)) as datetime(5)) = cast('2022-01-01 11:11:11.123451' as datetime(5)); "

qt_sql_cast_datetimev2_7 " select cast(cast('2022-01-01 11:11:11' as datetime(1)) as datetime(6)) = cast('2022-01-01 11:11:11' as datetime(0)); "
qt_sql_cast_datetimev2_8 " select cast(cast('2022-01-01 11:11:11' as datetime(2)) as datetime(3)) = cast('2022-01-01 11:11:11' as datetime(3)); "
qt_sql_cast_datetimev2_9 " select cast(cast('2022-01-01 11:11:11' as datetime(5)) as datetime(3)) = cast('2022-01-01 11:11:11' as datetime(3)); "

}

0 comments on commit d314a61

Please sign in to comment.