Apache Iceberg Rust 0.10.0 Release
The Apache Iceberg community is pleased to announce version 0.10.0 of iceberg-rust.
This release covers development work from early March through early July 2026 and is the result of merging 254 PRs from 40 contributors. See the changelog for the complete list of changes.
iceberg-rust is a native Rust implementation of the Apache Iceberg specification, providing high-performance libraries for reading, writing, and managing Iceberg tables in Rust applications and through Python bindings (pyiceberg-core).
Release Highlights🔗
There have been plenty of contributions across the iceberg-rust library; here's a highlight of a few.
Schema Evolution🔗
This release adds the update_schema action, enabling column addition and removal.
Snapshot Expiration🔗
A new ExpireSnapshotsAction (#2591, #2664, #2667) provides a high-level API for expiring old snapshots, respecting history.expire.* table properties and cleaning up associated statistics file metadata.
Configurable Tokio runtime🔗
A custom tokio Runtime can now be provided when initializing catalogs.
This allows for injecting a customized Tokio runtime into the session.
For example, it is now possible to configure the thread stack size or maximum number of threads programatically.
Writer Improvements🔗
- Content-defined chunking (#2375, #2561): content-defined chunking table properties are now respected for optimizing Parquet file boundaries
- Purge table support: Catalogs now offer a
purge_tablemethod, deleting both metadata and data files
Enhanced DataFusion Integration🔗
- EXPLAIN shows pushed-down limits:
IcebergTableScannow displays limit pushdown in EXPLAIN output for query debugging - IsNaN predicate pushdown: NaN-preserving numeric expressions are now pushed into scans
Reader and Scan Improvements🔗
- Scan I/O metrics:
ArrowReadernow exposes bytes read during scans - FixedBinary(N) support: Added support for fixed-length binary types
- Snappy codec for Avro: Avro files compressed with Snappy can now be read
Table Encryption (Foundational)🔗
Significant groundwork has been laid toward Iceberg's table encryption specification. Writes to encrypted tables are explicitly blocked until the full write path is complete. End-to-end read and write support for encrypted tables is expected in a future release. See the table encryption RFC for the full design.
Storage Improvements🔗
New Storage Backend - HuggingFace Hub🔗
The HuggingFace Hub storage backend was introduced, enabling direct access to Iceberg tables hosted on HuggingFace datasets.
Other improvements🔗
delete_streamon Storage trait: Batch delete operations for efficient cleanup- OpenDAL resolving storage: Automatically resolves the appropriate storage backend based on file path scheme
- Timeout layer for OpenDAL: Added
TimeoutLayerinsideRetryLayerto prevent indefinite hangs - S3 virtual-host-style addressing: Default to virtual-host-style S3 addressing for broader compatibility
Bug Fixes🔗
Notable correctness fixes or other validation improvements in this release:
- INT96 timestamp values: Fixed incorrect Parquet INT96 timestamp interpretation
- Nested type column indices: Fixed
build_fallback_field_id_mapproducing incorrect indices for schemas with nested types - Delete-only manifests in FastAppend: Preserved delete-only manifests that were incorrectly dropped
- DeleteFileIndex lost wakeup: Fixed a hang caused by a lost-wakeup race in
get_deletes_for_data_file - Row group byte range filtering: Fixed row duplication for sub-row-group file splits
- Cross-engine decimal compatibility: Added space in decimal type serialization for compatibility with other engines
- NaN pushdown correctness: Fixed NaN pushdown to correctly handle NaN values
- Puffin magic number validation: Added missing validation for magic number at the start of a Puffin file
- Glue catalog filtering: Only list Iceberg tables, not all Glue tables
- Empty insert handling: INSERT operations that produce no rows now correctly return a single row with count 0
- Name-mapped field IDs: Projection and predicate pushdown now correctly use name-mapped field IDs for Parquet files without embedded field IDs
- Snapshot summary total fields: Total values are now omitted if the previous summary had unparsable or no previous total.
- Negative positional delete positions: Negative positions now error during evaluation instead of wrapping to large u64 offsets
- Non-append insert rejection: Overwrite/replace inserts in DataFusion are now rejected instead of silently succeeding with append semantics
- Snapshot summary metrics: User-supplied properties can no longer override computed summary metrics
Breaking Changes🔗
Here's a few notable breaking changes.
Given iceberg-rust has not yet reached version 1.x, breaking changes are adopted for a better API long-term.
- Purge table: Added
purge_tableto theCatalogtrait; some catalog implementations moved their data-deletion logic fromdrop_tabletopurge_table - Compression codec enum: Codec enum variant changes introducing Snappy, and including compression levels in Zstd and Gzip.
- Custom Runtime in Catalog: Added
with_runtimeto theCatalogBuildertrait - DefaultLocationGenerator:
new()now borrowsTableMetadatainstead of taking ownership - MSRV: Bumped to Rust 1.94
Dependency Updates🔗
This release included a number of dependency updates, including upgrading to Apache DataFusion 53 and Apache Arrow 58. For a full list of dependency versions, the best resources to review are the Cargo manifests.
Infrastructure Improvements🔗
- Public API stability: cargo-public-api checks on every PR to catch unintentional API breakage
- Trusted publishing: Migrated to trusted publishing for crates.io releases
- Standalone compilation: CI verifies each crate compiles independently
- Security: Pinned all third-party actions to Apache-approved SHAs; ASF allowlist check on every PR
- Performance: Disabled debuginfo and incremental compilation in CI; Rust caches saved only from main
What's Next🔗
Work is already underway on several features for upcoming releases:
- Table encryption: With the foundational encryption stack landed, the community is working toward end-to-end encrypted reads and writes
- Transaction layer improvement: We are working on adding the snapshot validation mechanism to detect write conflicts, laying the groundwork for future support of RewriteDataFiles, RowDelta, and Overwrite commit operations.
Getting Involved🔗
The iceberg-rust 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:
- Try
iceberg-rustwith your workloads and report any issues you encounter - Review the contributor guide
- 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 iceberg-rust repository.