This is an automated email from the ASF dual-hosted git repository.
JingsongLi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new 19f35f54a8 [common] Fix partition getter indexing in
InternalRowPartitionComputer (#9513)
19f35f54a8 is described below
commit 19f35f54a8e28e25bd4fbc58c404f482a50e003e
Author: YangJie <[email protected]>
AuthorDate: Wed Sep 2 02:41:47 2026 -0400
[common] Fix partition getter indexing in InternalRowPartitionComputer
(#9513)
---
.../paimon/utils/InternalRowPartitionComputer.java | 10 ++--
.../utils/InternalRowPartitionComputerTest.java | 54 ++++++++++++++++++++++
2 files changed, 60 insertions(+), 4 deletions(-)
diff --git
a/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
b/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
index 2382647aa9..0145ee3f78 100644
---
a/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
+++
b/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
@@ -59,11 +59,13 @@ public class InternalRowPartitionComputer {
List<String> columnList = rowType.getFieldNames();
this.partitionFieldGetters = new FieldGetter[partitionColumns.length];
this.partitionCastExecutors = new
CastExecutor[partitionColumns.length];
- for (String partitionColumn : partitionColumns) {
- int i = columnList.indexOf(partitionColumn);
+ for (int j = 0; j < partitionColumns.length; j++) {
+ // The getter must be stored at the partition-column position,
while the type
+ // comes from the column's position in the full row schema.
+ int i = columnList.indexOf(partitionColumns[j]);
DataType type = rowType.getTypeAt(i);
- partitionFieldGetters[i] = createNullCheckingFieldGetter(type, i);
- partitionCastExecutors[i] = CastExecutors.resolve(type,
VarCharType.STRING_TYPE);
+ partitionFieldGetters[j] = createNullCheckingFieldGetter(type, i);
+ partitionCastExecutors[j] = CastExecutors.resolve(type,
VarCharType.STRING_TYPE);
}
}
diff --git
a/paimon-common/src/test/java/org/apache/paimon/utils/InternalRowPartitionComputerTest.java
b/paimon-common/src/test/java/org/apache/paimon/utils/InternalRowPartitionComputerTest.java
index 771136ce99..6f92d72ed9 100644
---
a/paimon-common/src/test/java/org/apache/paimon/utils/InternalRowPartitionComputerTest.java
+++
b/paimon-common/src/test/java/org/apache/paimon/utils/InternalRowPartitionComputerTest.java
@@ -21,12 +21,14 @@ package org.apache.paimon.utils;
import org.apache.paimon.data.BinaryRow;
import org.apache.paimon.data.BinaryRowWriter;
import org.apache.paimon.data.BinaryString;
+import org.apache.paimon.types.DataType;
import org.apache.paimon.types.DataTypes;
import org.apache.paimon.types.RowType;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.entry;
/** Test for {@link InternalRowPartitionComputer}. */
public class InternalRowPartitionComputerTest {
@@ -54,4 +56,56 @@ public class InternalRowPartitionComputerTest {
assertThat(InternalRowPartitionComputer.partToSimpleString(rowType,
binaryRow, "-", 30))
.isEqualTo("null-10");
}
+
+ @Test
+ public void testPartitionColumnNotAtRowPrefix() {
+ RowType rowType =
+ RowType.of(
+ new DataType[] {
+ DataTypes.INT(),
+ DataTypes.STRING(),
+ DataTypes.STRING(),
+ DataTypes.STRING()
+ },
+ new String[] {"id", "dt", "region", "extra"});
+ InternalRowPartitionComputer computer =
+ new InternalRowPartitionComputer(
+ "__DEFAULT_PARTITION__", rowType, new String[]
{"region", "dt"}, false);
+
+ BinaryRow binaryRow = new BinaryRow(4);
+ BinaryRowWriter writer = new BinaryRowWriter(binaryRow);
+ writer.writeInt(0, 1);
+ writer.writeString(1, BinaryString.fromString("20240731"));
+ writer.writeString(2, BinaryString.fromString("hangzhou"));
+ writer.writeString(3, BinaryString.fromString("ignored"));
+ writer.complete();
+
+ // "region" sits at row position 2, which is out of range for an array
sized by the
+ // number of partition columns.
+ assertThat(computer.generatePartValues(binaryRow))
+ .containsExactly(entry("region", "hangzhou"), entry("dt",
"20240731"));
+ }
+
+ @Test
+ public void testPartitionColumnsReorderedWithinRowPrefix() {
+ RowType rowType =
+ RowType.of(
+ new DataType[] {DataTypes.INT(), DataTypes.STRING(),
DataTypes.STRING()},
+ new String[] {"id", "dt", "region"});
+ InternalRowPartitionComputer computer =
+ new InternalRowPartitionComputer(
+ "__DEFAULT_PARTITION__", rowType, new String[] {"dt",
"id"}, false);
+
+ BinaryRow binaryRow = new BinaryRow(3);
+ BinaryRowWriter writer = new BinaryRowWriter(binaryRow);
+ writer.writeInt(0, 1);
+ writer.writeString(1, BinaryString.fromString("20240731"));
+ writer.writeString(2, BinaryString.fromString("hangzhou"));
+ writer.complete();
+
+ // Both row positions are in range here, so indexing by row position
did not throw: it
+ // paired each column name with the other column's getter and cast
executor.
+ assertThat(computer.generatePartValues(binaryRow))
+ .containsExactly(entry("dt", "20240731"), entry("id", "1"));
+ }
}