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() {