E.1. Release 19
Prev | Up | Appendix E. Release Notes | Home | Next

## E.1. Release 19 #

Release date: 2026-??-??, AS OF 2026-07-18

### E.1.1. Overview #

PostgreSQL 19 contains many new features and enhancements, including:

- Support for property graph queries (SQL/PGQ).

- A new `REPACK` command that reclaims disk space and reorganizes table contents, combining the functionality of the existing `VACUUM FULL` and `CLUSTER` commands. Its `CONCURRENTLY` option allows repacking without blocking reads and writes to the table.

- Logical replication now replicates sequence values and can be enabled without a server restart when wal_level is set to `replica`.

- Autovacuum can now use parallel worker processes to vacuum a table's indexes, and a new scoring system prioritizes the tables that most need vacuuming or analyzing.

- Data checksums can now be enabled or disabled while the database server is running.

- A new `WAIT FOR` command that waits until a standby has replayed changes up to a chosen point, thereby supporting “read-your-writes” query patterns on standbys.

- Support for temporal updates and deletes via the new `FOR PORTION OF` clause.

- A new pg_plan_advice extension for stabilizing and controlling the query planner's decisions, and a companion pg_stash_advice extension that applies this advice automatically based on the query.

- Better performance in many areas, including automatic scaling of the number of I/O worker processes, quicker foreign-key checks, and further planning and execution optimizations.

The above items and other new features of PostgreSQL 19 are explained in more detail in the sections below.

### E.1.2. Migration to Version 19 #

A dump/restore using pg_dumpall or use of pg_upgrade or logical replication is required for those wishing to migrate data from any previous release. See Section 18.6 for general information on migrating to new major releases.

Version 19 contains a number of changes that may affect compatibility with previous releases. Observe the following incompatibilities:

- Add server variable `password_expiration_warning_threshold` to warn about password expiration (Gilles Darold, Nathan Bossart) §

  The default warning period is seven days.

- Issue a warning after successful MD5 password authentication (Nathan Bossart) §

  The warning can be disabled via server variable `md5_password_warnings`. MD5 passwords were marked as deprecated in PostgreSQL 18.

- Remove RADIUS support (Thomas Munro) §

  PostgreSQL only supported RADIUS over UDP, which is unfixably insecure.

- Force `standard_conforming_strings` to always be `on` in the database server (Tom Lane) §

  Dumps created using pre-PostgreSQL 19 versions of pg_dump or pg_dumpall, and using `standard_conforming_strings = off`, will not properly load into PostgreSQL 19 and later servers. Users should create dumps using PostgreSQL 19 or later versions of these applications, or use `standard_conforming_strings = on`.

  Client applications still support operations with servers having `standard_conforming_strings = off`, for compatibility with old servers. The server variable `escape_string_warning` has been removed as unnecessary.

- Disallow carriage returns and line feeds in database, role, and tablespace names (Mahendra Singh Thalor) §

  pg_upgrade will also disallow upgrading of clusters that use such names. This was changed to avoid security problems.

- Change the default index opclasses for `inet` and `cidr` data types from btree_gist to GiST (Tom Lane) § §

  The btree_gist `inet`/`cidr` opclasses are broken because they can exclude rows that should be returned. pg_upgrade will disallow upgrading of clusters with btree_gist `inet`/`cidr` indexes.

- Stop reordering non-schema objects created by `CREATE SCHEMA` (Tom Lane, Jian He) § §

  The goal of the reordering was to avoid dependencies, but it was imperfect. PostgreSQL now uses the specified object ordering, except for foreign keys which are created last.

- Disallow system columns from being used in `COPY FROM ... WHERE` (Tom Lane) §

  The values of such columns were not well-defined.

- Change a `json_array()` call which returns no rows to return an empty JSON array (Richard Guo) §

  This previously returned `NULL`.

- Cause transactions to pass their `READ ONLY` and `DEFERRABLE` status to postgres_fdw sessions (Etsuro Fujita) §

  This means `READ ONLY` transactions can no longer modify rows processed by postgres_fdw sessions.

- Change default of `max_locks_per_transaction` from 64 to 128 (Heikki Linnakangas) §

  Lock size allocation has changed, so effectively settings must now be doubled to match their capacity in previous releases.

- Change JIT to be disabled by default (Jelte Fennema-Nio) §

  Previously JIT was enabled by default, and activated based on optimizer costs, but this costing has been determined to be unreliable. This change requires sites that are doing many large analytical queries to manually enable JIT.

