Skip to content

Commit 701a247

Browse files
fix out of bounds exception in array types
1 parent e02837d commit 701a247

File tree

2 files changed

+120
-7
lines changed

2 files changed

+120
-7
lines changed

fluss-common/src/main/java/org/apache/fluss/row/BinaryArray.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ public boolean[] toBooleanArray() {
474474
checkNoNull();
475475
boolean[] values = new boolean[size];
476476
BinarySegmentUtils.copyToUnsafe(
477-
segments, elementOffset, values, BOOLEAN_ARRAY_OFFSET, size);
477+
segments, elementOffset, values, 0, size);
478478
return values;
479479
}
480480

@@ -483,7 +483,7 @@ public byte[] toByteArray() {
483483
checkNoNull();
484484
byte[] values = new byte[size];
485485
BinarySegmentUtils.copyToUnsafe(
486-
segments, elementOffset, values, BYTE_ARRAY_BASE_OFFSET, size);
486+
segments, elementOffset, values, 0, size);
487487
return values;
488488
}
489489

@@ -492,7 +492,7 @@ public short[] toShortArray() {
492492
checkNoNull();
493493
short[] values = new short[size];
494494
BinarySegmentUtils.copyToUnsafe(
495-
segments, elementOffset, values, SHORT_ARRAY_OFFSET, size * 2);
495+
segments, elementOffset, values, 0, size * 2);
496496
return values;
497497
}
498498

@@ -501,7 +501,7 @@ public int[] toIntArray() {
501501
checkNoNull();
502502
int[] values = new int[size];
503503
BinarySegmentUtils.copyToUnsafe(
504-
segments, elementOffset, values, INT_ARRAY_OFFSET, size * 4);
504+
segments, elementOffset, values, 0, size * 4);
505505
return values;
506506
}
507507

@@ -510,7 +510,7 @@ public long[] toLongArray() {
510510
checkNoNull();
511511
long[] values = new long[size];
512512
BinarySegmentUtils.copyToUnsafe(
513-
segments, elementOffset, values, LONG_ARRAY_OFFSET, size * 8);
513+
segments, elementOffset, values, 0, size * 8);
514514
return values;
515515
}
516516

@@ -519,7 +519,7 @@ public float[] toFloatArray() {
519519
checkNoNull();
520520
float[] values = new float[size];
521521
BinarySegmentUtils.copyToUnsafe(
522-
segments, elementOffset, values, FLOAT_ARRAY_OFFSET, size * 4);
522+
segments, elementOffset, values, 0, size * 4);
523523
return values;
524524
}
525525

@@ -528,7 +528,7 @@ public double[] toDoubleArray() {
528528
checkNoNull();
529529
double[] values = new double[size];
530530
BinarySegmentUtils.copyToUnsafe(
531-
segments, elementOffset, values, DOUBLE_ARRAY_OFFSET, size * 8);
531+
segments, elementOffset, values, 0, size * 8);
532532
return values;
533533
}
534534

