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

snuyanzin 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 ea2bf30cd7d [FLINK-40972][table] Do not generate cast classes in case 
of Identity casts
ea2bf30cd7d is described below

commit ea2bf30cd7d9f73450f2ab69a1f73853dfc228e6
Author: Sergey Nuyanzin <[email protected]>
AuthorDate: Tue Oct 13 00:35:03 2026 +0200

    [FLINK-40972][table] Do not generate cast classes in case of Identity casts
---
 .../functions/casting/CastRuleProvider.java        |  5 +++
 .../functions/casting/CastRuleProviderTest.java    | 37 ++++++++++++++++++++++
 2 files changed, 42 insertions(+)

diff --git 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/CastRuleProvider.java
 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/CastRuleProvider.java
index 54f3af8679a..485b1ab89b1 100644
--- 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/CastRuleProvider.java
+++ 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/CastRuleProvider.java
@@ -193,6 +193,11 @@ public class CastRuleProvider {
             LogicalType inputLogicalType,
             LogicalType targetLogicalType,
             Object value) {
+        if (resolve(inputLogicalType, targetLogicalType) == 
IdentityCastRule.INSTANCE) {
+            // identity cast: value is unchanged, no need to compile a 
CastExecutor
+            return value;
+        }
+
         CastExecutor<Object, Object> castExecutor =
                 (CastExecutor<Object, Object>)
                         CastRuleProvider.create(context, inputLogicalType, 
targetLogicalType);
diff --git 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/casting/CastRuleProviderTest.java
 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/casting/CastRuleProviderTest.java
index e63cd7d0eb5..5d9915c16cd 100644
--- 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/casting/CastRuleProviderTest.java
+++ 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/casting/CastRuleProviderTest.java
@@ -20,6 +20,7 @@ package org.apache.flink.table.planner.functions.casting;
 
 import org.apache.flink.table.api.DataTypes;
 import org.apache.flink.table.catalog.ObjectIdentifier;
+import org.apache.flink.table.data.binary.BinaryStringData;
 import org.apache.flink.table.types.logical.ArrayType;
 import org.apache.flink.table.types.logical.CharType;
 import org.apache.flink.table.types.logical.DistinctType;
@@ -28,6 +29,8 @@ import org.apache.flink.table.types.logical.VarCharType;
 
 import org.junit.jupiter.api.Test;
 
+import java.time.ZoneId;
+
 import static org.apache.flink.table.api.DataTypes.ARRAY;
 import static org.apache.flink.table.api.DataTypes.BIGINT;
 import static org.apache.flink.table.api.DataTypes.BOOLEAN;
@@ -88,6 +91,40 @@ class CastRuleProviderTest {
         assertThat(CastRuleProvider.resolve(ROW, 
STRUCTURED)).isSameAs(IdentityCastRule.INSTANCE);
     }
 
+    @Test
+    void testValuePreservingCastDoesNotCompile() {
+        // refusing classloader: compilation fails, so a value-preserving cast 
passes only if it
+        // skips compilation
+        final ClassLoader failing =
+                new 
ClassLoader(Thread.currentThread().getContextClassLoader()) {
+                    @Override
+                    protected Class<?> loadClass(String name, boolean resolve)
+                            throws ClassNotFoundException {
+                        throw new ClassNotFoundException("value-preserving 
cast must not compile");
+                    }
+                };
+
+        final CastRule.Context context =
+                CastRule.Context.create(false, false, ZoneId.of("UTC"), 
failing, null);
+
+        final BinaryStringData value = BinaryStringData.fromString("35709");
+        final BinaryStringData castedValue =
+                (BinaryStringData)
+                        CastRuleProvider.cast(
+                                context, CHAR(5).getLogicalType(), 
STRING_TYPE, value);
+        assertThat(castedValue).isSameAs(value);
+        assertThat(CastRuleProvider.cast(context, INT, INT, 42)).isEqualTo(42);
+
+        // IdentityCastRule treats these as identity too, unlike 
supportsAvoidingCast
+        final LogicalType yearMonth = INTERVAL(MONTH()).getLogicalType();
+        assertThat(CastRuleProvider.cast(context, yearMonth, INT, 
12)).isEqualTo(12);
+        assertThat(CastRuleProvider.cast(context, INT, yearMonth, 
12)).isEqualTo(12);
+        final LogicalType dayTime = 
INTERVAL(DataTypes.SECOND()).getLogicalType();
+        final LogicalType bigint = BIGINT().getLogicalType();
+        assertThat(CastRuleProvider.cast(context, dayTime, bigint, 
1_000L)).isEqualTo(1_000L);
+        assertThat(CastRuleProvider.cast(context, bigint, dayTime, 
1_000L)).isEqualTo(1_000L);
+    }
+
     @Test
     void testResolveIntToBigIntWithDistinct() {
         assertThat(CastRuleProvider.resolve(INT, DISTINCT_BIG_INT))

Reply via email to