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 df71005c7c [iceberg] Fix UnsupportedOperationException reading 
multiset columns (#8580)
df71005c7c is described below

commit df71005c7cf018c05faea3a59f555b285bf1963e
Author: Arnav Balyan <[email protected]>
AuthorDate: Mon Jul 13 07:47:12 2026 +0530

    [iceberg] Fix UnsupportedOperationException reading multiset columns (#8580)
---
 .../paimon/iceberg/metadata/IcebergDataField.java  |  9 +++++++++
 .../iceberg/metadata/IcebergDataFieldTest.java     | 22 ++++++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git 
a/paimon-core/src/main/java/org/apache/paimon/iceberg/metadata/IcebergDataField.java
 
b/paimon-core/src/main/java/org/apache/paimon/iceberg/metadata/IcebergDataField.java
index ca557fc1d0..95bbed9982 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/iceberg/metadata/IcebergDataField.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/iceberg/metadata/IcebergDataField.java
@@ -32,6 +32,7 @@ import org.apache.paimon.types.FloatType;
 import org.apache.paimon.types.IntType;
 import org.apache.paimon.types.LocalZonedTimestampType;
 import org.apache.paimon.types.MapType;
+import org.apache.paimon.types.MultisetType;
 import org.apache.paimon.types.RowType;
 import org.apache.paimon.types.TimeType;
 import org.apache.paimon.types.TimestampType;
@@ -206,6 +207,14 @@ public class IcebergDataField {
                         SpecialFields.getMapValueFieldId(fieldId, depth + 1),
                         !mapType.getValueType().isNullable(),
                         toTypeObject(mapType.getValueType(), fieldId, depth + 
1));
+            case MULTISET:
+                MultisetType multisetType = (MultisetType) dataType;
+                return new IcebergMapType(
+                        SpecialFields.getMapKeyFieldId(fieldId, depth + 1),
+                        toTypeObject(multisetType.getElementType(), fieldId, 
depth + 1),
+                        SpecialFields.getMapValueFieldId(fieldId, depth + 1),
+                        true,
+                        "int");
             case ROW:
                 RowType rowType = (RowType) dataType;
                 return new IcebergStructType(
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/iceberg/metadata/IcebergDataFieldTest.java
 
b/paimon-core/src/test/java/org/apache/paimon/iceberg/metadata/IcebergDataFieldTest.java
index c00e3a2f5e..926a83b24e 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/iceberg/metadata/IcebergDataFieldTest.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/iceberg/metadata/IcebergDataFieldTest.java
@@ -18,6 +18,7 @@
 
 package org.apache.paimon.iceberg.metadata;
 
+import org.apache.paimon.table.SpecialFields;
 import org.apache.paimon.types.ArrayType;
 import org.apache.paimon.types.BigIntType;
 import org.apache.paimon.types.BinaryType;
@@ -31,6 +32,7 @@ import org.apache.paimon.types.FloatType;
 import org.apache.paimon.types.IntType;
 import org.apache.paimon.types.LocalZonedTimestampType;
 import org.apache.paimon.types.MapType;
+import org.apache.paimon.types.MultisetType;
 import org.apache.paimon.types.RowType;
 import org.apache.paimon.types.TimestampType;
 import org.apache.paimon.types.VarBinaryType;
@@ -288,6 +290,26 @@ class IcebergDataFieldTest {
         assertThat(mapType.valueRequired()).isTrue();
     }
 
+    @Test
+    @DisplayName("Test multiset type conversion")
+    void testMultisetTypeConversion() {
+        DataField multisetField =
+                new DataField(
+                        1,
+                        "multiset",
+                        new MultisetType(false, new VarCharType(false, 
VarCharType.MAX_LENGTH)));
+        IcebergDataField icebergMultiset = new IcebergDataField(multisetField);
+
+        assertThat(icebergMultiset.type()).isInstanceOf(IcebergMapType.class);
+        IcebergMapType mapType = (IcebergMapType) icebergMultiset.type();
+        assertThat(mapType.type()).isEqualTo("map");
+        assertThat(mapType.key()).isEqualTo("string");
+        assertThat(mapType.value()).isEqualTo("int");
+        assertThat(mapType.valueRequired()).isTrue();
+        
assertThat(mapType.keyId()).isEqualTo(SpecialFields.getMapKeyFieldId(1, 1));
+        
assertThat(mapType.valueId()).isEqualTo(SpecialFields.getMapValueFieldId(1, 1));
+    }
+
     @Test
     @DisplayName("Test row type conversion")
     void testRowTypeConversion() {

Reply via email to