System architecture

PostgreSQL 19 release date moves to 19 November: what was cut, what shipped, and how to test the RC

PostgreSQL 19 is now due on 19 November. What was reverted, what shipped, the defaults that change, and how to test your cluster against RC 1.

Kemo
10 min read
A small herd of elephants walking slowly towards the camera across a dry, dusty grass plain in warm evening light.
On this page
  1. When is PostgreSQL 19 released?
  2. Why Postgres 19 is late: more bugs found, the same number of people to fix them
  3. Which features were removed from PostgreSQL 19?
  4. What made it into PostgreSQL 19
  5. What breaks when you upgrade to PostgreSQL 19
  6. How to test your database against PostgreSQL 19 RC 1
  7. Questions people ask about PostgreSQL 19
  8. Sources and further reading

PostgreSQL 19 will not ship in September or October like the last several major releases. The release team now plans general availability for 19 November 2026, after a second release candidate on 12 November (RC 1 announcement). Between eight and ten significant features were pulled out during beta, including SQL/PGQ graph queries, UPDATE/DELETE ... FOR PORTION OF, and MERGE/SPLIT PARTITION, and two committers have said publicly that LLM-assisted bug finding is a large part of why.

This article sorts out what that means if you run Postgres. You will get the dates, what was cut and why, what did make it into 19 (REPACK (CONCURRENTLY), WAIT FOR LSN, parallel autovacuum, sequence replication), the changed defaults and incompatibilities that will bite an upgrade, and the queries and commands to test your own cluster against RC 1 before GA.

Current buildPostgreSQL 19 RC 1, released 15 October 2026
NextRC 2 on 12 November 2026, alongside the scheduled minor releases
General availabilityPlanned for 19 November 2026, unless another problem forces a delay
Reverted during betaAbout 8 to 10 significant features (Peter Eisentraut)
Headline features keptREPACK (CONCURRENTLY), pg_plan_advice, parallel autovacuum, WAIT FOR LSN, logical replication of sequences
Upgrade pathpg_upgrade, dump and restore, or logical replication (upgrading)
PostgreSQL 19 at a glance, from the release candidate announcement and the open-items page

When is PostgreSQL 19 released?

The planned date is Thursday 19 November 2026. The RC 1 announcement says RC 2 is needed because fixes due in the 12 November minor release were also taken into 19, and that GA follows a week later unless a problem requires another candidate. Release candidates are meant to be nearly identical to the final release, so RC 1 is the right build to test against now.

MilestoneDate
Feature freeze8 April 2026
Beta 14 June 2026
Beta 216 July 2026
Beta 313 August 2026
Beta 424 September 2026
RC 115 October 2026
RC 212 November 2026
GA (planned)19 November 2026
PostgreSQL 19 release milestones, from the PostgreSQL 19 Open Items wiki page

For comparison, Robert Haas notes that major releases over the past decade have landed between mid-September and mid-October (Haas). The full schedule is on the open items page.

Why Postgres 19 is late: more bugs found, the same number of people to fix them

LLMs made bugs easier to find, and fixing them still needs human review. That is the argument of Robert Haas, a PostgreSQL committer, in Postgres 19 is late, and it's AI's fault, and his numbers show where the time went: from feature freeze to late September, commits to the stable branches, which carry fixes rather than features, rose by more than 60 per cent on the new release branch and more than 74 per cent on the previous one.

Commits to PostgreSQL stable branches, 8 April to 25 September2025 compared with 2026
20252026
0 commits500 commits1,000 commits1,500 commitsrelease in progressprevious release

