Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion src/iceberg/table_requirement.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
33 changes: 33 additions & 0 deletions src/iceberg/test/table_metadata_builder_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
// ============================================================================
Expand Down
Loading