This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 97b2a3b993c306d21172656cddd47a68d52d5dfa Author: yangshijie <sjyang2...@zju.edu.cn> AuthorDate: Fri Jan 19 11:49:20 2024 +0800 [improvement](ip function) refactor some ip functions and remove dirty codes (#30080) --- be/src/vec/functions/function_ip.cpp | 4 +- be/src/vec/functions/function_ip.h | 228 +++++---------------- .../doris/catalog/BuiltinScalarFunctions.java | 4 +- .../{IPv6CIDRToRange.java => Ipv6CIDRToRange.java} | 12 +- .../expressions/functions/scalar/IsIpv4String.java | 4 +- .../expressions/functions/scalar/IsIpv6String.java | 4 +- .../expressions/visitor/ScalarFunctionVisitor.java | 4 +- gensrc/script/doris_builtins_functions.py | 12 +- .../test_ipv6_cidr_to_range_function.out | 4 + .../test_ipv6_cidr_to_range_function.groovy | 10 +- 10 files changed, 79 insertions(+), 207 deletions(-) diff --git a/be/src/vec/functions/function_ip.cpp b/be/src/vec/functions/function_ip.cpp index dce648bfaaf..3faa6a42d8c 100644 --- a/be/src/vec/functions/function_ip.cpp +++ b/be/src/vec/functions/function_ip.cpp @@ -34,8 +34,8 @@ void register_function_ip(SimpleFunctionFactory& factory) { factory.register_function<FunctionIPv6StringToNum<IPStringToNumExceptionMode::Null>>(); factory.register_alias(FunctionIPv6StringToNum<IPStringToNumExceptionMode::Throw>::name, "inet6_aton"); - factory.register_function<FunctionIsIPv4String>(); - factory.register_function<FunctionIsIPv6String>(); + factory.register_function<FunctionIsIPString<IPv4>>(); + factory.register_function<FunctionIsIPString<IPv6>>(); factory.register_function<FunctionIsIPAddressInRange>(); factory.register_function<FunctionIPv6CIDRToRange>(); } diff --git a/be/src/vec/functions/function_ip.h b/be/src/vec/functions/function_ip.h index 2997153049a..313ad0fdd65 100644 --- a/be/src/vec/functions/function_ip.h +++ b/be/src/vec/functions/function_ip.h @@ -93,8 +93,6 @@ public: return make_nullable(std::make_shared<DataTypeString>()); } - bool use_default_implementation_for_nulls() const override { return true; } - Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, size_t result, size_t input_rows_count) const override { ColumnWithTypeAndName& argument = block.get_by_position(arguments[0]); @@ -309,8 +307,6 @@ public: return make_nullable(std::make_shared<DataTypeString>()); } - bool use_default_implementation_for_nulls() const override { return true; } - Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, size_t result, size_t input_rows_count) const override { const ColumnPtr& column = block.get_by_position(arguments[0]).column; @@ -603,143 +599,53 @@ public: } }; -class FunctionIsIPv4String : public IFunction { -private: - Status execute_type(Block& block, const ColumnWithTypeAndName& argument, size_t result) const { - const ColumnPtr& column = argument.column; - - if (const auto* nullable_src = typeid_cast<const ColumnNullable*>(column.get())) { - size_t col_size = nullable_src->size(); - auto col_res = ColumnUInt8::create(col_size, 0); - auto null_map = ColumnUInt8::create(col_size, 0); - auto& col_res_data = col_res->get_data(); - auto& null_map_data = null_map->get_data(); - - for (size_t i = 0; i < col_size; ++i) { - if (nullable_src->is_null_at(i)) { - null_map_data[i] = 1; - } else { - StringRef ipv4_str = nullable_src->get_data_at(i); - if (IPv4Value::is_valid_string(ipv4_str.data, ipv4_str.size)) { - col_res_data[i] = 1; - } - } - } - - block.replace_by_position( - result, ColumnNullable::create(std::move(col_res), std::move(null_map))); - return Status::OK(); - } else if (const auto* col_src = typeid_cast<const ColumnString*>(column.get())) { - size_t col_size = col_src->size(); - auto col_res = ColumnUInt8::create(col_size, 0); - auto null_map = ColumnUInt8::create(col_size, 0); - auto& col_res_data = col_res->get_data(); - - for (size_t i = 0; i < col_size; ++i) { - StringRef ipv4_str = col_src->get_data_at(i); - if (IPv4Value::is_valid_string(ipv4_str.data, ipv4_str.size)) { - col_res_data[i] = 1; - } - } - - block.replace_by_position( - result, ColumnNullable::create(std::move(col_res), std::move(null_map))); - return Status::OK(); - } else { - return Status::RuntimeError("Illegal column {} of argument of function {}", - argument.column->get_name(), get_name()); - } - } +template <typename Type> +class FunctionIsIPString : public IFunction { + static_assert(std::is_same_v<Type, IPv4> || std::is_same_v<Type, IPv6>); public: - static constexpr auto name = "is_ipv4_string"; - static FunctionPtr create() { return std::make_shared<FunctionIsIPv4String>(); } + static constexpr auto name = std::is_same_v<Type, IPv4> ? "is_ipv4_string" : "is_ipv6_string"; + static FunctionPtr create() { return std::make_shared<FunctionIsIPString<Type>>(); } String get_name() const override { return name; } size_t get_number_of_arguments() const override { return 1; } DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { - return make_nullable(std::make_shared<DataTypeUInt8>()); + const auto& addr_type = arguments[0]; + if (!is_string(remove_nullable(addr_type))) { + throw Exception(ErrorCode::INVALID_ARGUMENT, + "Illegal type {} of first argument of function {}, expected String", + addr_type->get_name(), get_name()); + } + return std::make_shared<DataTypeUInt8>(); } - bool use_default_implementation_for_nulls() const override { return true; } - Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, size_t result, size_t input_rows_count) const override { - ColumnWithTypeAndName& argument = block.get_by_position(arguments[0]); - DCHECK(argument.type->get_type_id() == TypeIndex::String); - return execute_type(block, argument, result); - } -}; - -class FunctionIsIPv6String : public IFunction { -private: - Status execute_type(Block& block, const ColumnWithTypeAndName& argument, size_t result) const { - const ColumnPtr& column = argument.column; - - if (const auto* nullable_src = typeid_cast<const ColumnNullable*>(column.get())) { - size_t col_size = nullable_src->size(); - auto col_res = ColumnUInt8::create(col_size, 0); - auto null_map = ColumnUInt8::create(col_size, 0); - auto& col_res_data = col_res->get_data(); - auto& null_map_data = null_map->get_data(); + const auto& addr_column_with_type_and_name = block.get_by_position(arguments[0]); + WhichDataType addr_type(addr_column_with_type_and_name.type); + const ColumnPtr& addr_column = addr_column_with_type_and_name.column; + const auto* str_addr_column = assert_cast<const ColumnString*>(addr_column.get()); + auto col_res = ColumnUInt8::create(input_rows_count, 0); + auto& col_res_data = col_res->get_data(); - for (size_t i = 0; i < col_size; ++i) { - if (nullable_src->is_null_at(i)) { - null_map_data[i] = 1; - } else { - StringRef ipv6_str = nullable_src->get_data_at(i); - if (IPv6Value::is_valid_string(ipv6_str.data, ipv6_str.size)) { - col_res_data[i] = 1; - } + for (size_t i = 0; i < input_rows_count; ++i) { + if constexpr (std::is_same_v<Type, IPv4>) { + StringRef ipv4_str = str_addr_column->get_data_at(i); + if (IPv4Value::is_valid_string(ipv4_str.data, ipv4_str.size)) { + col_res_data[i] = 1; } - } - - block.replace_by_position( - result, ColumnNullable::create(std::move(col_res), std::move(null_map))); - return Status::OK(); - } else if (const auto* col_src = typeid_cast<const ColumnString*>(column.get())) { - size_t col_size = col_src->size(); - auto col_res = ColumnUInt8::create(col_size, 0); - auto null_map = ColumnUInt8::create(col_size, 0); - auto& col_res_data = col_res->get_data(); - - for (size_t i = 0; i < col_size; ++i) { - StringRef ipv6_str = col_src->get_data_at(i); + } else { + StringRef ipv6_str = str_addr_column->get_data_at(i); if (IPv6Value::is_valid_string(ipv6_str.data, ipv6_str.size)) { col_res_data[i] = 1; } } - - block.replace_by_position( - result, ColumnNullable::create(std::move(col_res), std::move(null_map))); - return Status::OK(); - } else { - return Status::RuntimeError("Illegal column {} of argument of function {}", - argument.column->get_name(), get_name()); } - } - -public: - static constexpr auto name = "is_ipv6_string"; - static FunctionPtr create() { return std::make_shared<FunctionIsIPv6String>(); } - - String get_name() const override { return name; } - size_t get_number_of_arguments() const override { return 1; } - - DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { - return make_nullable(std::make_shared<DataTypeUInt8>()); - } - - bool use_default_implementation_for_nulls() const override { return true; } - - Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, - size_t result, size_t input_rows_count) const override { - ColumnWithTypeAndName& argument = block.get_by_position(arguments[0]); - DCHECK(argument.type->get_type_id() == TypeIndex::String); - return execute_type(block, argument, result); + block.replace_by_position(result, std::move(col_res)); + return Status::OK(); } }; @@ -859,12 +765,10 @@ public: cidr_type->get_name(), get_name()); } DataTypePtr element = std::make_shared<DataTypeIPv6>(); - return make_nullable(std::make_shared<DataTypeStruct>(DataTypes {element, element}, - Strings {"min", "max"})); + return std::make_shared<DataTypeStruct>(DataTypes {element, element}, + Strings {"min", "max"}); } - bool use_default_implementation_for_nulls() const override { return true; } - Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, size_t result, size_t input_rows_count) const override { const auto& addr_column_with_type_and_name = block.get_by_position(arguments[0]); @@ -873,54 +777,19 @@ public: WhichDataType cidr_type(cidr_column_with_type_and_name.type); const ColumnPtr& addr_column = addr_column_with_type_and_name.column; const ColumnPtr& cidr_column = cidr_column_with_type_and_name.column; - const ColumnInt16* cidr_col = nullptr; - const NullMap* cidr_null_map = nullptr; + const auto* cidr_col = assert_cast<const ColumnInt16*>(cidr_column.get()); ColumnPtr col_res = nullptr; - if (cidr_type.is_nullable()) { - const auto* cidr_column_nullable = - assert_cast<const ColumnNullable*>(cidr_column.get()); - cidr_col = assert_cast<const ColumnInt16*>(&cidr_column_nullable->get_nested_column()); - cidr_null_map = &cidr_column_nullable->get_null_map_data(); + if (addr_type.is_ipv6()) { + const auto* ipv6_addr_column = check_and_get_column<ColumnIPv6>(addr_column.get()); + col_res = execute_impl<ColumnIPv6>(*ipv6_addr_column, *cidr_col, input_rows_count); + } else if (addr_type.is_string()) { + const auto* str_addr_column = check_and_get_column<ColumnString>(addr_column.get()); + col_res = execute_impl<ColumnString>(*str_addr_column, *cidr_col, input_rows_count); } else { - cidr_col = assert_cast<const ColumnInt16*>(cidr_column.get()); - } - - if (addr_type.is_nullable()) { - const auto* addr_column_nullable = - assert_cast<const ColumnNullable*>(addr_column.get()); - const NullMap* addr_null_map = &addr_column_nullable->get_null_map_data(); - WhichDataType sub_addr_type(remove_nullable(addr_column_with_type_and_name.type)); - - if (sub_addr_type.is_ipv6()) { - const auto* ipv6_addr_column = - check_and_get_column<ColumnIPv6>(addr_column_nullable->get_nested_column()); - col_res = execute_impl<ColumnIPv6>(*ipv6_addr_column, addr_null_map, *cidr_col, - cidr_null_map, input_rows_count); - } else if (sub_addr_type.is_string()) { - const auto* str_addr_column = check_and_get_column<ColumnString>( - addr_column_nullable->get_nested_column()); - col_res = execute_impl<ColumnString>(*str_addr_column, addr_null_map, *cidr_col, - cidr_null_map, input_rows_count); - } else { - return Status::RuntimeError( - "Illegal column {} of argument of function {}, Expected IPv6 or String", - addr_column->get_name(), get_name()); - } - } else { - if (addr_type.is_ipv6()) { - const auto* ipv6_addr_column = check_and_get_column<ColumnIPv6>(addr_column.get()); - col_res = execute_impl<ColumnIPv6>(*ipv6_addr_column, nullptr, *cidr_col, nullptr, - input_rows_count); - } else if (addr_type.is_string()) { - const auto* str_addr_column = check_and_get_column<ColumnString>(addr_column.get()); - col_res = execute_impl<ColumnString>(*str_addr_column, nullptr, *cidr_col, nullptr, - input_rows_count); - } else { - return Status::RuntimeError( - "Illegal column {} of argument of function {}, Expected IPv6 or String", - addr_column->get_name(), get_name()); - } + return Status::RuntimeError( + "Illegal column {} of argument of function {}, Expected IPv6 or String", + addr_column->get_name(), get_name()); } block.replace_by_position(result, std::move(col_res)); @@ -928,33 +797,28 @@ public: } template <typename FromColumn> - static ColumnPtr execute_impl(const FromColumn& from_column, const NullMap* from_null_map, - const ColumnInt16& cidr_column, const NullMap* cidr_null_map, + static ColumnPtr execute_impl(const FromColumn& from_column, const ColumnInt16& cidr_column, size_t input_rows_count) { auto col_res_lower_range = ColumnIPv6::create(input_rows_count, 0); auto col_res_upper_range = ColumnIPv6::create(input_rows_count, 0); - auto col_res_null_map = ColumnUInt8::create(input_rows_count, 0); auto& vec_res_lower_range = col_res_lower_range->get_data(); auto& vec_res_upper_range = col_res_upper_range->get_data(); - auto& vec_res_null_map = col_res_null_map->get_data(); - static constexpr Int64 max_cidr_mask = IPV6_BINARY_LENGTH * 8; + static constexpr UInt8 max_cidr_mask = IPV6_BINARY_LENGTH * 8; for (size_t i = 0; i < input_rows_count; ++i) { - if ((from_null_map && (*from_null_map)[i]) || (cidr_null_map && (*cidr_null_map)[i])) { - vec_res_null_map[i] = 1; - continue; + auto cidr = cidr_column.get_int(i); + if (cidr < 0 || cidr > max_cidr_mask) { + throw Exception(ErrorCode::INVALID_ARGUMENT, "Illegal cidr value '{}'", + std::to_string(cidr)); } - Int64 cidr = cidr_column.get_int(i); - cidr = std::min(cidr, max_cidr_mask); apply_cidr_mask(from_column.get_data_at(i).data, reinterpret_cast<char*>(&vec_res_lower_range[i]), reinterpret_cast<char*>(&vec_res_upper_range[i]), cidr); } - auto col_res_struct = ColumnStruct::create( + return ColumnStruct::create( Columns {std::move(col_res_lower_range), std::move(col_res_upper_range)}); - return ColumnNullable::create(std::move(col_res_struct), std::move(col_res_null_map)); } private: diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java index 903a77b4494..f4f7af5cf38 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java @@ -188,7 +188,6 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.HourFloor; import org.apache.doris.nereids.trees.expressions.functions.scalar.HoursAdd; import org.apache.doris.nereids.trees.expressions.functions.scalar.HoursDiff; import org.apache.doris.nereids.trees.expressions.functions.scalar.HoursSub; -import org.apache.doris.nereids.trees.expressions.functions.scalar.IPv6CIDRToRange; import org.apache.doris.nereids.trees.expressions.functions.scalar.If; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ignore; import org.apache.doris.nereids.trees.expressions.functions.scalar.Initcap; @@ -198,6 +197,7 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv4NumToStri import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv4StringToNum; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv4StringToNumOrDefault; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv4StringToNumOrNull; +import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6CIDRToRange; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6NumToString; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6StringToNum; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6StringToNumOrDefault; @@ -612,7 +612,7 @@ public class BuiltinScalarFunctions implements FunctionHelper { scalar(IsIpv4String.class, "is_ipv4_string"), scalar(IsIpv6String.class, "is_ipv6_string"), scalar(IsIpAddressInRange.class, "is_ip_address_in_range"), - scalar(IPv6CIDRToRange.class, "ipv6_cidr_to_range"), + scalar(Ipv6CIDRToRange.class, "ipv6_cidr_to_range"), scalar(JsonArray.class, "json_array"), scalar(JsonObject.class, "json_object"), scalar(JsonQuote.class, "json_quote"), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IPv6CIDRToRange.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Ipv6CIDRToRange.java similarity index 89% rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IPv6CIDRToRange.java rename to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Ipv6CIDRToRange.java index 2ada5b0e095..7d0720f2302 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IPv6CIDRToRange.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Ipv6CIDRToRange.java @@ -19,8 +19,8 @@ package org.apache.doris.nereids.trees.expressions.functions.scalar; import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable; import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.IPv6Type; @@ -38,8 +38,8 @@ import java.util.List; /** * scalar function `ipv6_cidr_to_range` */ -public class IPv6CIDRToRange extends ScalarFunction - implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { +public class Ipv6CIDRToRange extends ScalarFunction + implements BinaryExpression, ExplicitlyCastableSignature, PropagateNullable { public static final List<FunctionSignature> SIGNATURES; @@ -54,17 +54,17 @@ public class IPv6CIDRToRange extends ScalarFunction FunctionSignature.ret(retType).args(StringType.INSTANCE, SmallIntType.INSTANCE)); } - public IPv6CIDRToRange(Expression arg0, Expression arg1) { + public Ipv6CIDRToRange(Expression arg0, Expression arg1) { super("ipv6_cidr_to_range", arg0, arg1); } @Override - public IPv6CIDRToRange withChildren(List<Expression> children) { + public Ipv6CIDRToRange withChildren(List<Expression> children) { Preconditions.checkArgument(children.size() == 2, "ipv6_cidr_to_range accept 2 args, but got %s (%s)", children.size(), children); - return new IPv6CIDRToRange(children.get(0), children.get(1)); + return new Ipv6CIDRToRange(children.get(0), children.get(1)); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IsIpv4String.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IsIpv4String.java index b1ea28d7518..cb0f47d2579 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IsIpv4String.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IsIpv4String.java @@ -19,8 +19,8 @@ package org.apache.doris.nereids.trees.expressions.functions.scalar; import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable; import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.BooleanType; @@ -36,7 +36,7 @@ import java.util.List; * scalar function is_ipv4_string */ public class IsIpv4String extends ScalarFunction - implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements BinaryExpression, ExplicitlyCastableSignature, PropagateNullable { public static final List<FunctionSignature> SIGNATURES = ImmutableList.of( FunctionSignature.ret(BooleanType.INSTANCE).args(VarcharType.SYSTEM_DEFAULT), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IsIpv6String.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IsIpv6String.java index 850e35cf3d8..0a41c3104b3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IsIpv6String.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IsIpv6String.java @@ -19,8 +19,8 @@ package org.apache.doris.nereids.trees.expressions.functions.scalar; import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable; import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.BooleanType; @@ -36,7 +36,7 @@ import java.util.List; * scalar function is_ipv6_string */ public class IsIpv6String extends ScalarFunction - implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements BinaryExpression, ExplicitlyCastableSignature, PropagateNullable { public static final List<FunctionSignature> SIGNATURES = ImmutableList.of( FunctionSignature.ret(BooleanType.INSTANCE).args(VarcharType.SYSTEM_DEFAULT), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java index 6f43a45dd79..899a31abbd7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java @@ -184,7 +184,6 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.HourFloor; import org.apache.doris.nereids.trees.expressions.functions.scalar.HoursAdd; import org.apache.doris.nereids.trees.expressions.functions.scalar.HoursDiff; import org.apache.doris.nereids.trees.expressions.functions.scalar.HoursSub; -import org.apache.doris.nereids.trees.expressions.functions.scalar.IPv6CIDRToRange; import org.apache.doris.nereids.trees.expressions.functions.scalar.If; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ignore; import org.apache.doris.nereids.trees.expressions.functions.scalar.Initcap; @@ -194,6 +193,7 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv4NumToStri import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv4StringToNum; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv4StringToNumOrDefault; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv4StringToNumOrNull; +import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6CIDRToRange; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6NumToString; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6StringToNum; import org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6StringToNumOrDefault; @@ -1167,7 +1167,7 @@ public interface ScalarFunctionVisitor<R, C> { return visitScalarFunction(isIpAddressInRange, context); } - default R visitIpv6CIDRToRange(IPv6CIDRToRange ipv6CIDRToRange, C context) { + default R visitIpv6CIDRToRange(Ipv6CIDRToRange ipv6CIDRToRange, C context) { return visitScalarFunction(ipv6CIDRToRange, context); } diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 0ca8dfad354..973a4675621 100644 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -2014,14 +2014,14 @@ visible_functions = { [['ipv6_string_to_num_or_default'], 'STRING', ['STRING'], 'ALWAYS_NOT_NULLABLE'], [['ipv6_string_to_num_or_null'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'], [['ipv6_string_to_num_or_null'], 'STRING', ['STRING'], 'ALWAYS_NULLABLE'], - [['is_ipv4_string'], 'BOOLEAN', ['VARCHAR'], 'ALWAYS_NULLABLE'], - [['is_ipv4_string'], 'BOOLEAN', ['STRING'], 'ALWAYS_NULLABLE'], - [['is_ipv6_string'], 'BOOLEAN', ['VARCHAR'], 'ALWAYS_NULLABLE'], - [['is_ipv6_string'], 'BOOLEAN', ['STRING'], 'ALWAYS_NULLABLE'], + [['is_ipv4_string'], 'BOOLEAN', ['VARCHAR'], ''], + [['is_ipv4_string'], 'BOOLEAN', ['STRING'], ''], + [['is_ipv6_string'], 'BOOLEAN', ['VARCHAR'], ''], + [['is_ipv6_string'], 'BOOLEAN', ['STRING'], ''], [['is_ip_address_in_range'], 'BOOLEAN', ['VARCHAR', 'VARCHAR'], 'ALWAYS_NOT_NULLABLE'], [['is_ip_address_in_range'], 'BOOLEAN', ['STRING', 'STRING'], 'ALWAYS_NOT_NULLABLE'], - [['ipv6_cidr_to_range'], 'STRUCT<IPV6, IPV6>', ['VARCHAR', 'SMALLINT'], 'ALWAYS_NULLABLE'], - [['ipv6_cidr_to_range'], 'STRUCT<IPV6, IPV6>', ['STRING', 'SMALLINT'], 'ALWAYS_NULLABLE'], + [['ipv6_cidr_to_range'], 'STRUCT<IPV6, IPV6>', ['VARCHAR', 'SMALLINT'], ''], + [['ipv6_cidr_to_range'], 'STRUCT<IPV6, IPV6>', ['STRING', 'SMALLINT'], ''], ], "NonNullalbe": [ diff --git a/regression-test/data/query_p0/sql_functions/ip_functions/test_ipv6_cidr_to_range_function.out b/regression-test/data/query_p0/sql_functions/ip_functions/test_ipv6_cidr_to_range_function.out index 411010046cc..6ffd4ee56f7 100644 --- a/regression-test/data/query_p0/sql_functions/ip_functions/test_ipv6_cidr_to_range_function.out +++ b/regression-test/data/query_p0/sql_functions/ip_functions/test_ipv6_cidr_to_range_function.out @@ -6,6 +6,8 @@ 5 2001:: 2001:ffff:ffff:ffff:ffff:ffff:ffff:ffff 6 :: ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff 7 f000:: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff +8 \N \N +9 \N \N -- !sql -- 1 :: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff @@ -15,6 +17,8 @@ 5 2001:: 2001:ffff:ffff:ffff:ffff:ffff:ffff:ffff 6 :: ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff 7 f000:: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff +8 \N \N +9 \N \N -- !sql -- {"min": "::", "max": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"} 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 f606460377a..7b3c5107fa5 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 @@ -42,7 +42,9 @@ suite("test_ipv6_cidr_to_range_function") { (4, '2001:df8:0:85a3::ac1f:8001', 32), (5, '2001:0db8:85a3:85a3:0000:0000:ac1f:8001', 16), (6, '0000:0000:0000:0000:0000:0000:0000:0000', 8), - (7, 'ffff:0000:0000:0000:0000:0000:0000:0000', 4) + (7, 'ffff:0000:0000:0000:0000:0000:0000:0000', 4), + (8, NULL, 8), + (9, 'ffff:0000:0000:0000:0000:0000:0000:0000', NULL) """ qt_sql "select id, struct_element(ipv6_cidr_to_range(addr, cidr), 'min') as min_range, struct_element(ipv6_cidr_to_range(addr, cidr), 'max') as max_range from test_ipv6_cidr_to_range_function order by id" @@ -70,10 +72,12 @@ suite("test_ipv6_cidr_to_range_function") { (4, '2001:df8:0:85a3::ac1f:8001', 32), (5, '2001:0db8:85a3:85a3:0000:0000:ac1f:8001', 16), (6, '0000:0000:0000:0000:0000:0000:0000:0000', 8), - (7, 'ffff:0000:0000:0000:0000:0000:0000:0000', 4) + (7, 'ffff:0000:0000:0000:0000:0000:0000:0000', 4), + (8, NULL, 8), + (9, 'ffff:0000:0000:0000:0000:0000:0000:0000', NULL) """ - qt_sql "select id, struct_element(ipv6_cidr_to_range(ipv6_string_to_num(addr), cidr), 'min') as min_range, struct_element(ipv6_cidr_to_range(ipv6_string_to_num(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_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" sql """ DROP TABLE IF EXISTS test_str_cidr_to_range_function """ --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org