- Rename column `sync_error_count` to `sync_table_error_count` in system view `pg_stat_subscription_stats` (Vignesh C) §

  This is necessary since sequence errors are now tracked separately.

- Rename wait event type `BUFFERPIN` to `BUFFER` (Andres Freund) §

- Change index access method handlers to use a static `IndexAmRoutines` structure, rather than dynamically allocated ones (Matthias van de Meent) §

- Remove optimizer hook get_relation_info_hook and add better-placed hook build_simple_rel_hook (Robert Haas) §

- Change psql's `\crosstabview` command to honor the `\pset null` setting (Chao Li) §

- Remove `MULE_INTERNAL` encoding (Thomas Munro) §

  This encoding was complex and rarely used. Databases using it will need to be dumped and restored with a different encoding.

### E.1.3. Changes #

Below you will find a detailed account of the changes between PostgreSQL 19 and the previous major release.

#### E.1.3.1. Server #

##### E.1.3.1.1. Optimizer #

- Allow `NOT IN` clauses to be converted to more efficient `ANTI JOIN`s when NULLs are not present (Richard Guo) §

- Allow more `LEFT JOIN`s to be converted to `ANTI JOIN`s (Tender Wang, Richard Guo) §

- Allow use of Memoize for `ANTI JOIN`s with unique inner sides (Richard Guo) §

- Allow some aggregate processing to be performed before joins (Richard Guo, Antonin Houska) § § §

  This can reduce the number of rows needed to be processed.

- Improve hash join's handling of tuples with `NULL` join keys (Tom Lane) §

- Improve the planning of semijoins (Richard Guo) §

- Allow Append and MergeAppend to consider explicit incremental sorts (Richard Guo) §

- Convert `IS [NOT] DISTINCT FROM NULL` to `IS [NOT] NULL` during constant folding (Richard Guo) §

  The latter form is more easily optimized.

- Simplify `IS [NOT] DISTINCT FROM` to equality/inequality operators when inputs are proven non-nullable (Richard Guo) §

- Perform earlier constant folding of `var` `IS [NOT] NULL` in the optimizer (Richard Guo) §

  This allows for later optimizations.

- Simplify `COALESCE()` and `ROW(...) IS [NOT] NULL` to avoid evaluating unnecessary arguments (Richard Guo) § §

- Simplify `IS [NOT] TRUE/FALSE/UNKNOWN` to plain boolean expressions when the input is proven non-nullable (Richard Guo) §

- Speed up join selectivity computations for large optimizer statistics targets (Ilia Evdokimov, David Geier) §

- Enable proper optimizer statistics for functions returning boolean values (Tom Lane) §

- Allow extended statistics on virtual generated columns (Yugo Nagata) §

- Allow function `pg_restore_extended_stats()` to restore optimizer extended statistics (Corey Huinker, Michael Paquier, Chao Li) § § § §

- Add function `pg_clear_extended_stats()` to remove extended statistics (Corey Huinker, Michael Paquier) §

- Adjust the optimizer to consider startup costs of partial paths (Robert Haas, Tomas Vondra) §

- Allow negative values of `pg_aggregate`.`aggtransspace` to indicate unbounded memory usage (Richard Guo) §

  This information is used by the optimizer in planning memory usage.

##### E.1.3.1.2. General Performance #

- Improve performance of foreign key constraint checks (Junwang Zhao, Amit Langote, Chao Li) § § § §

- Improve asynchronous I/O read-ahead scheduling for large requests (Andres Freund) § § §

- Allow `io_method` method `worker` to automatically control needed background workers (Thomas Munro) §

  The new server variables are `io_min_workers`, `io_max_workers`, `io_worker_idle_timeout`, and `io_worker_launch_interval`.

- Allow query table scans to mark pages as all-visible in the visibility map (Melanie Plageman) §

  Previously only `VACUUM` and `COPY ... FREEZE` could do this.

- Allow autovacuum to use `parallel autovacuum workers` (Daniil Davydov) § §

  The maximum number of workers is controlled by server variable `autovacuum_max_parallel_workers` and per-table storage parameter `autovacuum_parallel_workers`.

- Allow `TID` Range Scans to be parallelized (Cary Huang, David Rowley) §

