From cdef66d28cb0bf00c7f1a2f99c8b21577215df9c Mon Sep 17 00:00:00 2001 From: Xinli Shang Date: Sat, 1 Nov 2025 17:46:30 -0700 Subject: [PATCH 1/2] Add validation for AssertCurrentSchemaID --- src/iceberg/table_requirement.cc | 19 ++++++++++- .../test/table_metadata_builder_test.cc | 33 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/iceberg/table_requirement.cc b/src/iceberg/table_requirement.cc index e951d7003..357dd9a2a 100644 --- a/src/iceberg/table_requirement.cc +++ b/src/iceberg/table_requirement.cc @@ -54,7 +54,24 @@ Status AssertLastAssignedFieldId::Validate(const TableMetadata* base) const { } Status AssertCurrentSchemaID::Validate(const TableMetadata* base) const { - return NotImplemented("AssertCurrentTableSchemaID::Validate not implemented"); + // Validate that the current schema ID matches the expected value + + if (base == nullptr) { + return CommitFailed("Requirement failed: current table metadata is missing"); + } + + if (!base->current_schema_id.has_value()) { + return CommitFailed( + "Requirement failed: current schema ID is not set in table metadata"); + } + + if (base->current_schema_id.value() != schema_id_) { + return CommitFailed( + "Requirement failed: current schema ID does not match (expected={}, actual={})", + schema_id_, base->current_schema_id.value()); + } + + return {}; } Status AssertLastAssignedPartitionId::Validate(const TableMetadata* base) const { diff --git a/src/iceberg/test/table_metadata_builder_test.cc b/src/iceberg/test/table_metadata_builder_test.cc index aa22f8571..6b2314f1e 100644 --- a/src/iceberg/test/table_metadata_builder_test.cc +++ b/src/iceberg/test/table_metadata_builder_test.cc @@ -231,6 +231,39 @@ TEST_F(TableMetadataBuilderTest, TableRequirementAssertUUIDCaseInsensitive) { ASSERT_THAT(requirement.Validate(base_metadata_.get()), IsOk()); } +TEST_F(TableMetadataBuilderTest, TableRequirementAssertCurrentSchemaIDSuccess) { + base_metadata_->current_schema_id = 5; + table::AssertCurrentSchemaID requirement(5); + + ASSERT_THAT(requirement.Validate(base_metadata_.get()), IsOk()); +} + +TEST_F(TableMetadataBuilderTest, TableRequirementAssertCurrentSchemaIDMismatch) { + base_metadata_->current_schema_id = 5; + table::AssertCurrentSchemaID requirement(10); + + auto status = requirement.Validate(base_metadata_.get()); + EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed)); + EXPECT_THAT(status, HasErrorMessage("schema ID does not match")); +} + +TEST_F(TableMetadataBuilderTest, TableRequirementAssertCurrentSchemaIDNullBase) { + table::AssertCurrentSchemaID requirement(5); + + auto status = requirement.Validate(nullptr); + EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed)); + EXPECT_THAT(status, HasErrorMessage("metadata is missing")); +} + +TEST_F(TableMetadataBuilderTest, TableRequirementAssertCurrentSchemaIDNotSet) { + base_metadata_->current_schema_id = std::nullopt; + table::AssertCurrentSchemaID requirement(5); + + auto status = requirement.Validate(base_metadata_.get()); + EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed)); + EXPECT_THAT(status, HasErrorMessage("schema ID is not set")); +} + // ============================================================================ // Integration Tests - End-to-End Workflow // ============================================================================ From aa8bb7bc52e78f9fb1dc1cab5a65e3c547bfa974 Mon Sep 17 00:00:00 2001 From: Xinli Shang Date: Sun, 2 Nov 2025 14:47:19 -0800 Subject: [PATCH 2/2] Update src/iceberg/table_requirement.cc Co-authored-by: Junwang Zhao --- src/iceberg/table_requirement.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iceberg/table_requirement.cc b/src/iceberg/table_requirement.cc index 357dd9a2a..0b8e79578 100644 --- a/src/iceberg/table_requirement.cc +++ b/src/iceberg/table_requirement.cc @@ -54,7 +54,7 @@ Status AssertLastAssignedFieldId::Validate(const TableMetadata* base) const { } Status AssertCurrentSchemaID::Validate(const TableMetadata* base) const { - // Validate that the current schema ID matches the expected value + // Validate that the current schema ID matches the one used when the metadata was read if (base == nullptr) { return CommitFailed("Requirement failed: current table metadata is missing");