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 ce76ab95e6 [codegen] Fix generated map comparator comparing values by 
key type (#8763)
ce76ab95e6 is described below

commit ce76ab95e6feb5ff767760855f72ea8b29521e26
Author: Eunbin Son <[email protected]>
AuthorDate: Tue Jul 21 14:17:47 2026 +0900

    [codegen] Fix generated map comparator comparing values by key type (#8763)
---
 .../org/apache/paimon/codegen/GenerateUtils.scala  |  2 +-
 .../apache/paimon/codegen/CodeGenUtilsTest.java    | 26 ++++++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git 
a/paimon-codegen/src/main/scala/org/apache/paimon/codegen/GenerateUtils.scala 
b/paimon-codegen/src/main/scala/org/apache/paimon/codegen/GenerateUtils.scala
index 4ea0df464f..87e1bcca28 100644
--- 
a/paimon-codegen/src/main/scala/org/apache/paimon/codegen/GenerateUtils.scala
+++ 
b/paimon-codegen/src/main/scala/org/apache/paimon/codegen/GenerateUtils.scala
@@ -248,7 +248,7 @@ object GenerateUtils {
       leftTerm: String,
       rightTerm: String): String = {
     val keyArrayType = new ArrayType(mapType.getKeyType)
-    val valueArrayType = new ArrayType(mapType.getKeyType)
+    val valueArrayType = new ArrayType(mapType.getValueType)
     generateMapDataCompare(ctx, nullsIsLast, leftTerm, rightTerm, 
keyArrayType, valueArrayType)
   }
 
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/codegen/CodeGenUtilsTest.java 
b/paimon-core/src/test/java/org/apache/paimon/codegen/CodeGenUtilsTest.java
index f557c58aac..efa8f07272 100644
--- a/paimon-core/src/test/java/org/apache/paimon/codegen/CodeGenUtilsTest.java
+++ b/paimon-core/src/test/java/org/apache/paimon/codegen/CodeGenUtilsTest.java
@@ -19,6 +19,7 @@
 package org.apache.paimon.codegen;
 
 import org.apache.paimon.data.BinaryString;
+import org.apache.paimon.data.GenericMap;
 import org.apache.paimon.data.GenericRow;
 import org.apache.paimon.data.InternalRow;
 import org.apache.paimon.types.RowType;
@@ -28,7 +29,9 @@ import org.junit.jupiter.api.Test;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.function.Supplier;
 
 import static org.apache.paimon.codegen.CodeGenUtils.newNormalizedKeyComputer;
@@ -38,6 +41,7 @@ import static 
org.apache.paimon.codegen.CodeGenUtils.newRecordEqualiser;
 import static org.apache.paimon.types.DataTypes.DOUBLE;
 import static org.apache.paimon.types.DataTypes.FLOAT;
 import static org.apache.paimon.types.DataTypes.INT;
+import static org.apache.paimon.types.DataTypes.MAP;
 import static org.apache.paimon.types.DataTypes.STRING;
 import static org.apache.paimon.types.DataTypes.VECTOR;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -157,6 +161,28 @@ class CodeGenUtilsTest {
         return Integer.compare(value, 0);
     }
 
+    @Test
+    public void testMapComparatorComparesValuesWithValueType() {
+        // MAP<INT, STRING>: the generated comparator must compare the value 
array using the
+        // value type (STRING), not the key type (INT). With equal keys, 
ordering is decided by
+        // the values, so a wrong value type yields an incorrect result or a 
runtime failure.
+        RecordComparator comparator =
+                newRecordComparator(Arrays.asList(MAP(INT(), STRING())), new 
int[] {0});
+
+        InternalRow rowA = GenericRow.of(singletonMap(1, "a"));
+        InternalRow rowB = GenericRow.of(singletonMap(1, "b"));
+
+        assertThat(comparator.compare(rowA, rowB)).isLessThan(0);
+        assertThat(comparator.compare(rowB, rowA)).isGreaterThan(0);
+        assertThat(comparator.compare(rowA, GenericRow.of(singletonMap(1, 
"a")))).isZero();
+    }
+
+    private static GenericMap singletonMap(int key, String value) {
+        Map<Object, Object> map = new HashMap<>();
+        map.put(key, BinaryString.fromString(value));
+        return new GenericMap(map);
+    }
+
     @Test
     public void sortByDoubleColumnWithNaNProducesTotalOrder() {
         RecordComparator scoreComparator =

Reply via email to