From 1540c49530a02da4703416ce1c0b9e71daee6c60 Mon Sep 17 00:00:00 2001 From: amory Date: Tue, 3 Dec 2024 11:50:54 +0800 Subject: [PATCH 1/3] [fix](ip) fix ip nullable param without check (#44700) if we use ipv6_cidr_to_range function with nullable func which with invalid ipv6 will make be core ``` mysql> select id, ipv6_cidr_to_range(nullable(''), 32) from fn_test_ip_nullable order by id; ``` --- be/src/vec/functions/function_ip.h | 68 +++--- .../scalar_function/IP.out | 204 ++++++++++++++++++ .../scalar_function/IP.groovy | 23 +- .../test_ipv6_cidr_to_range_function.groovy | 12 +- 4 files changed, 256 insertions(+), 51 deletions(-) diff --git a/be/src/vec/functions/function_ip.h b/be/src/vec/functions/function_ip.h index 0f22fbda043b70..6259948f029fa2 100644 --- a/be/src/vec/functions/function_ip.h +++ b/be/src/vec/functions/function_ip.h @@ -955,6 +955,11 @@ class FunctionIPv4CIDRToRange : public IFunction { } }; +/** + * this function accepts two arguments: an IPv6 address and a CIDR mask + * IPv6 address can be either ipv6 type or string type as ipv6 string address + * FE: PropagateNullable is used to handle nullable columns + */ class FunctionIPv6CIDRToRange : public IFunction { public: static constexpr auto name = "ipv6_cidr_to_range"; @@ -986,12 +991,14 @@ class FunctionIPv6CIDRToRange : public IFunction { if (addr_type.is_ipv6()) { const auto* ipv6_addr_column = assert_cast(addr_column.get()); - col_res = execute_impl(*ipv6_addr_column, *cidr_col, input_rows_count, - add_col_const, col_const); + col_res = execute_impl(*ipv6_addr_column, *cidr_col, input_rows_count, add_col_const, + col_const); } else if (addr_type.is_string()) { - const auto* str_addr_column = assert_cast(addr_column.get()); - col_res = execute_impl(*str_addr_column, *cidr_col, input_rows_count, - add_col_const, col_const); + ColumnPtr col_ipv6 = + convert_to_ipv6(addr_column, nullptr); + const auto* ipv6_addr_column = assert_cast(col_ipv6.get()); + col_res = execute_impl(*ipv6_addr_column, *cidr_col, input_rows_count, add_col_const, + col_const); } else { return Status::RuntimeError( "Illegal column {} of argument of function {}, Expected IPv6 or String", @@ -1002,8 +1009,7 @@ class FunctionIPv6CIDRToRange : public IFunction { return Status::OK(); } - template - static ColumnPtr execute_impl(const FromColumn& from_column, const ColumnInt16& cidr_column, + static ColumnPtr execute_impl(const ColumnIPv6& from_column, const ColumnInt16& cidr_column, size_t input_rows_count, bool is_addr_const = false, bool is_cidr_const = false) { auto col_res_lower_range = ColumnIPv6::create(input_rows_count, 0); @@ -1020,18 +1026,10 @@ class FunctionIPv6CIDRToRange : public IFunction { throw Exception(ErrorCode::INVALID_ARGUMENT, "Illegal cidr value '{}'", std::to_string(cidr)); } - if constexpr (std::is_same_v) { - // 16 bytes ipv6 string is stored in big-endian byte order - // so transfer to little-endian firstly - auto* src_data = const_cast(from_column.get_data_at(0).data); - std::reverse(src_data, src_data + IPV6_BINARY_LENGTH); - apply_cidr_mask(src_data, reinterpret_cast(&vec_res_lower_range[i]), - reinterpret_cast(&vec_res_upper_range[i]), cidr); - } else { - apply_cidr_mask(from_column.get_data_at(0).data, - reinterpret_cast(&vec_res_lower_range[i]), - reinterpret_cast(&vec_res_upper_range[i]), cidr); - } + apply_cidr_mask(from_column.get_data_at(0).data, + reinterpret_cast(&vec_res_lower_range[i]), + reinterpret_cast(&vec_res_upper_range[i]), + cast_set(cidr)); } } else if (is_cidr_const) { auto cidr = cidr_column.get_int(0); @@ -1040,18 +1038,10 @@ class FunctionIPv6CIDRToRange : public IFunction { std::to_string(cidr)); } for (size_t i = 0; i < input_rows_count; ++i) { - if constexpr (std::is_same_v) { - // 16 bytes ipv6 string is stored in big-endian byte order - // so transfer to little-endian firstly - auto* src_data = const_cast(from_column.get_data_at(i).data); - std::reverse(src_data, src_data + IPV6_BINARY_LENGTH); - apply_cidr_mask(src_data, reinterpret_cast(&vec_res_lower_range[i]), - reinterpret_cast(&vec_res_upper_range[i]), cidr); - } else { - apply_cidr_mask(from_column.get_data_at(i).data, - reinterpret_cast(&vec_res_lower_range[i]), - reinterpret_cast(&vec_res_upper_range[i]), cidr); - } + apply_cidr_mask(from_column.get_data_at(i).data, + reinterpret_cast(&vec_res_lower_range[i]), + reinterpret_cast(&vec_res_upper_range[i]), + cast_set(cidr)); } } else { for (size_t i = 0; i < input_rows_count; ++i) { @@ -1060,18 +1050,10 @@ class FunctionIPv6CIDRToRange : public IFunction { throw Exception(ErrorCode::INVALID_ARGUMENT, "Illegal cidr value '{}'", std::to_string(cidr)); } - if constexpr (std::is_same_v) { - // 16 bytes ipv6 string is stored in big-endian byte order - // so transfer to little-endian firstly - auto* src_data = const_cast(from_column.get_data_at(i).data); - std::reverse(src_data, src_data + IPV6_BINARY_LENGTH); - apply_cidr_mask(src_data, reinterpret_cast(&vec_res_lower_range[i]), - reinterpret_cast(&vec_res_upper_range[i]), cidr); - } else { - apply_cidr_mask(from_column.get_data_at(i).data, - reinterpret_cast(&vec_res_lower_range[i]), - reinterpret_cast(&vec_res_upper_range[i]), cidr); - } + apply_cidr_mask(from_column.get_data_at(i).data, + reinterpret_cast(&vec_res_lower_range[i]), + reinterpret_cast(&vec_res_upper_range[i]), + cast_set(cidr)); } } return ColumnStruct::create( diff --git a/regression-test/data/nereids_function_p0/scalar_function/IP.out b/regression-test/data/nereids_function_p0/scalar_function/IP.out index 5b44453ceb6232..af146b66223378 100644 --- a/regression-test/data/nereids_function_p0/scalar_function/IP.out +++ b/regression-test/data/nereids_function_p0/scalar_function/IP.out @@ -410,6 +410,108 @@ 99 {"min":"224.0.0.0", "max":"224.0.255.255"} 100 {"min":"224.0.0.0", "max":"224.0.255.255"} +-- !sql_cidr_ipv6_nullable_ -- +1 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +2 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +3 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +4 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +5 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +6 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +7 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +8 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +9 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +10 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +11 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +12 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +13 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +14 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +15 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +16 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +17 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +18 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +19 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +20 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +21 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +22 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +23 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +24 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +25 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +26 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +27 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +28 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +29 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +30 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +31 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +32 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +33 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +34 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +35 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +36 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +37 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +38 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +39 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +40 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +41 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +42 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +43 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +44 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +45 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +46 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +47 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +48 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +49 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +50 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +51 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +52 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +53 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +54 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +55 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +56 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +57 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +58 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +59 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +60 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +61 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +62 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +63 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +64 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +65 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +66 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +67 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +68 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +69 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +70 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +71 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +72 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +73 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +74 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +75 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +76 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +77 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +78 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +79 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +80 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +81 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +82 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +83 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +84 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +85 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +86 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +87 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +88 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +89 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +90 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +91 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +92 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +93 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +94 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +95 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +96 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +97 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +98 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +99 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +100 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} + -- !sql_num2string_ipv6 -- 1 ::1 2 fc00:: @@ -6121,6 +6223,108 @@ 99 {"min":"224.0.0.0", "max":"224.0.255.255"} 100 {"min":"224.0.0.0", "max":"224.0.255.255"} +-- !sql_not_null_cidr_ipv6_nullable_ -- +1 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +2 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +3 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +4 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +5 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +6 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +7 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +8 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +9 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +10 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +11 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +12 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +13 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +14 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +15 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +16 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +17 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +18 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +19 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +20 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +21 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +22 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +23 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +24 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +25 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +26 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +27 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +28 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +29 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +30 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +31 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +32 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +33 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +34 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +35 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +36 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +37 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +38 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +39 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +40 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +41 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +42 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +43 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +44 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +45 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +46 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +47 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +48 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +49 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +50 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +51 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +52 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +53 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +54 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +55 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +56 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +57 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +58 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +59 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +60 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +61 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +62 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +63 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +64 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +65 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +66 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +67 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +68 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +69 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +70 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +71 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +72 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +73 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +74 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +75 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +76 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +77 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +78 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +79 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +80 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +81 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +82 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +83 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +84 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +85 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +86 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +87 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +88 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +89 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +90 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +91 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +92 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +93 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +94 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +95 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +96 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +97 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +98 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +99 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} +100 {"min":"::", "max":"::ffff:ffff:ffff:ffff:ffff:ffff"} + -- !sql_not_null_ipv6_string_to_num -- 1 00000000000000000000000000000001 2 FC000000000000000000000000000000 diff --git a/regression-test/suites/nereids_function_p0/scalar_function/IP.groovy b/regression-test/suites/nereids_function_p0/scalar_function/IP.groovy index 9cbdccbe78840b..a1c1d00caa29fe 100644 --- a/regression-test/suites/nereids_function_p0/scalar_function/IP.groovy +++ b/regression-test/suites/nereids_function_p0/scalar_function/IP.groovy @@ -30,7 +30,16 @@ suite("nereids_scalar_fn_IP") { qt_sql_cidr_ipv6_all """ select id, ipv6_cidr_to_range(ip6, 16) from fn_test_ip_nullable order by id; """ qt_sql_cidr_ipv4_all """ select id, ipv4_cidr_to_range(ip4, 16) from fn_test_ip_nullable order by id; """ - + // test nullable param + qt_sql_cidr_ipv6_nullable_ "select id, ipv6_cidr_to_range(to_ipv6('::'), 32) from fn_test_ip_nullable order by id;" + test { + sql "select id, ipv6_cidr_to_range(nullable(''), 32) from fn_test_ip_nullable order by id" + exception "Invalid IPv6 value" + } + test { + sql "select id, ipv6_cidr_to_range(nullable('abc'), 32) from fn_test_ip_not_nullable order by id" + exception "Invalid IPv6 value" + } // test IPV4_STRING_TO_NUM/IPV6_STRING_TO_NUM (we have null value in ip4 and ip6 column in fn_test_ip_nullable table) test { sql 'select id, ipv6_string_to_num(ip6) from fn_test_ip_nullable order by id' @@ -153,7 +162,17 @@ suite("nereids_scalar_fn_IP") { qt_sql_not_null_cidr_ipv6_all """ select id, ipv6_cidr_to_range(ip6, 16) from fn_test_ip_not_nullable order by id; """ qt_sql_not_null_cidr_ipv4_all """ select id, ipv4_cidr_to_range(ip4, 16) from fn_test_ip_not_nullable order by id; """ + // test nullable param + qt_sql_not_null_cidr_ipv6_nullable_ "select id, ipv6_cidr_to_range(to_ipv6('::'), 32) from fn_test_ip_nullable order by id;" + test { + sql "select id, ipv6_cidr_to_range(nullable(''), 32) from fn_test_ip_not_nullable order by id" + exception "Invalid IPv6 value" + } + test { + sql "select id, ipv6_cidr_to_range(nullable('abc'), 32) from fn_test_ip_not_nullable order by id" + exception "Invalid IPv6 value" + } // test IPV4_STRING_TO_NUM/IPV6_STRING_TO_NUM qt_sql_not_null_ipv6_string_to_num 'select id, hex(ipv6_string_to_num(ip6)) from fn_test_ip_not_nullable order by id' @@ -269,4 +288,4 @@ suite("nereids_scalar_fn_IP") { qt_sql_not_null_to_ipv4_or_null "select id, to_ipv4_or_null(ip6) from fn_test_ip_not_nullable order by id" qt_sql_not_null_to_ipv4_or_null_str "select id, to_ipv4_or_null(ip6_str) from fn_test_ip_not_nullable order by id" -} \ No newline at end of file +} diff --git a/regression-test/suites/query_p0/sql_functions/ip_functions/test_ipv6_cidr_to_range_function.groovy b/regression-test/suites/query_p0/sql_functions/ip_functions/test_ipv6_cidr_to_range_function.groovy index 41432c986fec49..0a8ba107013b4e 100644 --- a/regression-test/suites/query_p0/sql_functions/ip_functions/test_ipv6_cidr_to_range_function.groovy +++ b/regression-test/suites/query_p0/sql_functions/ip_functions/test_ipv6_cidr_to_range_function.groovy @@ -91,13 +91,13 @@ suite("test_ipv6_cidr_to_range_function") { (9, 'ffff:0000:0000:0000:0000:0000:0000:0000', NULL) """ - qt_sql "select id, struct_element(ipv6_cidr_to_range(ipv6_string_to_num_or_null(addr), cidr), 'min') as min_range, struct_element(ipv6_cidr_to_range(ipv6_string_to_num_or_null(addr), cidr), 'max') as max_range from test_str_cidr_to_range_function order by id" + qt_sql "select id, struct_element(ipv6_cidr_to_range(ipv6_num_to_string(ipv6_string_to_num_or_null(addr)), cidr), 'min') as min_range, struct_element(ipv6_cidr_to_range(ipv6_num_to_string(ipv6_string_to_num_or_null(addr)), cidr), 'max') as max_range from test_str_cidr_to_range_function order by id" sql """ DROP TABLE IF EXISTS test_str_cidr_to_range_function """ - qt_sql "select ipv6_cidr_to_range(ipv6_string_to_num('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 0)" - qt_sql "select ipv6_cidr_to_range(ipv6_string_to_num('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 128)" - qt_sql "select ipv6_cidr_to_range(ipv6_string_to_num('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'), 64)" - qt_sql "select ipv6_cidr_to_range(ipv6_string_to_num('0000:0000:0000:0000:0000:0000:0000:0000'), 8)" - qt_sql "select ipv6_cidr_to_range(ipv6_string_to_num('ffff:0000:0000:0000:0000:0000:0000:0000'), 4)" + qt_sql "select ipv6_cidr_to_range(ipv6_num_to_string(ipv6_string_to_num('2001:0db8:0000:85a3:0000:0000:ac1f:8001')), 0)" + qt_sql "select ipv6_cidr_to_range(ipv6_num_to_string(ipv6_string_to_num('2001:0db8:0000:85a3:0000:0000:ac1f:8001')), 128)" + qt_sql "select ipv6_cidr_to_range(ipv6_num_to_string(ipv6_string_to_num('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')), 64)" + qt_sql "select ipv6_cidr_to_range(ipv6_num_to_string(ipv6_string_to_num('0000:0000:0000:0000:0000:0000:0000:0000')), 8)" + qt_sql "select ipv6_cidr_to_range(ipv6_num_to_string(ipv6_string_to_num('ffff:0000:0000:0000:0000:0000:0000:0000')), 4)" } From 9778b791a2b6f29b8fe092dda8d5789fbf397903 Mon Sep 17 00:00:00 2001 From: amorynan Date: Thu, 2 Jan 2025 15:54:13 +0800 Subject: [PATCH 2/3] fix function_ip --- be/src/vec/functions/function_ip.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/be/src/vec/functions/function_ip.h b/be/src/vec/functions/function_ip.h index 6259948f029fa2..d2792a1af2a589 100644 --- a/be/src/vec/functions/function_ip.h +++ b/be/src/vec/functions/function_ip.h @@ -1029,7 +1029,7 @@ class FunctionIPv6CIDRToRange : public IFunction { apply_cidr_mask(from_column.get_data_at(0).data, reinterpret_cast(&vec_res_lower_range[i]), reinterpret_cast(&vec_res_upper_range[i]), - cast_set(cidr)); + cidr); } } else if (is_cidr_const) { auto cidr = cidr_column.get_int(0); @@ -1041,7 +1041,7 @@ class FunctionIPv6CIDRToRange : public IFunction { apply_cidr_mask(from_column.get_data_at(i).data, reinterpret_cast(&vec_res_lower_range[i]), reinterpret_cast(&vec_res_upper_range[i]), - cast_set(cidr)); + cidr); } } else { for (size_t i = 0; i < input_rows_count; ++i) { @@ -1053,7 +1053,7 @@ class FunctionIPv6CIDRToRange : public IFunction { apply_cidr_mask(from_column.get_data_at(i).data, reinterpret_cast(&vec_res_lower_range[i]), reinterpret_cast(&vec_res_upper_range[i]), - cast_set(cidr)); + cidr); } } return ColumnStruct::create( From 03b744c6d011581cd66ad4da81acdaee40085db9 Mon Sep 17 00:00:00 2001 From: amorynan Date: Thu, 2 Jan 2025 15:56:04 +0800 Subject: [PATCH 3/3] fix format --- be/src/vec/functions/function_ip.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/be/src/vec/functions/function_ip.h b/be/src/vec/functions/function_ip.h index d2792a1af2a589..a212c4130cac3b 100644 --- a/be/src/vec/functions/function_ip.h +++ b/be/src/vec/functions/function_ip.h @@ -1028,8 +1028,7 @@ class FunctionIPv6CIDRToRange : public IFunction { } apply_cidr_mask(from_column.get_data_at(0).data, reinterpret_cast(&vec_res_lower_range[i]), - reinterpret_cast(&vec_res_upper_range[i]), - cidr); + reinterpret_cast(&vec_res_upper_range[i]), cidr); } } else if (is_cidr_const) { auto cidr = cidr_column.get_int(0); @@ -1040,8 +1039,7 @@ class FunctionIPv6CIDRToRange : public IFunction { for (size_t i = 0; i < input_rows_count; ++i) { apply_cidr_mask(from_column.get_data_at(i).data, reinterpret_cast(&vec_res_lower_range[i]), - reinterpret_cast(&vec_res_upper_range[i]), - cidr); + reinterpret_cast(&vec_res_upper_range[i]), cidr); } } else { for (size_t i = 0; i < input_rows_count; ++i) { @@ -1052,8 +1050,7 @@ class FunctionIPv6CIDRToRange : public IFunction { } apply_cidr_mask(from_column.get_data_at(i).data, reinterpret_cast(&vec_res_lower_range[i]), - reinterpret_cast(&vec_res_upper_range[i]), - cidr); + reinterpret_cast(&vec_res_upper_range[i]), cidr); } } return ColumnStruct::create(