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,