From 96e2329fc94d672dcc4e321fa5062de121548ad1 Mon Sep 17 00:00:00 2001 From: Li Jiajia Date: Sun, 7 Jun 2026 16:51:34 +0800 Subject: [PATCH] fix(rest): use "ref" field name for AssertRefSnapshotId requirement --- src/iceberg/json_serde.cc | 6 ++++-- src/iceberg/test/json_serde_test.cc | 12 ++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/iceberg/json_serde.cc b/src/iceberg/json_serde.cc index 550d0f07e..c72b7da57 100644 --- a/src/iceberg/json_serde.cc +++ b/src/iceberg/json_serde.cc @@ -207,6 +207,7 @@ constexpr std::string_view kSortOrderId = "sort-order-id"; constexpr std::string_view kSnapshot = "snapshot"; constexpr std::string_view kSnapshotIds = "snapshot-ids"; constexpr std::string_view kRefName = "ref-name"; +constexpr std::string_view kRef = "ref"; constexpr std::string_view kUpdates = "updates"; constexpr std::string_view kRemovals = "removals"; @@ -1505,7 +1506,8 @@ nlohmann::json ToJson(const TableRequirement& requirement) { const auto& r = internal::checked_cast(requirement); json[kType] = kRequirementAssertRefSnapshotID; - json[kRefName] = r.ref_name(); + // REST spec names this field "ref", not "ref-name". + json[kRef] = r.ref_name(); if (r.snapshot_id().has_value()) { json[kSnapshotId] = r.snapshot_id().value(); } else { @@ -1702,7 +1704,7 @@ Result> TableRequirementFromJson( return std::make_unique(std::move(uuid)); } if (type == kRequirementAssertRefSnapshotID) { - ICEBERG_ASSIGN_OR_RAISE(auto ref_name, GetJsonValue(json, kRefName)); + ICEBERG_ASSIGN_OR_RAISE(auto ref_name, GetJsonValue(json, kRef)); ICEBERG_ASSIGN_OR_RAISE(auto snapshot_id_opt, GetJsonValueOptional(json, kSnapshotId)); return std::make_unique(std::move(ref_name), diff --git a/src/iceberg/test/json_serde_test.cc b/src/iceberg/test/json_serde_test.cc index f019375d3..0dac226e9 100644 --- a/src/iceberg/test/json_serde_test.cc +++ b/src/iceberg/test/json_serde_test.cc @@ -681,7 +681,7 @@ TEST(TableRequirementJsonTest, TableRequirementAssertUUID) { TEST(TableRequirementJsonTest, TableRequirementAssertRefSnapshotID) { table::AssertRefSnapshotID req("main", 123456789); nlohmann::json expected = - R"({"type":"assert-ref-snapshot-id","ref-name":"main","snapshot-id":123456789})"_json; + R"({"type":"assert-ref-snapshot-id","ref":"main","snapshot-id":123456789})"_json; EXPECT_EQ(ToJson(req), expected); auto parsed = TableRequirementFromJson(expected); @@ -693,7 +693,7 @@ TEST(TableRequirementJsonTest, TableRequirementAssertRefSnapshotID) { TEST(TableRequirementJsonTest, TableRequirementAssertRefSnapshotIDWithNull) { table::AssertRefSnapshotID req("main", std::nullopt); nlohmann::json expected = - R"({"type":"assert-ref-snapshot-id","ref-name":"main","snapshot-id":null})"_json; + R"({"type":"assert-ref-snapshot-id","ref":"main","snapshot-id":null})"_json; EXPECT_EQ(ToJson(req), expected); auto parsed = TableRequirementFromJson(expected); @@ -702,6 +702,14 @@ TEST(TableRequirementJsonTest, TableRequirementAssertRefSnapshotIDWithNull) { req); } +TEST(TableRequirementJsonTest, TableRequirementAssertRefSnapshotIDRejectsRefName) { + nlohmann::json legacy = + R"({"type":"assert-ref-snapshot-id","ref-name":"main","snapshot-id":123456789})"_json; + auto result = TableRequirementFromJson(legacy); + EXPECT_THAT(result, IsError(ErrorKind::kJsonParseError)); + EXPECT_THAT(result, HasErrorMessage("Missing 'ref'")); +} + TEST(TableRequirementJsonTest, TableRequirementAssertLastAssignedFieldId) { table::AssertLastAssignedFieldId req(100); nlohmann::json expected =