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 <42577861+superdiaod...@users.noreply.github.com>
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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to