fluss-common/src/test/java/org/apache/fluss/row/BinaryArrayTest.java

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,4 +966,117 @@ public void testCalculateFixLengthPartSizeForArray() {
966966
assertThat(BinaryArray.calculateFixLengthPartSize(DataTypes.CHAR(10))).isEqualTo(8);
967967
assertThat(BinaryArray.calculateFixLengthPartSize(DataTypes.BINARY(20))).isEqualTo(8);
968968
}
969+
970+
@Test
971+
public void testToDoubleArrayWithLargeArray() {
972+
// Test with 20 elements to verify fix for ArrayIndexOutOfBoundsException
973+
double[] input = new double[20];
974+
for (int i = 0; i < 20; i++) {
975+
input[i] = i * 1.1;
976+
}
977+
BinaryArray binaryArray = BinaryArray.fromPrimitiveArray(input);
978+
979+
double[] result = binaryArray.toDoubleArray();
980+
981+
assertThat(result).hasSize(20);
982+
for (int i = 0; i < 20; i++) {
983+
assertThat(result[i]).isEqualTo(i * 1.1);
984+
}
985+
}
986+
987+
@Test
988+
public void testToFloatArrayWithLargeArray() {
989+
float[] input = new float[20];
990+
for (int i = 0; i < 20; i++) {
991+
input[i] = i * 1.5f;
992+
}
993+
BinaryArray binaryArray = BinaryArray.fromPrimitiveArray(input);
994+
995+
float[] result = binaryArray.toFloatArray();
996+
997+
assertThat(result).hasSize(20);
998+
for (int i = 0; i < 20; i++) {
999+
assertThat(result[i]).isEqualTo(i * 1.5f);
1000+
}
1001+
}
1002+
1003+
@Test
1004+
public void testToLongArrayWithLargeArray() {
1005+
long[] input = new long[20];
1006+
for (int i = 0; i < 20; i++) {
1007+
input[i] = i * 1000L;
1008+
}
1009+
BinaryArray binaryArray = BinaryArray.fromPrimitiveArray(input);
1010+
1011+
long[] result = binaryArray.toLongArray();
1012+
1013+
assertThat(result).hasSize(20);
1014+
for (int i = 0; i < 20; i++) {
1015+
assertThat(result[i]).isEqualTo(i * 1000L);
1016+
}
1017+
}
1018+
1019+
@Test
1020+
public void testToIntArrayWithLargeArray() {
1021+
int[] input = new int[20];
1022+
for (int i = 0; i < 20; i++) {
1023+
input[i] = i * 100;
1024+
}
1025+
BinaryArray binaryArray = BinaryArray.fromPrimitiveArray(input);
1026+
1027+
int[] result = binaryArray.toIntArray();
1028+
1029+
assertThat(result).hasSize(20);
1030+
for (int i = 0; i < 20; i++) {
1031+
assertThat(result[i]).isEqualTo(i * 100);
1032+
}
1033+
}
1034+
1035+
@Test
1036+
public void testToShortArrayWithLargeArray() {
1037+
short[] input = new short[20];
1038+
for (int i = 0; i < 20; i++) {
1039+
input[i] = (short) (i * 10);
1040+
}
1041+
BinaryArray binaryArray = BinaryArray.fromPrimitiveArray(input);
1042+
1043+
short[] result = binaryArray.toShortArray();
1044+
1045+
assertThat(result).hasSize(20);
1046+
for (int i = 0; i < 20; i++) {
1047+
assertThat(result[i]).isEqualTo((short) (i * 10));
1048+
}
1049+
}
1050+
1051+
@Test
1052+
public void testToByteArrayWithLargeArray() {
1053+
byte[] input = new byte[20];
1054+
for (int i = 0; i < 20; i++) {
1055+
input[i] = (byte) i;
1056+
}
1057+
BinaryArray binaryArray = BinaryArray.fromPrimitiveArray(input);
1058+
1059+
byte[] result = binaryArray.toByteArray();
1060+
1061+
assertThat(result).hasSize(20);
1062+
for (int i = 0; i < 20; i++) {
1063+
assertThat(result[i]).isEqualTo((byte) i);
1064+
}
1065+
}
1066+
1067+
@Test
1068+
public void testToBooleanArrayWithLargeArray() {
1069+
boolean[] input = new boolean[20];
1070+
for (int i = 0; i < 20; i++) {
1071+
input[i] = i % 2 == 0;
1072+
}
1073+
BinaryArray binaryArray = BinaryArray.fromPrimitiveArray(input);
1074+
1075+
boolean[] result = binaryArray.toBooleanArray();
1076+
1077+
assertThat(result).hasSize(20);
1078+
for (int i = 0; i < 20; i++) {
1079+
assertThat(result[i]).isEqualTo(i % 2 == 0);
1080+
}
1081+
}
9691082
}

0 commit comments

Comments
 (0)