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 7402fee1fcf [feature](function) support ip function
ipv6_string_to_num(_or_default, _or_null), inet6_aton (#28361)
7402fee1fcf is described below
commit 7402fee1fcfe597f157b93115cf29f7f9cf360e7
Author: Chester <[email protected]>
AuthorDate: Fri Jan 5 19:24:45 2024 +0800
[feature](function) support ip function ipv6_string_to_num(_or_default,
_or_null), inet6_aton (#28361)
---
be/src/vec/common/format_ip.cpp | 3 -
be/src/vec/common/format_ip.h | 1 +
be/src/vec/functions/function_ip.cpp | 5 +
be/src/vec/functions/function_ip.h | 257 +++++++++++++++++++++
.../sql-functions/ip-functions/inet6-aton.md | 70 ++++++
.../ip-functions/ipv6-string-to-num-or-default.md | 75 ++++++
.../ip-functions/ipv6-string-to-num-or-null.md | 75 ++++++
.../ip-functions/ipv6-string-to-num.md | 70 ++++++
docs/sidebars.json | 7 +-
.../sql-functions/ip-functions/inet6-aton.md | 70 ++++++
.../sql-functions/ip-functions/inet6-ntoa.md | 2 +-
.../ip-functions/ipv6-num-to-string.md | 2 +-
.../ip-functions/ipv6-string-to-num-or-default.md | 75 ++++++
.../ip-functions/ipv6-string-to-num-or-null.md | 75 ++++++
.../ip-functions/ipv6-string-to-num.md | 70 ++++++
.../doris/catalog/BuiltinScalarFunctions.java | 6 +
.../functions/scalar/Ipv6StringToNum.java | 66 ++++++
.../functions/scalar/Ipv6StringToNumOrDefault.java | 66 ++++++
.../functions/scalar/Ipv6StringToNumOrNull.java | 66 ++++++
.../expressions/visitor/ScalarFunctionVisitor.java | 15 ++
gensrc/script/doris_builtins_functions.py | 6 +
.../data/nereids_function_p0/ip_functions.out | 65 +++++-
.../ip_functions/test_ip_functions.out | 65 +++++-
.../suites/nereids_function_p0/ip_functions.groovy | 22 ++
.../ip_functions/test_ip_functions.groovy | 22 ++
25 files changed, 1248 insertions(+), 8 deletions(-)
diff --git a/be/src/vec/common/format_ip.cpp b/be/src/vec/common/format_ip.cpp
index b673d5575dd..3e4379872ac 100644
--- a/be/src/vec/common/format_ip.cpp
+++ b/be/src/vec/common/format_ip.cpp
@@ -23,9 +23,6 @@
#include <algorithm>
#include <array>
-#include "vec/common/hex.h"
-#include "vec/core/types.h"
-
namespace doris::vectorized {
/** Further we want to generate constexpr array of strings with sizes from
sequence of unsigned ints [0..N)
diff --git a/be/src/vec/common/format_ip.h b/be/src/vec/common/format_ip.h
index 58322ecd9fc..71c7c73b50a 100644
--- a/be/src/vec/common/format_ip.h
+++ b/be/src/vec/common/format_ip.h
@@ -22,6 +22,7 @@
#include <vec/common/hex.h>
#include <vec/common/string_utils/string_utils.h>
+#include <vec/core/types.h>
#include <algorithm>
#include <array>
diff --git a/be/src/vec/functions/function_ip.cpp
b/be/src/vec/functions/function_ip.cpp
index 643c69939d3..6e59503dba3 100644
--- a/be/src/vec/functions/function_ip.cpp
+++ b/be/src/vec/functions/function_ip.cpp
@@ -32,5 +32,10 @@ void register_function_ip(SimpleFunctionFactory& factory) {
"inet_aton");
factory.register_function<FunctionIPv6NumToString>();
factory.register_alias(FunctionIPv6NumToString::name, "inet6_ntoa");
+
factory.register_function<FunctionIPv6StringToNum<IPStringToNumExceptionMode::Throw>>();
+
factory.register_function<FunctionIPv6StringToNum<IPStringToNumExceptionMode::Default>>();
+
factory.register_function<FunctionIPv6StringToNum<IPStringToNumExceptionMode::Null>>();
+
factory.register_alias(FunctionIPv6StringToNum<IPStringToNumExceptionMode::Throw>::name,
+ "inet6_aton");
}
} // namespace doris::vectorized
\ No newline at end of file
diff --git a/be/src/vec/functions/function_ip.h
b/be/src/vec/functions/function_ip.h
index 4a39242e85e..042f1023602 100644
--- a/be/src/vec/functions/function_ip.h
+++ b/be/src/vec/functions/function_ip.h
@@ -348,4 +348,261 @@ public:
}
};
+namespace detail {
+template <IPStringToNumExceptionMode exception_mode, typename ToColumn =
ColumnIPv6,
+ typename StringColumnType>
+ColumnPtr convertToIPv6(const StringColumnType& string_column,
+ const PaddedPODArray<UInt8>* null_map = nullptr) {
+ if constexpr (!std::is_same_v<ToColumn, ColumnString> &&
+ !std::is_same_v<ToColumn, ColumnIPv6>) {
+ throw Exception(ErrorCode::INVALID_ARGUMENT,
+ "Illegal return column type {}. Expected IPv6 or
String",
+ TypeName<typename ToColumn::ValueType>::get());
+ }
+
+ const size_t column_size = string_column.size();
+
+ ColumnUInt8::MutablePtr col_null_map_to;
+ ColumnUInt8::Container* vec_null_map_to = nullptr;
+
+ if constexpr (exception_mode == IPStringToNumExceptionMode::Null) {
+ col_null_map_to = ColumnUInt8::create(column_size, false);
+ vec_null_map_to = &col_null_map_to->get_data();
+ }
+
+ /// This is a special treatment for source column of type String
+ /// to preserve previous behavior when IPv6 was a domain type of String
+ if constexpr (std::is_same_v<StringColumnType, ColumnString>) {
+ if (string_column.get_offsets()[0] - 1 == IPV6_BINARY_LENGTH) {
+ if constexpr (std::is_same_v<ToColumn, ColumnString>) {
+ auto col_res = ColumnString::create();
+
+ if constexpr (exception_mode ==
IPStringToNumExceptionMode::Null) {
+ col_null_map_to = ColumnUInt8::create(column_size, false);
+ if (null_map) {
+ memcpy(col_null_map_to->get_data().data(),
null_map->data(), column_size);
+ }
+
+ return ColumnNullable::create(std::move(col_res),
std::move(col_null_map_to));
+ }
+
+ return col_res;
+ } else {
+ auto col_res = ColumnIPv6::create();
+ auto& vec_res = col_res->get_data();
+
+ vec_res.resize(column_size);
+ memcpy(vec_res.data(), string_column.get_chars().data(),
+ column_size * IPV6_BINARY_LENGTH);
+
+ if constexpr (exception_mode ==
IPStringToNumExceptionMode::Null) {
+ col_null_map_to = ColumnUInt8::create(column_size, false);
+ if (null_map) {
+ memcpy(col_null_map_to->get_data().data(),
null_map->data(), column_size);
+ }
+ return ColumnNullable::create(std::move(col_res),
std::move(col_null_map_to));
+ }
+
+ return col_res;
+ }
+ }
+ }
+
+ auto column_create = [](size_t column_size) -> typename
ToColumn::MutablePtr {
+ if constexpr (std::is_same_v<ToColumn, ColumnString>) {
+ auto column_string = ColumnString::create();
+ column_string->get_chars().reserve(column_size *
IPV6_BINARY_LENGTH);
+ column_string->get_offsets().reserve(column_size);
+ return column_string;
+ } else {
+ return ColumnIPv6::create();
+ }
+ };
+
+ auto get_vector = [](auto& col_res, size_t col_size) -> decltype(auto) {
+ if constexpr (std::is_same_v<ToColumn, ColumnString>) {
+ auto& vec_res = col_res->get_chars();
+ vec_res.resize(col_size * IPV6_BINARY_LENGTH);
+ return (vec_res);
+ } else {
+ auto& vec_res = col_res->get_data();
+ vec_res.resize(col_size);
+ return (vec_res);
+ }
+ };
+
+ auto col_res = column_create(column_size);
+ auto& vec_res = get_vector(col_res, column_size);
+
+ using Chars = typename StringColumnType::Chars;
+ const Chars& vec_src = string_column.get_chars();
+
+ size_t src_offset = 0;
+ char src_ipv4_buf[sizeof("::ffff:") + IPV4_MAX_TEXT_LENGTH + 1] =
"::ffff:";
+
+ /// ColumnString contains not null terminated strings. But functions
parseIPv6, parseIPv4 expect null terminated string.
+ /// TODO fix this - now parseIPv6/parseIPv4 accept end iterator, so can be
parsed in-place
+ std::string string_buffer;
+
+ int offset_inc = 1;
+ if constexpr (std::is_same_v<ToColumn, ColumnString>) {
+ offset_inc = IPV6_BINARY_LENGTH;
+ }
+
+ for (size_t out_offset = 0, i = 0; i < column_size; out_offset +=
offset_inc, ++i) {
+ size_t src_next_offset = src_offset;
+
+ const char* src_value = nullptr;
+ auto* res_value = reinterpret_cast<unsigned
char*>(&vec_res[out_offset]);
+
+ if constexpr (std::is_same_v<StringColumnType, ColumnString>) {
+ src_value = reinterpret_cast<const char*>(&vec_src[src_offset]);
+ src_next_offset = string_column.get_offsets()[i];
+
+ string_buffer.assign(src_value, src_next_offset - src_offset);
+ src_value = string_buffer.c_str();
+ }
+
+ if (null_map && (*null_map)[i]) {
+ if (exception_mode == IPStringToNumExceptionMode::Throw) {
+ throw Exception(ErrorCode::INVALID_ARGUMENT, "Invalid IPv6
value");
+ } else if (exception_mode == IPStringToNumExceptionMode::Default) {
+ std::fill_n(&vec_res[out_offset], offset_inc, 0);
+ } else {
+ std::fill_n(&vec_res[out_offset], offset_inc, 0);
+ (*vec_null_map_to)[i] = true;
+ if constexpr (std::is_same_v<ToColumn, ColumnString>) {
+ auto* column_string =
assert_cast<ColumnString*>(col_res.get());
+ column_string->get_offsets().push_back((i + 1) *
IPV6_BINARY_LENGTH);
+ }
+ }
+ src_offset = src_next_offset;
+ continue;
+ }
+
+ bool parse_result = false;
+ Int64 dummy_result = 0;
+
+ /// For both cases below: In case of failure, the function parseIPv6
fills vec_res with zero bytes.
+
+ /// If the source IP address is parsable as an IPv4 address, then
transform it into a valid IPv6 address.
+ /// Keeping it simple by just prefixing `::ffff:` to the IPv4 address
to represent it as a valid IPv6 address.
+ size_t string_length = src_next_offset - src_offset;
+ if (string_length != 0) {
+ if (tryParseIPv4(src_value, dummy_result)) {
+ strcat(src_ipv4_buf, src_value);
+ parse_result = parseIPv6whole(src_ipv4_buf, res_value);
+ } else {
+ parse_result = parseIPv6whole(src_value, res_value);
+ }
+ }
+
+ if (parse_result && string_length != 0) {
+ if constexpr (std::is_same_v<ToColumn, ColumnString>) {
+ auto* column_string =
assert_cast<ColumnString*>(col_res.get());
+ std::copy(res_value, res_value + IPV6_BINARY_LENGTH,
+ column_string->get_chars().begin() + i *
IPV6_BINARY_LENGTH);
+ column_string->get_offsets().push_back((i + 1) *
IPV6_BINARY_LENGTH);
+ } else {
+ col_res->insert_data(reinterpret_cast<const char*>(res_value),
IPV6_BINARY_LENGTH);
+ }
+ } else {
+ if (exception_mode == IPStringToNumExceptionMode::Throw) {
+ throw Exception(ErrorCode::INVALID_ARGUMENT, "Invalid IPv6
value");
+ }
+ std::fill_n(&vec_res[out_offset], offset_inc, 0);
+ if constexpr (std::is_same_v<ToColumn, ColumnString>) {
+ auto* column_string =
assert_cast<ColumnString*>(col_res.get());
+ column_string->get_offsets().push_back((i + 1) *
IPV6_BINARY_LENGTH);
+ }
+ if constexpr (exception_mode == IPStringToNumExceptionMode::Null) {
+ (*vec_null_map_to)[i] = true;
+ }
+ }
+ src_offset = src_next_offset;
+ }
+
+ if constexpr (exception_mode == IPStringToNumExceptionMode::Null) {
+ return ColumnNullable::create(std::move(col_res),
std::move(col_null_map_to));
+ }
+ return col_res;
+}
+} // namespace detail
+
+template <IPStringToNumExceptionMode exception_mode, typename ToColumn =
ColumnIPv6>
+ColumnPtr convertToIPv6(ColumnPtr column, const PaddedPODArray<UInt8>*
null_map = nullptr) {
+ if (const auto* column_input_string =
check_and_get_column<ColumnString>(column.get())) {
+ auto result =
+ detail::convertToIPv6<exception_mode,
ToColumn>(*column_input_string, null_map);
+ return result;
+ } else {
+ throw Exception(ErrorCode::INVALID_ARGUMENT, "Illegal column type {}.
Expected String",
+ column->get_name());
+ }
+}
+
+template <IPStringToNumExceptionMode exception_mode>
+class FunctionIPv6StringToNum : public IFunction {
+public:
+ static constexpr auto name = exception_mode ==
IPStringToNumExceptionMode::Throw
+ ? "ipv6_string_to_num"
+ : (exception_mode ==
IPStringToNumExceptionMode::Default
+ ?
"ipv6_string_to_num_or_default"
+ :
"ipv6_string_to_num_or_null");
+
+ static FunctionPtr create() {
+ return std::make_shared<FunctionIPv6StringToNum<exception_mode>>();
+ }
+
+ String get_name() const override { return name; }
+
+ size_t get_number_of_arguments() const override { return 1; }
+
+ bool use_default_implementation_for_nulls() const override { return false;
}
+
+ DataTypePtr get_return_type_impl(const DataTypes& arguments) const
override {
+ if (!is_string(remove_nullable(arguments[0]))) {
+ throw Exception(ErrorCode::INVALID_ARGUMENT,
+ "Illegal type {} of argument of function {}",
arguments[0]->get_name(),
+ get_name());
+ }
+
+ auto result_type = std::make_shared<DataTypeString>();
+
+ if constexpr (exception_mode == IPStringToNumExceptionMode::Null) {
+ return make_nullable(result_type);
+ }
+
+ return result_type;
+ }
+
+ Status execute_impl(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
+ size_t result, size_t input_rows_count) const override
{
+ ColumnPtr column = block.get_by_position(arguments[0]).column;
+ ColumnPtr null_map_column;
+ const NullMap* null_map = nullptr;
+
+ if (column->is_nullable()) {
+ const auto* column_nullable = assert_cast<const
ColumnNullable*>(column.get());
+ column = column_nullable->get_nested_column_ptr();
+ if constexpr (exception_mode == IPStringToNumExceptionMode::Null) {
+ null_map_column = column_nullable->get_null_map_column_ptr();
+ null_map = &column_nullable->get_null_map_data();
+ }
+ }
+
+ auto col_res = convertToIPv6<exception_mode, ColumnString>(column,
null_map);
+
+ if (null_map && !col_res->is_nullable()) {
+ block.replace_by_position(result,
+
ColumnNullable::create(IColumn::mutate(col_res),
+
IColumn::mutate(null_map_column)));
+ return Status::OK();
+ }
+
+ block.replace_by_position(result, col_res);
+ return Status::OK();
+ }
+};
+
} // namespace doris::vectorized
\ No newline at end of file
diff --git a/docs/en/docs/sql-manual/sql-functions/ip-functions/inet6-aton.md
b/docs/en/docs/sql-manual/sql-functions/ip-functions/inet6-aton.md
new file mode 100644
index 00000000000..69bf4a44861
--- /dev/null
+++ b/docs/en/docs/sql-manual/sql-functions/ip-functions/inet6-aton.md
@@ -0,0 +1,70 @@
+---
+{
+"title": "INET6_ATON",
+"language": "en"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+## INET6_ATON
+
+<version since="dev">
+
+inet6_aton
+
+</version>
+
+### description
+
+#### Syntax
+
+`VARCHAR INET6_ATON(VARCHAR ipv6_string)`
+
+The reverse function of IPv6NumToString, it takes an IP address String and
returns an IPv6 address in binary format.
+If the input string contains a valid IPv4 address, returns its IPv6 equivalent.
+
+### notice
+
+`will return an error if the input string is not a valid IP address`
+
+### example
+```
+mysql> select hex(inet6_aton('1111::ffff'));
++----------------------------------+
+| hex(inet6_aton('1111::ffff')) |
++----------------------------------+
+| 1111000000000000000000000000FFFF |
++----------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(inet6_aton('192.168.0.1'));
++----------------------------------+
+| hex(inet6_aton('192.168.0.1')) |
++----------------------------------+
+| 00000000000000000000FFFFC0A80001 |
++----------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(inet6_aton('notaaddress'));
+ERROR 1105 (HY000): errCode = 2, detailMessage = (172.17.0.2)[CANCELLED][E33]
Invalid IPv6 value
+```
+
+### keywords
+
+INET6_ATON, IP
\ No newline at end of file
diff --git
a/docs/en/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-default.md
b/docs/en/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-default.md
new file mode 100644
index 00000000000..30c3455adf6
--- /dev/null
+++
b/docs/en/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-default.md
@@ -0,0 +1,75 @@
+---
+{
+"title": "IPV6_STRING_TO_NUM_OR_DEFAULT",
+"language": "en"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+## IPV6_STRING_TO_NUM_OR_DEFAULT
+
+<version since="dev">
+
+IPV6_STRING_TO_NUM_OR_DEFAULT
+
+</version>
+
+### description
+
+#### Syntax
+
+`VARCHAR IPV6_STRING_TO_NUM_OR_DEFAULT(VARCHAR ipv6_string)`
+
+The reverse function of IPv6NumToString, it takes an IP address String and
returns an IPv6 address in binary format.
+If the input string contains a valid IPv4 address, returns its IPv6 equivalent.
+
+### notice
+
+`will return zero if the input string is not a valid IP address`
+
+### example
+```
+mysql> select hex(ipv6_string_to_num_or_default('1111::ffff'));
++--------------------------------------------------+
+| hex(ipv6_string_to_num_or_default('1111::ffff')) |
++--------------------------------------------------+
+| 1111000000000000000000000000FFFF |
++--------------------------------------------------+
+1 row in set (0.01 sec)
+
+mysql> select hex(ipv6_string_to_num_or_default('192.168.0.1'));
++---------------------------------------------------+
+| hex(ipv6_string_to_num_or_default('192.168.0.1')) |
++---------------------------------------------------+
+| 00000000000000000000FFFFC0A80001 |
++---------------------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(ipv6_string_to_num_or_default('notaaddress'));
++---------------------------------------------------+
+| hex(ipv6_string_to_num_or_default('notaaddress')) |
++---------------------------------------------------+
+| 00000000000000000000000000000000 |
++---------------------------------------------------+
+1 row in set (0.02 sec)
+```
+
+### keywords
+
+IPV6_STRING_TO_NUM_OR_DEFAULT, IP
\ No newline at end of file
diff --git
a/docs/en/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-null.md
b/docs/en/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-null.md
new file mode 100644
index 00000000000..9df5f11414c
--- /dev/null
+++
b/docs/en/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-null.md
@@ -0,0 +1,75 @@
+---
+{
+"title": "IPV6_STRING_TO_NUM_OR_NULL",
+"language": "en"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+## IPV6_STRING_TO_NUM_OR_NULL
+
+<version since="dev">
+
+IPV6_STRING_TO_NUM_OR_NULL
+
+</version>
+
+### description
+
+#### Syntax
+
+`VARCHAR IPV6_STRING_TO_NUM_OR_NULL(VARCHAR ipv6_string)`
+
+The reverse function of IPv6NumToString, it takes an IP address String and
returns an IPv6 address in binary format.
+If the input string contains a valid IPv4 address, returns its IPv6 equivalent.
+
+### notice
+
+`will return NULL if the input string is not a valid IP address`
+
+### example
+```
+mysql> select hex(ipv6_string_to_num_or_null('1111::ffff'));
++-----------------------------------------------+
+| hex(ipv6_string_to_num_or_null('1111::ffff')) |
++-----------------------------------------------+
+| 1111000000000000000000000000FFFF |
++-----------------------------------------------+
+1 row in set (0.01 sec)
+
+mysql> select hex(ipv6_string_to_num_or_null('192.168.0.1'));
++------------------------------------------------+
+| hex(ipv6_string_to_num_or_null('192.168.0.1')) |
++------------------------------------------------+
+| 00000000000000000000FFFFC0A80001 |
++------------------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(ipv6_string_to_num_or_null('notaaddress'));
++------------------------------------------------+
+| hex(ipv6_string_to_num_or_null('notaaddress')) |
++------------------------------------------------+
+| NULL |
++------------------------------------------------+
+1 row in set (0.02 sec)
+```
+
+### keywords
+
+IPV6_STRING_TO_NUM_OR_NULL, IP
\ No newline at end of file
diff --git
a/docs/en/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num.md
b/docs/en/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num.md
new file mode 100644
index 00000000000..c9d1530549f
--- /dev/null
+++ b/docs/en/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num.md
@@ -0,0 +1,70 @@
+---
+{
+"title": "IPV6_STRING_TO_NUM",
+"language": "en"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+## IPV6_STRING_TO_NUM
+
+<version since="dev">
+
+IPV6_STRING_TO_NUM
+
+</version>
+
+### description
+
+#### Syntax
+
+`VARCHAR IPV6_STRING_TO_NUM(VARCHAR ipv6_string)`
+
+The reverse function of IPv6NumToString, it takes an IP address String and
returns an IPv6 address in binary format.
+If the input string contains a valid IPv4 address, returns its IPv6 equivalent.
+
+### notice
+
+`will return an error if the input string is not a valid IP address`
+
+### example
+```
+mysql> select hex(ipv6_string_to_num('1111::ffff'));
++---------------------------------------+
+| hex(ipv6_string_to_num('1111::ffff')) |
++---------------------------------------+
+| 1111000000000000000000000000FFFF |
++---------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(ipv6_string_to_num('192.168.0.1'));
++----------------------------------------+
+| hex(ipv6_string_to_num('192.168.0.1')) |
++----------------------------------------+
+| 00000000000000000000FFFFC0A80001 |
++----------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(ipv6_string_to_num('notaaddress'));
+ERROR 1105 (HY000): errCode = 2, detailMessage = (172.17.0.2)[CANCELLED][E33]
Invalid IPv6 value
+```
+
+### keywords
+
+IPV6_STRING_TO_NUM, IP
\ No newline at end of file
diff --git a/docs/sidebars.json b/docs/sidebars.json
index f8aa83eb3ab..d0bcae3aa5a 100644
--- a/docs/sidebars.json
+++ b/docs/sidebars.json
@@ -800,7 +800,12 @@
"sql-manual/sql-functions/ip-functions/ipv4-string-to-num-or-default",
"sql-manual/sql-functions/ip-functions/ipv4-string-to-num-or-null",
"sql-manual/sql-functions/ip-functions/ipv6-num-to-string",
-
"sql-manual/sql-functions/ip-functions/inet6-ntoa"
+
"sql-manual/sql-functions/ip-functions/inet6-ntoa",
+
"sql-manual/sql-functions/ip-functions/ipv6-num-to-string",
+
"sql-manual/sql-functions/ip-functions/inet6-aton",
+
"sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-default",
+
"sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-null"
+
]
},
{
diff --git
a/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/inet6-aton.md
b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/inet6-aton.md
new file mode 100644
index 00000000000..cc2bd6f04d2
--- /dev/null
+++ b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/inet6-aton.md
@@ -0,0 +1,70 @@
+---
+{
+"title": "INET6_ATON",
+"language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+## INET6_ATON
+
+<version since="dev">
+
+inet6_aton
+
+</version>
+
+### description
+
+#### Syntax
+
+`VARCHAR INET6_ATON(VARCHAR ipv6_string)`
+
+IPv6NumToString 的反向函数,它接受一个 IP 地址字符串并返回二进制格式的 IPv6 地址。
+如果输入字符串包含有效的 IPv4 地址,则返回其等效的 IPv6 地址。
+
+### notice
+
+`如果输入非法的IP地址,会抛出异常`
+
+### example
+```
+mysql> select hex(inet6_aton('1111::ffff'));
++----------------------------------+
+| hex(inet6_aton('1111::ffff')) |
++----------------------------------+
+| 1111000000000000000000000000FFFF |
++----------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(inet6_aton('192.168.0.1'));
++----------------------------------+
+| hex(inet6_aton('192.168.0.1')) |
++----------------------------------+
+| 00000000000000000000FFFFC0A80001 |
++----------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(inet6_aton('notaaddress'));
+ERROR 1105 (HY000): errCode = 2, detailMessage = (172.17.0.2)[CANCELLED][E33]
Invalid IPv6 value
+```
+
+### keywords
+
+INET6_ATON, IP
\ No newline at end of file
diff --git
a/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/inet6-ntoa.md
b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/inet6-ntoa.md
index aaeb3cc0c32..d92dcee5227 100644
--- a/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/inet6-ntoa.md
+++ b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/inet6-ntoa.md
@@ -1,7 +1,7 @@
---
{
"title": "INET6_NTOA",
-"language": "en"
+"language": "zh-CN"
}
---
diff --git
a/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-num-to-string.md
b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-num-to-string.md
index c58ecf42f4c..44bb3a9da6a 100644
---
a/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-num-to-string.md
+++
b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-num-to-string.md
@@ -1,7 +1,7 @@
---
{
"title": "IPV6_NUM_TO_STRING",
-"language": "en"
+"language": "zh-CN"
}
---
diff --git
a/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-default.md
b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-default.md
new file mode 100644
index 00000000000..4215256a849
--- /dev/null
+++
b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-default.md
@@ -0,0 +1,75 @@
+---
+{
+"title": "IPV6_STRING_TO_NUM_OR_DEFAULT",
+"language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+## IPV6_STRING_TO_NUM_OR_DEFAULT
+
+<version since="dev">
+
+IPV6_STRING_TO_NUM_OR_DEFAULT
+
+</version>
+
+### description
+
+#### Syntax
+
+`VARCHAR IPV6_STRING_TO_NUM_OR_DEFAULT(VARCHAR ipv6_string)`
+
+IPv6NumToString 的反向函数,它接受一个 IP 地址字符串并返回二进制格式的 IPv6 地址。
+如果输入字符串包含有效的 IPv4 地址,则返回其等效的 IPv6 地址。
+
+### notice
+
+`如果输入非法的IP地址,会返回0`
+
+### example
+```
+mysql> select hex(ipv6_string_to_num_or_default('1111::ffff'));
++--------------------------------------------------+
+| hex(ipv6_string_to_num_or_default('1111::ffff')) |
++--------------------------------------------------+
+| 1111000000000000000000000000FFFF |
++--------------------------------------------------+
+1 row in set (0.01 sec)
+
+mysql> select hex(ipv6_string_to_num_or_default('192.168.0.1'));
++---------------------------------------------------+
+| hex(ipv6_string_to_num_or_default('192.168.0.1')) |
++---------------------------------------------------+
+| 00000000000000000000FFFFC0A80001 |
++---------------------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(ipv6_string_to_num_or_default('notaaddress'));
++---------------------------------------------------+
+| hex(ipv6_string_to_num_or_default('notaaddress')) |
++---------------------------------------------------+
+| 00000000000000000000000000000000 |
++---------------------------------------------------+
+1 row in set (0.02 sec)
+```
+
+### keywords
+
+IPV6_STRING_TO_NUM_OR_DEFAULT, IP
\ No newline at end of file
diff --git
a/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-null.md
b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-null.md
new file mode 100644
index 00000000000..9549d2b100c
--- /dev/null
+++
b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num-or-null.md
@@ -0,0 +1,75 @@
+---
+{
+"title": "IPV6_STRING_TO_NUM_OR_NULL",
+"language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+## IPV6_STRING_TO_NUM_OR_NULL
+
+<version since="dev">
+
+IPV6_STRING_TO_NUM_OR_NULL
+
+</version>
+
+### description
+
+#### Syntax
+
+`VARCHAR IPV6_STRING_TO_NUM_OR_NULL(VARCHAR ipv6_string)`
+
+IPv6NumToString 的反向函数,它接受一个 IP 地址字符串并返回二进制格式的 IPv6 地址。
+如果输入字符串包含有效的 IPv4 地址,则返回其等效的 IPv6 地址。
+
+### notice
+
+`如果输入非法的IP地址,会返回NULL`
+
+### example
+```
+mysql> select hex(ipv6_string_to_num_or_null('1111::ffff'));
++-----------------------------------------------+
+| hex(ipv6_string_to_num_or_null('1111::ffff')) |
++-----------------------------------------------+
+| 1111000000000000000000000000FFFF |
++-----------------------------------------------+
+1 row in set (0.01 sec)
+
+mysql> select hex(ipv6_string_to_num_or_null('192.168.0.1'));
++------------------------------------------------+
+| hex(ipv6_string_to_num_or_null('192.168.0.1')) |
++------------------------------------------------+
+| 00000000000000000000FFFFC0A80001 |
++------------------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(ipv6_string_to_num_or_null('notaaddress'));
++------------------------------------------------+
+| hex(ipv6_string_to_num_or_null('notaaddress')) |
++------------------------------------------------+
+| NULL |
++------------------------------------------------+
+1 row in set (0.02 sec)
+```
+
+### keywords
+
+IPV6_STRING_TO_NUM_OR_NULL, IP
\ No newline at end of file
diff --git
a/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num.md
b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num.md
new file mode 100644
index 00000000000..a02ae6374d5
--- /dev/null
+++
b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/ipv6-string-to-num.md
@@ -0,0 +1,70 @@
+---
+{
+"title": "IPV6_STRING_TO_NUM",
+"language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+## IPV6_STRING_TO_NUM
+
+<version since="dev">
+
+IPV6_STRING_TO_NUM
+
+</version>
+
+### description
+
+#### Syntax
+
+`VARCHAR IPV6_STRING_TO_NUM(VARCHAR ipv6_string)`
+
+IPv6NumToString 的反向函数,它接受一个 IP 地址字符串并返回二进制格式的 IPv6 地址。
+如果输入字符串包含有效的 IPv4 地址,则返回其等效的 IPv6 地址。
+
+### notice
+
+`如果输入非法的IP地址,会抛出异常`
+
+### example
+```
+mysql> select hex(ipv6_string_to_num('1111::ffff'));
++---------------------------------------+
+| hex(ipv6_string_to_num('1111::ffff')) |
++---------------------------------------+
+| 1111000000000000000000000000FFFF |
++---------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(ipv6_string_to_num('192.168.0.1'));
++----------------------------------------+
+| hex(ipv6_string_to_num('192.168.0.1')) |
++----------------------------------------+
+| 00000000000000000000FFFFC0A80001 |
++----------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> select hex(ipv6_string_to_num('notaaddress'));
+ERROR 1105 (HY000): errCode = 2, detailMessage = (172.17.0.2)[CANCELLED][E33]
Invalid IPv6 value
+```
+
+### keywords
+
+IPV6_STRING_TO_NUM, IP
\ No newline at end of file
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 726cef054eb..2a2627d29af 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
@@ -195,6 +195,9 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv4StringToN
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.Ipv6NumToString;
+import
org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6StringToNum;
+import
org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6StringToNumOrDefault;
+import
org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6StringToNumOrNull;
import org.apache.doris.nereids.trees.expressions.functions.scalar.JsonArray;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.JsonContains;
import org.apache.doris.nereids.trees.expressions.functions.scalar.JsonExtract;
@@ -593,6 +596,9 @@ public class BuiltinScalarFunctions implements
FunctionHelper {
scalar(Ipv4StringToNumOrDefault.class, "ipv4stringtonumordefault"),
scalar(Ipv4StringToNumOrNull.class, "ipv4stringtonumornull"),
scalar(Ipv6NumToString.class, "ipv6numtostring", "inet6_ntoa"),
+ scalar(Ipv6StringToNum.class, "ipv6_string_to_num", "inet6_aton"),
+ scalar(Ipv6StringToNumOrDefault.class,
"ipv6_string_to_num_or_default"),
+ scalar(Ipv6StringToNumOrNull.class, "ipv6_string_to_num_or_null"),
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/Ipv6StringToNum.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Ipv6StringToNum.java
new file mode 100644
index 00000000000..646d005e492
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Ipv6StringToNum.java
@@ -0,0 +1,66 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+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.AlwaysNotNullable;
+import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.StringType;
+import org.apache.doris.nereids.types.VarcharType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * scalar function ipv6_string_to_num
+ */
+public class Ipv6StringToNum extends ScalarFunction
+ implements BinaryExpression, ExplicitlyCastableSignature,
AlwaysNotNullable {
+
+ public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args(VarcharType.SYSTEM_DEFAULT),
+
FunctionSignature.ret(StringType.INSTANCE).args(StringType.INSTANCE));
+
+ public Ipv6StringToNum(Expression arg0) {
+ super("ipv6_string_to_num", arg0);
+ }
+
+ @Override
+ public Ipv6StringToNum withChildren(List<Expression> children) {
+ Preconditions.checkArgument(children.size() == 1,
+ "ipv6_string_to_num accept 1 args, but got %s (%s)",
+ children.size(),
+ children);
+ return new Ipv6StringToNum(children.get(0));
+ }
+
+ @Override
+ public List<FunctionSignature> getSignatures() {
+ return SIGNATURES;
+ }
+
+ @Override
+ public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+ return visitor.visitIpv6StringToNum(this, context);
+ }
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Ipv6StringToNumOrDefault.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Ipv6StringToNumOrDefault.java
new file mode 100644
index 00000000000..e34e6ea2fe8
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Ipv6StringToNumOrDefault.java
@@ -0,0 +1,66 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+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.AlwaysNotNullable;
+import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.StringType;
+import org.apache.doris.nereids.types.VarcharType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * scalar function ipv6_string_to_num_or_default
+ */
+public class Ipv6StringToNumOrDefault extends ScalarFunction
+ implements BinaryExpression, ExplicitlyCastableSignature,
AlwaysNotNullable {
+
+ public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args(VarcharType.SYSTEM_DEFAULT),
+
FunctionSignature.ret(StringType.INSTANCE).args(StringType.INSTANCE));
+
+ public Ipv6StringToNumOrDefault(Expression arg0) {
+ super("ipv6_string_to_num_or_default", arg0);
+ }
+
+ @Override
+ public Ipv6StringToNumOrDefault withChildren(List<Expression> children) {
+ Preconditions.checkArgument(children.size() == 1,
+ "ipv6_string_to_num_or_default accept 1 args, but got %s (%s)",
+ children.size(),
+ children);
+ return new Ipv6StringToNumOrDefault(children.get(0));
+ }
+
+ @Override
+ public List<FunctionSignature> getSignatures() {
+ return SIGNATURES;
+ }
+
+ @Override
+ public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+ return visitor.visitIpv6StringToNumOrDefault(this, context);
+ }
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Ipv6StringToNumOrNull.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Ipv6StringToNumOrNull.java
new file mode 100644
index 00000000000..9a099c8df33
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Ipv6StringToNumOrNull.java
@@ -0,0 +1,66 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+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.shape.BinaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.StringType;
+import org.apache.doris.nereids.types.VarcharType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * scalar function ipv6_string_to_num_or_null
+ */
+public class Ipv6StringToNumOrNull extends ScalarFunction
+ implements BinaryExpression, ExplicitlyCastableSignature,
AlwaysNullable {
+
+ public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args(VarcharType.SYSTEM_DEFAULT),
+
FunctionSignature.ret(StringType.INSTANCE).args(StringType.INSTANCE));
+
+ public Ipv6StringToNumOrNull(Expression arg0) {
+ super("ipv6_string_to_num_or_null", arg0);
+ }
+
+ @Override
+ public Ipv6StringToNumOrNull withChildren(List<Expression> children) {
+ Preconditions.checkArgument(children.size() == 1,
+ "ipv6_string_to_num_or_null accept 1 args, but got %s (%s)",
+ children.size(),
+ children);
+ return new Ipv6StringToNumOrNull(children.get(0));
+ }
+
+ @Override
+ public List<FunctionSignature> getSignatures() {
+ return SIGNATURES;
+ }
+
+ @Override
+ public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+ return visitor.visitIpv6StringToNumOrNull(this, context);
+ }
+}
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 ae147b633bd..944bb4fdb89 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
@@ -191,6 +191,9 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv4StringToN
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.Ipv6NumToString;
+import
org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6StringToNum;
+import
org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6StringToNumOrDefault;
+import
org.apache.doris.nereids.trees.expressions.functions.scalar.Ipv6StringToNumOrNull;
import org.apache.doris.nereids.trees.expressions.functions.scalar.JsonArray;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.JsonContains;
import org.apache.doris.nereids.trees.expressions.functions.scalar.JsonExtract;
@@ -1121,6 +1124,18 @@ public interface ScalarFunctionVisitor<R, C> {
return visitScalarFunction(ipv6NumToString, context);
}
+ default R visitIpv6StringToNum(Ipv6StringToNum ipv6StringToNum, C context)
{
+ return visitScalarFunction(ipv6StringToNum, context);
+ }
+
+ default R visitIpv6StringToNumOrDefault(Ipv6StringToNumOrDefault
ipv6StringToNumOrDefault, C context) {
+ return visitScalarFunction(ipv6StringToNumOrDefault, context);
+ }
+
+ default R visitIpv6StringToNumOrNull(Ipv6StringToNumOrNull
ipv6StringToNumOrNull, C context) {
+ return visitScalarFunction(ipv6StringToNumOrNull, context);
+ }
+
default R visitJsonArray(JsonArray jsonArray, C context) {
return visitScalarFunction(jsonArray, context);
}
diff --git a/gensrc/script/doris_builtins_functions.py
b/gensrc/script/doris_builtins_functions.py
index 5e45a1a78af..77992a539b5 100644
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -2006,6 +2006,12 @@ visible_functions = {
[['ipv4stringtonumornull'], 'BIGINT', ['STRING'], 'ALWAYS_NULLABLE'],
[['ipv6numtostring','inet6_ntoa'], 'VARCHAR', ['VARCHAR'],
'ALWAYS_NULLABLE'],
[['ipv6numtostring','inet6_ntoa'], 'STRING', ['STRING'],
'ALWAYS_NULLABLE'],
+ [['ipv6_string_to_num','inet6_aton'], 'VARCHAR', ['VARCHAR'],
'ALWAYS_NOT_NULLABLE'],
+ [['ipv6_string_to_num','inet6_aton'], 'STRING', ['STRING'],
'ALWAYS_NOT_NULLABLE'],
+ [['ipv6_string_to_num_or_default'], 'VARCHAR', ['VARCHAR'],
'ALWAYS_NOT_NULLABLE'],
+ [['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'],
],
"NonNullalbe": [
diff --git a/regression-test/data/nereids_function_p0/ip_functions.out
b/regression-test/data/nereids_function_p0/ip_functions.out
index f906ee221f0..56ae0959999 100644
--- a/regression-test/data/nereids_function_p0/ip_functions.out
+++ b/regression-test/data/nereids_function_p0/ip_functions.out
@@ -87,4 +87,67 @@ aaaa:aaaa:ffff:ffff:ffff:ffff:aaaa:aaaa
\N
-- !ip30 --
-::ffff:127.0.0.1
\ No newline at end of file
+::ffff:127.0.0.1
+
+-- !ip31 --
+00000000000000000000FFFFC0A80001
+
+-- !ip32 --
+2A0206B8000000000000000000000011
+
+-- !ip33 --
+00000000000000000000000000000000
+
+-- !ip34 --
+00A00050910000000000000000000000
+
+-- !ip35 --
+00000000000000000000FFFFC0A80001
+
+-- !ip36 --
+2A0206B8000000000000000000000011
+
+-- !ip37 --
+00000000000000000000000000000000
+
+-- !ip38 --
+00000000000000000000000000000000
+
+-- !ip39 --
+00000000000000000000000000000000
+
+-- !ip40 --
+00000000000000000000FFFFC0A80001
+
+-- !ip41 --
+2A0206B8000000000000000000000011
+
+-- !ip42 --
+00000000000000000000000000000000
+
+-- !ip43 --
+\N
+
+-- !ip44 --
+\N
+
+-- !ip45 --
+\N
+
+-- !ip46 --
+\N
+
+-- !ip47 --
+\N
+
+-- !ip48 --
+\N
+
+-- !ip49 --
+AAAAAAAAFFFFFFFFFFFFFFFFAAAAAAAA
+
+-- !ip50 --
+00000000000000000000FFFFC0A80001
+
+-- !ip51 --
+2A0206B8000000000000000000000011
\ No newline at end of file
diff --git
a/regression-test/data/query_p0/sql_functions/ip_functions/test_ip_functions.out
b/regression-test/data/query_p0/sql_functions/ip_functions/test_ip_functions.out
index 54e2fac8892..71f02449d3b 100644
---
a/regression-test/data/query_p0/sql_functions/ip_functions/test_ip_functions.out
+++
b/regression-test/data/query_p0/sql_functions/ip_functions/test_ip_functions.out
@@ -74,4 +74,67 @@ aaaa:aaaa:ffff:ffff:ffff:ffff:aaaa:aaaa
\N
-- !sql --
-::ffff:127.0.0.1
\ No newline at end of file
+::ffff:127.0.0.1
+
+-- !sql --
+00000000000000000000FFFFC0A80001
+
+-- !sql --
+2A0206B8000000000000000000000011
+
+-- !sql --
+00000000000000000000000000000000
+
+-- !sql --
+00A00050910000000000000000000000
+
+-- !sql --
+00000000000000000000FFFFC0A80001
+
+-- !sql --
+2A0206B8000000000000000000000011
+
+-- !sql --
+00000000000000000000000000000000
+
+-- !sql --
+00000000000000000000000000000000
+
+-- !sql --
+00000000000000000000000000000000
+
+-- !sql --
+00000000000000000000FFFFC0A80001
+
+-- !sql --
+2A0206B8000000000000000000000011
+
+-- !sql --
+00000000000000000000000000000000
+
+-- !sql --
+\N
+
+-- !sql --
+\N
+
+-- !sql --
+\N
+
+-- !sql --
+\N
+
+-- !sql --
+\N
+
+-- !sql --
+\N
+
+-- !sql --
+AAAAAAAAFFFFFFFFFFFFFFFFAAAAAAAA
+
+-- !sql --
+00000000000000000000FFFFC0A80001
+
+-- !sql --
+2A0206B8000000000000000000000011
\ No newline at end of file
diff --git a/regression-test/suites/nereids_function_p0/ip_functions.groovy
b/regression-test/suites/nereids_function_p0/ip_functions.groovy
index 2a6f8caad6c..76accd986dc 100644
--- a/regression-test/suites/nereids_function_p0/ip_functions.groovy
+++ b/regression-test/suites/nereids_function_p0/ip_functions.groovy
@@ -50,4 +50,26 @@ suite("ip_functions") {
qt_ip28 "SELECT inet6_ntoa(unhex('aaaa@#'));"
qt_ip29 "SELECT inet6_ntoa(unhex('\0'));"
qt_ip30 "SELECT inet6_ntoa(unhex('00000000000000000000FFFF7F000001'));"
+
+ qt_ip31 "SELECT hex(ipv6_string_to_num('192.168.0.1'));"
+ qt_ip32 "SELECT hex(ipv6_string_to_num('2a02:6b8::11'));"
+ qt_ip33 "SELECT hex(ipv6_string_to_num('::'));"
+ qt_ip34 "SELECT hex(ipv6_string_to_num('a0:50:9100::'));"
+ qt_ip35 "SELECT hex(ipv6_string_to_num_or_default('192.168.0.1'));"
+ qt_ip36 "SELECT hex(ipv6_string_to_num_or_default('2a02:6b8::11'));"
+ qt_ip37 "SELECT hex(ipv6_string_to_num_or_default('::'));"
+ qt_ip38 "SELECT hex(ipv6_string_to_num_or_default('KK'));"
+ qt_ip39 "SELECT
hex(ipv6_string_to_num_or_default('ffffffffffffffffffffffffffffffffffffffffffffffffffffff'));"
+ qt_ip40 "SELECT hex(ipv6_string_to_num_or_null('192.168.0.1'));"
+ qt_ip41 "SELECT hex(ipv6_string_to_num_or_null('2a02:6b8::11'));"
+ qt_ip42 "SELECT hex(ipv6_string_to_num_or_null('::'));"
+ qt_ip43 "SELECT hex(ipv6_string_to_num_or_null('KK'));"
+ qt_ip44 "SELECT
hex(ipv6_string_to_num_or_null('ffffffffffffffffffffffffffffffffffffffffffffffffffffff'));"
+ qt_ip45 "SELECT hex(ipv6_string_to_num_or_null(''));"
+ qt_ip46 "SELECT hex(ipv6_string_to_num_or_null(NULL));"
+ qt_ip47 "SELECT hex(ipv6_string_to_num_or_null('\0'));"
+ qt_ip48 "SELECT hex(ipv6_string_to_num_or_null('00'));"
+ qt_ip49 "SELECT
hex(ipv6_string_to_num_or_null('aaaa:aaaa:ffff:ffff:ffff:ffff:aaaa:aaaa'));"
+ qt_ip50 "SELECT hex(inet6_aton('192.168.0.1'));"
+ qt_ip51 "SELECT hex(inet6_aton('2a02:6b8::11'));"
}
\ No newline at end of file
diff --git
a/regression-test/suites/query_p0/sql_functions/ip_functions/test_ip_functions.groovy
b/regression-test/suites/query_p0/sql_functions/ip_functions/test_ip_functions.groovy
index 60ba7d3c076..633ff9ddf42 100644
---
a/regression-test/suites/query_p0/sql_functions/ip_functions/test_ip_functions.groovy
+++
b/regression-test/suites/query_p0/sql_functions/ip_functions/test_ip_functions.groovy
@@ -45,4 +45,26 @@ suite("test_ip_functions", "arrow_flight_sql") {
qt_sql "SELECT inet6_ntoa(unhex('aaaa@#'));"
qt_sql "SELECT inet6_ntoa(unhex('\0'));"
qt_sql "SELECT inet6_ntoa(unhex('00000000000000000000FFFF7F000001'));"
+
+ qt_sql "SELECT hex(ipv6_string_to_num('192.168.0.1'));"
+ qt_sql "SELECT hex(ipv6_string_to_num('2a02:6b8::11'));"
+ qt_sql "SELECT hex(ipv6_string_to_num('::'));"
+ qt_sql "SELECT hex(ipv6_string_to_num('a0:50:9100::'));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_default('192.168.0.1'));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_default('2a02:6b8::11'));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_default('::'));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_default('KK'));"
+ qt_sql "SELECT
hex(ipv6_string_to_num_or_default('ffffffffffffffffffffffffffffffffffffffffffffffffffffff'));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_null('192.168.0.1'));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_null('2a02:6b8::11'));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_null('::'));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_null('KK'));"
+ qt_sql "SELECT
hex(ipv6_string_to_num_or_null('ffffffffffffffffffffffffffffffffffffffffffffffffffffff'));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_null(''));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_null(NULL));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_null('\0'));"
+ qt_sql "SELECT hex(ipv6_string_to_num_or_null('00'));"
+ qt_sql "SELECT
hex(ipv6_string_to_num_or_null('aaaa:aaaa:ffff:ffff:ffff:ffff:aaaa:aaaa'));"
+ qt_sql "SELECT hex(inet6_aton('192.168.0.1'));"
+ qt_sql "SELECT hex(inet6_aton('2a02:6b8::11'));"
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]