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"));
+    }
 }

Reply via email to