- Improve `COPY FROM` performance for text and CSV input using SIMD CPU instructions (Nazir Bilal Yavuz, Shinya Kato) §

- Improve `NOTIFY` to only wake up backends that are listening to specified notifications (Joel Jacobson) §

  Previously most backends were woken by `NOTIFY`.

- Change the default TOAST compression method from `pglz` to the more efficient `lz4` (Euler Taveira) §

  This is done by changing the default for server variable `default_toast_compression`.

- Improve performance of internal row deformation (David Rowley) §

- Improve performance of repeated UTF-8 case-folding operations (Andreas Karlsson) §

- Improve performance of hash index bulk-deletion and `GIN` index vacuuming using streaming reads (Xuneng Zhou) § §

- Improve sort performance using radix sort (John Naylor) §

- Improve timing performance measurements (Lukas Fittl, Andres Freund, David Geier) § §

  This benefits `EXPLAIN (ANALYZE, TIMING)` and pg_test_timing, and is controlled via server variable `timing_clock_source`.

- Optimize plpgsql syntax `SELECT simple-expression INTO` `var` (Tom Lane) §

##### E.1.3.1.3. System Views #

- Add system view `pg_stat_lock` and function `pg_stat_get_lock()` to report per-lock-type statistics (Bertrand Drouvot) §

- Add system view `pg_stat_recovery` to report recovery status (Xuneng Zhou, Shinya Kato) § §

- Add system view `pg_stat_autovacuum_scores` to report per-table autovacuum details (Sami Imseih) §

- Add system view `pg_dsm_registry_allocations` to report dynamic shared memory details (Florents Tselai, Nathan Bossart) § §

- Add vacuum initiation details to system view `pg_stat_progress_vacuum` (Shinya Kato) §

  The new `started_by` column reports the initiator of the vacuum, and `mode` indicates its aggressiveness.

- Add analyze initiation details to system view `pg_stat_progress_analyze` (Shinya Kato) §

  The new `started_by` column reports the initiator of the analyze.

- Add `mem_exceeded_count` column to system view `pg_stat_replication_slots` (Bertrand Drouvot) §

  This reports the number of times that `logical_decoding_work_mem` was exceeded.

- Add slot synchronization skip information to `pg_stat_replication_slots` and `pg_replication_slots` (Shlok Kyal) § § §

  The new columns are `slotsync_skip_count`, `slotsync_last_skip`, and `slotsync_skip_reason`.

- Add `update_deleted` column to system view `pg_stat_subscription_stats` (Zhijie Hou) §

  This reports the number of rows where updates were ignored due to concurrent deletes. This requires the subscriber have `retain_dead_tuples` enabled.

- Add `sync_seq_error_count` column to system view `pg_stat_subscription_stats` to report sequence synchronization errors (Vignesh C) § §

- Add `stats_reset` column to system views `pg_stat_all_tables`, `pg_stat_all_indexes`, and `pg_statio_all_sequences` (Bertrand Drouvot, Sami Imseih, Shihao Zhong) §

  It also appears in the `sys` and `user` view variants.

- Add `stats_reset` column to system views `pg_stat_user_functions` and `pg_stat_database_conflicts` (Bertrand Drouvot, Shihao Zhong) § §

- Add `location` column to system views `pg_available_extensions` and `pg_available_extension_versions` to report the file system directory of extensions (Matheus Alcantara) §

- Add `backup_type` column to system view `pg_stat_progress_basebackup` to report the type of backup (Shinya Kato) §

  Possible values are `full` or `incremental`.

- Add `connecting` value to system view column `pg_stat_wal_receiver`.`status` (Xuneng Zhou) §

- Add reporting of the bytes written to WAL for full page images (Shinya Kato) §

  This is accessible via system view `pg_stat_wal` and function `pg_stat_get_backend_wal()`.

- Add columns to system views `pg_stats`, `pg_stats_ext`, and `pg_stats_ext_exprs` (Corey Huinker) §

  Adds table `OID` and attribute number columns to `pg_stats`, and table `OID` and statistics object `OID` columns to the other two.

- Add information about range type extended statistics to system view `pg_stats_ext_exprs` (Corey Huinker, Michael Paquier) §

##### E.1.3.1.4. Monitoring #

- Allow `log_min_messages` log levels to be specified by process type (Euler Taveira) §

  The new format is `type`:`level`. A value without a colon controls all process types, allowing backward compatibility.

