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))