PostgreSQL 19 Beta 2 Is Here: Graph Queries, REPACK, and Everything New in Postgres This Summer

PostgreSQL 19 Beta 2 Is Here: Graph Queries, REPACK, and Everything New in Postgres This Summer

PostgreSQL had a busy few months. Postgres 19 Beta 2 landed on July 16, 2026, the feature set is now frozen, and general availability is on track for September/October 2026. At the same time, every supported branch got fresh minor releases with real security fixes. Here's a practical roundup of what actually matters if you run Postgres in production.


The headline: Postgres 19 enters feature freeze

Beta 2 is the second pre-release of the version 19 cycle. Feature freeze means the list below is locked — from here it's release candidates, bug fixes, and stability work until GA. If you maintain extensions, drivers, or anything that pokes at Postgres internals, now is the window to test against your real workloads before it ships.

A few housekeeping notes from the beta itself: the team ironed out regressions in vacuumdb --analyze-in-stages for partitioned tables, tightened up the new FOR PORTION OF temporal syntax, fixed several rough edges in the new SQL/PGQ graph feature, and reverted non-text output formats for pg_dumpall (more on that below). Beta software, as always, is for testing — not production.

⚠️ One date to circle: PostgreSQL 14 stops receiving fixes on November 12, 2026. If you're still on 14 in production, start planning the jump now.

The marquee features

1. Native graph queries with SQL/PGQ

The big-ticket item. Postgres 19 adds support for the SQL Property Graph Queries (SQL/PGQ) standard, letting you run graph-style pattern-matching queries directly against your relational tables. Internally these are treated like views and translated into ordinary relational queries, so there's no separate graph engine to operate — you define a property graph over existing tables and query it with the new syntax. For anything involving relationships, recommendations, or network traversal, this is a genuinely new capability without leaving Postgres.

2. REPACK replaces VACUUM FULL and CLUSTER

Two commands that did overlapping jobs under confusing names are now unified into one: REPACK. It supersedes both VACUUM FULL and CLUSTER. The headline improvement is the CONCURRENTLY option, which rebuilds a table without taking an access-exclusive lock — effectively zero-downtime table reorganization. There's a new max_repack_replication_slots setting to go with it. If you've ever scheduled maintenance windows just to reclaim bloat, this changes your life a little.

3. Temporal tables: UPDATE / DELETE FOR PORTION OF

Postgres 19 adds UPDATE ... FOR PORTION OF and DELETE ... FOR PORTION OF, letting you apply changes to a specific slice of a temporal range rather than the whole row. It's a meaningful step toward first-class system- and application-time temporal data.

4. Quality-of-life query syntax

A batch of ergonomic wins that developers will feel immediately:

  • GROUP BY ALL — automatically groups by every non-aggregate, non-window column in your target list. No more re-typing the whole column list.
  • INSERT ... ON CONFLICT DO SELECT ... RETURNING — you can now return (and optionally lock with FOR UPDATE/SHARE) the conflicting rows on an upsert.
  • IGNORE NULLS / RESPECT NULLS for window functions like lead, lag, first_value, last_value, and nth_value.
  • Partition surgery via ALTER TABLE ... MERGE / SPLIT PARTITIONS — reshape partitions without rebuilding everything.

5. COPY gets more capable

COPY TO can now emit JSON (including as a single JSON array via FORCE_ARRAY) and output partitioned tables directly. COPY FROM can skip multiple header lines and coerce bad input to NULL with ON_ERROR SET_NULL. Text/CSV parsing is also faster thanks to SIMD.


Performance & operational wins

