This is an automated email from the ASF dual-hosted git repository.
gustavodemorais pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/master by this push:
new 878844f937f [FLINK-40486][table] Introduce the UUID logical type
878844f937f is described below
commit 878844f937f78963b8765d848731d13b4592ce32
Author: Ramin Gharib <[email protected]>
AuthorDate: Tue Sep 1 10:48:40 2026 +0200
[FLINK-40486][table] Introduce the UUID logical type
This closes #29041
---
docs/static/generated/rest_v1_sql_gateway.yml | 1 +
docs/static/generated/rest_v2_sql_gateway.yml | 1 +
docs/static/generated/rest_v3_sql_gateway.yml | 1 +
docs/static/generated/rest_v4_sql_gateway.yml | 1 +
.../rest/serde/LogicalTypeJsonDeserializer.java | 3 +
.../rest/serde/LogicalTypeJsonSerializer.java | 1 +
.../rest/serde/LogicalTypeJsonSerDeTest.java | 2 +
.../java/org/apache/flink/table/api/DataTypes.java | 12 +++
.../flink/table/types/logical/LogicalTypeRoot.java | 4 +-
.../table/types/logical/LogicalTypeVisitor.java | 4 +
.../apache/flink/table/types/logical/UuidType.java | 85 ++++++++++++++++++++++
.../types/logical/utils/LogicalTypeParser.java | 6 +-
.../apache/flink/table/types/DataTypesTest.java | 6 ++
.../flink/table/types/LogicalTypeParserTest.java | 3 +
.../apache/flink/table/types/LogicalTypesTest.java | 16 ++++
.../table/planner/calcite/FlinkTypeFactory.java | 7 ++
.../exec/serde/LogicalTypeJsonSerializer.java | 2 +
.../typeutils/LogicalRelDataTypeConverter.java | 8 ++
.../planner/calcite/FlinkTypeFactoryTest.java | 2 +
.../nodes/exec/serde/LogicalTypeJsonSerdeTest.java | 2 +
.../typeutils/LogicalRelDataTypeConverterTest.java | 2 +
.../table/runtime/typeutils/TypeCheckUtils.java | 8 +-
22 files changed, 174 insertions(+), 3 deletions(-)
diff --git a/docs/static/generated/rest_v1_sql_gateway.yml
b/docs/static/generated/rest_v1_sql_gateway.yml
index fecf0576a01..8a7d1688747 100644
--- a/docs/static/generated/rest_v1_sql_gateway.yml
+++ b/docs/static/generated/rest_v1_sql_gateway.yml
@@ -403,6 +403,7 @@ components:
- DESCRIPTOR
- VARIANT
- BITMAP
+ - UUID
OpenSessionRequestBody:
type: object
properties:
diff --git a/docs/static/generated/rest_v2_sql_gateway.yml
b/docs/static/generated/rest_v2_sql_gateway.yml
index e39feaaea8e..51faa9c28ae 100644
--- a/docs/static/generated/rest_v2_sql_gateway.yml
+++ b/docs/static/generated/rest_v2_sql_gateway.yml
@@ -477,6 +477,7 @@ components:
- DESCRIPTOR
- VARIANT
- BITMAP
+ - UUID
OpenSessionRequestBody:
type: object
properties:
diff --git a/docs/static/generated/rest_v3_sql_gateway.yml
b/docs/static/generated/rest_v3_sql_gateway.yml
index 6d171ac2152..dd6a5ca1a5f 100644
--- a/docs/static/generated/rest_v3_sql_gateway.yml
+++ b/docs/static/generated/rest_v3_sql_gateway.yml
@@ -506,6 +506,7 @@ components:
- DESCRIPTOR
- VARIANT
- BITMAP
+ - UUID
OpenSessionRequestBody:
type: object
properties:
diff --git a/docs/static/generated/rest_v4_sql_gateway.yml
b/docs/static/generated/rest_v4_sql_gateway.yml
index d39da5e007c..cd7061c1b3c 100644
--- a/docs/static/generated/rest_v4_sql_gateway.yml
+++ b/docs/static/generated/rest_v4_sql_gateway.yml
@@ -516,6 +516,7 @@ components:
- DESCRIPTOR
- VARIANT
- BITMAP
+ - UUID
OpenSessionRequestBody:
type: object
properties:
diff --git
a/flink-table/flink-sql-gateway/src/main/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonDeserializer.java
b/flink-table/flink-sql-gateway/src/main/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonDeserializer.java
index b154c81e815..8c3a88b8fee 100644
---
a/flink-table/flink-sql-gateway/src/main/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonDeserializer.java
+++
b/flink-table/flink-sql-gateway/src/main/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonDeserializer.java
@@ -46,6 +46,7 @@ import org.apache.flink.table.types.logical.SmallIntType;
import org.apache.flink.table.types.logical.TimeType;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.VariantType;
@@ -165,6 +166,8 @@ public final class LogicalTypeJsonDeserializer extends
StdDeserializer<LogicalTy
return new VariantType(isNullable);
case BITMAP:
return new BitmapType(isNullable);
+ case UUID:
+ return new UuidType(isNullable);
default:
throw new UnsupportedOperationException(
String.format(
diff --git
a/flink-table/flink-sql-gateway/src/main/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonSerializer.java
b/flink-table/flink-sql-gateway/src/main/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonSerializer.java
index c7e9b3b2eb9..bb650453c4f 100644
---
a/flink-table/flink-sql-gateway/src/main/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonSerializer.java
+++
b/flink-table/flink-sql-gateway/src/main/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonSerializer.java
@@ -130,6 +130,7 @@ public final class LogicalTypeJsonSerializer extends
StdSerializer<LogicalType>
case DATE:
case VARIANT:
case BITMAP:
+ case UUID:
break;
case CHAR:
jsonGenerator.writeNumberField(
diff --git
a/flink-table/flink-sql-gateway/src/test/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonSerDeTest.java
b/flink-table/flink-sql-gateway/src/test/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonSerDeTest.java
index b71276fc41c..dd1f71b255f 100644
---
a/flink-table/flink-sql-gateway/src/test/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonSerDeTest.java
+++
b/flink-table/flink-sql-gateway/src/test/java/org/apache/flink/table/gateway/rest/serde/LogicalTypeJsonSerDeTest.java
@@ -48,6 +48,7 @@ import org.apache.flink.table.types.logical.TimeType;
import org.apache.flink.table.types.logical.TimestampKind;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.YearMonthIntervalType;
@@ -197,6 +198,7 @@ class LogicalTypeJsonSerDeTest {
new MultisetType(BinaryType.ofEmptyLiteral()),
new MultisetType(VarBinaryType.ofEmptyLiteral()),
new BitmapType(),
+ new UuidType(),
RowType.of(new BigIntType(), new IntType(false), new
VarCharType(200)),
RowType.of(
new LogicalType[] {
diff --git
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/api/DataTypes.java
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/api/DataTypes.java
index af1e718d90e..9beae7d2f4a 100644
---
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/api/DataTypes.java
+++
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/api/DataTypes.java
@@ -59,6 +59,7 @@ import
org.apache.flink.table.types.logical.StructuredType.StructuredAttribute;
import org.apache.flink.table.types.logical.TimeType;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.VariantType;
@@ -1075,6 +1076,17 @@ public final class DataTypes {
return new AtomicDataType(new BitmapType());
}
+ /**
+ * Data type of a universally unique identifier (UUID).
+ *
+ * <p>The type represents a 128-bit value stored as a fixed 16-byte
big-endian sequence.
+ *
+ * @see UuidType
+ */
+ public static DataType UUID() {
+ return new AtomicDataType(new UuidType());
+ }
+
//
--------------------------------------------------------------------------------------------
// Helper functions
//
--------------------------------------------------------------------------------------------
diff --git
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/LogicalTypeRoot.java
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/LogicalTypeRoot.java
index 6c823add433..1026070c710 100644
---
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/LogicalTypeRoot.java
+++
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/LogicalTypeRoot.java
@@ -145,7 +145,9 @@ public enum LogicalTypeRoot {
VARIANT(LogicalTypeFamily.EXTENSION),
- BITMAP(LogicalTypeFamily.EXTENSION);
+ BITMAP(LogicalTypeFamily.EXTENSION),
+
+ UUID(LogicalTypeFamily.EXTENSION);
private final Set<LogicalTypeFamily> families;
diff --git
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/LogicalTypeVisitor.java
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/LogicalTypeVisitor.java
index 6a0e5614466..fe5548c8f65 100644
---
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/LogicalTypeVisitor.java
+++
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/LogicalTypeVisitor.java
@@ -101,5 +101,9 @@ public interface LogicalTypeVisitor<R> {
return visit((LogicalType) bitmapType);
}
+ default R visit(UuidType uuidType) {
+ return visit((LogicalType) uuidType);
+ }
+
R visit(LogicalType other);
}
diff --git
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/UuidType.java
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/UuidType.java
new file mode 100644
index 00000000000..2973a89b601
--- /dev/null
+++
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/UuidType.java
@@ -0,0 +1,85 @@
+/*
+ * 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.flink.table.types.logical;
+
+import org.apache.flink.annotation.PublicEvolving;
+
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+/**
+ * Data type of a universally unique identifier (UUID).
+ *
+ * <p>The type stores any 128-bit UUID as the canonical 16-byte big-endian
encoding defined by RFC
+ * 9562 (which obsoletes RFC 4122). It is version-agnostic: the version and
variant bits are stored
+ * as-is and never validated or interpreted.
+ *
+ * <p>The serializable string representation of this type is {@code UUID}.
+ */
+@PublicEvolving
+public final class UuidType extends LogicalType {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Set<String> INPUT_OUTPUT_CONVERSION =
conversionSet(UUID.class.getName());
+
+ public UuidType(boolean isNullable) {
+ super(isNullable, LogicalTypeRoot.UUID);
+ }
+
+ public UuidType() {
+ this(true);
+ }
+
+ @Override
+ public LogicalType copy(boolean isNullable) {
+ return new UuidType(isNullable);
+ }
+
+ @Override
+ public String asSerializableString() {
+ return withNullability("UUID");
+ }
+
+ @Override
+ public boolean supportsInputConversion(Class<?> clazz) {
+ return INPUT_OUTPUT_CONVERSION.contains(clazz.getName());
+ }
+
+ @Override
+ public boolean supportsOutputConversion(Class<?> clazz) {
+ return INPUT_OUTPUT_CONVERSION.contains(clazz.getName());
+ }
+
+ @Override
+ public Class<?> getDefaultConversion() {
+ return UUID.class;
+ }
+
+ @Override
+ public List<LogicalType> getChildren() {
+ return List.of();
+ }
+
+ @Override
+ public <R> R accept(LogicalTypeVisitor<R> visitor) {
+ return visitor.visit(this);
+ }
+}
diff --git
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/utils/LogicalTypeParser.java
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/utils/LogicalTypeParser.java
index 3711ac76f4f..a8e85920433 100644
---
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/utils/LogicalTypeParser.java
+++
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/logical/utils/LogicalTypeParser.java
@@ -54,6 +54,7 @@ import org.apache.flink.table.types.logical.TimeType;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
import org.apache.flink.table.types.logical.UnresolvedUserDefinedType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.VariantType;
@@ -336,7 +337,8 @@ public final class LogicalTypeParser {
DESCRIPTOR,
STRUCTURED,
VARIANT,
- BITMAP
+ BITMAP,
+ UUID
}
private static final Set<String> KEYWORDS =
@@ -586,6 +588,8 @@ public final class LogicalTypeParser {
return new VariantType();
case BITMAP:
return new BitmapType();
+ case UUID:
+ return new UuidType();
default:
throw parsingError("Unsupported type: " + token().value);
}
diff --git
a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/DataTypesTest.java
b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/DataTypesTest.java
index 8c274ed7191..7151f9b8c22 100644
---
a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/DataTypesTest.java
+++
b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/DataTypesTest.java
@@ -44,6 +44,7 @@ import org.apache.flink.table.types.logical.SmallIntType;
import org.apache.flink.table.types.logical.TimeType;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.VariantType;
@@ -68,6 +69,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.UUID;
import java.util.stream.Stream;
import static org.apache.flink.table.api.DataTypes.ARRAY;
@@ -100,6 +102,7 @@ import static
org.apache.flink.table.api.DataTypes.TIMESTAMP_LTZ;
import static
org.apache.flink.table.api.DataTypes.TIMESTAMP_WITH_LOCAL_TIME_ZONE;
import static org.apache.flink.table.api.DataTypes.TIMESTAMP_WITH_TIME_ZONE;
import static org.apache.flink.table.api.DataTypes.TINYINT;
+import static org.apache.flink.table.api.DataTypes.UUID;
import static org.apache.flink.table.api.DataTypes.VARBINARY;
import static org.apache.flink.table.api.DataTypes.VARCHAR;
import static org.apache.flink.table.api.DataTypes.VARIANT;
@@ -231,6 +234,9 @@ class DataTypesTest {
TestSpec.forDataType(BITMAP())
.expectLogicalType(new BitmapType())
.expectConversionClass(Bitmap.class),
+ TestSpec.forDataType(UUID())
+ .expectLogicalType(new UuidType())
+ .expectConversionClass(UUID.class),
TestSpec.forUnresolvedDataType(RAW(Types.VOID))
.expectUnresolvedString("[RAW('java.lang.Void', '?')]")
.lookupReturns(dummyRaw(Void.class))
diff --git
a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/LogicalTypeParserTest.java
b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/LogicalTypeParserTest.java
index 258b397c871..8a87c4663f4 100644
---
a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/LogicalTypeParserTest.java
+++
b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/LogicalTypeParserTest.java
@@ -55,6 +55,7 @@ import org.apache.flink.table.types.logical.TimeType;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
import org.apache.flink.table.types.logical.UnresolvedUserDefinedType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.VariantType;
@@ -309,6 +310,8 @@ public class LogicalTypeParserTest {
TestSpec.forString("VARIANT NOT NULL").expectType(new
VariantType(false)),
TestSpec.forString("BITMAP").expectType(new BitmapType()),
TestSpec.forString("BITMAP NOT NULL").expectType(new
BitmapType(false)),
+ TestSpec.forString("UUID").expectType(new UuidType()),
+ TestSpec.forString("UUID NOT NULL").expectType(new
UuidType(false)),
// error message testing
diff --git
a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/LogicalTypesTest.java
b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/LogicalTypesTest.java
index 8b06ceb5118..0703e16c78e 100644
---
a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/LogicalTypesTest.java
+++
b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/LogicalTypesTest.java
@@ -57,6 +57,7 @@ import org.apache.flink.table.types.logical.TimestampKind;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
import org.apache.flink.table.types.logical.UnresolvedUserDefinedType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.VariantType;
@@ -79,6 +80,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
+import java.util.UUID;
import static org.apache.flink.table.test.TableAssertions.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
@@ -626,6 +628,20 @@ public class LogicalTypesTest {
new BitmapType(false)));
}
+ @Test
+ void testUuidType() {
+ assertThat(new UuidType())
+ .isJavaSerializable()
+ .satisfies(
+ baseAssertions(
+ "UUID",
+ "UUID",
+ new Class[] {UUID.class},
+ new Class[] {UUID.class},
+ new LogicalType[] {},
+ new UuidType(false)));
+ }
+
@Test
void testTypeInformationRawType() {
final TypeInformationRawType<?> rawType =
diff --git
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/calcite/FlinkTypeFactory.java
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/calcite/FlinkTypeFactory.java
index f5bd64adeef..4157e378da8 100644
---
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/calcite/FlinkTypeFactory.java
+++
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/calcite/FlinkTypeFactory.java
@@ -63,6 +63,7 @@ import org.apache.flink.table.types.logical.TimeType;
import org.apache.flink.table.types.logical.TimestampKind;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.VariantType;
@@ -490,6 +491,9 @@ public class FlinkTypeFactory extends JavaTypeFactoryImpl
implements ExtendedRel
case VARIANT:
return createSqlType(SqlTypeName.VARIANT);
+ case UUID:
+ return createSqlType(SqlTypeName.UUID);
+
case BITMAP:
return new BitmapRelDataType((BitmapType) logicalType);
@@ -861,6 +865,9 @@ public class FlinkTypeFactory extends JavaTypeFactoryImpl
implements ExtendedRel
case VARIANT:
return new VariantType();
+ case UUID:
+ return new UuidType();
+
case OTHER:
if (relDataType instanceof RawRelDataType) {
return ((RawRelDataType) relDataType).getRawType();
diff --git
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/LogicalTypeJsonSerializer.java
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/LogicalTypeJsonSerializer.java
index f06c38ba1b8..27bdff6e398 100644
---
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/LogicalTypeJsonSerializer.java
+++
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/serde/LogicalTypeJsonSerializer.java
@@ -239,6 +239,7 @@ final class LogicalTypeJsonSerializer extends
StdSerializer<LogicalType> {
break;
case SYMBOL:
case VARIANT:
+ case UUID:
// type root is enough
break;
case RAW:
@@ -546,6 +547,7 @@ final class LogicalTypeJsonSerializer extends
StdSerializer<LogicalType> {
case DESCRIPTOR:
case BITMAP:
case VARIANT:
+ case UUID:
return true;
default:
// fall back to generic serialization
diff --git
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/typeutils/LogicalRelDataTypeConverter.java
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/typeutils/LogicalRelDataTypeConverter.java
index cf78ce82068..58c164b31ec 100644
---
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/typeutils/LogicalRelDataTypeConverter.java
+++
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/typeutils/LogicalRelDataTypeConverter.java
@@ -57,6 +57,7 @@ import org.apache.flink.table.types.logical.TimeType;
import org.apache.flink.table.types.logical.TimestampKind;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.VariantType;
@@ -467,6 +468,11 @@ public final class LogicalRelDataTypeConverter {
return relDataTypeFactory.createSqlType(SqlTypeName.VARIANT);
}
+ @Override
+ public RelDataType visit(UuidType uuidType) {
+ return relDataTypeFactory.createSqlType(SqlTypeName.UUID);
+ }
+
@Override
public RelDataType visit(BitmapType bitmapType) {
return new BitmapRelDataType(bitmapType);
@@ -596,6 +602,8 @@ public final class LogicalRelDataTypeConverter {
return new DescriptorType(false);
case VARIANT:
return new VariantType(false);
+ case UUID:
+ return new UuidType(false);
case STRUCTURED:
case OTHER:
if (relDataType instanceof StructuredRelDataType) {
diff --git
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/calcite/FlinkTypeFactoryTest.java
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/calcite/FlinkTypeFactoryTest.java
index 6e0e7a8c3d3..a5a85e11c3b 100644
---
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/calcite/FlinkTypeFactoryTest.java
+++
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/calcite/FlinkTypeFactoryTest.java
@@ -46,6 +46,7 @@ import org.apache.flink.table.types.logical.SmallIntType;
import org.apache.flink.table.types.logical.TimeType;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.utils.LogicalTypeMerging;
@@ -89,6 +90,7 @@ class FlinkTypeFactoryTest {
new TimeType(),
new TimestampType(3),
new LocalZonedTimestampType(3),
+ new UuidType(),
new ArrayType(new DoubleType()),
new MapType(new DoubleType(), VarCharType.STRING_TYPE),
RowType.of(new DoubleType(), VarCharType.STRING_TYPE),
diff --git
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/nodes/exec/serde/LogicalTypeJsonSerdeTest.java
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/nodes/exec/serde/LogicalTypeJsonSerdeTest.java
index c838a6ca08a..32554e7264e 100644
---
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/nodes/exec/serde/LogicalTypeJsonSerdeTest.java
+++
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/nodes/exec/serde/LogicalTypeJsonSerdeTest.java
@@ -59,6 +59,7 @@ import org.apache.flink.table.types.logical.TimeType;
import org.apache.flink.table.types.logical.TimestampKind;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.VariantType;
@@ -268,6 +269,7 @@ public class LogicalTypeJsonSerdeTest {
new MultisetType(BinaryType.ofEmptyLiteral()),
new MultisetType(VarBinaryType.ofEmptyLiteral()),
new BitmapType(),
+ new UuidType(),
new VariantType(),
new ArrayType(new VariantType()),
new MultisetType(new VariantType()),
diff --git
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/typeutils/LogicalRelDataTypeConverterTest.java
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/typeutils/LogicalRelDataTypeConverterTest.java
index fd37601a39f..b47206e184c 100644
---
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/typeutils/LogicalRelDataTypeConverterTest.java
+++
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/typeutils/LogicalRelDataTypeConverterTest.java
@@ -48,6 +48,7 @@ import org.apache.flink.table.types.logical.TimeType;
import org.apache.flink.table.types.logical.TimestampKind;
import org.apache.flink.table.types.logical.TimestampType;
import org.apache.flink.table.types.logical.TinyIntType;
+import org.apache.flink.table.types.logical.UuidType;
import org.apache.flink.table.types.logical.VarBinaryType;
import org.apache.flink.table.types.logical.VarCharType;
import org.apache.flink.table.types.logical.VariantType;
@@ -153,6 +154,7 @@ public class LogicalRelDataTypeConverterTest {
new MultisetType(BinaryType.ofEmptyLiteral()),
new MultisetType(VarBinaryType.ofEmptyLiteral()),
new BitmapType(),
+ new UuidType(),
new VariantType(),
new ArrayType(new VariantType()),
new MapType(new VarCharType(5), new VariantType()),
diff --git
a/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/typeutils/TypeCheckUtils.java
b/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/typeutils/TypeCheckUtils.java
index e8fe0c0ad4e..c469696d247 100644
---
a/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/typeutils/TypeCheckUtils.java
+++
b/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/runtime/typeutils/TypeCheckUtils.java
@@ -39,6 +39,7 @@ import static
org.apache.flink.table.types.logical.LogicalTypeRoot.STRUCTURED_TY
import static
org.apache.flink.table.types.logical.LogicalTypeRoot.TIMESTAMP_WITHOUT_TIME_ZONE;
import static
org.apache.flink.table.types.logical.LogicalTypeRoot.TIMESTAMP_WITH_LOCAL_TIME_ZONE;
import static
org.apache.flink.table.types.logical.LogicalTypeRoot.TIME_WITHOUT_TIME_ZONE;
+import static org.apache.flink.table.types.logical.LogicalTypeRoot.UUID;
import static org.apache.flink.table.types.logical.LogicalTypeRoot.VARIANT;
import static
org.apache.flink.table.types.logical.utils.LogicalTypeChecks.isRowtimeAttribute;
@@ -146,6 +147,10 @@ public class TypeCheckUtils {
return type.getTypeRoot() == BITMAP;
}
+ private static boolean isUuidType(LogicalType type) {
+ return type.getTypeRoot() == UUID;
+ }
+
public static boolean isComparable(LogicalType type) {
return !isRaw(type)
&& !isMap(type)
@@ -154,7 +159,8 @@ public class TypeCheckUtils {
&& !isArray(type)
&& !isStructuredType(type)
&& !isVariantType(type)
- && !isBitmapType(type);
+ && !isBitmapType(type)
+ && !isUuidType(type);
}
public static boolean isMutable(LogicalType type) {