[
https://issues.apache.org/jira/browse/FLINK-38138?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18012277#comment-18012277
]
Voon Hou edited comment on FLINK-38138 at 8/6/25 4:42 AM:
----------------------------------------------------------
Backport for 1.20: [https://github.com/apache/flink/pull/26871]
Backport for 1.19: [https://github.com/apache/flink/pull/26872]
Added backports for the above version for now, will need to check internally if
we need to support other versions. May I know how many rolling versions of
minor version Flink is supporting?
was (Author: JIRAUSER303356):
Backport for 1.20: [https://github.com/apache/flink/pull/26871]
Backport for 1.19: [https://github.com/apache/flink/pull/26872]
> Array OOB error when trying to get a binary from a non-zero offset from a
> vector
> --------------------------------------------------------------------------------
>
> Key: FLINK-38138
> URL: https://issues.apache.org/jira/browse/FLINK-38138
> Project: Flink
> Issue Type: Bug
> Components: API / Type Serialization System
> Affects Versions: 1.17.0, 1.18.0, 1.20.0
> Reporter: Voon Hou
> Assignee: Voon Hou
> Priority: Major
> Labels: pull-request-available
> Fix For: 2.2.0
>
>
> We have noticed that an OOB error is being thrown when trying to invoke
> getBinary when the following conditions are met:
> # There are multiple elements in a HeapArrayVector
> # When trying to get an element from a non-zero offset of the array
> # When trying to convert this array that we have obtained to a binary
>
>
> {code:java}
> Caused by: java.lang.IllegalArgumentException: 72 > 36 at
> java.util.Arrays.copyOfRange(Arrays.java:3519) at
> org.apache.flink.table.data.columnar.ColumnarArrayData.getBinary(ColumnarArrayData.java:138)
> at
> org.apache.hudi.table.format.cow.vector.ColumnarGroupRowData.getBinary(ColumnarGroupRowData.java:121)
> at
> org.apache.flink.table.data.RowData.lambda$createFieldGetter$245ca7d1$3(RowData.java:228)
> at
> org.apache.flink.table.runtime.typeutils.RowDataSerializer.toBinaryRow(RowDataSerializer.java:207)
> at
> org.apache.flink.table.data.writer.AbstractBinaryWriter.writeRow(AbstractBinaryWriter.java:147)
> at
> org.apache.flink.table.data.writer.BinaryArrayWriter.writeRow(BinaryArrayWriter.java:30)
> at
> org.apache.flink.table.data.writer.BinaryWriter.write(BinaryWriter.java:155)
> at
> org.apache.flink.table.runtime.typeutils.MapDataSerializer.toBinaryMap(MapDataSerializer.java:179)
> at
> org.apache.flink.table.runtime.typeutils.MapDataSerializer.copy(MapDataSerializer.java:113)
> at
> org.apache.flink.table.runtime.typeutils.MapDataSerializer.copy(MapDataSerializer.java:44)
> at
> org.apache.flink.table.runtime.typeutils.RowDataSerializer.copyRowData(RowDataSerializer.java:170)
> at
> org.apache.flink.table.runtime.typeutils.RowDataSerializer.copy(RowDataSerializer.java:131)
> {code}
>
> The error below is caused by the code below:
>
> {code:java}
> @Override
> public byte[] getBinary(int pos) {
> BytesColumnVector.Bytes byteArray = getByteArray(pos);
> if (byteArray.len == byteArray.data.length) {
> return byteArray.data;
> } else {
> return Arrays.copyOfRange(byteArray.data, byteArray.offset,
> byteArray.len);
> }
> } {code}
>
>
> The function signature of {{Arrays.copyOfRange}} is as such:
>
> {code:java}
> public static byte[] copyOfRange(byte[] original, int from, int to) { {code}
>
> The {{java.util.Arrays.copyOfRange(original, from, to)}} method copies the
> specified range of the {{original}} array into a new array.
> * {{{}from{}}}: The initial index of the range to be copied, inclusive.
> * {{{}to{}}}: The final index of the range to be copied, {*}exclusive{*}.
>
>
> Hence, the correct way of invoking {{Arrays.copyOfRange}} should be:
> {code:java}
> return Arrays.copyOfRange(
> byteArray.data, byteArray.offset, byteArray.offset + byteArray.len);
> {code}
> Will fire a fix for this.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)