Source: Robert Haas, Postgres 19 is late, and it's AI's fault, 30 October 2026 (https://rhaas.blogspot.com/2026/10/postgres-19-is-late-and-its-ais-fault.html)

Commits to PostgreSQL stable branches, 8 April to 25 September
20252026
release in progress724 commits1,169 commits
previous release248 commits433 commits

"Release in progress" is REL_18_STABLE in 2025 and REL_19_STABLE in 2026; "previous release" is REL_17_STABLE and REL_18_STABLE. Haas reads the rise as bugs found faster rather than committers making more mistakes: people are reporting LLM-found bugs, including security issues, and committers have been fixing them. LLMs can draft fixes too, but those are not always correct or up to project standards, so a human still has to review and commit each one.

The effective quality bar has been raised after the time the feature was written and committed.

Peter Eisentraut, PostgreSQL committer, The Register, 16 October 2026

Eisentraut adds a second cause in his own post: senior developers spent April to August on security work, which cut into the usual beta review. He also says the reverted code was mostly written before "vibe coding" was possible, so this is not a story about AI-written patches. It is a story about AI-assisted review raising the cost of shipping a feature that has edge cases nobody had looked for.

Which features were removed from PostgreSQL 19?

Three large SQL features and several smaller changes were reverted after beta began; most are expected back in PostgreSQL 20. Haas names the three big ones and dates their reverts between 27 August and 15 September; the open items page lists the rest with their commits.

FeatureWhat it would have doneWhy it went
SQL/PGQ (GRAPH_TABLE)Property graph queries from SQL:2023 over ordinary tablesUnresolved issues with aggregates, subqueries, catalog representation and pg_dump (The Register)
UPDATE/DELETE ... FOR PORTION OFChange part of a row's valid-time range, splitting the rest into "leftover" rowsLeftovers lost with some triggers and rules, trigger firing on child tables, a memory leak with domains
ALTER TABLE ... MERGE/SPLIT PARTITIONMerge several partitions into one, or split one into several, with a single ALTER TABLEOpen issues on the partition commands; the fix was reverted
pg_get_*_ddl() redesignFunctions that return the DDL for an objectReverted during beta
Offline data checksum changesChange checksum settings on a stopped clusterReverted during beta
Features reverted from PostgreSQL 19 during beta, from the open-items page and committers' posts

If you had written migrations against Beta 1 using any of these, they will fail on RC 1 with a syntax error or an unknown function. Tom Lane's earlier warning about SQL/PGQ, quoted by The Register, explains the bias towards reverting: "if we ship it in v19 there will be post-release bug discoveries that are unfixable until v20." A bug in new grammar or a new catalog representation cannot be fixed in a minor release without breaking dumps, so it waits a year.

A late revert costs a feature a year; a shipped catalog bug costs every user a year.

What made it into PostgreSQL 19

The operational features survived, and several of them remove reasons to run extensions or downtime windows. The release notes list the full set; these are the ones most teams will use first.

REPACK (CONCURRENTLY) replaces VACUUM FULL and CLUSTER

REPACK rewrites a table to reclaim space, optionally in index order, and with CONCURRENTLY it keeps the table readable and writable for most of the run. VACUUM FULL and CLUSTER remain for compatibility. The REPACK reference describes the mechanism: the bulk of the work runs under SHARE UPDATE EXCLUSIVE, concurrent changes are captured through logical decoding, and ACCESS EXCLUSIVE is taken only to swap the files at the end.

Application writesOriginal tableSHARE UPDATE EXCLUSIVENew copy + indexesbuilt in the backgroundLogical decoding slotmax_repack_replication_slotsChange data on diskFile swapbrief ACCESS EXCLUSIVEINSERT/UPDATE/DELETEinitial copyWALreplay
  • Application writes → Original table: INSERT/UPDATE/DELETE
  • Original table → New copy + indexes: initial copy
  • Original table → Logical decoding slot: WAL
  • Logical decoding slot → Change data on disk
  • Change data on disk → New copy + indexes: replay
  • New copy + indexes → File swap
How REPACK (CONCURRENTLY) rebuilds a table while it stays in use, following the PostgreSQL 19 REPACK reference page.
repack-orders.sqlSQL
-- Rebuild a bloated table online and refresh its statistics afterwardsREPACK (CONCURRENTLY) orders;ANALYZE orders; -- Watch progress from another sessionSELECT * FROM pg_stat_progress_repack;

The restrictions matter. CONCURRENTLY refuses partitioned, unlogged and non-heap tables, tables without a primary key or index-based replica identity, and cannot run inside a transaction block; it needs a free slot under max_repack_replication_slots; and it fails if more than about 104 million rows are updated or deleted during the run. It also is not MVCC-safe: a transaction whose snapshot predates the repack sees the table as empty after it commits. You need free disk equal to the table plus its indexes (REPACK).

WAIT FOR LSN gives read-your-writes on replicas

Write on the primary, take the LSN, and make the replica wait until it has replayed that far before you read. Before 19 this meant polling pg_last_wal_replay_lsn() in application code (WAIT FOR).

read-your-writes.sqlSQL
-- On the primary, after the write commitsSELECT pg_current_wal_insert_lsn();   -- e.g. 0/306EE20 -- On the replica, before the readWAIT FOR LSN '0/306EE20' WITH (TIMEOUT '200ms', NO_THROW);-- returns success, timeout or 'not in recovery'

WAIT FOR must be a top-level statement: not inside a function or DO block, and not while a snapshot is held, which rules out REPEATABLE READ transactions. It compares LSNs only and ignores timelines, so after a failover check the timeline yourself.

Autovacuum, replication and COPY

  • Parallel autovacuum of indexes, capped by autovacuum_max_parallel_workers and set per table with autovacuum_parallel_workers; tables are now prioritised by score, visible in pg_stat_autovacuum_scores.
  • Logical replication of sequences with CREATE PUBLICATION ... FOR ALL SEQUENCES and ALTER SUBSCRIPTION ... REFRESH SEQUENCES, which removes a classic manual step from logical-replication upgrades.
  • Logical replication without a restart when wal_level is replica; the new read-only effective_wal_level shows what is actually in force.
  • pg_plan_advice and pg_stash_advice to pin planner decisions, the latter applied automatically by query ID.
  • COPY ... TO ... (FORMAT json), which since RC 1 uses the query's column names and aliases as keys.

What breaks when you upgrade to PostgreSQL 19

Most clusters upgrade cleanly, but several defaults changed and a few old configurations are refused outright. These come from the "Migration to Version 19" section of the release notes.

ChangeBefore 19In 19What to do
JITOnOffSet jit = on if you run large analytical queries that benefited
max_locks_per_transaction64128Lock sizing changed: double any custom value to keep the same capacity
default_toast_compressionpglzlz4Applies to values compressed from now on
log_lock_waitsOffOnExpect more log lines
standard_conforming_stringsSettableAlways onTake dumps with the 19 pg_dump, not the old one
MD5 password loginDeprecated in 18Succeeds with a warningMove roles to SCRAM; md5_password_warnings silences it
RADIUS authenticationSupportedRemovedSwitch pg_hba.conf entries before upgrading
btree_gist inet/cidr indexesDefault opclasspg_upgrade refuses themRebuild them with the core GiST inet_ops
MULE_INTERNAL encodingSupportedRemovedDump and restore into another encoding
PostgreSQL 19 default changes and incompatibilities most likely to affect an upgrade

Two of these silently change behaviour rather than failing. With JIT off, an analytical query that relied on it simply gets slower. And a pre-19 dump from a server with standard_conforming_strings = off loads with wrong string contents, so always dump with the new version's tools.

How to test your database against PostgreSQL 19 RC 1

Run the three checks below on your current cluster, then a pg_upgrade --check against an RC 1 install. The project asks for beta and RC testing and takes reports through its bug form.

pre-upgrade-checks.sqlSQL
-- 1. btree_gist inet/cidr indexes: pg_upgrade to 19 refuses theseSELECT i.indexrelid::regclass AS index_name, o.opcnameFROM pg_index iJOIN pg_opclass o ON o.oid = ANY (i.indclass::oid[])WHERE o.opcname IN ('gist_inet_ops', 'gist_cidr_ops'); -- 2. Roles still on MD5 passwords (run as a superuser)SELECT rolname FROM pg_authid WHERE rolpassword LIKE 'md5%'; -- 3. Databases in an encoding that 19 removesSELECT datname FROM pg_databaseWHERE pg_encoding_to_char(encoding) = 'MULE_INTERNAL';

Then point pg_upgrade from the RC 1 binaries at a copy of your data directory with --check, which runs the compatibility checks without changing anything (pg_upgrade). Paths depend on your packaging; these are the Debian and Ubuntu layout.

pg_upgrade --checkShell
/usr/lib/postgresql/19/bin/pg_upgrade \  --old-bindir /usr/lib/postgresql/18/bin \  --new-bindir /usr/lib/postgresql/19/bin \  --old-datadir /var/lib/postgresql/18/main \  --new-datadir /var/lib/postgresql/19/main \  --check

Run your application's test suite against the RC 1 server too, with JIT left at its new default, and compare query plans for your heaviest reports. If something regresses, there is still time to report it before GA; after 19 November it waits for a minor release at best.

The one thing to remember: PostgreSQL 19 is a release with fewer headline SQL features and more scrutiny than any before it. Plan the upgrade around REPACK, the changed defaults and the refused configurations, not around features that are now scheduled for 20.

Questions people ask about PostgreSQL 19

When is PostgreSQL 19 released?

General availability is planned for 19 November 2026, after RC 2 on 12 November. The release team says it may slip again if a problem needs another release candidate.

Why was PostgreSQL 19 delayed?

About 8 to 10 features were reverted late in beta, and committers spent much of the cycle fixing a larger number of bugs, many found with LLM-assisted review, plus security work from April to August.

Is SQL/PGQ in PostgreSQL 19?

No. SQL property graph queries (GRAPH_TABLE) were reverted during beta over unresolved issues and are expected in a later release.

Does PostgreSQL 19 have temporal FOR PORTION OF updates?

No. UPDATE and DELETE ... FOR PORTION OF were reverted because of bugs in how leftover rows interact with triggers, rules and domains.

Does REPACK replace VACUUM FULL?

Yes, functionally. REPACK covers both VACUUM FULL and CLUSTER, which remain for compatibility, and REPACK (CONCURRENTLY) avoids holding an exclusive lock for the whole rebuild.

Can I use pg_upgrade from PostgreSQL 18 to 19?

Yes, unless the cluster has btree_gist inet or cidr indexes, or database, role or tablespace names containing line breaks. pg_upgrade --check reports these before anything changes.

Should I run PostgreSQL 19 RC 1 in production?

No. It is for testing; wait for GA and, as usual for a new major version, consider the first minor releases before upgrading critical systems.

Sources and further reading

Found this useful? Pass it on.

Written by

Kemo

Full-stack developer. Writes about Node.js backends, small infrastructure and tools that stay out of the way.

Discussion

Join the discussion

Sign in with Google, Apple or an email code to comment and reply.

One practical article a week

Follow k13 in any RSS reader. No account needed.