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 37b90f0e5a [common] Fix npe on null value map(k, v) cast (#8218)
37b90f0e5a is described below

commit 37b90f0e5a0c87c27a4123e01ec4ae1ae5668df1
Author: Arnav Balyan <[email protected]>
AuthorDate: Sat Jun 13 04:39:14 2026 +0200

    [common] Fix npe on null value map(k, v) cast (#8218)
---
 .../org/apache/paimon/casting/StringToMapCastRule.java | 18 +++++++-----------
 .../org/apache/paimon/casting/CastExecutorTest.java    |  9 +++++++++
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git 
a/paimon-common/src/main/java/org/apache/paimon/casting/StringToMapCastRule.java
 
b/paimon-common/src/main/java/org/apache/paimon/casting/StringToMapCastRule.java
index 02b21fc397..2183a67d77 100644
--- 
a/paimon-common/src/main/java/org/apache/paimon/casting/StringToMapCastRule.java
+++ 
b/paimon-common/src/main/java/org/apache/paimon/casting/StringToMapCastRule.java
@@ -37,8 +37,6 @@ import java.util.Map;
 import java.util.Stack;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
 
 /** {@link DataTypeFamily#CHARACTER_STRING} to {@link DataTypeRoot#MAP} cast 
rule. */
 class StringToMapCastRule extends AbstractCastRule<BinaryString, InternalMap> {
@@ -141,15 +139,13 @@ class StringToMapCastRule extends 
AbstractCastRule<BinaryString, InternalMap> {
             throw new RuntimeException("Invalid Function map format: odd 
number of elements");
         }
 
-        return IntStream.range(0, elements.size() / 2)
-                .boxed()
-                .collect(
-                        Collectors.toMap(
-                                i -> parseValue(elements.get(i * 2).trim(), 
keyCastExecutor),
-                                i ->
-                                        parseValue(
-                                                elements.get(i * 2 + 1).trim(),
-                                                valueCastExecutor)));
+        Map<Object, Object> mapContent = Maps.newHashMap();
+        for (int i = 0; i < elements.size(); i += 2) {
+            mapContent.put(
+                    parseValue(elements.get(i).trim(), keyCastExecutor),
+                    parseValue(elements.get(i + 1).trim(), valueCastExecutor));
+        }
+        return mapContent;
     }
 
     private Map<Object, Object> parseMapEntry(
diff --git 
a/paimon-common/src/test/java/org/apache/paimon/casting/CastExecutorTest.java 
b/paimon-common/src/test/java/org/apache/paimon/casting/CastExecutorTest.java
index dd6d53bf4c..0bcc455986 100644
--- 
a/paimon-common/src/test/java/org/apache/paimon/casting/CastExecutorTest.java
+++ 
b/paimon-common/src/test/java/org/apache/paimon/casting/CastExecutorTest.java
@@ -643,6 +643,15 @@ public class CastExecutorTest {
         assertThat(valueArray.getInt(0)).isEqualTo(42);
         assertThat(keyArray.getString(1).toString()).isEqualTo("key1");
         assertThat(valueArray.isNullAt(1)).isTrue();
+
+        result = stringToMap.cast(BinaryString.fromString("MAP(key1, null, 
key2, 42)"));
+        assertThat(result.size()).isEqualTo(2);
+        keyArray = result.keyArray();
+        valueArray = result.valueArray();
+        assertThat(keyArray.getString(0).toString()).isEqualTo("key2");
+        assertThat(valueArray.getInt(0)).isEqualTo(42);
+        assertThat(keyArray.getString(1).toString()).isEqualTo("key1");
+        assertThat(valueArray.isNullAt(1)).isTrue();
     }
 
     @Test

Reply via email to