- Add server variable `log_autoanalyze_min_duration` to log long-running analyze operations by autovacuum operations (Shinya Kato) §

  Server variable `log_autovacuum_min_duration` now only controls logging of vacuum operations by autovacuum.

- Enable server variable `log_lock_waits` by default (Laurenz Albe) §

- Add server variable `debug_print_raw_parse` to log raw parse trees (Chao Li) §

  This is also enabled when the server is started with debug level three and higher.

- Make messages coming from remote servers appear in the server logs in the same format as local server messages (Vignesh C) §

  These include replication, postgres_fdw, and dblink servers.

- Add reporting of WAL full-page write bytes to `VACUUM` and `ANALYZE` logging (Shinya Kato) §

- Add IO wait events for `COPY FROM/TO` on a pipe, file, or program (Nikolay Samokhvalov) §

- Add wait events for WAL write and flush LSNs (Xuneng Zhou) §

- Have `pg_get_sequence_data()` return the sequence page LSN (Vignesh C) §

- Add function `pg_get_multixact_stats()` to report multixact activity (Naga Appani) §

- Issue warnings when the wraparound of xid and multi-xids is less than 100 million (Nathan Bossart) §

  The previous warning was 40 million. Warnings are issued to clients and in the server log.

##### E.1.3.1.5. Server Configuration #

- Allow online enabling and disabling of data checksums (Daniel Gustafsson, Magnus Hagander, Tomas Vondra) § §

  Previously the checksum status could only be changed while the cluster was offline using pg_checksums.

- Add scoring system to control the order that tables are processed by autovacuum (Nathan Bossart) §

  The new server variables are `autovacuum_freeze_score_weight`, `autovacuum_multixact_freeze_score_weight`, `autovacuum_vacuum_score_weight`, `autovacuum_vacuum_insert_score_weight`, and `autovacuum_analyze_score_weight`.

- Add server-side support for SNI (Server Name Indication) (Daniel Gustafsson, Jacob Champion) §

  New configuration file `PGDATA/pg_hosts.conf` specifies hostname/key pairs.

- Allow OAuth validators to register custom `pg_hba.conf` authentication options (Jacob Champion, Zsolt Parragi) §

- Allow roles `pg_read_all_data` and `pg_write_all_data` to read/write large objects (Nitin Motiani, Nathan Bossart) §

  These roles are designed to allow non-super users to run pg_dump.

- Allow background workers to be configured to terminate before database-level operations (Aya Iwata) §

  This allows database-level operations to complete more quickly since blocking background workers can now be terminated.

- Allow server variables that represent lists to be emptied by setting the value to `NULL` (Tom Lane) §

- Update GB18030 encoding from version 2000 to 2022 (Chao Li, Zheng Tao) §

  See the commit message for compatibility details.

##### E.1.3.1.6. Streaming Replication and Recovery #

- Add `WAIT FOR` command to allow standbys to wait for LSN values to be written, flushed, or replayed (Kartyshov Ivan, Alexander Korotkov, Xuneng Zhou) § §

- Improve function `pg_sync_replication_slots()` to wait for replication synchronization completion (Ajin Cherian, Zhijie Hou) §

  Previously, certain synchronization failures would not be reported.

- Add server variable `wal_sender_shutdown_timeout` to limit replica synchronization waits during shutdown (Andrey Silitskiy, Hayato Kuroda) §

  By default, senders still wait forever for synchronization.

- Allow `wal_receiver_timeout` to be set per-subscription and user (Fujii Masao) § §

  This allows subscribers to use different `wal_receiver_timeout` values.

- Add optional pid parameter to `pg_replication_origin_session_setup()` to allow parallelization of SQL-level replication solutions (Doruk Yilmaz, Hayato Kuroda) §

##### E.1.3.1.7. Logical Replication #

- Allow sequence values stored in subscribers to match the publisher (Vignesh C) § § §

  This is enabled during `CREATE SUBSCRIPTION`, `ALTER SUBSCRIPTION ... REFRESH PUBLICATION`, and `ALTER SUBSCRIPTION ... REFRESH SEQUENCES`. The latter only updates values, not sequence existence. Function `pg_get_sequence_data()` allows inspection of sequence synchronization.

- Allow `CREATE`/`ALTER PUBLICATION` to publish all sequences (Vignesh C, Tomas Vondra) §

  This is enabled with the `ALL SEQUENCES` clause.

