Recent development · Practical technical guide · 17 October 2026

PostgreSQL 19 RC 1 was announced on 15 October 2026 with GA planned for 19 November. The incompatibilities that break upgrades or change behaviour, the features worth planning for, pre-upgrade checks you can run today, and a test plan.

What was announced

On 15 October 2026 the PostgreSQL Global Development Group announced the first release candidate of PostgreSQL 19. The announcement says the next scheduled update release for supported versions, on 12 November 2026, will carry a large number of fixes, and the release team decided to include them in 19 before general availability. A second release candidate will therefore ship on 12 November, and general availability is planned for 19 November 2026, unless an issue forces a delay. Fixes since Beta 4 include several for REPACK (CONCURRENTLY), pg_plan_advice, parallel autovacuum and the automatic enablement of logical replication.

A release candidate is the right moment to test an upgrade, because the feature set is fixed and the release notes are close to final. The notes used here are the version 19 release notes as published with RC 1, marked "as of 2026-10-09". Anything not in those notes, including features discussed during development and later removed, is not in PostgreSQL 19.

Incompatibilities that can break an upgrade

ChangeWho is affectedWhat to do
btree_gist inet and cidr opclasses: default changed to core GiST; pg_upgrade refuses clusters with btree_gist inet or cidr indexesExclusion constraints or GiST indexes on network columns via btree_gistRebuild those indexes with the core GiST opclass before upgrading
Carriage returns and line feeds forbidden in database, role and tablespace names; pg_upgrade refuses themRare, usually generated namesRename before upgrading
standard_conforming_strings is always onDumps taken by older pg_dump with the setting offDump with the version 19 pg_dump, or with the setting on
RADIUS authentication removedpg_hba.conf entries using radiusMove to another method before upgrading
MULE_INTERNAL encoding removedDatabases using that encodingDump and restore with another encoding

Run pg_upgrade --check with the RC binaries against a copy of production. It is the authoritative test for the conditions pg_upgrade refuses, and it is quicker than discovering them during a maintenance window.

Behaviour changes that do not fail loudly

  • JIT is disabled by default. The notes say the cost model that switched JIT on was unreliable. Analytical workloads that benefited from JIT will get slower unless you set jit = on. Find them first with pg_stat_statements, which records JIT activity per query.
  • max_locks_per_transaction default went from 64 to 128, and lock allocation changed. The notes say existing settings must be doubled to keep the same capacity. A cluster tuned to 256 for many partitions should move to 512.
  • Default TOAST compression is lz4 instead of pglz, and wal_compression = on now picks the best available method. Existing data is unchanged; new values compress differently.
  • log_lock_waits is on by default. Expect more log lines on contended systems; check log volume alerts.
  • MD5 password logins produce a warning, controllable with md5_password_warnings, and password_expiration_warning_threshold warns seven days before expiry by default.
  • json_array() with no rows returns an empty array instead of NULL; code that checks for NULL needs a change.
  • postgres_fdw sessions inherit READ ONLY and DEFERRABLE, so read-only transactions can no longer modify remote rows.
  • Monitoring names changed: wait event type BUFFERPIN is now BUFFER, and sync_error_count in pg_stat_subscription_stats is now sync_table_error_count. Dashboards and alerts that match on the old names go silent.

Pre-upgrade checks you can run today

Illustrative SQL; query 5 needs pg_stat_statements 1.10 or later (PostgreSQL 15+). pg_upgrade --check remains the authoritative test.

-- 1. Roles still using MD5 passwords (superuser required)
SELECT rolname FROM pg_authid WHERE rolpassword LIKE 'md5%';

-- 2. Names that pg_upgrade 19 will refuse
SELECT 'database' AS kind, datname AS name FROM pg_database WHERE datname ~ '[\r\n]'
UNION ALL SELECT 'role', rolname FROM pg_roles WHERE rolname ~ '[\r\n]'
UNION ALL SELECT 'tablespace', spcname FROM pg_tablespace WHERE spcname ~ '[\r\n]';

