mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 16:12:01 +00:00
Merge pull request #54136 from aiven-sal/aiven-sal/fix_38585
Fix issues in accurateCastOrNull
This commit is contained in:
commit
47701d690a
@ -87,6 +87,7 @@ namespace ErrorCodes
|
||||
extern const int ILLEGAL_TYPE_OF_ARGUMENT;
|
||||
extern const int NOT_IMPLEMENTED;
|
||||
extern const int CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN;
|
||||
extern const int CANNOT_PARSE_BOOL;
|
||||
}
|
||||
|
||||
|
||||
@ -1597,7 +1598,19 @@ struct ConvertImplGenericFromString
|
||||
|
||||
const auto & val = col_from_string->getDataAt(i);
|
||||
ReadBufferFromMemory read_buffer(val.data, val.size);
|
||||
serialization_from.deserializeWholeText(column_to, read_buffer, format_settings);
|
||||
try
|
||||
{
|
||||
serialization_from.deserializeWholeText(column_to, read_buffer, format_settings);
|
||||
}
|
||||
catch (const Exception & e)
|
||||
{
|
||||
if (e.code() == ErrorCodes::CANNOT_PARSE_BOOL && typeid_cast<ColumnNullable *>(&column_to))
|
||||
{
|
||||
column_to.insertDefault();
|
||||
continue;
|
||||
}
|
||||
throw;
|
||||
}
|
||||
|
||||
if (!read_buffer.eof())
|
||||
{
|
||||
@ -4054,15 +4067,21 @@ private:
|
||||
{
|
||||
if constexpr (std::is_same_v<ToDataType, DataTypeIPv4>)
|
||||
{
|
||||
ret = [cast_ipv4_ipv6_default_on_conversion_error_value, input_format_ipv4_default_on_conversion_error_value, requested_result_is_nullable](
|
||||
ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, const ColumnNullable * column_nullable, size_t)
|
||||
-> ColumnPtr
|
||||
ret = [cast_ipv4_ipv6_default_on_conversion_error_value,
|
||||
input_format_ipv4_default_on_conversion_error_value,
|
||||
requested_result_is_nullable](
|
||||
ColumnsWithTypeAndName & arguments,
|
||||
const DataTypePtr & result_type,
|
||||
const ColumnNullable * column_nullable,
|
||||
size_t) -> ColumnPtr
|
||||
{
|
||||
if (!WhichDataType(result_type).isIPv4())
|
||||
throw Exception(ErrorCodes::TYPE_MISMATCH, "Wrong result type {}. Expected IPv4", result_type->getName());
|
||||
|
||||
const auto * null_map = column_nullable ? &column_nullable->getNullMapData() : nullptr;
|
||||
if (cast_ipv4_ipv6_default_on_conversion_error_value || input_format_ipv4_default_on_conversion_error_value || requested_result_is_nullable)
|
||||
if (requested_result_is_nullable)
|
||||
return convertToIPv4<IPStringToNumExceptionMode::Null>(arguments[0].column, null_map);
|
||||
else if (cast_ipv4_ipv6_default_on_conversion_error_value || input_format_ipv4_default_on_conversion_error_value)
|
||||
return convertToIPv4<IPStringToNumExceptionMode::Default>(arguments[0].column, null_map);
|
||||
else
|
||||
return convertToIPv4<IPStringToNumExceptionMode::Throw>(arguments[0].column, null_map);
|
||||
@ -4073,16 +4092,22 @@ private:
|
||||
|
||||
if constexpr (std::is_same_v<ToDataType, DataTypeIPv6>)
|
||||
{
|
||||
ret = [cast_ipv4_ipv6_default_on_conversion_error_value, input_format_ipv6_default_on_conversion_error_value, requested_result_is_nullable](
|
||||
ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, const ColumnNullable * column_nullable, size_t)
|
||||
-> ColumnPtr
|
||||
ret = [cast_ipv4_ipv6_default_on_conversion_error_value,
|
||||
input_format_ipv6_default_on_conversion_error_value,
|
||||
requested_result_is_nullable](
|
||||
ColumnsWithTypeAndName & arguments,
|
||||
const DataTypePtr & result_type,
|
||||
const ColumnNullable * column_nullable,
|
||||
size_t) -> ColumnPtr
|
||||
{
|
||||
if (!WhichDataType(result_type).isIPv6())
|
||||
throw Exception(
|
||||
ErrorCodes::TYPE_MISMATCH, "Wrong result type {}. Expected IPv6", result_type->getName());
|
||||
|
||||
const auto * null_map = column_nullable ? &column_nullable->getNullMapData() : nullptr;
|
||||
if (cast_ipv4_ipv6_default_on_conversion_error_value || input_format_ipv6_default_on_conversion_error_value || requested_result_is_nullable)
|
||||
if (requested_result_is_nullable)
|
||||
return convertToIPv6<IPStringToNumExceptionMode::Null>(arguments[0].column, null_map);
|
||||
else if (cast_ipv4_ipv6_default_on_conversion_error_value || input_format_ipv6_default_on_conversion_error_value)
|
||||
return convertToIPv6<IPStringToNumExceptionMode::Default>(arguments[0].column, null_map);
|
||||
else
|
||||
return convertToIPv6<IPStringToNumExceptionMode::Throw>(arguments[0].column, null_map);
|
||||
@ -4093,7 +4118,18 @@ private:
|
||||
|
||||
if (to_type->getCustomSerialization() && to_type->getCustomName())
|
||||
{
|
||||
ret = &ConvertImplGenericFromString<typename FromDataType::ColumnType>::execute;
|
||||
ret = [requested_result_is_nullable](
|
||||
ColumnsWithTypeAndName & arguments,
|
||||
const DataTypePtr & result_type,
|
||||
const ColumnNullable * column_nullable,
|
||||
size_t input_rows_count) -> ColumnPtr
|
||||
{
|
||||
auto wrapped_result_type = result_type;
|
||||
if (requested_result_is_nullable)
|
||||
wrapped_result_type = makeNullable(result_type);
|
||||
return ConvertImplGenericFromString<typename FromDataType::ColumnType>::execute(
|
||||
arguments, wrapped_result_type, column_nullable, input_rows_count);
|
||||
};
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -4108,7 +4144,9 @@ private:
|
||||
ErrorCodes::TYPE_MISMATCH, "Wrong result type {}. Expected IPv4", result_type->getName());
|
||||
|
||||
const auto * null_map = column_nullable ? &column_nullable->getNullMapData() : nullptr;
|
||||
if (cast_ipv4_ipv6_default_on_conversion_error_value || requested_result_is_nullable)
|
||||
if (requested_result_is_nullable)
|
||||
return convertIPv6ToIPv4<IPStringToNumExceptionMode::Null>(arguments[0].column, null_map);
|
||||
else if (cast_ipv4_ipv6_default_on_conversion_error_value)
|
||||
return convertIPv6ToIPv4<IPStringToNumExceptionMode::Default>(arguments[0].column, null_map);
|
||||
else
|
||||
return convertIPv6ToIPv4<IPStringToNumExceptionMode::Throw>(arguments[0].column, null_map);
|
||||
|
@ -42,3 +42,8 @@
|
||||
2023-05-30
|
||||
2149-06-06
|
||||
1970-01-20
|
||||
Tests for issue #38585
|
||||
\N
|
||||
\N
|
||||
\N
|
||||
\N
|
||||
|
@ -49,3 +49,10 @@ SELECT accurateCastOrNull('1xxx', 'Date');
|
||||
SELECT accurateCastOrNull('2023-05-30', 'Date');
|
||||
SELECT accurateCastOrNull('2180-01-01', 'Date');
|
||||
SELECT accurateCastOrNull(19, 'Date');
|
||||
|
||||
SELECT 'Tests for issue #38585';
|
||||
select accurateCastOrNull('test', 'Bool');
|
||||
select accurateCast('test', 'Nullable(Bool)');
|
||||
|
||||
select accurateCastOrNull('test', 'IPv4');
|
||||
select accurateCastOrNull('test', 'IPv6');
|
||||
|
@ -17,7 +17,7 @@ true
|
||||
\N
|
||||
0.0.0.0
|
||||
\N
|
||||
0.0.0.0
|
||||
\N
|
||||
\N
|
||||
\N
|
||||
\N
|
||||
@ -25,7 +25,7 @@ true
|
||||
\N
|
||||
::
|
||||
\N
|
||||
::
|
||||
\N
|
||||
\N
|
||||
\N
|
||||
\N
|
||||
|
Loading…
Reference in New Issue
Block a user