From 48264b4de4befa40af28c4cfbaf9bb7ab89d033b Mon Sep 17 00:00:00 2001 From: Neelesh Salian Date: Fri, 10 Apr 2026 10:26:44 -0700 Subject: [PATCH 1/3] Fix NPE in ParquetAvroWriter --- .../iceberg/parquet/ParquetAvroWriter.java | 5 ++++ .../apache/iceberg/parquet/TestParquet.java | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/parquet/src/main/java/org/apache/iceberg/parquet/ParquetAvroWriter.java b/parquet/src/main/java/org/apache/iceberg/parquet/ParquetAvroWriter.java index 114e5fe27545..75b3a6604084 100644 --- a/parquet/src/main/java/org/apache/iceberg/parquet/ParquetAvroWriter.java +++ b/parquet/src/main/java/org/apache/iceberg/parquet/ParquetAvroWriter.java @@ -103,6 +103,11 @@ public ParquetValueWriter map( ParquetValueWriters.option(valueType, valueD, valueWriter)); } + @Override + public ParquetValueWriter variant(GroupType variant) { + throw new UnsupportedOperationException("Avro writer does not support variant types"); + } + @Override public ParquetValueWriter primitive(PrimitiveType primitive) { ColumnDescriptor desc = type.getColumnDescription(currentPath()); diff --git a/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java b/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java index 58850ec7c9f4..d794be34a6f9 100644 --- a/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java +++ b/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java @@ -30,6 +30,7 @@ import static org.apache.iceberg.types.Types.NestedField.optional; import static org.apache.iceberg.types.Types.NestedField.required; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.io.File; import java.io.IOException; @@ -57,6 +58,7 @@ import org.apache.iceberg.types.Types; import org.apache.iceberg.types.Types.IntegerType; import org.apache.iceberg.util.Pair; +import org.apache.iceberg.variants.Variant; import org.apache.parquet.avro.AvroParquetWriter; import org.apache.parquet.column.statistics.Statistics; import org.apache.parquet.hadoop.ParquetFileReader; @@ -64,7 +66,9 @@ import org.apache.parquet.hadoop.metadata.BlockMetaData; import org.apache.parquet.hadoop.metadata.ColumnChunkMetaData; import org.apache.parquet.io.LocalOutputFile; +import org.apache.parquet.schema.LogicalTypeAnnotation; import org.apache.parquet.schema.MessageType; +import org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -354,4 +358,24 @@ private Pair generateFile( records.toArray(new GenericData.Record[] {})); return Pair.of(file, size); } + + @Test + public void testAvroWriterRejectsVariantType() { + MessageType schema = + org.apache.parquet.schema.Types.buildMessage() + .optional(PrimitiveTypeName.INT32) + .named("id") + .optionalGroup() + .as(LogicalTypeAnnotation.variantType(Variant.VARIANT_SPEC_VERSION)) + .required(PrimitiveTypeName.BINARY) + .named("metadata") + .required(PrimitiveTypeName.BINARY) + .named("value") + .named("v") + .named("table"); + + assertThatThrownBy(() -> ParquetAvroWriter.buildWriter(schema)) + .isInstanceOf(UnsupportedOperationException.class) + .hasMessageContaining("variant"); + } } From 22f4ee2cc18510fcf92d09532c7dd4f7479372db Mon Sep 17 00:00:00 2001 From: Neelesh Salian Date: Fri, 10 Apr 2026 10:37:09 -0700 Subject: [PATCH 2/3] Update error message check in test --- .../src/test/java/org/apache/iceberg/parquet/TestParquet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java b/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java index d794be34a6f9..b58bff1ed71c 100644 --- a/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java +++ b/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java @@ -376,6 +376,6 @@ public void testAvroWriterRejectsVariantType() { assertThatThrownBy(() -> ParquetAvroWriter.buildWriter(schema)) .isInstanceOf(UnsupportedOperationException.class) - .hasMessageContaining("variant"); + .hasMessage("Avro writer does not support variant types"); } } From 68535570493f84faa9ca8d569d01c84a9d976c35 Mon Sep 17 00:00:00 2001 From: Neelesh Salian Date: Sun, 12 Apr 2026 12:02:28 -0700 Subject: [PATCH 3/3] PR comments --- .../apache/iceberg/parquet/TestParquet.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java b/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java index b58bff1ed71c..5f1e0c83cc0f 100644 --- a/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java +++ b/parquet/src/test/java/org/apache/iceberg/parquet/TestParquet.java @@ -318,6 +318,26 @@ public void testFooterMetricsWithNameMappingForFileWithoutIds() throws IOExcepti } } + @Test + public void testAvroWriterRejectsVariantType() { + MessageType schema = + org.apache.parquet.schema.Types.buildMessage() + .optional(PrimitiveTypeName.INT32) + .named("id") + .optionalGroup() + .as(LogicalTypeAnnotation.variantType(Variant.VARIANT_SPEC_VERSION)) + .required(PrimitiveTypeName.BINARY) + .named("metadata") + .required(PrimitiveTypeName.BINARY) + .named("value") + .named("v") + .named("table"); + + assertThatThrownBy(() -> ParquetAvroWriter.buildWriter(schema)) + .isInstanceOf(UnsupportedOperationException.class) + .hasMessage("Avro writer does not support variant types"); + } + private Pair generateFile( Function> createWriterFunc, int desiredRecordCount, @@ -358,24 +378,4 @@ private Pair generateFile( records.toArray(new GenericData.Record[] {})); return Pair.of(file, size); } - - @Test - public void testAvroWriterRejectsVariantType() { - MessageType schema = - org.apache.parquet.schema.Types.buildMessage() - .optional(PrimitiveTypeName.INT32) - .named("id") - .optionalGroup() - .as(LogicalTypeAnnotation.variantType(Variant.VARIANT_SPEC_VERSION)) - .required(PrimitiveTypeName.BINARY) - .named("metadata") - .required(PrimitiveTypeName.BINARY) - .named("value") - .named("v") - .named("table"); - - assertThatThrownBy(() -> ParquetAvroWriter.buildWriter(schema)) - .isInstanceOf(UnsupportedOperationException.class) - .hasMessage("Avro writer does not support variant types"); - } }