You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by zh...@apache.org on 2024/09/05 06:22:39 UTC

(doris) branch master updated: [improve](cast) support ipv4 cast to ipv6 type (#39828)

This is an automated email from the ASF dual-hosted git repository.

zhangstar333 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 58dbb5ffdbe [improve](cast) support ipv4 cast to ipv6 type (#39828)
58dbb5ffdbe is described below

commit 58dbb5ffdbe6ae3a6081d65e056799ccca26cde6
Author: zhangstar333 <87...@users.noreply.github.com>
AuthorDate: Thu Sep 5 14:22:30 2024 +0800

    [improve](cast) support ipv4 cast to ipv6 type (#39828)
    
    ## Proposed changes
    support ipv4 cast to ipv6 type
---
 be/src/vec/functions/function_cast.h               | 11 ++++++++++
 .../org/apache/doris/catalog/PrimitiveType.java    |  1 +
 .../doris/nereids/util/TypeCoercionUtils.java      |  4 +++-
 .../data/datatype_p0/ip/test_ip_implicit_cast.out  | 25 ++++++++++++++++++++++
 .../datatype_p0/ip/test_ip_implicit_cast.groovy    | 19 +++++++++++++++-
 5 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/be/src/vec/functions/function_cast.h b/be/src/vec/functions/function_cast.h
index e463742ef99..153c3ef0f2e 100644
--- a/be/src/vec/functions/function_cast.h
+++ b/be/src/vec/functions/function_cast.h
@@ -433,6 +433,11 @@ struct ConvertImpl {
                     block.get_by_position(result).column =
                             ColumnNullable::create(std::move(col_to), std::move(col_null_map_to));
                     return Status::OK();
+                } else if constexpr ((std::is_same_v<FromDataType, DataTypeIPv4>)&&(
+                                             std::is_same_v<ToDataType, DataTypeIPv6>)) {
+                    for (size_t i = 0; i < size; ++i) {
+                        map_ipv4_to_ipv6(vec_from[i], reinterpret_cast<UInt8*>(&vec_to[i]));
+                    }
                 } else {
                     for (size_t i = 0; i < size; ++i) {
                         vec_to[i] = static_cast<ToFieldType>(vec_from[i]);
@@ -453,6 +458,12 @@ struct ConvertImpl {
         }
         return Status::OK();
     }
+
+private:
+    static void map_ipv4_to_ipv6(IPv4 ipv4, UInt8* buf) {
+        unaligned_store<UInt64>(buf, 0x0000FFFF00000000ULL | static_cast<UInt64>(ipv4));
+        unaligned_store<UInt64>(buf + 8, 0);
+    }
 };
 
 /** If types are identical, just take reference to column.
diff --git a/fe/fe-common/src/main/java/org/apache/doris/catalog/PrimitiveType.java b/fe/fe-common/src/main/java/org/apache/doris/catalog/PrimitiveType.java
index dbb5e7ad376..fbd9bf6924e 100644
--- a/fe/fe-common/src/main/java/org/apache/doris/catalog/PrimitiveType.java
+++ b/fe/fe-common/src/main/java/org/apache/doris/catalog/PrimitiveType.java
@@ -596,6 +596,7 @@ public enum PrimitiveType {
         // ipv4
         builder.put(IPV4, VARCHAR);
         builder.put(IPV4, STRING);
+        builder.put(IPV4, IPV6);
 
         // ipv6
         builder.put(IPV6, VARCHAR);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
index 651e018c20e..968d70b52da 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
@@ -1442,7 +1442,9 @@ public class TypeCoercionUtils {
             return Optional.of(IPv4Type.INSTANCE);
         }
         if ((leftType.isIPv6Type() && rightType.isStringLikeType())
-                || (rightType.isIPv6Type() && leftType.isStringLikeType())) {
+                || (rightType.isIPv6Type() && leftType.isStringLikeType())
+                || (leftType.isIPv4Type() && rightType.isIPv6Type())
+                || (leftType.isIPv6Type() && rightType.isIPv4Type())) {
             return Optional.of(IPv6Type.INSTANCE);
         }
 
diff --git a/regression-test/data/datatype_p0/ip/test_ip_implicit_cast.out b/regression-test/data/datatype_p0/ip/test_ip_implicit_cast.out
index 7e7f571ef5a..5a27ca74f4f 100644
--- a/regression-test/data/datatype_p0/ip/test_ip_implicit_cast.out
+++ b/regression-test/data/datatype_p0/ip/test_ip_implicit_cast.out
@@ -5,3 +5,28 @@
 1	0.0.0.1	::1
 2130706433	127.0.0.1	2001:1b70:a1:610::b102:2
 4294967295	255.255.255.255	ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
+
+-- !sql2 --
+true
+false
+
+-- !sql3 --
+true
+false
+
+-- !sql4 --
+172.20.48.119	::ffff:172.20.48.119
+172.20.48.111	::ffff:172.20.48.111
+
+-- !sql5 --
+true
+false
+
+-- !sql6 --
+true
+false
+
+-- !sql7 --
+172.20.48.119	::ffff:172.20.48.119
+172.20.48.111	::ffff:172.20.48.111
+
diff --git a/regression-test/suites/datatype_p0/ip/test_ip_implicit_cast.groovy b/regression-test/suites/datatype_p0/ip/test_ip_implicit_cast.groovy
index 96ef6e8134a..30291b3af3a 100644
--- a/regression-test/suites/datatype_p0/ip/test_ip_implicit_cast.groovy
+++ b/regression-test/suites/datatype_p0/ip/test_ip_implicit_cast.groovy
@@ -40,7 +40,24 @@ suite("test_ip_implicit_cast") {
     sql "insert into ${tableName} values(2130706433, 2130706433, '2001:1b70:a1:610::b102:2')"
     sql "insert into ${tableName} values(4294967295, 4294967295, 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')"
 
-    qt_sql1 "select id, ip_v4 from ${tableName} order by id"
+    qt_sql1 "select id, ip_v4, ip_v6 from ${tableName} order by id"
 
     sql "DROP TABLE ${tableName}"
+
+    sql """ drop table if exists t5;"""
+    sql """ create table t5 (id int, a ipv4, b ipv6) properties ("replication_num"="1");"""
+    sql """ insert into t5 values (1, to_ipv4('172.20.48.119'), to_ipv6('::ffff:172.20.48.119'));"""
+    sql """ insert into t5 values (2, to_ipv4('172.20.48.111'), to_ipv6('::ffff:172.20.48.119'));"""
+    qt_sql2 """ select ipv4_to_ipv6(a) = b from t5 order by id;"""
+    qt_sql3 """ select a = b from t5 order by id;"""
+    qt_sql4 """ select a, cast(a as ipv6) from t5 order by id;"""
+
+    sql """ drop table if exists t5_not_null;"""
+    sql """ create table t5_not_null (id int, a ipv4 not null, b ipv6 not null) properties ("replication_num"="1");"""
+    sql """ insert into t5_not_null values (1, to_ipv4('172.20.48.119'), to_ipv6('::ffff:172.20.48.119'));"""
+    sql """ insert into t5_not_null values (2, to_ipv4('172.20.48.111'), to_ipv6('::ffff:172.20.48.119'));"""
+    qt_sql5 """ select ipv4_to_ipv6(a) = b from t5_not_null order by id;"""
+    qt_sql6 """ select a = b from t5_not_null order by id;"""
+    qt_sql7 """ select a, cast(a as ipv6) from t5_not_null order by id;"""
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org