- Allow `ALTER SUBSCRIPTION` on publications to synchronize the existence of sequences on subscribers to match the publisher (Vignesh C) §

  This is enabled with the `REFRESH SEQUENCES` clause.

- Allow `CREATE`/`ALTER PUBLICATION` to exclude some tables (Vignesh C, Shlok Kyal) § § § §

  This is controlled with the `EXCEPT` clause, and is useful when specifying `ALL TABLES`.

- Add `CREATE`/`ALTER PUBLICATION` setting `retain_dead_tuples` to retain information needed for conflict resolution (Zhijie Hou) § § §

  Also add setting `max_retention_duration` to limit `retain_dead_tuples` retention.

- Allow `CREATE SUBSCRIPTION` to use postgres_fdw foreign data wrapper connection parameters (Jeff Davis) §

  The connection parameters are referenced via `CREATE SUBSCRIPTION ... SERVER`.

- When server variable `wal_level` is `replica`, allow automatic enablement of logical replication when needed (Masahiko Sawada) §

  New server variable `effective_wal_level` reports the effective WAL level.

#### E.1.3.2. Query Commands #

- Add support for SQL Property Graph Queries (SQL/PGQ) (Peter Eisentraut, Ashutosh Bapat) § § §

  Internally these are processed like views so are written as standard relational queries.

- Add `FOR PORTION OF` clause to `UPDATE` and `DELETE` (Paul A. Jungwirth) § §

  This allows operations on temporal ranges.

- Allow `GROUP BY` to process target list subqueries that have expressions referencing non-subquery columns (Tom Lane) §

  Also fix a bug in how `GROUPING()` handles target list subquery aliases.

- Allow window functions to ignore NULLs with the `IGNORE NULLS`/`RESPECT NULLS` clause (Oliver Ford, Tatsuo Ishii) §

  Supported window functions are `lead()`, `lag()`, `first_value()`, `last_value()`, and `nth_value()`.

- Add support for `INSERT ... ON CONFLICT DO SELECT ... RETURNING` (Andreas Karlsson, Marko Tiikkaja, Viktor Holmberg) §

  This allows conflicting rows to be returned, and optionally locked with `FOR UPDATE`/`SHARE`.

#### E.1.3.3. Utility Commands #

- Add `REPACK` command which replaces `VACUUM FULL` and `CLUSTER` (Antonin Houska) §

  The two former commands did similar things, but with confusing names, so unify them as `REPACK`. The old commands have been retained for compatibility.

- Allow `REPACK` to rebuild tables without access-exclusive locking (Antonin Houska, Mihail Nikalayeu, Álvaro Herrera) § § §

  This is enabled via the `CONCURRENTLY` option. Server variable `max_repack_replication_slots` was also added.

- Allow partitions to be merged and split using `ALTER TABLE ... MERGE/SPLIT PARTITIONS` (Dmitry Koval, Alexander Korotkov, Tender Wang, Richard Guo, Dagfinn Ilmari Mannsåker, Fujii Masao, Jian He) § §

- Allow `GRANT`/`REVOKE` to specify the effective role performing the privileges adjustment (Nathan Bossart, Tom Lane) §

  The `GRANTED BY` clause controls this.

- Allow `CREATE SCHEMA` to create more types of objects in newly-created schemas (Kirill Reshke, Jian He, Tom Lane) §

- Allow `CHECKPOINT` to accept a list of options (Christoph Berg) § § §

  Supported options are `MODE` and `FLUSH_UNLOGGED`.

- Add `CONNECTION` clause to `CREATE FOREIGN DATA WRAPPER` to specify a function to be called for subscription connection parameters (Jeff Davis, Noriyoshi Shinoda) § §

- Add memory usage and parallelism reporting to `VACUUM (VERBOSE)` and autovacuum logs (Tatsuya Kawata, Daniil Davydov) § §

##### E.1.3.3.1. Constraints #

- Allow `ALTER TABLE ALTER CONSTRAINT ... [NOT] ENFORCED` for `CHECK` constraints (Jian He) §

  Previously enforcement changes were only supported for foreign key constraints.

- Allow `ALTER TABLE ... COLUMN SET EXPRESSION` to succeed on virtual columns with `CHECK` constraints (Jian He) §

  This was previously prohibited.

##### E.1.3.3.2. COPY #

