Skip to content

feat: support catalog labels on tables loaded from REST catalogs - #960

Open
NihalJain wants to merge 1 commit into
apache:mainfrom
NihalJain:feat/catalog-labels
Open

NihalJain wants to merge 1 commit into
apache:mainfrom
NihalJain:feat/catalog-labels

Conversation

@NihalJain

@NihalJain NihalJain commented Sep 23, 2026

Copy link
Copy Markdown

Parse the optional labels field of the REST load-table response and expose it through Table::labels(), mirroring apache/iceberg#18045 and apache/iceberg#18046. Labels are catalog-provided rather than table state, so they live on the Table instance instead of TableMetadata.

Part of #938.

Unit tests cover the serde (all label shapes, null/absent handling, invalid input, strict int32 field-id) and the Table side (default empty, provided labels exposed, unchanged by Refresh()). The REST-response-to-Table wiring isn't reachable from unit tests, so I also checked it locally against the REST fixture behind a proxy that adds labels, covering create, load and register. Test code posted at https://gist.github.com/NihalJain/847d9137f090db63978a56c9fa84cd0b

Proper integration tests come in C3 once apache/iceberg#18047 ships in the fixture image.


AI Disclosure

  • Model: Opus 5.5
  • Platform/Tool: Claude Code
  • Human Oversight: Fully reviewed
  • Prompt Summary: Research how catalog labels were implemented in Iceberg Java, port the read path to iceberg-cpp for C1 of Catalog Labels: client-library read support for C++ #938 with matching semantics, verify it with unit tests and an end-to-end run against the REST fixture, and open a PR to apache/iceberg-cpp

Parse the optional `labels` field of the REST load-table response and
expose it through Table::labels(), mirroring apache/iceberg#18045 and
#18046. Labels are catalog-provided rather than table state, so they
live on the Table instance instead of TableMetadata.

Part of apache#938.
Copilot AI lite review requested due to automatic review settings September 23, 2026 18:58

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

The staged create-table path must preserve catalog-provided labels.

Review effort: Lite
Findings: None

What changed in this PR

Adds REST catalog label parsing and exposes catalog-provided labels through Table::labels().

Changes:

  • Adds label models, serde support, and strict field-ID parsing.
  • Wires labels into REST table responses and table instances.
  • Adds serde and table behavior tests.
File Summary
src/​iceberg/​util/​json_util_internal.h Adds strict int32 parsing.
src/​iceberg/​type_fwd.h Adds label forward declarations.
src/​iceberg/​test/​table_test.cc Tests table label behavior.
src/​iceberg/​test/​rest_json_serde_test.cc Tests label serialization and parsing.
src/​iceberg/​table.h Adds the labels API.
src/​iceberg/​table.cc Stores and exposes labels.
src/​iceberg/​labels.h Defines label models.
src/​iceberg/​catalog/​rest/​types.h Adds labels to load results; staged table construction still drops them (moderate issue).
src/​iceberg/​catalog/​rest/​types.cc Includes labels in equality checks.
src/​iceberg/​catalog/​rest/​rest_catalog.cc Wires labels into REST table handling.
src/​iceberg/​catalog/​rest/​json_serde.cc Implements label JSON serde.
src/​iceberg/​catalog/​rest/​json_serde_internal.h Declares label serde functions.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants