diff --git a/be/src/vec/functions/function_ip.cpp b/be/src/vec/functions/function_ip.cpp index 140100d22b..349e095b4a 100644 --- a/be/src/vec/functions/function_ip.cpp +++ b/be/src/vec/functions/function_ip.cpp @@ -25,7 +25,7 @@ void register_function_ip(SimpleFunctionFactory& factory) { factory.register_function>(); factory.register_function>(); factory.register_function>(); - factory.register_alias(FunctionIPv4StringToNum::name, + factory.register_alias(FunctionIPv4StringToNum::name, "inet_aton"); factory.register_function(); @@ -33,7 +33,7 @@ void register_function_ip(SimpleFunctionFactory& factory) { factory.register_function>(); factory.register_function>(); factory.register_function>(); - factory.register_alias(FunctionIPv6StringToNum::name, + factory.register_alias(FunctionIPv6StringToNum::name, "inet6_aton"); factory.register_function(); diff --git a/docs/en/docs/sql-manual/sql-functions/ip-functions/inet-aton.md b/docs/en/docs/sql-manual/sql-functions/ip-functions/inet-aton.md index 1120a4852f..56f9308f34 100644 --- a/docs/en/docs/sql-manual/sql-functions/ip-functions/inet-aton.md +++ b/docs/en/docs/sql-manual/sql-functions/ip-functions/inet-aton.md @@ -40,20 +40,26 @@ Takes a string containing an IPv4 address in the format A.B.C.D (dot-separated n ### notice -`will return an error if the input string is not a valid IPv4 address` +`It is the alias of ipv4_string_to_num_or_null. +It will return NULL if the input string is not a valid IP address or NULL, which is the same with MySQL` ### example ``` mysql> select inet_aton('192.168.0.1'); -+--------------------------------+ -| inet_aton('192.168.0.1') | -+--------------------------------+ -| 3232235521 | -+--------------------------------+ ++-------------------------------------------+ +| ipv4_string_to_num_or_null('192.168.0.1') | ++-------------------------------------------+ +| 3232235521 | ++-------------------------------------------+ 1 row in set (0.01 sec) mysql> SELECT inet_aton('192.168'); -ERROR 1105 (HY000): errCode = 2, detailMessage = (172.17.0.2)[CANCELLED][INVALID_ARGUMENT][E33] Invalid IPv4 value ++---------------------------------------+ +| ipv4_string_to_num_or_null('192.168') | ++---------------------------------------+ +| NULL | ++---------------------------------------+ +1 row in set (0.01 sec) ``` ### keywords 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 index 69bf4a4486..25f60b2cb8 100644 --- 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 @@ -41,28 +41,34 @@ 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` +`It is the alias of ipv6_string_to_num_or_null. +It will return NULL if the input string is not a valid IP address or NULL, which is the same with MySQL` ### example ``` mysql> select hex(inet6_aton('1111::ffff')); -+----------------------------------+ -| hex(inet6_aton('1111::ffff')) | -+----------------------------------+ -| 1111000000000000000000000000FFFF | -+----------------------------------+ ++-----------------------------------------------+ +| hex(ipv6_string_to_num_or_null('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 | -+----------------------------------+ ++------------------------------------------------+ +| hex(ipv6_string_to_num_or_null('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 ++--------------------------------------------------+ +| hex(ipv6_string_to_num_or_null('notaaddress')) | ++--------------------------------------------------+ +| NULL | ++--------------------------------------------------+ +1 row in set (0.02 sec) ``` ### keywords diff --git a/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/inet-aton.md b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/inet-aton.md index 2260dfbc49..50a31f1799 100644 --- a/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/inet-aton.md +++ b/docs/zh-CN/docs/sql-manual/sql-functions/ip-functions/inet-aton.md @@ -40,20 +40,25 @@ inet_aton ### notice -`如果输入字符串不是有效的 IPv4 地址,将返回错误` +`该函数为ipv4_string_to_num_or_null的别称。如果输入字符串不是有效的 IPv4 地址或者NULL,将返回NULL,和MySQL一样` ### example ``` mysql> select inet_aton('192.168.0.1'); -+--------------------------------+ -| inet_aton('192.168.0.1') | -+--------------------------------+ -| 3232235521 | -+--------------------------------+ ++-------------------------------------------+ +| ipv4_string_to_num_or_null('192.168.0.1') | ++-------------------------------------------+ +| 3232235521 | ++-------------------------------------------+ 1 row in set (0.01 sec) mysql> SELECT inet_aton('192.168'); -ERROR 1105 (HY000): errCode = 2, detailMessage = (172.17.0.2)[CANCELLED][INVALID_ARGUMENT][E33] Invalid IPv4 value ++---------------------------------------+ +| ipv4_string_to_num_or_null('192.168') | ++---------------------------------------+ +| NULL | ++---------------------------------------+ +1 row in set (0.01 sec) ``` ### keywords 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 index cc2bd6f04d..53eac5cb90 100644 --- 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 @@ -41,28 +41,33 @@ IPv6NumToString 的反向函数,它接受一个 IP 地址字符串并返回二 ### notice -`如果输入非法的IP地址,会抛出异常` +`该函数为ipv6_string_to_num_or_null的别称。如果输入字符串不是有效的 IPv4 地址或者NULL,将返回NULL,和MySQL一样` ### example ``` mysql> select hex(inet6_aton('1111::ffff')); -+----------------------------------+ -| hex(inet6_aton('1111::ffff')) | -+----------------------------------+ -| 1111000000000000000000000000FFFF | -+----------------------------------+ ++-----------------------------------------------+ +| hex(ipv6_string_to_num_or_null('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 | -+----------------------------------+ ++------------------------------------------------+ +| hex(ipv6_string_to_num_or_null('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 ++--------------------------------------------------+ +| hex(ipv6_string_to_num_or_null('notaaddress')) | ++--------------------------------------------------+ +| NULL | ++--------------------------------------------------+ +1 row in set (0.02 sec) ``` ### keywords 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 68da4df08a..fcc2a351bf 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 @@ -604,13 +604,13 @@ public class BuiltinScalarFunctions implements FunctionHelper { scalar(InnerProduct.class, "inner_product"), scalar(Instr.class, "instr"), scalar(Ipv4NumToString.class, "ipv4_num_to_string", "inet_ntoa"), - scalar(Ipv4StringToNum.class, "ipv4_string_to_num", "inet_aton"), + scalar(Ipv4StringToNum.class, "ipv4_string_to_num"), scalar(Ipv4StringToNumOrDefault.class, "ipv4_string_to_num_or_default"), - scalar(Ipv4StringToNumOrNull.class, "ipv4_string_to_num_or_null"), + scalar(Ipv4StringToNumOrNull.class, "ipv4_string_to_num_or_null", "inet_aton"), scalar(Ipv6NumToString.class, "ipv6_num_to_string", "inet6_ntoa"), - scalar(Ipv6StringToNum.class, "ipv6_string_to_num", "inet6_aton"), + scalar(Ipv6StringToNum.class, "ipv6_string_to_num"), scalar(Ipv6StringToNumOrDefault.class, "ipv6_string_to_num_or_default"), - scalar(Ipv6StringToNumOrNull.class, "ipv6_string_to_num_or_null"), + scalar(Ipv6StringToNumOrNull.class, "ipv6_string_to_num_or_null", "inet6_aton"), scalar(IsIpv4Compat.class, "is_ipv4_compat"), scalar(IsIpv4Mapped.class, "is_ipv4_mapped"), scalar(IsIpv4String.class, "is_ipv4_string"), diff --git a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FunctionAlias.java b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FunctionAlias.java index 9e9c6dc9f7..b32cc9919b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FunctionAlias.java +++ b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FunctionAlias.java @@ -38,8 +38,8 @@ public final class FunctionAlias implements ExprRewriteRule { .put("char_length", "character_length").put("curdate", "current_date").put("curtime", "current_time") .put("schema", "database").put("day", "dayofmonth").put("date_add", "days_add").put("adddate", "days_add") .put("date_sub", "days_sub").put("subdate", "days_sub").put("inet_ntoa", "ipv4_num_to_string") - .put("inet_aton", "ipv4_string_to_num").put("inet6_ntoa", "ipv6_num_to_string") - .put("inet6_aton", "ipv6_string_to_num").put("lcase", "lower").put("add_months", "months_add") + .put("inet_aton", "ipv4_string_to_num_or_null").put("inet6_ntoa", "ipv6_num_to_string") + .put("inet6_aton", "ipv6_string_to_num_or_null").put("lcase", "lower").put("add_months", "months_add") .put("current_timestamp", "now").put("localtime", "now").put("localtimestamp", "now").put("ifnull", "nvl") .put("rand", "random").put("sha", "sha1").put("substr", "substring").put("ucase", "upper").build(); diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 6a6ff96e83..183b38bdfd 100644 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -1998,22 +1998,22 @@ visible_functions = { [['ipv4_num_to_string','inet_ntoa'], 'VARCHAR', ['SMALLINT'], 'ALWAYS_NULLABLE'], [['ipv4_num_to_string','inet_ntoa'], 'VARCHAR', ['INT'], 'ALWAYS_NULLABLE'], [['ipv4_num_to_string','inet_ntoa'], 'VARCHAR', ['BIGINT'], 'ALWAYS_NULLABLE'], - [['ipv4_string_to_num','inet_aton'], 'BIGINT', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'], - [['ipv4_string_to_num','inet_aton'], 'BIGINT', ['STRING'], 'ALWAYS_NOT_NULLABLE'], + [['ipv4_string_to_num'], 'BIGINT', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'], + [['ipv4_string_to_num'], 'BIGINT', ['STRING'], 'ALWAYS_NOT_NULLABLE'], [['ipv4_string_to_num_or_default'], 'BIGINT', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'], [['ipv4_string_to_num_or_default'], 'BIGINT', ['STRING'], 'ALWAYS_NOT_NULLABLE'], - [['ipv4_string_to_num_or_null'], 'BIGINT', ['VARCHAR'], 'ALWAYS_NULLABLE'], - [['ipv4_string_to_num_or_null'], 'BIGINT', ['STRING'], 'ALWAYS_NULLABLE'], + [['ipv4_string_to_num_or_null','inet_aton'], 'BIGINT', ['VARCHAR'], 'ALWAYS_NULLABLE'], + [['ipv4_string_to_num_or_null','inet_aton'], 'BIGINT', ['STRING'], 'ALWAYS_NULLABLE'], [['ipv6_num_to_string','inet6_ntoa'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'], [['ipv6_num_to_string','inet6_ntoa'], 'STRING', ['STRING'], 'ALWAYS_NULLABLE'], [['ipv6_num_to_string','inet6_ntoa'], 'VARCHAR', ['IPV6'], 'ALWAYS_NULLABLE'], [['ipv6_num_to_string','inet6_ntoa'], 'STRING', ['IPV6'], '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'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NOT_NULLABLE'], + [['ipv6_string_to_num'], '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'], + [['ipv6_string_to_num_or_null','inet6_aton'], 'VARCHAR', ['VARCHAR'], 'ALWAYS_NULLABLE'], + [['ipv6_string_to_num_or_null','inet6_aton'], 'STRING', ['STRING'], 'ALWAYS_NULLABLE'], [['is_ipv4_compat'], 'BOOLEAN', ['VARCHAR'], ''], [['is_ipv4_compat'], 'BOOLEAN', ['STRING'], ''], [['is_ipv4_mapped'], 'BOOLEAN', ['VARCHAR'], ''], diff --git a/regression-test/data/nereids_function_p0/ip_functions.out b/regression-test/data/nereids_function_p0/ip_functions.out index 914b5ccd68..a89ca34fe6 100644 --- a/regression-test/data/nereids_function_p0/ip_functions.out +++ b/regression-test/data/nereids_function_p0/ip_functions.out @@ -35,6 +35,15 @@ -- !ip12 -- 3232235521 +-- !ip12_1 -- +\N + +-- !ip12_2 -- +\N + +-- !ip12_3 -- +\N + -- !ip13 -- \N @@ -152,6 +161,15 @@ AAAAAAAAFFFFFFFFFFFFFFFFAAAAAAAA -- !ip51 -- 2A0206B8000000000000000000000011 +-- !ip51_1 -- +\N + +-- !ip51_2 -- +\N + +-- !ip51_3 -- +\N + -- !ip52 -- true @@ -182,6 +200,15 @@ false -- !ip61 -- true +-- !ip61_1 -- +\N + +-- !ip61_2 -- +\N + +-- !ip61_3 -- +\N + -- !ip62 -- false @@ -192,4 +219,13 @@ true false -- !ip65 -- -true \ No newline at end of file +true + +-- !ip65_1 -- +\N + +-- !ip65_2 -- +\N + +-- !ip65_3 -- +\N \ 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 1837acc4ba..569dc78a1e 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 @@ -25,6 +25,15 @@ -- !sql -- \N +-- !sql -- +\N + +-- !sql -- +\N + +-- !sql -- +\N + -- !sql -- 2a02:6b8::11 @@ -139,6 +148,15 @@ AAAAAAAAFFFFFFFFFFFFFFFFAAAAAAAA -- !sql -- 2A0206B8000000000000000000000011 +-- !sql -- +\N + +-- !sql -- +\N + +-- !sql -- +\N + -- !sql -- true @@ -157,6 +175,15 @@ false -- !sql -- true +-- !sql -- +\N + +-- !sql -- +\N + +-- !sql -- +\N + -- !sql -- false @@ -167,4 +194,13 @@ true false -- !sql -- -true \ No newline at end of file +true + +-- !sql -- +\N + +-- !sql -- +\N + +-- !sql -- +\N \ 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 b5d4d177e8..98a2574e62 100644 --- a/regression-test/suites/nereids_function_p0/ip_functions.groovy +++ b/regression-test/suites/nereids_function_p0/ip_functions.groovy @@ -31,6 +31,9 @@ suite("ip_functions") { qt_ip10 "SELECT ipv4_string_to_num_or_null('');" qt_ip11 "SELECT ipv4_string_to_num_or_default('');" qt_ip12 "SELECT inet_aton('192.168.0.1');" + qt_ip12_1 "SELECT inet_aton('192.168');" + qt_ip12_2 "SELECT inet_aton('');" + qt_ip12_3 "SELECT inet_aton(NULL);" qt_ip13 "SELECT ipv6_num_to_string(unhex('0A0005091'));" qt_ip14 "SELECT ipv6_num_to_string(unhex('2A0206B8000000000000000000000011'));" @@ -72,6 +75,9 @@ suite("ip_functions") { 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'));" + qt_ip51_1 "SELECT hex(inet6_aton(''));" + qt_ip51_2 "SELECT hex(inet6_aton(NULL));" + qt_ip51_3 "SELECT hex(inet6_aton('KK'));" qt_ip52 "SELECT is_ipv4_string('255.255.255.255');" qt_ip53 "SELECT is_ipv4_string('255.255.255.256');" @@ -84,9 +90,15 @@ suite("ip_functions") { qt_ip59 "SELECT is_ipv4_compat(inet6_aton('::c0a8:0001'));" qt_ip60 "SELECT is_ipv4_compat(inet6_aton('::0.0.0.0'));" qt_ip61 "SELECT is_ipv4_compat(inet6_aton('::255.255.255.255'));" + qt_ip61_1 "SELECT is_ipv4_compat(inet6_aton(''));" + qt_ip61_2 "SELECT is_ipv4_compat(inet6_aton(NULL));" + qt_ip61_3 "SELECT is_ipv4_compat(inet6_aton('KK'));" qt_ip62 "SELECT is_ipv4_mapped(inet6_aton('::10.0.5.9'));" qt_ip63 "SELECT is_ipv4_mapped(inet6_aton('::ffff:10.0.5.9'));" qt_ip64 "SELECT is_ipv4_mapped(inet6_aton('::'));" qt_ip65 "SELECT is_ipv4_mapped(inet6_aton('::ffff:c0a8:0001'));" + qt_ip65_1 "SELECT is_ipv4_mapped(inet6_aton(''));" + qt_ip65_2 "SELECT is_ipv4_mapped(inet6_aton(NULL));" + qt_ip65_3 "SELECT is_ipv4_mapped(inet6_aton('KK'));" } \ 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 c5ff6d36a1..5cbf59ac36 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 @@ -26,6 +26,9 @@ suite("test_ip_functions", "arrow_flight_sql") { qt_sql "SELECT ipv4_string_to_num_or_null('');" qt_sql "SELECT ipv4_string_to_num_or_default('');" qt_sql "SELECT inet_aton('192.168.0.1');" + qt_sql "SELECT inet_aton('192.168');" + qt_sql "SELECT inet_aton('');" + qt_sql "SELECT inet_aton(NULL);" qt_sql "SELECT ipv6_num_to_string(unhex('0A0005091'));" qt_sql "SELECT ipv6_num_to_string(unhex('2A0206B8000000000000000000000011'));" @@ -67,6 +70,9 @@ suite("test_ip_functions", "arrow_flight_sql") { 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'));" + qt_sql "SELECT hex(inet6_aton(''));" + qt_sql "SELECT hex(inet6_aton(NULL));" + qt_sql "SELECT hex(inet6_aton('KK'));" qt_sql "SELECT is_ipv4_compat(inet6_aton('::10.0.5.9'));" qt_sql "SELECT is_ipv4_compat(inet6_aton('::ffff:10.0.5.9'));" @@ -74,9 +80,15 @@ suite("test_ip_functions", "arrow_flight_sql") { qt_sql "SELECT is_ipv4_compat(inet6_aton('::c0a8:0001'));" qt_sql "SELECT is_ipv4_compat(inet6_aton('::0.0.0.0'));" qt_sql "SELECT is_ipv4_compat(inet6_aton('::255.255.255.255'));" + qt_sql "SELECT is_ipv4_compat(inet6_aton(''));" + qt_sql "SELECT is_ipv4_compat(inet6_aton(NULL));" + qt_sql "SELECT is_ipv4_compat(inet6_aton('KK'));" qt_sql "SELECT is_ipv4_mapped(inet6_aton('::10.0.5.9'));" qt_sql "SELECT is_ipv4_mapped(inet6_aton('::ffff:10.0.5.9'));" qt_sql "SELECT is_ipv4_mapped(inet6_aton('::'));" qt_sql "SELECT is_ipv4_mapped(inet6_aton('::ffff:c0a8:0001'));" + qt_sql "SELECT is_ipv4_mapped(inet6_aton(''));" + qt_sql "SELECT is_ipv4_mapped(inet6_aton(NULL));" + qt_sql "SELECT is_ipv4_mapped(inet6_aton('KK'));" }