The PostgreSQL Global Development Group announces that the first beta release of
PostgreSQL 19 is now [available for download](https://www.postgresql.org/download/).
This release contains previews of all features when PostgreSQL 19 is made
generally available, though some details of the release can change during the
beta period.

You can find information about all of the PostgreSQL 19 features and changes in
the [release notes](https://www.postgresql.org/docs/19/release-19.html):

[https://www.postgresql.org/docs/19/release-19.html](https://www.postgresql.org/docs/19/release-19.html)

In the spirit of the open source PostgreSQL community, we strongly encourage you
to test the new features of PostgreSQL 19 on your systems to help us eliminate
bugs and other issues. While we do not advise you to run PostgreSQL 19 Beta 1 in
production environments, we encourage you to find ways to run your typical
application workloads against this beta release.

Your testing and feedback helps the community ensure that PostgreSQL 19
upholds our standards of delivering a stable, reliable release of the
world's most advanced open source relational database. Please read more about
our [beta testing process](https://www.postgresql.org/developer/beta/) and how
you can contribute:

[https://www.postgresql.org/developer/beta/](https://www.postgresql.org/developer/beta/)

PostgreSQL 19 Feature Highlights
--------------------------------

Below are some of the feature highlights that are planned for PostgreSQL 19.
This list is not exhaustive; for the full list of planned features, please see
the [release notes](https://www.postgresql.org/docs/19/release-19.html).

### Performance

PostgreSQL 19 builds on the asynchronous I/O subsystem introduced in
PostgreSQL 18. In this release, `io_method=worker` now automatically scales the
number of workers based on the new `io_min_workers` and `io_max_workers`
settings.

This release brings improvements to vacuum and maintenance operations.
Autovacuum can now use parallel workers, which can be configured with the new
`autovacuum_max_parallel_workers` setting, and a new autovacuum scoring system
helps prioritize tables to vacuum. PostgreSQL 19 further enhances vacuum, adding
a new strategy that lets table scans mark pages as visible and reduce future
vacuuming work. Additionally, this release adds the new `REPACK` and
`REPACK CONCURRENTLY` commands, which allow rebuilding tables with less
operational overhead.

PostgreSQL 19 shows up to 2x better performance on inserts when foreign
key checks are present. Additionally, this release improves several areas of
the query planner and executor, including new anti-join optimizations, broader
use of incremental sorts, faster reads from storage during parallel sequential
scans, and simplification of `IS DISTINCT FROM` and `IS NOT DISTINCT FROM` to
plain `<>` and `=` operators when the inputs are not nullable.

This release also introduces the `pg_plan_advice` extension, which lets users
stabilize and control planner decisions, along with `pg_stash_advice` to apply
advice automatically using query identifiers.

### Developer Experience

PostgreSQL 19 introduces support for SQL/PGQ, letting users execute property
graph queries using SQL standard syntax. This release also expands temporal
query capabilities with `UPDATE` and `DELETE` support for the
`FOR PORTION OF` clause, complementing the temporal constraint support added in
PostgreSQL 18. This release also adds `ALTER TABLE ... MERGE PARTITIONS` and
`ALTER TABLE ... SPLIT PARTITIONS` to make it easier to reorganize partitioned
tables in place.

PostgreSQL 19 makes it easier to adopt "read-your-writes" query patterns
when working with replicas using the new `WAIT FOR LSN` command. This lets a
session wait until changes up to a specific log position (LSN) have been
replayed on the replica before executing a `SELECT` query.

This release extends jsonpath support with the addition of `lower()`, `upper()`,
`initcap()`, `replace()`, `split_part()`, and several variants of `trim()`
functions. PostgreSQL 19 also adds new SQL functions to retrieve the DDL
statements needed to recreate roles, tablespaces, and databases, simplifying
scripting and migration tasks. Additionally, the `random()` function now works
with `date` and `timestamp` types, and PL/Python now supports event triggers.

### Security Features

PostgreSQL 19 adds server-side support for Server Name Indication (SNI) through
a new `pg_hosts.conf` file, allowing a single PostgreSQL server to present
different TLS certificates based on the hostname requested by the client.
Additionally, the OAuth authentication method added in PostgreSQL 18 has been
extended with a new flow hook, `PQAUTHDATA_OAUTH_BEARER_TOKEN_V2`, which adds
issuer identifiers and structured error message specification.

The `GRANT` and `REVOKE` statements now support a `GRANTED BY` clause that lets
the user select the role to issue the `GRANT`/`REVOKE` and have more control
of the behavior. Additionally, PostgreSQL 19 also adds a new
`password_expiration_warning_threshold` setting (defaulting to 7 days) to warn
users in advance of upcoming password expirations.

Further to the ongoing deprecation efforts of `md5` authentication, this release
issues a warning after a successful `md5` authentication. This is controllable
via the new `md5_password_warnings` setting.

### Monitoring and Observability

PostgreSQL 19 introduces the `pg_stat_lock` view, which reports per-lock-type
statistics, and `pg_stat_recovery`, which provides detailed visibility into the
state of recovery operations. A `stats_reset` column has been added across many
statistics views to make it easier to reason about when counters were last
cleared. The `pg_stat_progress_vacuum` and `pg_stat_progress_analyze` views now
include a `started_by` column that reports the initiator of the operation, along
with a `mode` column that reports its level of aggressiveness.

This release also allows `log_min_messages` levels to be specified per process
type, giving operators finer control over what each part of the system logs.
Additionally, WAL full page write byte counts are now reported in `VACUUM` and
`ANALYZE` log output, helping identify maintenance operations that generate
large amounts of WAL. Additionally, `EXPLAIN ANALYZE` now supports surfacing
asynchronous I/O statistics through its `IO` option, providing better visibility
into how queries are using the AIO subsystem.

### Logical Replication and query federation

In PostgreSQL 19, logical replication now replicates sequence values, making it
easier to use logical replication for use cases like upgrades. Additionally, the
new `CREATE PUBLICATION ... EXCEPT` syntax allows you to publish all tables in
a database except for a specified set, while `CREATE SUBSCRIPTION ... SERVER`
allows subscriptions to be defined using a foreign server, simplifying
credential management.

PostgreSQL 19 makes it possible to enable logical replication without restarting
a server. Logical replication can now be enabled on demand even when `wal_level`
is set to `replica`, and the new read-only `effective_wal_level` parameter
reports the WAL level currently in effect. This reduces the need to commit
upfront to a higher WAL level for clusters that may only occasionally need it,
and avoids disrupting an active workload.

The PostgreSQL foreign data wrapper, `postgres_fdw`, used for query federation,
includes several performance improvements, including pushing down array
operations to the remote server, and retrieving and using statistics from
foreign tables to support better local query planning.

### Other Highlights

PostgreSQL 19 allows data checksums to be enabled or disabled online, without
requiring a cluster restart or reinitialization.

There are several notable changes to be aware of in
PostgreSQL 19. JIT is now disabled by default, and the `default_toast_compression`
setting now defaults to `lz4`, providing better compression and decompression
performance out-of-the-box. Support for RADIUS authentication is now removed.
Additionally, the `vacuumdb --analyze-only` command will now also analyze
partitioned tables when no other options are specified.

Additional Features
-------------------

Many other new features and improvements have been added to PostgreSQL 19. Many
of these may also be helpful for your use cases. Please see the
[release notes](https://www.postgresql.org/docs/19/release-19.html) for a
complete list of new and changed features:

[https://www.postgresql.org/docs/19/release-19.html](https://www.postgresql.org/docs/19/release-19.html)

Testing for Bugs & Compatibility
--------------------------------

The stability of each PostgreSQL release greatly depends on you, the community,
to test the upcoming version with your workloads and testing tools to find bugs
and regressions before the general availability of PostgreSQL 19. As this is a
Beta, minor changes to database behaviors, feature details, and APIs are still
possible. Your feedback and testing will help determine the final tweaks on the
new features, so please test in the near future. The quality of user testing
helps determine when we can make a final release.

A list of [open issues](https://wiki.postgresql.org/wiki/PostgreSQL_19_Open_Items)
is publicly available in the PostgreSQL wiki.  You can
[report bugs](https://www.postgresql.org/account/submitbug/) using this form on
the PostgreSQL website:

[https://www.postgresql.org/account/submitbug/](https://www.postgresql.org/account/submitbug/)

Beta Schedule
-------------

This is the first beta release of version 19. The PostgreSQL Project will
release additional betas as required for testing, followed by one or more
release candidates, until the final release around September/October 2026. For further
information please see the [Beta Testing](https://www.postgresql.org/developer/beta/)
page.

Links
-----

* [Download](https://www.postgresql.org/download/)
* [Beta Testing Information](https://www.postgresql.org/developer/beta/)
* [PostgreSQL 19 Beta Release Notes](https://www.postgresql.org/docs/19/release-19.html)
* [PostgreSQL 19 Open Issues](https://wiki.postgresql.org/wiki/PostgreSQL_19_Open_Items)
* [Submit a Bug](https://www.postgresql.org/account/submitbug/)
* [Donate](https://www.postgresql.org/about/donate/)
