From 23d69f83f97228407114e93f8de8495322eaf420 Mon Sep 17 00:00:00 2001 From: Zhuo Wang Date: Tue, 14 Jul 2026 18:18:59 +0800 Subject: [PATCH] fix: use kLegacyPartitionDataIdStart as partition field ID baseline FreshPartitionSpec and TableMetadataBuilder::Impl both initialized the partition field ID counter to kInvalidPartitionFieldId (-1), causing the first partition field to get ID 0 instead of 1000. Partition field ID 0 collides with ManifestEntry internal fields (status=0, snapshot_id=1, data_file=2), corrupting manifest file schemas. Fix by using kLegacyPartitionDataIdStart - 1 (999) as the baseline, consistent with PartitionSpec's own constructor, Unpartitioned(), and UpdatePartitionSpec, as well as Java Iceberg's PARTITION_DATA_ID_START convention. The first partition field now correctly gets ID 1000. --- src/iceberg/table_metadata.cc | 4 ++-- src/iceberg/test/table_metadata_builder_test.cc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/iceberg/table_metadata.cc b/src/iceberg/table_metadata.cc index 83ae47351..94a154501 100644 --- a/src/iceberg/table_metadata.cc +++ b/src/iceberg/table_metadata.cc @@ -71,7 +71,7 @@ Result> FreshPartitionSpec(int32_t spec_id, const Schema& fresh_schema) { std::vector partition_fields; partition_fields.reserve(spec.fields().size()); - int32_t last_partition_field_id = PartitionSpec::kInvalidPartitionFieldId; + int32_t last_partition_field_id = PartitionSpec::kLegacyPartitionDataIdStart - 1; for (auto& field : spec.fields()) { ICEBERG_ASSIGN_OR_RAISE(auto source_name, base_schema.FindColumnNameById(field.source_id())); @@ -556,7 +556,7 @@ class TableMetadataBuilder::Impl { metadata_.last_updated_ms = kInvalidLastUpdatedMs; metadata_.last_column_id = Schema::kInvalidColumnId; metadata_.default_spec_id = PartitionSpec::kInitialSpecId; - metadata_.last_partition_id = PartitionSpec::kInvalidPartitionFieldId; + metadata_.last_partition_id = PartitionSpec::kLegacyPartitionDataIdStart - 1; metadata_.current_snapshot_id = kInvalidSnapshotId; metadata_.default_sort_order_id = SortOrder::kInitialSortOrderId; metadata_.next_row_id = TableMetadata::kInitialRowId; diff --git a/src/iceberg/test/table_metadata_builder_test.cc b/src/iceberg/test/table_metadata_builder_test.cc index f9080e0f2..5fd970d62 100644 --- a/src/iceberg/test/table_metadata_builder_test.cc +++ b/src/iceberg/test/table_metadata_builder_test.cc @@ -125,7 +125,7 @@ TEST(TableMetadataTest, Make) { auto spec_fields = metadata->partition_specs[0]->fields() | std::ranges::to(); ASSERT_EQ(1, spec_fields.size()); - EXPECT_EQ(PartitionSpec::kInvalidPartitionFieldId + 1, spec_fields[0].field_id()); + EXPECT_EQ(PartitionSpec::kLegacyPartitionDataIdStart, spec_fields[0].field_id()); EXPECT_EQ(2, spec_fields[0].source_id()); EXPECT_EQ("part_name", spec_fields[0].name());