This is an automated email from the ASF dual-hosted git repository.
lihaopeng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 6b9d7c00940 [improvement](ip function) refactor some ip functions and
remove dirty codes (#30080)
6b9d7c00940 is described below
commit 6b9d7c00940f2bde9ea5412ad43d2b27087c02a3
Author: yangshijie <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]