- Allow multiple headers lines to be skipped by `COPY FROM` (Shinya Kato, Fujii Masao) §

  Previously only a single header line could be skipped.

- Allow `COPY FROM` to set invalid input values to `NULL` (Jian He, Kirill Reshke) §

  This is done using the `COPY` option `ON_ERROR SET_NULL`.

- Allow `COPY TO` to output JSON format (Joe Conway, Jian He, Andrew Dunstan) § §

  JSON output can also be a single JSON array using the `COPY` option `FORCE_ARRAY`.

- Allow `COPY TO` to process partitioned tables (Jian He, Ajin Cherian) § §

  Previously `COPY (SELECT ...)` had to be used to output partitioned tables. This also improves logical replication table synchronization.

##### E.1.3.3.3. EXPLAIN #

- Add `EXPLAIN ANALYZE` option `IO` to report asynchronous IO activity (Tomas Vondra) § § §

- Add reporting of WAL full-page write bytes to `EXPLAIN (ANALYZE, WAL)` output (Shinya Kato) §

- Add Memoize cache and lookup estimates to `EXPLAIN` output (Ilia Evdokimov, Lukas Fittl) §

  This can show why Memoize was chosen.

#### E.1.3.4. Data Types #

- Add the 64-bit unsigned data type `oid8` (Michael Paquier) §

- Add more `jsonpath` string methods (Florents Tselai, David E. Wheeler) §

  They are `ltrim()`, `rtrim()`, `btrim()`, `lower()`, `upper()`, `initcap()`, `replace()`, and `split_part()`. These are immutable like their non-JSON string variants.

- Allow casts between `bytea` and `uuid` data types (Dagfinn Ilmari Mannsåker, Aleksander Alekseev) §

- Add ability to cast between database names and `oid8`s using `regdatabase` (Ian Lawrence Barwick) §

- Add functions `tid_block()` and `tid_offset()` to extract block numbers and offsets from `tid` values (Ayush Tiwari) §

#### E.1.3.5. Functions #

- Add `date`, `timestamp`, and `timestamptz` versions of `random(min, max)` (Damien Clochard, Dean Rasheed) § §

- Allow `encode()` and `decode()` to process data in `base64url` and `base32hex` formats (Andrey Borodin, Aleksander Alekseev, Florents Tselai) § § §

  This format retains ordering, unlike `base32`.

- Add functions to return a set of ranges resulting from range subtraction (Paul A. Jungwirth) §

  The functions are `range_minus_multi()` and `multirange_minus_multi()`. This is useful to represent range subtraction results with gaps.

- Add function `error_on_null()` to return the supplied parameter, or error on `NULL` input (Joel Jacobson) §

- Allow `IS JSON` to work on domains defined over supported base types (Jian He) §

  The supported base types are `TEXT`, `JSON`, `JSONB`, and `BYTEA`.

- Add full text stemmers for Polish and Esperanto (Tom Lane) §

  The Dutch stemmer has also been updated. The old Dutch stemmer is available via `dutch_porter`.

- Add function `pg_get_role_ddl()` to output role creation commands (Mario Gonzalez, Bryan Green, Andrew Dunstan, Euler Taveira) §

- Add function `pg_get_tablespace_ddl()` to output tablespace creation commands (Nishant Sharma, Manni Wood, Andrew Dunstan, Euler Taveira) §

- Add function `pg_get_database_ddl()` to output database creation commands (Akshay Joshi, Andrew Dunstan, Euler Taveira) §

- Allow event triggers to be written using PL/Python (Euler Taveira, Dimitri Fontaine) §

#### E.1.3.6. Libpq #

- Allow libpq connections to specify a service file via `servicefile` (Torsten Förtsch, Ryo Kanbayashi) §

- Add special libpq protocol parameters for compatibility testing (Jelte Fennema-Nio, Jacob Champion) §

  Otherwise known as protocol grease, which was active during the 19 beta period. These will no longer be sent as of the PostgreSQL 19 official release, but the parameter reservations will remain for potential use in the future.

- Add libpq connection parameter `oauth_ca_file` to specify an alternate certificate authority when communicating with OAuth providers (Jonathan Gonzalez V., Jacob Champion) §

  This can also be set via the `PGOAUTHCAFILE` environment variable. The default is to use curl's built-in certificates.

- Allow libpq environment variable `PGOAUTHDEBUG` to specify particular debug options (Zsolt Parragi, Jacob Champion) §

  The `UNSAFE` option still generates all debugging output.

