mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 17:12:03 +00:00
commit
3b43b0a1be
@ -704,7 +704,11 @@ struct DateTimeTransformImpl
|
||||
{
|
||||
using Op = Transformer<typename FromDataType::FieldType, typename ToDataType::FieldType, Transform>;
|
||||
|
||||
const DateLUTImpl & time_zone = extractTimeZoneFromFunctionArguments(arguments, 1, 0);
|
||||
size_t time_zone_argument_position = 1;
|
||||
if constexpr (std::is_same_v<ToDataType, DataTypeDateTime64>)
|
||||
time_zone_argument_position = 2;
|
||||
|
||||
const DateLUTImpl & time_zone = extractTimeZoneFromFunctionArguments(arguments, time_zone_argument_position, 0);
|
||||
|
||||
const ColumnPtr source_col = arguments[0].column;
|
||||
if (const auto * sources = checkAndGetColumn<typename FromDataType::ColumnType>(source_col.get()))
|
||||
|
@ -477,6 +477,61 @@ template <typename Name> struct ConvertImpl<DataTypeDate, DataTypeDateTime64, Na
|
||||
template <typename Name> struct ConvertImpl<DataTypeDateTime, DataTypeDateTime64, Name, ConvertDefaultBehaviorTag>
|
||||
: DateTimeTransformImpl<DataTypeDateTime, DataTypeDateTime64, ToDateTime64Transform> {};
|
||||
|
||||
/** Conversion of numeric to DateTime64
|
||||
*/
|
||||
|
||||
template <typename FromType>
|
||||
struct ToDateTime64TransformUnsigned
|
||||
{
|
||||
static constexpr auto name = "toDateTime64";
|
||||
|
||||
const DateTime64::NativeType scale_multiplier = 1;
|
||||
|
||||
ToDateTime64TransformUnsigned(UInt32 scale = 0)
|
||||
: scale_multiplier(DecimalUtils::scaleMultiplier<DateTime64::NativeType>(scale))
|
||||
{}
|
||||
|
||||
inline NO_SANITIZE_UNDEFINED DateTime64::NativeType execute(FromType from, const DateLUTImpl &) const
|
||||
{
|
||||
from = std::min(time_t(from), time_t(0xFFFFFFFF));
|
||||
return DecimalUtils::decimalFromComponentsWithMultiplier<DateTime64>(from, 0, scale_multiplier);
|
||||
}
|
||||
};
|
||||
template <typename FromType>
|
||||
struct ToDateTime64TransformSigned
|
||||
{
|
||||
static constexpr auto name = "toDateTime64";
|
||||
|
||||
const DateTime64::NativeType scale_multiplier = 1;
|
||||
|
||||
ToDateTime64TransformSigned(UInt32 scale = 0)
|
||||
: scale_multiplier(DecimalUtils::scaleMultiplier<DateTime64::NativeType>(scale))
|
||||
{}
|
||||
|
||||
inline NO_SANITIZE_UNDEFINED DateTime64::NativeType execute(FromType from, const DateLUTImpl &) const
|
||||
{
|
||||
if (from < 0)
|
||||
return 0;
|
||||
from = std::min(time_t(from), time_t(0xFFFFFFFF));
|
||||
return DecimalUtils::decimalFromComponentsWithMultiplier<DateTime64>(from, 0, scale_multiplier);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Name> struct ConvertImpl<DataTypeInt8, DataTypeDateTime64, Name>
|
||||
: DateTimeTransformImpl<DataTypeInt8, DataTypeDateTime64, ToDateTime64TransformSigned<Int8>> {};
|
||||
template <typename Name> struct ConvertImpl<DataTypeInt16, DataTypeDateTime64, Name>
|
||||
: DateTimeTransformImpl<DataTypeInt16, DataTypeDateTime64, ToDateTime64TransformSigned<Int16>> {};
|
||||
template <typename Name> struct ConvertImpl<DataTypeInt32, DataTypeDateTime64, Name>
|
||||
: DateTimeTransformImpl<DataTypeInt32, DataTypeDateTime64, ToDateTime64TransformSigned<Int32>> {};
|
||||
template <typename Name> struct ConvertImpl<DataTypeInt64, DataTypeDateTime64, Name>
|
||||
: DateTimeTransformImpl<DataTypeInt64, DataTypeDateTime64, ToDateTime64TransformSigned<Int64>> {};
|
||||
template <typename Name> struct ConvertImpl<DataTypeUInt64, DataTypeDateTime64, Name>
|
||||
: DateTimeTransformImpl<DataTypeUInt64, DataTypeDateTime64, ToDateTime64TransformUnsigned<UInt64>> {};
|
||||
template <typename Name> struct ConvertImpl<DataTypeFloat32, DataTypeDateTime64, Name>
|
||||
: DateTimeTransformImpl<DataTypeFloat32, DataTypeDateTime64, ToDateTime64TransformSigned<Float32>> {};
|
||||
template <typename Name> struct ConvertImpl<DataTypeFloat64, DataTypeDateTime64, Name>
|
||||
: DateTimeTransformImpl<DataTypeFloat64, DataTypeDateTime64, ToDateTime64TransformSigned<Float64>> {};
|
||||
|
||||
/** Conversion of DateTime64 to Date or DateTime: discards fractional part.
|
||||
*/
|
||||
template <typename Transform>
|
||||
@ -1294,7 +1349,12 @@ public:
|
||||
bool useDefaultImplementationForNulls() const override { return checked_return_type; }
|
||||
|
||||
bool useDefaultImplementationForConstants() const override { return true; }
|
||||
ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; }
|
||||
ColumnNumbers getArgumentsThatAreAlwaysConstant() const override
|
||||
{
|
||||
if constexpr (std::is_same_v<ToDataType, DataTypeDateTime64>)
|
||||
return {2};
|
||||
return {1};
|
||||
}
|
||||
bool canBeExecutedOnDefaultArguments() const override { return false; }
|
||||
|
||||
ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override
|
||||
@ -2313,7 +2373,7 @@ private:
|
||||
using LeftDataType = typename Types::LeftType;
|
||||
using RightDataType = typename Types::RightType;
|
||||
|
||||
if constexpr (IsDataTypeDecimalOrNumber<LeftDataType> && IsDataTypeDecimalOrNumber<RightDataType>)
|
||||
if constexpr (IsDataTypeDecimalOrNumber<LeftDataType> && IsDataTypeDecimalOrNumber<RightDataType> && !std::is_same_v<DataTypeDateTime64, RightDataType>)
|
||||
{
|
||||
if (wrapper_cast_type == CastType::accurate)
|
||||
{
|
||||
|
11
tests/queries/0_stateless/01691_DateTime64_clamp.reference
Normal file
11
tests/queries/0_stateless/01691_DateTime64_clamp.reference
Normal file
@ -0,0 +1,11 @@
|
||||
-- { echo }
|
||||
SELECT toDateTime(-2, 2);
|
||||
1970-01-01 03:00:00.00
|
||||
SELECT toDateTime64(-2, 2);
|
||||
1970-01-01 03:00:00.00
|
||||
SELECT CAST(-1 AS DateTime64);
|
||||
1970-01-01 03:00:00.000
|
||||
SELECT CAST('2020-01-01 00:00:00.3' AS DateTime64);
|
||||
2020-01-01 00:00:00.300
|
||||
SELECT toDateTime64(bitShiftLeft(toUInt64(1),33), 2);
|
||||
2106-02-07 09:28:15.00
|
6
tests/queries/0_stateless/01691_DateTime64_clamp.sql
Normal file
6
tests/queries/0_stateless/01691_DateTime64_clamp.sql
Normal file
@ -0,0 +1,6 @@
|
||||
-- { echo }
|
||||
SELECT toDateTime(-2, 2);
|
||||
SELECT toDateTime64(-2, 2);
|
||||
SELECT CAST(-1 AS DateTime64);
|
||||
SELECT CAST('2020-01-01 00:00:00.3' AS DateTime64);
|
||||
SELECT toDateTime64(bitShiftLeft(toUInt64(1),33), 2);
|
@ -0,0 +1,9 @@
|
||||
-- { echo }
|
||||
select toDateTime64(toDateTime(1), 2);
|
||||
1970-01-01 03:00:01.00
|
||||
select toDateTime64(toDate(1), 2);
|
||||
1970-01-02 00:00:00.00
|
||||
select toDateTime64(toDateTime(1), 2, 'GMT');
|
||||
1970-01-01 00:00:01.00
|
||||
select toDateTime64(toDate(1), 2, 'GMT');
|
||||
1970-01-02 00:00:00.00
|
@ -0,0 +1,5 @@
|
||||
-- { echo }
|
||||
select toDateTime64(toDateTime(1), 2);
|
||||
select toDateTime64(toDate(1), 2);
|
||||
select toDateTime64(toDateTime(1), 2, 'GMT');
|
||||
select toDateTime64(toDate(1), 2, 'GMT');
|
Loading…
Reference in New Issue
Block a user