What's changed
- CREATE SERVER syntax for reading from multiple external (REST) catalogs
- Improved Iceberg compatibility across platforms
- Performance improvements for Iceberg writes
- Various bug fixes and security patches
Upgrading to 3.4.0 or 3.3.5 is recommended to get the latest security patches.
PR list
- Make linting its own workflow by @sfc-gh-npuka in #317
- Export GetNotShippableDescription and CollectNotShippableObjects by @sfc-gh-okalaci in #318
- Bump all versions to 3.4 by @sfc-gh-npuka in #321
- Fix NOT NULL bypass when clamp mode converts values to NULL by @sfc-gh-npuka in #316
- Upload postgres log artifacts to CI by @sfc-gh-dachristensen in #323
- Pin PGINDENT_PG_VERSION by @sfc-gh-npuka in #325
- Bump max_replication_slots in CI by @sfc-gh-dachristensen in #324
- Fix double-free in WaitForResult when pgduck_server crashes mid-query by @sfc-gh-dachristensen in #326
- Fix TIMETZ corruption in Iceberg pushdown/snapshot writes by @sfc-gh-okalaci in #329
- Bound iceberg manifest-rewrite memory under high-churn workloads by @sfc-gh-okalaci in #334
- Allow per-table opt-out of autovacuum data-file compaction by @sfc-gh-okalaci in #335
- Add PAM support to PostgreSQL compile flags and Docker images by @sfc-gh-dachristensen in #313
- Onder/iceberg preserve required on autodetect by @sfc-gh-okalaci in #337
- Optimize pre-commit by avoiding to read stats of unchanged files by @sfc-gh-mslot in #339
- Allow external extensions to register objects to hide from installcheck by @sfc-gh-dachristensen in #340
- Fix double pfree of REST catalog access token after OAuth failure by @sfc-gh-dachristensen in #342
- Mark test_writable_iceberg_table_tx as flaky with reruns=2 by @sfc-gh-dachristensen in #343
- Fix DuckDB identifier and struct value quoting for special characters by @sfc-gh-dachristensen in #297
- Lock down extension-owner SPI / direct-call sites by @sfc-gh-dachristensen in #359
- pg_lake_table: ANALYZE pg_lake catalogs to keep commit-time diff off the N² cliff by @sfc-gh-okalaci in #352
- pg_lake: batch delete in_progress_files by @sfc-gh-okalaci in #354
- Escape JSON identifiers and paths in REST catalog request bodies by @sfc-gh-dachristensen in #358
- Add region detection to FileExists by @sfc-gh-mslot in #351
- Allow narrow temp-table creation under SPI_START_EXTENSION_OWNER by @sfc-gh-dachristensen in #360
- Bump polaris version from 1.2 to 1.5.0 by @sfc-gh-okalaci in #344
- pg_lake_table: tune autovacuum on commit-time diff catalogs by @sfc-gh-okalaci in #362
- pg_lake_table: bulk-INSERT data file catalog changes by @sfc-gh-okalaci in #355
- Fix CI for #327: Fix column type OIDs in pgduck_server row description metadata by @sfc-gh-mslot in #364
- Fix domain types in Iceberg always mapping to string by @sfc-gh-mslot in #370
- Fix base64 newline wrapping that corrupts the GHCR auth header by @sfc-gh-npuka in #374
- Fix misleading iceberg catalog option error messages by @sfc-gh-npuka in #368
- test_common: honor PGLAKE_EXTRA_INITDB_ARGS in initdb by @sfc-gh-dachristensen in #376
- postgres_scanner: convert PostGIS geometry to canonical WKB by @sfc-gh-dachristensen in #377
- pg_extension_base: install ProcessUtility hook before preloading libraries by @sfc-gh-mslot in #381
- New Catalog Configuration via CREATE SERVER by @sfc-gh-npuka in #242
- Reject hour partition transform on time columns (CI) by @sfc-gh-mslot in #379
- Push down array containment operators @> and <@ to DuckDB by @sfc-gh-okalaci in #386
- Invalidate Parquet metadata on explicit uncache (CI) by @sfc-gh-mslot in #378
- Allow r2:// URL scheme (CI) and make supported-URL errors generic by @sfc-gh-mslot in #380
- Support ALTER on external Iceberg tables to redirect path by @sfc-gh-mslot in #387
- pgduck_server: bound DuckDB spill to disk and fail gracefully by @sfc-gh-okalaci in #393
- Add hook in pg_lake_finish_postgres_recovery by @sfc-gh-mslot in #394
- Fix iceberg STRUCT text value escaping for embedded " and \ by @sfc-gh-mslot in #402
- Support copy from and insert..select pushdown with identity and time partitioning by @sfc-gh-mslot in #322
- pg_lake_iceberg: rewrite object_store catalog at least once per minute, include catalog-snapshot-time by @sfc-gh-mslot in #388
- Extract 5 components from rest_catalog.c into sibling source files by @sfc-gh-npuka in #406
- Add AppendReadCSVListClause for multi-file CSV reads by @sfc-gh-mslot in #409
- Set default Parquet row group size to 128 MB by @sfc-gh-mslot in #412
- New Catalog Configuration: Credentials via CREATE USER MAPPING by @sfc-gh-npuka in #255
- Improve logging by reducing noise and logging high-level events by @sfc-gh-mslot in #350
- pg_lake_engine: extract ConvertTypeTree generic type-tree walker by @sfc-gh-okalaci in #410
- iceberg: add compatibility_mode table option (storage no-op) by @sfc-gh-okalaci in #420
- iceberg: surface/storage type mapping for tables, with compatibility_mode on top by @sfc-gh-okalaci in #419
- install.sh: fix pgaudit version tag and add missing gmp-devel dep by @sfc-gh-mslot in #422
- pg_lake_table: parameterize CheckIfTypeIsUsedInInternalIcebergTable by @sfc-gh-npuka in #423
- Drop zero-row split files right after writing them by @sfc-gh-okalaci in #425
- pg_lake_table: reject partition_by on read_only table creation by @sfc-gh-mslot in #426
- Reduce CI flakiness in three iceberg test modules by @sfc-gh-mslot in #396
- Defer Iceberg drop cleanup by resolving metadata at VACUUM by @sfc-gh-okalaci in #427
- Preserve literal "\N" text values across the internal CSV exchange by @sfc-gh-mslot in #429
- Truncate or error on oversize values written to Iceberg per out_of_range_values by @sfc-gh-mslot in #371
- Register Iceberg size-clamp syscache callbacks once, not per cache rebuild by @sfc-gh-mslot in #432
- Fix wrong Iceberg bounds for multi-row-group DECIMAL(38,0) by @sfc-gh-okalaci in #431
Full Changelog: v3.3.0...v3.4.0