Back to Devoured - September 17, 2026
DEVOURED
Apache Iceberg Python 0.12.0 Release

Apache Iceberg Python 0.12.0 Release

Data Apache Iceberg
PyIceberg 0.12.0 adds production-ready features including REST-catalog views, conflict-aware commit retries, and geometry support.
What: The 0.12.0 release includes over 470 pull requests, adding read support for Iceberg views in REST catalogs, improved concurrency validation, incremental append scans, and support for Iceberg v3 geometry/geography types.
Why it matters: The project is reaching higher maturity, focusing on correctness, security via CodeQL, and broader ecosystem compatibility with Python 3.14.
Takeaway: If you are upgrading, note that PyArrow minimum is now 18.0.0 and `NoopCatalog.table_exists` now returns `False` instead of raising an exception.
Deep dive
  • REST Catalog Views: Create, load, and list views via REST; exposed through a standard View object.
  • Commit Retries: Transaction.commit_transaction now automatically refreshes the table and retries on CommitFailedException.
  • Incremental Scans: Table.incremental_append_scan() reads new rows between snapshot ranges.
  • Data Types: Full v3 geometry and geography type support, including Avro mapping.
  • Infrastructure: Added Python 3.14 support, CodeQL security scanning, and automated uv-pre-commit lockfile management.
Decoder
  • Iceberg View: A stored SQL query that behaves like a table, allowing for logical abstraction over physical data files.
  • Incremental Append Scan: A specialized read operation that only fetches data modified or added since a specific snapshot.
  • Deletion Vector: A mechanism for tracking deleted rows without needing to rewrite entire Parquet data files.
Original article

Apache Iceberg Python 0.12.0 Release

The Apache Iceberg community is pleased to announce the 0.12.0 release of Apache Iceberg Python.

The 0.12.0 release covers development work from early February through late August 2026 and is the result of merging over 470 pull requests from 58 contributors, including more than 40 first-time contributors.

These notes cover the highlights. For the full list, see the changelog.

Release Highlights

REST Catalog View Support

This release adds read support for Iceberg views. Views can be created, loaded, listed, registered, and dropped through the REST catalog, and are exposed through a View object.

view = catalog.create_view(
    identifier=("default", "recent_orders"),
    schema=schema,
    view_version=view_version,
)

view = catalog.load_view("default.recent_orders")
view.sql_for("spark")
  • ViewMetadata read support and create_view for the REST catalog
  • load_view and the View object API
  • Registering existing views via register_view
  • Pagination support for list_views
  • More examples for working with views and a REST integration test suite

For older REST servers that support the view endpoints but do not advertise them in the ConfigResponse, set the view-endpoints-supported catalog property.

Commit Retry and Concurrency Validation

Writes now retry on concurrent commits and validate for conflicts. When a catalog commit fails with CommitFailedException, Transaction.commit_transaction() refreshes the table, checks for conflicts, and retries the commit.

Incremental Append Scan

