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

Reply via email to