This is an automated email from the ASF dual-hosted git repository.
twalthr 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 bd0a65afb94 [FLINK-40556][table] Support UUID value literals backed by
byte[] values
bd0a65afb94 is described below
commit bd0a65afb943d56a8afb13c20a1ba57d1bfc30d5
Author: Ramin Gharib <[email protected]>
AuthorDate: Tue Sep 15 15:43:17 2026 +0200
[FLINK-40556][table] Support UUID value literals backed by byte[] values
This closes #29153.
---
.../table/expressions/ValueLiteralExpression.java | 12 +++++++
.../flink/table/expressions/ExpressionTest.java | 40 +++++++++++++++++-----
.../converter/ExpressionConverterTest.java | 26 ++++++++++++++
3 files changed, 70 insertions(+), 8 deletions(-)
diff --git
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/expressions/ValueLiteralExpression.java
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/expressions/ValueLiteralExpression.java
index d0d6a1389ed..10e7e879c2f 100644
---
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/expressions/ValueLiteralExpression.java
+++
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/expressions/ValueLiteralExpression.java
@@ -41,6 +41,7 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.math.BigDecimal;
+import java.nio.ByteBuffer;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
@@ -138,6 +139,8 @@ public final class ValueLiteralExpression implements
ResolvedExpression {
convertedValue = convertToInstant(value, valueClass);
} else if (clazz == BigDecimal.class) {
convertedValue = convertToBigDecimal(value);
+ } else if (clazz == UUID.class) {
+ convertedValue = convertToUuid(value, valueClass);
}
}
@@ -216,6 +219,15 @@ public final class ValueLiteralExpression implements
ResolvedExpression {
return null;
}
+ private @Nullable UUID convertToUuid(Object value, Class<?> valueClass) {
+ if (valueClass == byte[].class) {
+ final ByteBuffer buffer = ByteBuffer.wrap((byte[]) value);
+ return new UUID(buffer.getLong(), buffer.getLong());
+ }
+
+ return null;
+ }
+
@Override
public DataType getOutputDataType() {
return dataType;
diff --git
a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/expressions/ExpressionTest.java
b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/expressions/ExpressionTest.java
index 63748ccdc2a..947daf0157e 100644
---
a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/expressions/ExpressionTest.java
+++
b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/expressions/ExpressionTest.java
@@ -30,6 +30,7 @@ import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import java.math.BigDecimal;
+import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.sql.Date;
import java.sql.Time;
@@ -245,14 +246,18 @@ class ExpressionTest {
.isEqualTo(instant.minusMillis(100));
}
- @Test
- void testUuidValueLiteralExtraction() {
- final UUID uuid =
UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
- assertThat(
- new ValueLiteralExpression(uuid)
- .getValueAs(UUID.class)
- .orElseThrow(AssertionError::new))
- .isEqualTo(uuid);
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("uuidValueLiteralTestCases")
+ void testUuidValueLiteralExtraction(
+ String caseName, ValueLiteralExpression literal, UUID uuid) {
+
assertThat(literal.getValueAs(UUID.class).orElseThrow(AssertionError::new)).isEqualTo(uuid);
+ }
+
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("uuidValueLiteralTestCases")
+ void testUuidAsSerializableString(String caseName, ValueLiteralExpression
literal, UUID uuid) {
+ assertThat(literal.asSerializableString(DefaultSqlFactory.INSTANCE))
+ .isEqualTo(String.format("UUID '%s'", uuid));
}
@Test
@@ -343,6 +348,25 @@ class ExpressionTest {
DataTypes.BOOLEAN());
}
+ private static byte[] uuidToBytes(UUID uuid) {
+ return ByteBuffer.allocate(16)
+ .putLong(uuid.getMostSignificantBits())
+ .putLong(uuid.getLeastSignificantBits())
+ .array();
+ }
+
+ private static Stream<Arguments> uuidValueLiteralTestCases() {
+ final UUID uuid =
UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
+ return Stream.of(
+ Arguments.of("UUID value", new ValueLiteralExpression(uuid),
uuid),
+ Arguments.of(
+ "UUID bridged to byte[]",
+ new ValueLiteralExpression(
+ uuidToBytes(uuid),
+
DataTypes.UUID().notNull().bridgedTo(byte[].class)),
+ uuid));
+ }
+
private static Stream<Arguments> timestampLtzPrecisionTestCases() {
return Stream.of(
// Precision 0-2: numeric variant wrapped in CAST to match
data type
diff --git
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/expressions/converter/ExpressionConverterTest.java
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/expressions/converter/ExpressionConverterTest.java
index ffea6f95d5e..fe2bc4ff716 100644
---
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/expressions/converter/ExpressionConverterTest.java
+++
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/expressions/converter/ExpressionConverterTest.java
@@ -33,12 +33,14 @@ import org.apache.calcite.util.TimestampString;
import org.junit.jupiter.api.Test;
import java.math.BigDecimal;
+import java.nio.ByteBuffer;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;
+import java.util.UUID;
import static
org.apache.flink.table.expressions.ApiExpressionUtils.valueLiteral;
import static org.assertj.core.api.Assertions.assertThat;
@@ -194,4 +196,28 @@ class ExpressionConverterTest {
assertThat(((RexLiteral)
rex).getValueAs(TimeUnit.class)).isEqualTo(TimeUnit.MICROSECOND);
assertThat(rex.getType().getSqlTypeName()).isEqualTo(SqlTypeName.SYMBOL);
}
+
+ @Test
+ void testUuidLiteral() {
+ UUID uuid = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
+ RexNode rex = converter.visit(valueLiteral(uuid));
+ assertThat(((RexLiteral) rex).getValueAs(UUID.class)).isEqualTo(uuid);
+ assertThat(rex.getType().getSqlTypeName()).isEqualTo(SqlTypeName.UUID);
+ }
+
+ @Test
+ void testUuidLiteralFromBytes() {
+ UUID uuid = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
+ byte[] uuidBytes =
+ ByteBuffer.allocate(16)
+ .putLong(uuid.getMostSignificantBits())
+ .putLong(uuid.getLeastSignificantBits())
+ .array();
+ RexNode rex =
+ converter.visit(
+ valueLiteral(
+ uuidBytes,
DataTypes.UUID().notNull().bridgedTo(byte[].class)));
+ assertThat(((RexLiteral) rex).getValueAs(UUID.class)).isEqualTo(uuid);
+ assertThat(rex.getType().getSqlTypeName()).isEqualTo(SqlTypeName.UUID);
+ }
}