- Improve custom OAuth client flows (Jacob Champion) § §

  Previously, libpq reported only a generic error message during custom flow failures, and each flow implementation was required to calculate the issuer identifier independently. Add a new authdata hook type `PQAUTHDATA_OAUTH_BEARER_TOKEN_V2` that precomputes the issuer ID and lets hooks provide error details.

- Add libpq function `PQgetThreadLock()` to retrieve the current locking callback (Jacob Champion) §

#### E.1.3.7. psql #

- Allow the search path to appear in the psql prompt via `%S` (Florents Tselai) §

  This works when psql is connected to PostgreSQL 18 or later.

- Allow the hot standby status to appear in the psql prompt via `%i` (Jim Jones) §

- Modify psql backslash commands to show comments for publications, subscriptions, and extended statistics (Fujii Masao, Jim Jones) §

  The modified commands are `\dRp+`, `\dRs+`, and `\dX+`.

- Allow control over how booleans are displayed in psql (David G. Johnston) §

  The \pset variables are `display_true` and `display_false`.

- Add psql variable `SERVICEFILE` to reference the service file location (Ryo Kanbayashi) §

- Allow psql to more accurately determine if the pager is needed (Erik Wienhold) §

- Add or improve psql tab completion (Yamaguchi Atsuo, Yugo Nagata, Haruna Miwa, Xuneng Zhou, Dagfinn Ilmari Mannsåker, Fujii Masao, Álvaro Herrera, Jian He, Tatsuya Kawata, Ian Lawrence Barwick, Vasuki M) § § § § § § § § § § § § § §

#### E.1.3.8. Server Applications #

- Allow pg_dump to include restorable extended statistics (Corey Huinker) §

- Change vacuumdb's `--analyze-only` and `--analyze-in-stages` options to analyze partitioned tables when no targets are specified (Laurenz Albe, Mircea Cadariu, Chao Li) § §

  Previously it skipped partitioned tables. This now matches the behavior of `ANALYZE`.

- Allow vacuumdb to report its commands without running them using option `--dry-run` (Corey Huinker) §

- Allow pg_verifybackup to read WAL files stored in tar archives (Amul Sul) §

  Add option `--wal-path` as an alias for the existing and deprecated `--wal-directory` option.

- Allow pg_waldump to read WAL files stored in tar archives (Amul Sul) §

- Improve performance of pg_upgrade copying large object metadata (Nathan Bossart) § § § §

  Various methods are used, depending on the PostgreSQL version of the old cluster.

- Allow pg_upgrade to process non-default tablespaces stored in the `PGDATA` directory (Nathan Bossart) §

  Previously such tablespaces generated an error.

- Add pgbench option `--continue-on-error` to continue after SQL errors (Rintaro Ikeda, Yugo Nagata, Fujii Masao) §

- Improve the usability of pg_test_timing (Hannu Krosing, Tom Lane) § §

  Report nanoseconds instead of microseconds. In addition to histogram output, output a second table that reports exact timings, with an optional cutoff set by `--cutoff`.

##### E.1.3.8.1. pg_createsubscriber #

- Allow pg_createsubscriber to ignore specified publications that already exist (Shubham Khanna) §

  Previously this generated an error.

- Change the way pg_createsubscriber stores recovery parameters (Alyona Vinter) §

  Changes are stored in optionally-included `pg_createsubscriber.conf` rather than directly in `postgresql.auto.conf`.

- Add pg_createsubscriber option `-l`/`--logdir` to redirect output to files (Gyan Sreejith, Hayato Kuroda) §

#### E.1.3.9. Source Code #

- Restore support for AIX (Aditya Kamath, Srirama Kucherlapati, Peter Eisentraut) § §

  This uses gcc and only supports 64-bit builds.

- Change Solaris to use unnamed POSIX semaphores (Tom Lane) §

  Previously it used System V semaphores.

- Require Visual Studio 2019 or later (Peter Eisentraut) §

- Allow MSVC to create PL/Python using the Python Limited API (Bryan Green) §

- Allow building on AArch64 using MSVC (Niyas Sait, Greg Burd, Dave Cramer) §

- Allow execution stack backtraces on Windows using `DbgHelp` (Bryan Green) §

- Change the supported C language version to C11 (Peter Eisentraut) § §

  Previously C99 was used.

