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
| Change | Who is affected | What to do |
|---|---|---|
| btree_gist inet and cidr opclasses: default changed to core GiST; pg_upgrade refuses clusters with btree_gist inet or cidr indexes | Exclusion constraints or GiST indexes on network columns via btree_gist | Rebuild those indexes with the core GiST opclass before upgrading |
| Carriage returns and line feeds forbidden in database, role and tablespace names; pg_upgrade refuses them | Rare, usually generated names | Rename before upgrading |
| standard_conforming_strings is always on | Dumps taken by older pg_dump with the setting off | Dump with the version 19 pg_dump, or with the setting on |
| RADIUS authentication removed | pg_hba.conf entries using radius | Move to another method before upgrading |
| MULE_INTERNAL encoding removed | Databases using that encoding | Dump 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_transactiondefault 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 = onnow picks the best available method. Existing data is unchanged; new values compress differently. log_lock_waitsis 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, andpassword_expiration_warning_thresholdwarns 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_countin pg_stat_subscription_stats is nowsync_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
| Feature | What it replaces or enables | Planning note |
|---|---|---|
| REPACK, with a CONCURRENTLY option | Unifies VACUUM FULL and CLUSTER; concurrent mode rebuilds without access-exclusive locking | Uses replication slots; size max_repack_replication_slots. Old commands remain for compatibility |
| Parallel autovacuum | Index vacuuming with parallel workers | autovacuum_max_parallel_workers and per-table autovacuum_parallel_workers |
| Autovacuum scoring | Ordering of tables autovacuum processes | Weights such as autovacuum_freeze_score_weight; pg_stat_autovacuum_scores shows the result |
| WAIT command | Read-your-writes on standbys by waiting for an LSN | Replaces polling loops in applications that read from replicas |
| Logical replication without restart | Automatic enablement when wal_level is replica | effective_wal_level reports the result |
| Sequence replication | Copying sequence values to subscribers | Removes a manual step from logical-replication cutovers |
| pg_plan_advice and pg_stash_advice | Controlling planner decisions | Treat as a targeted tool for regressions, not a default |
| INSERT ... ON CONFLICT DO SELECT | Returning conflicting rows | Simplifies get-or-create patterns |
| COPY TO with FORMAT json | JSON export from COPY | RC 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
- Restore a recent production backup into a staging cluster and run pg_upgrade with --check, then a real upgrade, using RC 1 binaries.
- 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.
- Double any customized max_locks_per_transaction and run the partition-heavy jobs that needed it.
- Point dashboards and alerts at the staging cluster and fix every query that matches renamed columns or wait events.
- Test logical replication and REPACK (CONCURRENTLY) on a large table under write load, watching replication slot usage and WAL volume.
- 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.
Practice and related reading
Further reading:
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.