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 build | PostgreSQL 19 RC 1, released 15 October 2026 |
| Next | RC 2 on 12 November 2026, alongside the scheduled minor releases |
| General availability | Planned for 19 November 2026, unless another problem forces a delay |
| Reverted during beta | About 8 to 10 significant features (Peter Eisentraut) |
| Headline features kept | REPACK (CONCURRENTLY), pg_plan_advice, parallel autovacuum, WAIT FOR LSN, logical replication of sequences |
| Upgrade path | pg_upgrade, dump and restore, or logical replication (upgrading) |
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.
| Milestone | Date |
|---|---|
| Feature freeze | 8 April 2026 |
| Beta 1 | 4 June 2026 |
| Beta 2 | 16 July 2026 |
| Beta 3 | 13 August 2026 |
| Beta 4 | 24 September 2026 |
| RC 1 | 15 October 2026 |
| RC 2 | 12 November 2026 |
| GA (planned) | 19 November 2026 |
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.
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)
| 2025 | 2026 | |
|---|---|---|
| release in progress | 724 commits | 1,169 commits |
| previous release | 248 commits | 433 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.
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.
| Feature | What it would have done | Why it went |
|---|---|---|
SQL/PGQ (GRAPH_TABLE) | Property graph queries from SQL:2023 over ordinary tables | Unresolved issues with aggregates, subqueries, catalog representation and pg_dump (The Register) |
UPDATE/DELETE ... FOR PORTION OF | Change part of a row's valid-time range, splitting the rest into "leftover" rows | Leftovers lost with some triggers and rules, trigger firing on child tables, a memory leak with domains |
ALTER TABLE ... MERGE/SPLIT PARTITION | Merge several partitions into one, or split one into several, with a single ALTER TABLE | Open issues on the partition commands; the fix was reverted |
pg_get_*_ddl() redesign | Functions that return the DDL for an object | Reverted during beta |
| Offline data checksum changes | Change checksum settings on a stopped cluster | Reverted during beta |
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 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
-- 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).
-- 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_workersand set per table withautovacuum_parallel_workers; tables are now prioritised by score, visible inpg_stat_autovacuum_scores. - Logical replication of sequences with
CREATE PUBLICATION ... FOR ALL SEQUENCESandALTER SUBSCRIPTION ... REFRESH SEQUENCES, which removes a classic manual step from logical-replication upgrades. - Logical replication without a restart when
wal_levelisreplica; the new read-onlyeffective_wal_levelshows what is actually in force. pg_plan_adviceandpg_stash_adviceto 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.
| Change | Before 19 | In 19 | What to do |
|---|---|---|---|
| JIT | On | Off | Set jit = on if you run large analytical queries that benefited |
max_locks_per_transaction | 64 | 128 | Lock sizing changed: double any custom value to keep the same capacity |
default_toast_compression | pglz | lz4 | Applies to values compressed from now on |
log_lock_waits | Off | On | Expect more log lines |
standard_conforming_strings | Settable | Always on | Take dumps with the 19 pg_dump, not the old one |
| MD5 password login | Deprecated in 18 | Succeeds with a warning | Move roles to SCRAM; md5_password_warnings silences it |
| RADIUS authentication | Supported | Removed | Switch pg_hba.conf entries before upgrading |
btree_gist inet/cidr indexes | Default opclass | pg_upgrade refuses them | Rebuild them with the core GiST inet_ops |
MULE_INTERNAL encoding | Supported | Removed | Dump and restore into another encoding |
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.
-- 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.
/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 \ --checkRun 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
- PostgreSQL: 19 RC 1 announcement, PostgreSQL 19 release notes, 19 Open Items, beta testing
- Documentation: REPACK, WAIT FOR, pg_upgrade, upgrading a cluster
- Robert Haas, Postgres 19 is late, and it's AI's fault, 30 October 2026
- Peter Eisentraut, The reverts will continue until morale improves, 9 October 2026
- The Register: Postgres 19 delayed after AI reviewers find more bugs than humans can fix and the September report on SQL/PGQ
Discussion
Join the discussion
Sign in with Google, Apple or an email code to comment and reply.