- Use standard C23 and C++ attributes if available (Peter Eisentraut) §

- Use AVX2 CPU instructions for calculating page checksums (Matthew Sterrett, Andrew Kim) §

- Use ARM Crypto Extension to Compute CRC32C (John Naylor) §

- Change `hex_encode()` and `hex_decode()` to use SIMD CPU instructions (Nathan Bossart, Chiranmoy Bhattacharya) §

- Require Meson version 0.57.2 or later (Peter Eisentraut) §

- Add Meson option to build both shared and static libraries, or only shared (Peter Eisentraut) §

- Update Unicode data to version 17.0.0 (Peter Eisentraut) §

- Add hooks `planner_setup_hook`, `planner_shutdown_hook`, `joinrel_setup_hook`, and `join_path_setup_hook` (Robert Haas) § §

- Allow extensions to replace set-returning functions in the `FROM` clause with SQL queries (Paul A. Jungwirth) §

- Make multixid members 64-bit (Maxim Orlov) §

- Change function prototypes to use `uint*` instead of `bit*` typedefs (Nathan Bossart) §

- Allow logical decoding plugins to specify if they do not access shared catalogs (Antonin Houska) §

- Allow OAuth validators to supply failure details (Jacob Champion) §

  This is done by setting the `ValidatorModuleResult` structure member error_detail.

- Add simplified and improved shared memory registration function `ShmemRequestStruct()` (Heikki Linnakangas, Ashutosh Bapat) §

  Functions `ShmemInitStruct()` and `ShmemInitHash()` remain for backward compatibility.

- Add server variable `debug_exec_backend` to report how parameters are passed to new backends (Daniel Gustafsson) §

- Add documentation section about temporal tables (Paul A. Jungwirth) §

- Document the environment variables that control the regression tests (Michael Paquier) §

- Update documented systemd example to include a restart setting (Andrew Jackson) §

#### E.1.3.10. Additional Modules #

- Add pg_plan_advice module to stabilize and control planner decisions (Robert Haas) § §

- Add extension pg_stash_advice to allow per-query-id advice to be specified (Robert Haas, Lukas Fittl) § §

- Show sizes of `FETCH` queries as constants in pg_stat_statements (Sami Imseih) §

  Fetches of different sizes will now be grouped together in pg_stat_statements output.

- Add generic and custom plan counts to pg_stat_statements (Sami Imseih) §

- Refactor pg_buffercache reporting of shared memory mapping (Bertrand Drouvot) §

  New function `pg_buffercache_os_pages()` and system view `pg_buffercache_os_pages` allow reporting of shared memory mapping; the function optionally includes NUMA details. Function `pg_buffercache_numa_pages()` remains for backward compatibility.

- Add functions to pg_buffercache to mark buffers as dirty (Nazir Bilal Yavuz) §

  The functions are `pg_buffercache_mark_dirty()`, `pg_buffercache_mark_dirty_relation()`, and `pg_buffercache_mark_dirty_all()`.

- Allow pushdown of array comparisons in prepared statements to postgres_fdw foreign servers (Alexander Pyhalov) §

- Allow the retrieval of statistics from foreign data wrapper servers (Corey Huinker, Etsuro Fujita) §

  This is enabled for postgres_fdw by using the option `restore_stats`. The default is for `ANALYZE` to retrieve rows from the remote server to locally generate statistics.

- Allow file_fdw to read files or program output that uses multi-line headers (Shinya Kato) §

- Add server variable `auto_explain.log_io` to add IO reporting to auto_explain (Tomas Vondra) §

- Allow auto_explain to add extension-specific `EXPLAIN` options via server variable `auto_explain.log_extension_options` (Robert Haas) §

- Change btree_gin to support all btree-supported cross-type comparisons (Tom Lane) § §

- Improve performance of bloom indexes by using streaming reads (Xuneng Zhou) § §

- Improve performance of pgstattuple by using streaming reads (Xuneng Zhou) § §

- Allow fuzzystrmatch's `dmetaphone()` to use single-byte encodings beyond ASCII (Peter Eisentraut) §

- Modify oid2name `--extended` to report the relation file path (David Bidoc) §

### E.1.4. Acknowledgments #

The following individuals (in alphabetical order) have contributed to this release as patch authors, committers, reviewers, testers, or reporters of issues.

fill in later

Prev | Up | Next
Appendix E. Release Notes | Home | E.2. Prior Releases