Postgres 19 is full of quieter improvements that add up:

  • lz4 is the new default TOAST compression, replacing pglz. Faster compression and decompression out of the box.
  • Parallel autovacuum — autovacuum can now use parallel workers, controlled by autovacuum_max_parallel_workers (and a per-table autovacuum_parallel_workers).
  • Online data checksums — you can enable or disable checksums on a running cluster. Previously this meant taking the cluster offline.
  • Smarter async I/O — the worker I/O method can auto-manage its background workers, and read-ahead scheduling improved for large requests.
  • Radix sort and faster row deformation speed up sorting and general execution.
  • NOTIFY now wakes only the backends actually listening for a channel, instead of nearly everyone.
  • New observability: pg_stat_lock, pg_stat_recovery, pg_stat_autovacuum_scores, richer VACUUM/ANALYZE logging, and an EXPLAIN (ANALYZE) IO option for async I/O activity.
  • New pg_plan_advice and pg_stash_advice modules to stabilize and control planner decisions — a big deal if you've ever been burned by a plan regression.

Breaking changes to plan for

This is the part to read twice before you pg_upgrade. Postgres 19 ships several intentional incompatibilities:

  • JIT is now disabled by default. The cost model that decided when to use it proved unreliable. Heavy analytical workloads that benefited from JIT need to turn it back on explicitly.
  • default_toast_compression defaults to lz4 — worth verifying if you depend on pglz behavior.
  • max_locks_per_transaction default moves from 64 to 128. Lock allocation changed under the hood, so effective settings roughly double — recheck your capacity math.
  • RADIUS authentication is removed. Postgres only ever supported RADIUS over UDP, which is unfixably insecure.
  • btree_gist inet/cidr opclasses now default to GiST, because the old ones could wrongly exclude rows. pg_upgrade will refuse to upgrade if such indexes exist — fix these before you migrate.
  • standard_conforming_strings is now always on in the server; the escape_string_warning variable is gone.
  • No carriage returns or line feeds allowed in database, role, or tablespace names (security hardening — pg_upgrade blocks clusters that use them).
  • MULE_INTERNAL encoding removed — databases using it need a dump/restore into a different encoding.
  • MD5 passwords now emit a warning on successful auth (they were deprecated in Postgres 18); you can silence it via md5_password_warnings.

As always, moving to a new major version requires a dump/restore, pg_upgrade, or logical replication.


Meanwhile, on the stable branches

You don't have to wait for 19 to get value this cycle. The project shipped minor releases across all supported versions — 18.4, 17.10, 16.14, 15.18, and 14.23 — and, earlier in the year, an out-of-cycle release (18.3, 17.9, 16.13, 15.17, 14.22) to clean up regressions introduced by a February security update.

What was in those:

  • Security fixes. Recent minor releases addressed a batch of CVEs spanning issues like unbounded recursion in startup-packet processing, an SQL-injection path in logical replication origin checks during ALTER SUBSCRIPTION ... REFRESH PUBLICATION, and over-length option handling in ts_headline(). If you're behind, patch.
  • Regression cleanups. The February fix for one CVE was too aggressive and made substring() throw "invalid byte sequence for encoding" on valid non-ASCII column data; that's resolved. A standby-halt bug ("could not access status of transaction") during WAL replay was also fixed.
  • Time zone data was refreshed to tzdata 2026b, which includes British Columbia moving to year-round UTC−07 from November 2026 and a historical correction for Moldova.

Minor releases are cumulative and don't require a dump/reload — stop the server, swap the binaries, restart.


What to do this week

  • Running 14? Start your upgrade plan — support ends November 12, 2026.
  • On a supported branch? Apply the latest minor release for the security fixes. It's a binary swap, not a migration.
  • Curious about 19? Spin up Beta 2 in a staging environment and run your real workload against it — especially if you use JIT, custom TOAST settings, RADIUS auth, btree_gist inet/cidr indexes, or anything that touches pg_dumpall output formats. Feature freeze means what you test now is very close to what ships.
  • Building relationship-heavy features? SQL/PGQ is worth prototyping. Native graph queries without a second database is a compelling story.

Postgres 19's final release is expected around September/October 2026. Between the graph queries, REPACK CONCURRENTLY, and the steady drumbeat of performance work, it's shaping up to be one of the more consequential releases in a while.


Sources: PostgreSQL 19 Beta 2 announcement, PostgreSQL 19 release notes, and the official PostgreSQL news archive.