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