This is an automated email from the ASF dual-hosted git repository.
kevinjqliu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git
The following commit(s) were added to refs/heads/main by this push:
new 94250b2527 Site: Add 1.12.0 release blog post (#18344)
94250b2527 is described below
commit 94250b2527f9e24082134be7da247ff5fc55df8c
Author: Neelesh Salian <[email protected]>
AuthorDate: Sun Oct 4 09:49:33 2026 -0700
Site: Add 1.12.0 release blog post (#18344)
---
.../posts/2026-10-05-iceberg-1.12.0-release.md | 210 +++++++++++++++++++++
1 file changed, 210 insertions(+)
diff --git a/site/docs/blog/posts/2026-10-05-iceberg-1.12.0-release.md
b/site/docs/blog/posts/2026-10-05-iceberg-1.12.0-release.md
new file mode 100644
index 0000000000..e8e4e82071
--- /dev/null
+++ b/site/docs/blog/posts/2026-10-05-iceberg-1.12.0-release.md
@@ -0,0 +1,210 @@
+---
+date: 2026-10-05
+title: Apache Iceberg 1.12.0 Release
+slug: apache-iceberg-1.12.0-release
+authors:
+ - iceberg-pmc
+categories:
+ - release
+---
+
+<!--
+ - Licensed to the Apache Software Foundation (ASF) under one or more
+ - contributor license agreements. See the NOTICE file distributed with
+ - this work for additional information regarding copyright ownership.
+ - The ASF licenses this file to You under the Apache License, Version 2.0
+ - (the "License"); you may not use this file except in compliance with
+ - the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing, software
+ - distributed under the License is distributed on an "AS IS" BASIS,
+ - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ - See the License for the specific language governing permissions and
+ - limitations under the License.
+ -->
+
+The Apache Iceberg community is pleased to announce the release of Apache
Iceberg 1.12.0. This release is the result of **777 commits** from **142
contributors** since 1.11.0. See the [release
notes](https://iceberg.apache.org/releases/#1120-release) for the complete list
of changes.
+
+<!-- more -->
+
+## Release Highlights
+
+### Data Types: Variant and Geospatial
+
+This release improves Variant read performance, extends shredded Variant
writes beyond Spark, and adds read and write support for the geospatial types.
+
+**Variant.** Reading unshredded Variant data is now faster in Spark. On both
Spark 4.0 and 4.1, unshredded Variant columns are [read through the vectorized
Parquet path](https://github.com/apache/iceberg/pull/16292) instead of
row-at-a-time decoding.
+
+Variant shredding also uses a stricter layout rule. Shredding now [requires
type uniformity](https://github.com/apache/iceberg/pull/17424): a field is
shredded into a typed column only when all of its values fall into a single
type family (after numeric widening); fields that mix types stay in the untyped
residual. Unlike the previous majority-based rule, which could shred a field
while covering only a fraction of its rows, every typed column now fully covers
its field. Single-type field [...]
+
+Shredded Variant writes are no longer Spark-only. Flink can now [write
shredded Variant](https://github.com/apache/iceberg/pull/15596), and the [Kafka
Connect sink and the generic record
writer](https://github.com/apache/iceberg/pull/17520) can produce shredded
Variant as well, so semi-structured data ingested through those paths benefits
from the same read-time pushdown. Flink also gains [Variant support in Avro
readers and writers](https://github.com/apache/iceberg/pull/17737).
+
+Several correctness and hardening fixes also landed for Variant:
+
+- Shredded-column string bounds are computed in [UTF-8 byte
order](https://github.com/apache/iceberg/pull/17397) and binary upper bounds
[truncate up](https://github.com/apache/iceberg/pull/16880) so pruning stays
correct; bounds also honor the column's [configured truncation
length](https://github.com/apache/iceberg/pull/17342)
+- A [crash computing metrics for a value column with no
statistics](https://github.com/apache/iceberg/pull/16585) is fixed, and
[large-decimal shredding (precision >
18)](https://github.com/apache/iceberg/pull/17002) is corrected
+- The Variant classes are made
[serializable](https://github.com/apache/iceberg/pull/17260), and binary
parsing is [hardened against malformed
input](https://github.com/apache/iceberg/pull/16568)
+- [ORC filter pushdown on tables with a Variant
column](https://github.com/apache/iceberg/pull/17998) is fixed
+
+**Geospatial.** The `geometry` and `geography` types gain read and write
support. Both are stored as Well-Known Binary (WKB) and can now be [read and
written in Avro](https://github.com/apache/iceberg/pull/17119) and [in
Parquet](https://github.com/apache/iceberg/pull/16982), where they map to the
[Parquet geometry and geography logical
types](https://github.com/apache/iceberg/pull/16765) so files are
self-describing; [single-value binary
serialization](https://github.com/apache/iceberg/ [...]
+
+[Spark 4.1](https://github.com/apache/iceberg/pull/17073) is the first engine
with an end-to-end geospatial path: it reads and writes both types in Parquet
and supports row-level `DELETE`, `UPDATE`, and `MERGE` on tables with
geospatial columns, including the merge-on-read, deletion-vector path on format
version 3. Current limitations:
+
+- Support is limited to Spark 4.1 (not Spark 3.5 or 4.0, Flink, or ORC)
+- Reads use the row-based reader; there is no Arrow geospatial vector yet
+- There are no spatial predicates yet, so filters are expressed against
non-geospatial columns
+
+### Deletion Vectors
+
+Deletion vectors gain [co-located access through
`DataFile.deletionVector()`](https://github.com/apache/iceberg/pull/17928), and
get fixes for [references when they share a Puffin
file](https://github.com/apache/iceberg/pull/17497) and [preserved encryption
metadata on merge](https://github.com/apache/iceberg/pull/15911).
+
+### Streaming Deletes
+
+Streaming pipelines that upsert into Iceberg write *equality deletes*: markers
that say "remove every row whose key matches these values." They are cheap to
write but expensive to read, because every query has to re-open data files and
compare values to work out which rows still exist. 1.12.0 adds a Flink-native
maintenance task that resolves those deletes once, instead of on every scan.
+
+**`ConvertEqualityDeletes`.** This new maintenance task resolves the equality
deletes produced during streaming ingest into row-position deletion vectors and
commits them alongside the data files. After conversion, readers apply deletes
by position rather than re-scanning and comparing values, so queries no longer
pay this cost.
+
+It pairs with `IcebergSink`, which stages new data files and equality deletes
on a source branch; the converter resolves those into deletion vectors and
commits to the target branch, or converts in place. Because deletion vectors
are a v3 feature, the task requires table format version 3 or later and runs on
Flink 1.20, 2.1, 2.2, and 2.3. It landed across several changes, including the
[core data model](https://github.com/apache/iceberg/pull/16831) and
[integration with `IcebergSink`](ht [...]
+
+### Data Layout
+
+**Hilbert clustering.** `rewrite_data_files` gains [Hilbert-curve
clustering](https://github.com/apache/iceberg/pull/16827), a new
multi-dimensional sort strategy alongside Z-order. Both map several columns
onto a single space-filling curve so rows with similar values in those columns
are stored together, improving file skipping for multi-column filters. Hilbert
keeps neighboring points on the curve adjacent in the data, without the large
"jumps" across the space that Z-order makes. You [...]
+
+```sql
+CALL system.rewrite_data_files(
+ table => 'db.tbl',
+ strategy => 'sort',
+ sort_order => 'hilbert(c1, c2)'
+);
+```
+
+Hilbert clustering ships for Spark 4.1.
+
+**Other maintenance.** The [`RepairTable` action
interface](https://github.com/apache/iceberg/pull/17399) is defined (a standard
way to repair manifest-entry statistics that disagree with the files they
describe), and Spark's `rewrite_data_files` now accepts the
[`max-file-group-input-files`](https://github.com/apache/iceberg/pull/17544)
option to cap the input files in a single group.
+
+### REST Catalog
+
+The REST catalog protocol picks up several additions, grouped here by layer.
(Finer-grained read restrictions on `loadTable`, a spec-level change, are
covered under Spec Evolution below.)
+
+**OpenAPI protocol.**
[`VariantType`](https://github.com/apache/iceberg/pull/17256) is now
representable in the spec so Variant columns can travel in schemas over the
protocol. Read-only [list and load
function](https://github.com/apache/iceberg/pull/15180) endpoints and an
[unregister-table endpoint](https://github.com/apache/iceberg/pull/16400)
(which detaches a table from a catalog without deleting its data or metadata)
are added, along with [formalized remote signing configuration](h [...]
+
+**Library and client.**
[`CatalogObjectIdentifier`](https://github.com/apache/iceberg/pull/16160) adds
a shared way to name catalog objects, the remote signing configuration gains a
[client implementation](https://github.com/apache/iceberg/pull/17709), and
catalog labels are [read on load
responses](https://github.com/apache/iceberg/pull/18045) and [exposed on the
loaded table via
`SupportsLabels`](https://github.com/apache/iceberg/pull/18046).
+
+### Spec Evolution
+
+The specification evolved alongside the code during this release. These
changes define behavior for current and future table versions; they are not
necessarily engine features shipped in 1.12.0.
+
+The [expressions specification is
adopted](https://github.com/apache/iceberg/pull/16652), giving Iceberg a
formal, engine-independent definition of predicate expressions; the [REST
OpenAPI spec is aligned](https://github.com/apache/iceberg/pull/17138) to it in
the same release, so read-restriction row filters are portable across clients.
+
+[Finer-grained read
restrictions](https://github.com/apache/iceberg/pull/13879) on `loadTable` are
added: a catalog can return a `ReadRestrictions` object in the load response
describing required column projections (column-masking actions such as showing
only the last four characters, replacing a value with null, truncating a
timestamp, hashing, or alphanumeric masking) together with a required row
filter modeled as an Iceberg expression. The contract is client-enforced and
fail-closed: [...]
+
+[Content-file uniqueness](https://github.com/apache/iceberg/pull/17198) is now
spelled out: within a snapshot, each content file must be referenced by at most
one live manifest entry across all manifests, and a snapshot that violates this
has undefined behavior. Smaller clarifications round out the spec work:
[Variant type classification](https://github.com/apache/iceberg/pull/16836) and
[decimal type serialization](https://github.com/apache/iceberg/pull/16798).
+
+### Format V4 Foundations
+
+Work toward Table Format V4 continues. V4 is under active development and has
not been formally adopted: Iceberg 1.12.0 cannot read or write a V4 table, and
everything here is groundwork the next ratified spec version will build on.
+
+**Manifests.** The release adds a [V4 manifest
reader](https://github.com/apache/iceberg/pull/16958) that reads V4 manifests
written in both Parquet and Avro, the [ability to write Parquet and Avro
manifests in the V4 layout](https://github.com/apache/iceberg/pull/15634), and
an [adapter layer](https://github.com/apache/iceberg/pull/17932) with a
[tracked-file metadata model](https://github.com/apache/iceberg/pull/16100)
that surfaces V4-tracked files through the existing `ManifestFile` [...]
+
+**Foundations.** Several structural pieces land: [relative paths in
metadata](https://github.com/apache/iceberg/pull/15630) (backed by
[relativization utilities](https://github.com/apache/iceberg/pull/16174) and
[reader-side resolution](https://github.com/apache/iceberg/pull/17434)), a step
toward relocatable tables; a new [content-statistics spec
addition](https://github.com/apache/iceberg/pull/14234); and a read-only
implementation of the [Mumbling bitmap](https://github.com/apache/ice [...]
+
+### Performance and Reliability
+
+**Faster planning and scans.** [Manifest list files are now
cached](https://github.com/apache/iceberg/pull/16762) in the manifest content
cache, and Parquet gains [adaptive bloom filter
sizing](https://github.com/apache/iceberg/pull/16363) and [per-column
dictionary encoding](https://github.com/apache/iceberg/pull/16713).
+
+**Vectorized reader fixes.** The vectorized Parquet reader gets several
correctness fixes: [`int`-to-`long`
promotion](https://github.com/apache/iceberg/pull/16343) that previously threw
a `ClassCastException`, [decimal columns with default
values](https://github.com/apache/iceberg/pull/16501), [decimals with precision
greater than 18](https://github.com/apache/iceberg/pull/16627),
[dictionary-encoded `VARCHAR`/`VARBINARY` through direct byte
buffers](https://github.com/apache/iceberg/pu [...]
+
+**Sharper pruning.** Predicate pushdown on nanosecond timestamps is fixed in
[Parquet](https://github.com/apache/iceberg/pull/16619) and
[ORC](https://github.com/apache/iceberg/pull/17750), [`notStartsWith` no longer
skips row groups containing
nulls](https://github.com/apache/iceberg/pull/17656), and [null counting is
correct for Parquet files written without
`null_count`](https://github.com/apache/iceberg/pull/17557).
+
+**Core fixes.** [FileIO leaks are fixed and `close()` is standardized across
catalog implementations](https://github.com/apache/iceberg/pull/16862),
[Z-order byte encoding of floating-point values is
corrected](https://github.com/apache/iceberg/pull/17071), [`EncryptingFileIO`
is reworked as a
`DelegateFileIO`](https://github.com/apache/iceberg/pull/14876) so encrypted
tables keep access to underlying I/O capabilities such as bulk operations, and
a [manifest-pruning and residual-evaluati [...]
+
+### Security
+
+This release fixes two HIGH-severity `jackson-databind` CVEs, CVE-2026-54512
and CVE-2026-54513, by [aligning Jackson versions across the runtimes and
bundles](https://github.com/apache/iceberg/pull/16954); a further [Jackson
bump](https://github.com/apache/iceberg/pull/17336) fixes GHSA-r7wm-3cxj-wff9.
Three Jackson findings remain in the Kafka Connect runtime because they come
from the copy of Jackson shaded inside `parquet-jackson`, which cannot be
upgraded independently of Apache Parquet.
+
+The [shaded-jar LICENSE and NOTICE files were cleaned
up](https://github.com/apache/iceberg/pull/16543): duplicate license metadata
was stripped from the cloud and engine bundles, and missing third-party notices
were added.
+
+### Engine Updates
+
+#### Spark
+
+Spark support in 1.12.0 is Spark 3.5, 4.0, and 4.1; [Spark 3.4 support is
removed](https://github.com/apache/iceberg/pull/14122). Notable additions:
+
+- **Delegated PURGE**: `DROP TABLE ... PURGE` can be [delegated to REST
catalogs](https://github.com/apache/iceberg/pull/15614) via the
`rest-catalog-purge` property, on Spark 3.5, 4.0, and 4.1
+- **Tolerant migration**: the
[`snapshot`](https://github.com/apache/iceberg/pull/16710) and
[`migrate`](https://github.com/apache/iceberg/pull/16643) procedures accept
`ignore_missing_files`
+- **Manifest rewrite by sort key**: the [`rewrite_manifests` procedure gains a
`sort_by` parameter](https://github.com/apache/iceberg/pull/18065) on Spark 3.5
and 4.0, matching Spark 4.1
+- **Streaming merge-append**: a [write
config](https://github.com/apache/iceberg/pull/17347) enables merge-append for
Structured Streaming writes, [ported to Spark 3.5 and
4.0](https://github.com/apache/iceberg/pull/17403)
+
+Spark 4.1 also gains geospatial support, described in the Data Types section
above, and Hilbert-curve clustering for `rewrite_data_files`, described in the
Data Layout section above.
+
+#### Flink
+
+Flink support in 1.12.0 is Flink 1.20, 2.1, 2.2, and 2.3; Flink 2.2 and 2.3
are added and Flink 2.0 is removed.
+
+Beyond the equality-delete-to-deletion-vector conversion above, Flink gains
Iceberg view support: it can [read views in
SQL](https://github.com/apache/iceberg/pull/17859) and [create, drop, and
rename them](https://github.com/apache/iceberg/pull/17873) through
`FlinkCatalog` (both backported to 2.2, 2.1, and 1.20).
+
+The Dynamic Sink gains [fine-grained slot-sharing-group
control](https://github.com/apache/iceberg/pull/16065) and several fixes:
+
+- [Honors schema identifier fields when routing
records](https://github.com/apache/iceberg/pull/16243)
+- [Avoids duplicate commits when the Flink job id changes on
restart](https://github.com/apache/iceberg/pull/16011)
+
+#### Kafka Connect
+
+The sink connector now [surfaces commit failures instead of swallowing
them](https://github.com/apache/iceberg/pull/16237), adds [bounded retry for
transient commit exceptions](https://github.com/apache/iceberg/pull/16434) and
a [metric for partial commit
failures](https://github.com/apache/iceberg/pull/16433), and improves offset
handling by [only committing offsets greater than the existing
ones](https://github.com/apache/iceberg/pull/17552) and [tracking control-topic
offsets as a hig [...]
+
+## Breaking Changes
+
+Users upgrading from 1.11.0 should review these before upgrading.
+
+**Removals:**
+
+- **Spark 3.4 removed**: [Spark 3.4 support has been
removed](https://github.com/apache/iceberg/pull/14122); use Spark 3.5, 4.0, or
4.1
+- **Flink 2.0 removed**: [Flink 2.0 support has been
removed](https://github.com/apache/iceberg/pull/17849) (Flink 2.2 and 2.3 are
added), so 1.12.0 supports Flink 1.20, 2.1, 2.2, and 2.3
+- **Position delete files with row data removed**: [writing position deletes
that carry row data is removed](https://github.com/apache/iceberg/pull/17706),
consistent with the move to deletion vectors on format version 3
+- **`DataReader` removed**: [removed in favor of
`PlannedDataReader`](https://github.com/apache/iceberg/pull/17699)
+
+**Deprecated APIs removed:**
+
+- [Partition-stats read
functionality](https://github.com/apache/iceberg/pull/14998) (use the Partition
Stats Scan API)
+- Spark [`SparkFilters`](https://github.com/apache/iceberg/pull/17702),
[`SparkTableUtil` methods](https://github.com/apache/iceberg/pull/17703), and
[`SparkReadConf`/`SparkWriteConf`/`SparkSchemaUtil`
methods](https://github.com/apache/iceberg/pull/17626)
+- Data [`GenericAppenderFactory` and
`BaseFileWriterFactory`](https://github.com/apache/iceberg/pull/17696)
+- AWS [S3 signer classes and
properties](https://github.com/apache/iceberg/pull/17627)
+- Flink
[`RewriteDataFiles.Builder.filter(Expression)`](https://github.com/apache/iceberg/pull/17624)
+- Core [REST namespace encoding
helpers](https://github.com/apache/iceberg/pull/17697) and the
[`HadoopFileIO(SerializableSupplier)`
constructor](https://github.com/apache/iceberg/pull/17704)
+- Kafka Connect [`TableReference` and `IcebergWriterResult`
members](https://github.com/apache/iceberg/pull/17623)
+- BigQuery [catalog property
constants](https://github.com/apache/iceberg/pull/17625)
+- A [final sweep of methods and fields scheduled for 1.12.0
removal](https://github.com/apache/iceberg/pull/17700)
+
+**Behavior changes:**
+
+- **AWS HTTP client**: the default AWS SDK HTTP client [migrated to Apache
HttpClient 5](https://github.com/apache/iceberg/pull/18195); users who manage
their own AWS SDK classpath (that is, those using `iceberg-aws` directly rather
than the `iceberg-aws-bundle`) must switch from
`software.amazon.awssdk:apache-client` to
`software.amazon.awssdk:apache5-client`
+- **Geospatial `toString()`**: [`GeometryType` and `GeographyType`
`toString()`](https://github.com/apache/iceberg/pull/16765) now include the
resolved CRS, and for geography the edge algorithm (for example
`geometry(OGC:CRS84)` and `geography(OGC:CRS84, spherical)`), instead of the
bare type name
+- **REST idempotency retries**: the REST client now [retries POST requests
carrying an `Idempotency-Key`](https://github.com/apache/iceberg/pull/17947) on
retriable errors (408, 500, 502, 503, 504)
+
+## Dependency Updates
+
+Notable dependency updates in 1.12.0:
+
+- **AWS SDK (bom)**: 2.44.4 -> 2.54.17
+- **Jackson (bom)**: 2.21.3 -> 2.22.2
+- **Netty**: 4.2.13.Final -> 4.2.18.Final
+- **Nessie**: 0.107.5 -> 0.108.8
+- **RoaringBitmap**: 1.6.14 -> 1.6.23
+- **Avro**: 1.12.1 -> 1.12.2
+- **ORC**: 1.9.8 -> 1.9.9
+- **Guava**: 33.6.0-jre -> 33.7.1-jre
+- **Caffeine**: 2.9.3 -> 3.2.4
+
+## Getting Involved
+
+Apache Iceberg is developed by a community of contributors. We use GitHub
[issues](https://github.com/apache/iceberg/issues) for tracking work and the
[Apache Iceberg Community Slack](https://iceberg.apache.org/community/#slack)
for discussions.
+
+The easiest way to get started is to:
+
+1. Try Apache Iceberg 1.12.0 with your workloads and report any issues you
encounter
+2. Review the [contributor guide](https://iceberg.apache.org/contribute/)
+3. Look for [good first issues](https://github.com/apache/iceberg/contribute)
+
+For more information, visit the [Apache Iceberg
repository](https://github.com/apache/iceberg) or the
[documentation](https://iceberg.apache.org/docs/latest/).