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);
+    }
 }

Reply via email to