-- 3. Databases in the removed encoding
SELECT datname FROM pg_database WHERE pg_encoding_to_char(encoding) = 'MULE_INTERNAL';

-- 4. Indexes that use btree_gist network opclasses (run in each database)
SELECT i.indexrelid::regclass AS index_name, oc.opcname
FROM pg_index i
JOIN pg_opclass oc ON oc.oid = ANY (i.indclass::oid[])
WHERE oc.opcname IN ('gist_inet_ops', 'gist_cidr_ops');

-- 5. Queries that currently use JIT (needs pg_stat_statements)
SELECT queryid, calls, jit_functions, jit_generation_time
FROM pg_stat_statements WHERE jit_functions > 0
ORDER BY jit_generation_time DESC LIMIT 20;

-- 6. Current lock table sizing
SHOW max_locks_per_transaction;

Query 4 names the btree_gist operator classes as the extension defines them; confirm against \dAc output in your cluster if you use a fork or an old extension version.

Features worth planning for

FeatureWhat it replaces or enablesPlanning note
REPACK, with a CONCURRENTLY optionUnifies VACUUM FULL and CLUSTER; concurrent mode rebuilds without access-exclusive lockingUses replication slots; size max_repack_replication_slots. Old commands remain for compatibility
Parallel autovacuumIndex vacuuming with parallel workersautovacuum_max_parallel_workers and per-table autovacuum_parallel_workers
Autovacuum scoringOrdering of tables autovacuum processesWeights such as autovacuum_freeze_score_weight; pg_stat_autovacuum_scores shows the result
WAIT commandRead-your-writes on standbys by waiting for an LSNReplaces polling loops in applications that read from replicas
Logical replication without restartAutomatic enablement when wal_level is replicaeffective_wal_level reports the result
Sequence replicationCopying sequence values to subscribersRemoves a manual step from logical-replication cutovers
pg_plan_advice and pg_stash_adviceControlling planner decisionsTreat as a targeted tool for regressions, not a default
INSERT ... ON CONFLICT DO SELECTReturning conflicting rowsSimplifies get-or-create patterns
COPY TO with FORMAT jsonJSON export from COPYRC 1 fixed key names to follow query aliases

Two smaller changes help operations immediately: transaction ID and multixact wraparound warnings now start at 100 million remaining instead of 40 million, and pg_stat_progress_vacuum reports who started a vacuum and how aggressive it is. For the mechanics behind those warnings, see PostgreSQL MVCC and VACUUM.

A test plan between RC 1 and GA

  1. Restore a recent production backup into a staging cluster and run pg_upgrade with --check, then a real upgrade, using RC 1 binaries.
  2. Replay a captured workload or run your performance suite with jit at the new default, then with jit = on for the analytical queries found by check 5. Compare plans and timings.
  3. Double any customized max_locks_per_transaction and run the partition-heavy jobs that needed it.
  4. Point dashboards and alerts at the staging cluster and fix every query that matches renamed columns or wait events.
  5. Test logical replication and REPACK (CONCURRENTLY) on a large table under write load, watching replication slot usage and WAL volume.
  6. Repeat the upgrade with RC 2 on 12 November, and keep the production upgrade for after GA and your own soak period.

What is still uncertain

Release candidates can change: the project says RC 1 is mostly identical to the final release but more fixes may be applied, and the GA date holds only if no blocking issue appears. Performance figures for the new features will depend on your hardware and workload; none are claimed here. Extensions you rely on need version 19 builds, and each extension project ships on its own schedule. Re-read the final release notes on GA day and diff them against the RC notes before the production change.

Sources and scope

Checked against these sources on 17 October 2026. Event: PostgreSQL 19 RC 1 announcement, 15 October 2026; recheck it before acting. Examples and figures are illustrative, not measurements.

Run pg_upgrade --check and the pre-checks now, re-enable JIT where it helped, double custom lock settings, fix renamed monitoring fields, and upgrade after GA.