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 2d69d0cd192 [FLINK-40230][table] `StringToBinary` and `RawToBinary` 
cast rules might generate runtime code with useless array copy
2d69d0cd192 is described below

commit 2d69d0cd192caa352e5a53e2e2f5637e119df08a
Author: Sergey Nuyanzin <[email protected]>
AuthorDate: Mon Jul 27 08:54:16 2026 +0200

    [FLINK-40230][table] `StringToBinary` and `RawToBinary` cast rules might 
generate runtime code with useless array copy
---
 .../functions/casting/RawToBinaryCastRule.java     | 23 ++++++++-------------
 .../functions/casting/StringToBinaryCastRule.java  | 24 ++++++++--------------
 2 files changed, 16 insertions(+), 31 deletions(-)

diff --git 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/RawToBinaryCastRule.java
 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/RawToBinaryCastRule.java
index dabe722a240..cfabe200eab 100644
--- 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/RawToBinaryCastRule.java
+++ 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/RawToBinaryCastRule.java
@@ -63,7 +63,7 @@ class RawToBinaryCastRule extends 
AbstractNullAwareCodeGeneratorCastRule<Object,
     isNull$290 = isNull$289;
     if (!isNull$290) {
         byte[] deserializedByteArray$76 = 
result$289.toBytes(typeSerializer$292);
-        if (deserializedByteArray$76.length <= 3) {
+        if (deserializedByteArray$76.length == 3) {
             result$291 = deserializedByteArray$76;
         } else {
             result$291 = java.util.Arrays.copyOf(deserializedByteArray$76, 3);
@@ -83,14 +83,14 @@ class RawToBinaryCastRule extends 
AbstractNullAwareCodeGeneratorCastRule<Object,
             LogicalType inputLogicalType,
             LogicalType targetLogicalType) {
         final int targetLength = 
LogicalTypeChecks.getLength(targetLogicalType);
+        final boolean couldPad = couldPad(targetLogicalType, targetLength);
 
         // Get serializer for RAW type
         final String typeSerializer = 
context.declareTypeSerializer(inputLogicalType);
         final String deserializedByteArrayTerm =
                 CodeGenUtils.newName(context.getCodeGeneratorContext(), 
"deserializedByteArray");
 
-        if (context.legacyBehaviour()
-                || !(couldTrim(targetLength) || (couldPad(targetLogicalType, 
targetLength)))) {
+        if (context.legacyBehaviour() || !(couldTrim(targetLength) || 
couldPad)) {
             return new CastRuleUtils.CodeWriter()
                     .assignStmt(returnVariable, methodCall(inputTerm, 
"toBytes", typeSerializer))
                     .toString();
@@ -101,19 +101,12 @@ class RawToBinaryCastRule extends 
AbstractNullAwareCodeGeneratorCastRule<Object,
                             deserializedByteArrayTerm,
                             methodCall(inputTerm, "toBytes", typeSerializer))
                     .ifStmt(
-                            arrayLength(deserializedByteArrayTerm) + " <= " + 
targetLength,
-                            thenWriter -> {
-                                if (couldPad(targetLogicalType, targetLength)) 
{
-                                    trimOrPadByteArray(
-                                            returnVariable,
-                                            targetLength,
-                                            deserializedByteArrayTerm,
-                                            thenWriter);
-                                } else {
+                            arrayLength(deserializedByteArrayTerm)
+                                    + (couldPad ? " == " : " <= ")
+                                    + targetLength,
+                            thenWriter ->
                                     thenWriter.assignStmt(
-                                            returnVariable, 
deserializedByteArrayTerm);
-                                }
-                            },
+                                            returnVariable, 
deserializedByteArrayTerm),
                             elseWriter ->
                                     trimOrPadByteArray(
                                             returnVariable,
diff --git 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/StringToBinaryCastRule.java
 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/StringToBinaryCastRule.java
index ead13c73003..cbea397da04 100644
--- 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/StringToBinaryCastRule.java
+++ 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/StringToBinaryCastRule.java
@@ -59,10 +59,9 @@ class StringToBinaryCastRule extends 
AbstractNullAwareCodeGeneratorCastRule<Stri
     isNull$0 = _myInputIsNull;
     if (!isNull$0) {
         byte[] byteArrayTerm$0 = _myInput.toBytes();
-        if (byteArrayTerm$0.length <= 2) {
-            // If could pad
-            result$1 = java.util.Arrays.copyOf(byteArrayTerm$0, 2);
-            // result$1 = byteArrayTerm$0 // If could not pad
+        if (byteArrayTerm$0.length == 2) {
+            // If could pad, condition is "== 2" instead of "<= 2"
+            result$1 = byteArrayTerm$0;
         } else {
             result$1 = java.util.Arrays.copyOf(byteArrayTerm$0, 2);
         }
@@ -86,24 +85,17 @@ class StringToBinaryCastRule extends 
AbstractNullAwareCodeGeneratorCastRule<Stri
                     .toString();
         } else {
             final int targetLength = 
LogicalTypeChecks.getLength(targetLogicalType);
+            final boolean couldPad = couldPad(targetLogicalType, targetLength);
             final String byteArrayTerm =
                     CodeGenUtils.newName(context.getCodeGeneratorContext(), 
"byteArrayTerm");
 
             return new CastRuleUtils.CodeWriter()
                     .declStmt(byte[].class, byteArrayTerm, 
methodCall(inputTerm, "toBytes"))
                     .ifStmt(
-                            arrayLength(byteArrayTerm) + " <= " + targetLength,
-                            thenWriter -> {
-                                if (couldPad(targetLogicalType, targetLength)) 
{
-                                    trimOrPadByteArray(
-                                            returnVariable,
-                                            targetLength,
-                                            byteArrayTerm,
-                                            thenWriter);
-                                } else {
-                                    thenWriter.assignStmt(returnVariable, 
byteArrayTerm);
-                                }
-                            },
+                            arrayLength(byteArrayTerm)
+                                    + (couldPad ? " == " : " <= ")
+                                    + targetLength,
+                            thenWriter -> 
thenWriter.assignStmt(returnVariable, byteArrayTerm),
                             elseWriter ->
                                     trimOrPadByteArray(
                                             returnVariable,

Reply via email to