Merge pull request #51642 from ClickHouse/fix-nullable-ipv4-intdiv

Fix binary arithmetic for Nullable(IPv4)
This commit is contained in:
Yakov Olkhovskiy 2023-07-28 08:27:37 -04:00 committed by GitHub
commit 61d05aeca4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 20 deletions

View File

@ -1919,25 +1919,6 @@ ColumnPtr executeStringInteger(const ColumnsWithTypeAndName & arguments, const A
return executeAggregateAddition(arguments, result_type, input_rows_count);
}
/// Special case - one or both arguments are IPv4
if (isIPv4(arguments[0].type) || isIPv4(arguments[1].type))
{
ColumnsWithTypeAndName new_arguments {
{
isIPv4(arguments[0].type) ? castColumn(arguments[0], std::make_shared<DataTypeUInt32>()) : arguments[0].column,
isIPv4(arguments[0].type) ? std::make_shared<DataTypeUInt32>() : arguments[0].type,
arguments[0].name,
},
{
isIPv4(arguments[1].type) ? castColumn(arguments[1], std::make_shared<DataTypeUInt32>()) : arguments[1].column,
isIPv4(arguments[1].type) ? std::make_shared<DataTypeUInt32>() : arguments[1].type,
arguments[1].name
}
};
return executeImpl(new_arguments, result_type, input_rows_count);
}
/// Special case when the function is plus or minus, one of arguments is Date/DateTime and another is Interval.
if (auto function_builder = getFunctionForIntervalArithmetic(arguments[0].type, arguments[1].type, context))
{
@ -1991,6 +1972,25 @@ ColumnPtr executeStringInteger(const ColumnsWithTypeAndName & arguments, const A
return wrapInNullable(res, arguments, result_type, input_rows_count);
}
/// Special case - one or both arguments are IPv4
if (isIPv4(arguments[0].type) || isIPv4(arguments[1].type))
{
ColumnsWithTypeAndName new_arguments {
{
isIPv4(arguments[0].type) ? castColumn(arguments[0], std::make_shared<DataTypeUInt32>()) : arguments[0].column,
isIPv4(arguments[0].type) ? std::make_shared<DataTypeUInt32>() : arguments[0].type,
arguments[0].name,
},
{
isIPv4(arguments[1].type) ? castColumn(arguments[1], std::make_shared<DataTypeUInt32>()) : arguments[1].column,
isIPv4(arguments[1].type) ? std::make_shared<DataTypeUInt32>() : arguments[1].type,
arguments[1].name
}
};
return executeImpl2(new_arguments, result_type, input_rows_count, right_nullmap);
}
const auto * const left_generic = left_argument.type.get();
const auto * const right_generic = right_argument.type.get();
ColumnPtr res;

View File

@ -1,3 +1,5 @@
-- { echoOn }
SELECT number, ip, ip % number FROM (SELECT number, toIPv4('1.2.3.4') as ip FROM numbers(10, 20));
10 1.2.3.4 0
11 1.2.3.4 3
12 1.2.3.4 4
@ -18,3 +20,24 @@
27 1.2.3.4 13
28 1.2.3.4 0
29 1.2.3.4 1
SELECT number, ip, number % ip FROM (SELECT number, toIPv4OrNull('0.0.0.3') as ip FROM numbers(10, 20));
10 0.0.0.3 1
11 0.0.0.3 2
12 0.0.0.3 0
13 0.0.0.3 1
14 0.0.0.3 2
15 0.0.0.3 0
16 0.0.0.3 1
17 0.0.0.3 2
18 0.0.0.3 0
19 0.0.0.3 1
20 0.0.0.3 2
21 0.0.0.3 0
22 0.0.0.3 1
23 0.0.0.3 2
24 0.0.0.3 0
25 0.0.0.3 1
26 0.0.0.3 2
27 0.0.0.3 0
28 0.0.0.3 1
29 0.0.0.3 2

View File

@ -1 +1,4 @@
SELECT number, ip, ip % number FROM (SELECT number, toIPv4('1.2.3.4') as ip FROM numbers(10, 20));
-- { echoOn }
SELECT number, ip, ip % number FROM (SELECT number, toIPv4('1.2.3.4') as ip FROM numbers(10, 20));
SELECT number, ip, number % ip FROM (SELECT number, toIPv4OrNull('0.0.0.3') as ip FROM numbers(10, 20));