diff --git a/core/src/main/java/org/apache/iceberg/BaseReplacePartitions.java b/core/src/main/java/org/apache/iceberg/BaseReplacePartitions.java index 04611f50f15a..892257b51b0c 100644 --- a/core/src/main/java/org/apache/iceberg/BaseReplacePartitions.java +++ b/core/src/main/java/org/apache/iceberg/BaseReplacePartitions.java @@ -111,7 +111,7 @@ public void validate(TableMetadata currentMetadata, Snapshot parent) { @Override public List apply(TableMetadata base, Snapshot snapshot) { - if (dataSpec().fields().isEmpty()) { + if (dataSpec().isUnpartitioned()) { // replace all data in an unpartitioned table deleteByRowFilter(Expressions.alwaysTrue()); } diff --git a/core/src/test/java/org/apache/iceberg/TestReplacePartitions.java b/core/src/test/java/org/apache/iceberg/TestReplacePartitions.java index 29daeb995cc5..abc27cddd610 100644 --- a/core/src/test/java/org/apache/iceberg/TestReplacePartitions.java +++ b/core/src/test/java/org/apache/iceberg/TestReplacePartitions.java @@ -102,6 +102,23 @@ public class TestReplacePartitions extends TestBase { .withRecordCount(1) .build(); + static final PartitionSpec SPEC_ALL_VOID = + PartitionSpec.builderFor(SCHEMA).alwaysNull("id").alwaysNull("data").build(); + + static final DataFile FILE_ALL_VOID_UNPARTITIONED_A = + DataFiles.builder(SPEC_ALL_VOID) + .withPath("/path/to/data-all-void-unpartitioned-a.parquet") + .withFileSizeInBytes(10) + .withRecordCount(1) + .build(); + + static final DataFile FILE_ALL_VOID_UNPARTITIONED_B = + DataFiles.builder(SPEC_ALL_VOID) + .withPath("/path/to/data-all-void-unpartitioned-b.parquet") + .withFileSizeInBytes(10) + .withRecordCount(1) + .build(); + @Parameter(index = 1) private String branch; @@ -198,6 +215,42 @@ public void testReplaceWithUnpartitionedTable() throws IOException { statuses(Status.DELETED)); } + @TestTemplate + public void testReplaceAllVoidUnpartitionedTable() { + Table tableVoid = + TestTables.create(tableDir, "allvoidUnpartitioned", SCHEMA, SPEC_ALL_VOID, formatVersion); + + commit(tableVoid, tableVoid.newAppend().appendFile(FILE_ALL_VOID_UNPARTITIONED_A), branch); + validateSnapshot( + null, + latestSnapshot(TestTables.readMetadata("allvoidUnpartitioned"), branch), + FILE_ALL_VOID_UNPARTITIONED_A); + + ReplacePartitions replacePartitions = + tableVoid.newReplacePartitions().addFile(FILE_ALL_VOID_UNPARTITIONED_B); + commit(tableVoid, replacePartitions, branch); + + assertThat(TestTables.metadataVersion("allvoidUnpartitioned")).isEqualTo(2); + TableMetadata replaceMetadata = TestTables.readMetadata("allvoidUnpartitioned"); + long replaceId = latestSnapshot(replaceMetadata, branch).snapshotId(); + List manifestFiles = + latestSnapshot(replaceMetadata, branch).allManifests(tableVoid.io()); + + assertThat(manifestFiles).hasSize(2); + + validateManifestEntries( + manifestFiles.get(0), + ids(replaceId), + files(FILE_ALL_VOID_UNPARTITIONED_B), + statuses(Status.ADDED)); + + validateManifestEntries( + manifestFiles.get(1), + ids(replaceId), + files(FILE_ALL_VOID_UNPARTITIONED_A), + statuses(Status.DELETED)); + } + @TestTemplate public void testReplaceAndMergeWithUnpartitionedTable() throws IOException { Table unpartitioned =