Table.incremental_append_scan() (#3512) reads the rows added by append snapshots within a snapshot range, projected onto the table's current schema.

scan = table.incremental_append_scan(
    from_snapshot_id_exclusive=last_processed_snapshot_id,
    to_snapshot_id_inclusive=table.current_snapshot().snapshot_id,
)
new_rows = scan.to_arrow()

Geometry and Geography Types

The v3 geometry and geography primitive types are now supported: schema parsing and serialization, Avro mapping via WKB bytes, and PyArrow/Parquet integration.

File Format Writer API

PyIceberg has begun using the File Format API for handling Parquet files.

Catalog and REST Improvements

  • REST loadCredentials support with longest-prefix resolution for a target location, and storage credentials in LoadTableResult
  • Pagination support for list_namespaces and list_tables, with a shared rest-page-size option
  • overwrite option for register_table
  • SigV4 retry configuration defaults for REST
  • S3 server-side encryption configs for FsspecFileIO
  • Glue create_table support for S3 Tables federated databases
  • An iceberg_type column for SqlCatalog, so Iceberg tables can be distinguished from other entries, with filtering fixed for existing catalogs
  • Catalog properties for the shared catalog test suite and coverage for nonexistent tables and namespaces
  • Renamed rest-scan-planning-enabled to scan-planning-mode

CLI

  • --warehouse flag for the REST catalog
  • --version flag, deprecating the version subcommand, which now also skips catalog loading
  • --purge option for drop table, to request that the catalog purge the underlying table files

Bug Fixes

Notable correctness fixes in this release:

  • Fixed strict NotEqualTo/NotIn pruning for files with partial nulls or NaNs
  • Corrected NOT STARTS WITH projection for truncated partitions, along with residual evaluation and the string-based starts_with/not_starts_with methods
  • Fixed the ManifestEntry.snapshot_id setter writing to the wrong index
  • Fixed the DELETED manifest entry snapshot_id in OverwriteFiles
  • Preserved a manifest min sequence number of 0 rather than dropping it
  • Stripped the spec-mandated deletion vector blob framing before deserializing, with a Spark interop test covering the read path
  • Fixed deepcopy for And, Or, and Not expressions
  • Fixed precision loss in large integral string conversions, with Long bounds returned for decimal conversion, bounds sentinels for long date literals, and an overflow sentinel in LongLiteral.to(FloatType)
  • Padded sub-microsecond digits when parsing nanosecond timestamps, and handled non-UTC nanosecond timestamps
  • Used minimal byte length when encoding decimals for negative powers of two
  • Preserved dictionary encoding in to_arrow_batch_reader
  • Fixed delete_data_file on partitioned tables and residual NotNaN for null partition values
  • Avoided committing update builders after exceptions
  • Preserved write_default when applying a name mapping
  • Handled zero-byte files in fsspec __len__, extracted the ADLS account_name from the URI hostname, and parsed S3 virtual addressing as a boolean
  • Stopped reusing TSaslClientTransport to eliminate server-side SASL noise
  • Rejected unsupported identity transform types, empty source-ids, and decimal precision outside the valid range

Breaking Changes

  • Raised pyarrow minimum from 17.0.0 to 18.0.0 for native UUID type support
  • Bumped pyiceberg-core from >=0.5.1,<0.9.0 to >=0.10.1,<0.11.0, which bundles DataFusion 53.x behind a new datafusion extra
  • NoopCatalog.table_exists now returns False instead of raising
  • Explicitly deleting a data file that's already missing now raises instead of failing silently

Infrastructure Improvements

  • Python 3.14 support
  • Windows unit test job added to CI
  • CodeQL security scanning for GitHub Actions, and a documented Iceberg security model
  • Migrated lockfile management to uv-pre-commit with uv.lock freshness enforced in CI
  • Third-party GitHub Actions pinned to Apache-approved SHAs, with an allowlist check on every PR and least-privilege workflow permissions
  • Papermill-based tests that execute the documentation examples, and a release verification script
  • PR auto-merge enabled

Contributors

$ git shortlog --perl-regexp --author='^((?!dependabot\[bot\]).*)$' -sn pyiceberg-0.11.0..pyiceberg-0.12.0
    44  Kevin Liu
    36  Yuya Ebihara
    12  Anas Khan
    11  Alex Stephen
     7  geruh
     5  Minh Vu
     5  Neelesh Salian
     4  Gabriel Igliozzi
     3  Fokko Driesprong
     3  GayathriSrividya
     3  Junwang Zhao
     3  Sotaro Hikita
     3  jj.lee
     3  vishnu prakash
     2  Aaron Niskode-Dossett
     2  ChangHyeon Im
     2  David
     2  David Dallakyan
     2  Jared Yu (余启正)
     2  Mrutunjay Kinagi
     2  Paul Mathew
     2  Sreesh Maheshwar
     2  Tanmay Rauth
     2  Yingjian Wu
     1  Adam
     1  Antonio
     1  Ben Lai
     1  BharatDeva
     1  CalebWeisgerber
     1  Chris Qiu
     1  David Zhao
     1  Federico
     1  James Bornholt
     1  Jared Yu
     1  Koen Denecker
     1  Kristofer Gaudel
     1  Marcin Szymański
     1  Ménélik Vero
     1  Noritaka Sekiyama
     1  Platon G. Gimp
     1  Pucheng Yang
     1  R. Conner Howell
     1  Rob Reeves
     1  Ruiyang Wang
     1  Sam Verhasselt
     1  Sidra
     1  Sumanth
     1  Sung Yun
     1  Thomas Pfeiffer
     1  Vova Kot
     1  Yong Zheng
     1  abnobdoss
     1  achasnovskiy
     1  antonlin1
     1  barking-code
     1  committobetter
     1  rcjverhoef
     1  shiwk
     1  spr0els

We thank all contributors for their efforts in making this release possible!

Getting Involved

The PyIceberg project welcomes contributions! We use GitHub issues for tracking work and the Apache Iceberg Community Slack for discussions.

The easiest way to get started is to:

  1. Try PyIceberg with your workloads and report any issues you encounter
  2. Review the contributor guide
  3. Look for good first issues

Code review is also a very welcome contribution - please provide feedback on pull requests where you feel comfortable to do so!

For more information, visit the PyIceberg repository or the documentation.

Explore all 60 articles in today's digest

Fresh dev news, AI-digested daily. Never miss a trend at devoured.fyi