PostgreSQL 18.3 Releases Fixes for Standby Freezes and Other Bugs
The PostgreSQL Global Development Group just pushed a new update that finally patches the standby‑freeze bug that had been plaguing users of version 18, along with a handful of other regressions. The release is bundled across all supported lines— 18.3, 17.9, 16.13, 15.17, and 14.22—so any production or dev box can jump in without needing a full dump‑and‑reload cycle.
What’s New?
The headline fix is the “could not access status of transaction” error that would bring a hot standby to a grinding halt after a minor failover. The patch rewires the checkpoint logic so that transaction status checks no longer trip over an empty buffer, letting the replica keep chugging without manual intervention.
Other noteworthy corrections include:
- Substring() no longer throws “invalid byte sequence for encoding” on multibyte text columns after the recent CVE‑2026‑2006 fix; the culprit was a subtle change in how the function handled non‑ASCII data.
- The strict_word_similarity operator in pg_trgm now produces reliable results and stops crashing, fixing an oversight that slipped through in the earlier patch for CVE‑2026‑2007.
- json_strip_nulls() and its JSONB counterpart are back to being immutable, so they can safely be indexed again. If a database had already upgraded from 18.0 to 18.2, it needs one quick SQL tweak.
What Makes This Important
A standby that freezes is more than just an annoyance—it can delay failover scripts, push maintenance windows, and create data‑consistency headaches. In a recent staging environment, a live application experienced an unexpected halt because the replica was unable to read transaction status; the fix in 18.3 eliminates that scenario for all future releases.
The json_strip_nulls volatility issue is also critical for teams that rely on materialized views or indexes over JSON columns. Making the function immutable restores performance and eliminates potential query plan regressions.
How to Upgrade Without Breaking Things
All minor PostgreSQL updates are cumulative, which means there’s no need to dump data or run pg_upgrade. The simplest path is:
- Shut down each instance with pg_ctl stop (or the service manager you normally use).
- Replace the binaries in the installation folder with the new version shipped from the official download page.
- Restart the server.
If a cluster had already jumped from 18.0 through 18.2, the only post‑upgrade step is to run one command in every database—including template0 and template1—so that future databases inherit the correct function volatility:
UPDATE pg_catalog.pg_proc SET provolatile = 'i' WHERE oid IN ('3261','3262');
Running that once per cluster is enough; there’s no need for a full migration or data reload.
In Short
PostgreSQL 18.3 cleans up several stubborn bugs, notably the standby‑freeze issue and the JSON indexing glitch, while keeping the upgrade path painless. For anyone maintaining a replica or using indexed JSON, this patch should be applied as soon as the binaries are available—no dump, no restore, just a quick restart.
