Skip to content

Commit 1a6f9c8

Browse files
authored
feat: Add validation for AssertCurrentSchemaID (#286)
1 parent 4f84053 commit 1a6f9c8

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

src/iceberg/table_requirement.cc

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,24 @@ Status AssertLastAssignedFieldId::Validate(const TableMetadata* base) const {
5454
}
5555

5656
Status AssertCurrentSchemaID::Validate(const TableMetadata* base) const {
57-
return NotImplemented("AssertCurrentTableSchemaID::Validate not implemented");
57+
// Validate that the current schema ID matches the one used when the metadata was read
58+
59+
if (base == nullptr) {
60+
return CommitFailed("Requirement failed: current table metadata is missing");
61+
}
62+
63+
if (!base->current_schema_id.has_value()) {
64+
return CommitFailed(
65+
"Requirement failed: current schema ID is not set in table metadata");
66+
}
67+
68+
if (base->current_schema_id.value() != schema_id_) {
69+
return CommitFailed(
70+
"Requirement failed: current schema ID does not match (expected={}, actual={})",
71+
schema_id_, base->current_schema_id.value());
72+
}
73+
74+
return {};
5875
}
5976

6077
Status AssertLastAssignedPartitionId::Validate(const TableMetadata* base) const {

src/iceberg/test/table_metadata_builder_test.cc

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,39 @@ TEST_F(TableMetadataBuilderTest, TableRequirementAssertUUIDCaseInsensitive) {
231231
ASSERT_THAT(requirement.Validate(base_metadata_.get()), IsOk());
232232
}
233233

234+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertCurrentSchemaIDSuccess) {
235+
base_metadata_->current_schema_id = 5;
236+
table::AssertCurrentSchemaID requirement(5);
237+
238+
ASSERT_THAT(requirement.Validate(base_metadata_.get()), IsOk());
239+
}
240+
241+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertCurrentSchemaIDMismatch) {
242+
base_metadata_->current_schema_id = 5;
243+
table::AssertCurrentSchemaID requirement(10);
244+
245+
auto status = requirement.Validate(base_metadata_.get());
246+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
247+
EXPECT_THAT(status, HasErrorMessage("schema ID does not match"));
248+
}
249+
250+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertCurrentSchemaIDNullBase) {
251+
table::AssertCurrentSchemaID requirement(5);
252+
253+
auto status = requirement.Validate(nullptr);
254+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
255+
EXPECT_THAT(status, HasErrorMessage("metadata is missing"));
256+
}
257+
258+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertCurrentSchemaIDNotSet) {
259+
base_metadata_->current_schema_id = std::nullopt;
260+
table::AssertCurrentSchemaID requirement(5);
261+
262+
auto status = requirement.Validate(base_metadata_.get());
263+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
264+
EXPECT_THAT(status, HasErrorMessage("schema ID is not set"));
265+
}
266+
234267
// ============================================================================
235268
// Integration Tests - End-to-End Workflow
236269
// ============================================================================

0 commit comments

Comments
 (0)