Skip to content

Catalog Labels: client-library read support (Go / Rust / Python / C++) #18126

Open

Description

@laskoviymishka

Summary

Catalog Labels were added to the Iceberg REST spec in #15750 (merged) and implemented on the Java client/engine side as a stacked set of PRs (#18045–#18049). This is a tracking issue to bring the other REST client libraries — iceberg-go, iceberg-rust, iceberg-python (PyIceberg), and iceberg-cpp — to read-path parity.

Labels are catalog-provided enrichment, not table state: they are returned on the load response, are transient/runtime-only, and are never persisted into table metadata or serialized. A client that ignores labels remains spec-compliant.

Wire shape

LoadTableResult / LoadViewResult gain an optional labels object:

"labels": {
  "object-labels": { "<key>": "<value>" },
  "fields": [ { "field-id": 3, "labels": { "classification": "pii" } } ]
}
  • object-labels: flat catalog-object-level map. fields: per-field labels keyed by field-id.
  • A field-id may carry multiple keys and may not resolve to a current column (e.g. a dropped column) — clients should tolerate both.

Java reference implementation

Shared prerequisite

Client integration tests need a server that emits labels — that is the REST server test fixture (#18047); once merged it must ship in the iceberg-rest-fixture Docker image. This gates the integration-test PRs only; unit-test PRs (mocked responses) can proceed immediately.

Per-repo proposed PRs

Each repo mirrors the Java layering (serde → table accessor → labels metadata table → integration tests), modeled on that client's existing storage-credentials / vended-credentials field. Read-path parity (metadata table) is included in all four. Rust and C++ are table-only (no LoadViewResult yet). Each per-repo group is a stack (each PR based on the previous); repos are independent.

iceberg-python (PyIceberg) — reconcile existing prototype to the spec

  • P1 serde + accessor: align internal keys "table"/"columns" → spec "object-labels"/"fields", add ViewResponse/View labels, unit tests
  • P2 table.inspect.labels() metadata table
  • P3 integration tests against the fixture (gated on prerequisite)

iceberg-go

  • G1 label types + serde on loadTableResponse/loadViewResponse + Table/View accessor + unit tests
  • G2 InspectTable.Labels() metadata table
  • G3 integration tests against the fixture (gated)

iceberg-cpp — table-only (no views yet)

  • C1 serde (FieldLabels/CatalogLabels + LoadTableResult.labels) + Table::catalog_labels() accessor + first REST serde unit test
  • C2 labels kind on inspect::MetadataTable
  • C3 integration tests against the fixture (gated)

iceberg-rust — table-only (no views yet)

  • R1 serde types (in the iceberg core crate) + labels on LoadTableResult + public-api.txt
  • R2 Table field + accessor + REST propagation
  • R3 inspect().labels() metadata table (+ DataFusion adapter)
  • R4 integration tests against the fixture (gated)

Notes

  • Suggested lead order: PyIceberg → Go → C++ → Rust (ascending ceremony).
  • Views: Go/Python cover table + view; Rust/C++ are table-only until LoadViewResult lands in those clients.

Activity

  1. NihalJain commented on Sep 16, 2026

    @NihalJain

    Hi I would like to contribute to Apache Iceberg. This seems like a good one to start with, will help me get hold of various clients of this project. Do you mind if I pick this up?

    NOTE: I am new to this project and may take a while to get hold of the codebase(s), if this is fine with you, please assign this to me.

  2. laskoviymishka commented on Sep 17, 2026

    @laskoviymishka
    ContributorAuthor

    There is a big gap now in coverage for C++ now, maybe you can take a look on those ones?

  3. NihalJain commented on Sep 17, 2026

    @NihalJain

    Hi @laskoviymishka

    Thank for your response. Sure let me start by looking at the cpp client and analsyse what all needs to be taken care of. Also lmk if any issues / prerequisites I should be aware of apart from #18047

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions