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 =