This is an automated email from the ASF dual-hosted git repository.

gangwu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg-cpp.git


The following commit(s) were added to refs/heads/main by this push:
     new 1a6f9c8  feat: Add validation for AssertCurrentSchemaID (#286)
1a6f9c8 is described below

commit 1a6f9c89ec12d43906c9088ea6779c2e7b874c14
Author: Xinli Shang <[email protected]>
AuthorDate: Mon Nov 3 18:08:55 2025 -0800

    feat: Add validation for AssertCurrentSchemaID (#286)
---
 src/iceberg/table_requirement.cc                | 19 +++++++++++++-
 src/iceberg/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 e951d70..0b8e795 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 one used when the 
metadata was read
+
+  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 aa22f85..6b2314f 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
 // ============================================================================

Reply via email to