E.1. Release 14.23

E.1.1. Migration to Version 14.23
E.1.2. Changes

Release date: 2026-05-14

This release contains a variety of fixes from 14.22. For information about new features in major release 14, see Section E.24.

The PostgreSQL community will stop releasing updates for the 14.X release series in November 2026. Users are encouraged to update to a newer release branch soon.

E.1.1. Migration to Version 14.23

A dump/restore is not required for those running 14.X.

However, if you are upgrading from a version earlier than 14.19, see Section E.5.

E.1.2. Changes

  • Check for nondeterministic collations before assuming that an equality condition on a collatable type implies uniqueness (Richard Guo) § §

    Numerous planner optimizations assume that, for example, at most one table row can satisfy WHERE x = 'abc' if there is a unique index on x. However this conclusion is unsafe in general if the index and the WHERE clause have different collations attached. It is safe when both collations are deterministic, because that property essentially requires that equality of two strings means bitwise equality. But nondeterministic collations don't act that way, so that optimizing on the assumption of unique matches can give wrong query answers if either the WHERE clause or the index has a nondeterministic collation.

  • Fix incorrect handling of NEW generated columns in rule actions and rule qualifications (Richard Guo, Dean Rasheed) §

    Previously, such column references would produce NULL in INSERT cases, or be equivalent to the OLD value in UPDATE cases.

  • Fix spurious generated columns are not supported in COPY FROM WHERE conditions errors (Tom Lane) §

    Use of a system column in a COPY FROM WHERE condition could sometimes incorrectly report this error.

  • Fix CREATE TABLE ... LIKE ... INCLUDING STATISTICS for cases where the source table has dropped column(s) (Julien Tachoires) §

    In such cases, extended statistics objects could be copied incorrectly, or the command could give an incorrect error.

  • Allow ALTER INDEX ... ATTACH PARTITION to mark the parent index valid if appropriate (Sami Imseih) §

    There are edge cases in which a partitioned index might remain marked as invalid even when all its leaf indexes are valid. This change provides a mechanism whereby a user can correct such a situation without resorting to manual catalog updates.

  • Fix ALTER FOREIGN DATA WRAPPER to not drop the wrapper object's dependency on its handler function (Jeff Davis) §

  • Disallow making a composite type be a member of itself via a multirange (Heikki Linnakangas) §

    We already forbade such cases when the intermediate type is a domain, array, composite type, or range; but multiranges were overlooked.

  • Fix datum-image comparisons to be insensitive to sign-extension variations (David Rowley) §

    This fixes some situations that previously led to could not find memoization table entry errors or wrong query results.

  • Fix incorrect logic for hashed IN/NOT IN with non-strict equality operator (Chengpeng Yan) §

    The previous coding could crash or give wrong answers. All built-in data types have strict equality operators, so that this issue could only arise with an extension data type.

  • Truncate overly-long locale-specific numeric symbols in to_char() (Tom Lane) §

    If a locale specified a currency symbol, thousands separator, or decimal or sign symbol more than 8 bytes long, a buffer overrun was possible. No such locales exist in the real world, and it's impractical for an unprivileged attacker to install a malicious locale definition underneath a Postgres server; but for safety's sake check for overlength symbols and truncate if needed.

  • Prevent buffer overruns when parsing an affix file for an Ispell dictionary (Tom Lane) § §

    A corrupt or malicious affix file could crash the server. This is not considered a security issue because text search configuration files are presumed trustworthy, but it still seems worth fixing.

  • Guard against integer overflow in calculations of frame start and end positions for window aggregates (Richard Guo) §

    Very large user-specified offsets (close to INT64_MAX) could result in errors or incorrect query results.

  • Fix buffer overread when pglz_decompress() receives corrupt input (Andrew Dunstan) §

    It was possible to read a few bytes past the end of the input, which in very unlucky cases might cause a crash.

  • Ensure that tuplestore data structures are internally consistent even after an error (Tom Lane) §

    The code was previously careless about this, which is fine most of the time but is problematic for the tuplestore backing a WITH HOLD cursor. In v15 and before this leads to easily-reproducible crashes; later branches are not known to be vulnerable, but it seems best to preserve consistency in all.

  • Fix premature NULL lag reporting in pg_stat_replication (Shinya Kato) §

    The lag columns frequently read as NULL even while replication activity was happening.

  • Avoid rare flush failure when working with non-WAL-logged GiST indexes (Tomas Vondra) §

    A non-logged GiST index could nonetheless sometimes produce xlog flush request n/nnnn is not satisfied errors, due to incorrect selection of a fake LSN to represent an insertion point.

  • Fix underestimate of required size of DSA page maps for odd-size segments (Paul Bunn) §

    This miscalculation led to out-of-bounds accesses and hence server crashes.

  • Fix possible server crash when processing extended statistics on expressions of extension data types (Michael Paquier) §

    NULL pointer dereferences were possible if the data type's typanalyze function does not compute any useful statistics. No in-core typanalyze function behaves that way, but extensions could.

  • Fix race condition between WAL replay of checkpoints and multixact ID creations (Heikki Linnakangas) §

    A standby server following WAL from a primary of an older minor version could get into a crash-and-restart loop complaining about could not access status of transaction.

  • Prevent indefinite wait in shutdown of a walsender process (Anthonin Bonnefoy) § §

    At shutdown of a cluster that is publishing logical replication data, the walsender waits for all pending WAL to be written out. But it did not correctly request that to happen, so that in some cases this could become an indefinite wait.

  • Ensure that changes to tables' free space maps are persisted during recovery (Alexey Makhmutov) §

    Previously, while WAL replay did update the free space map while replaying operations that should change it, the map page buffer did not get marked dirty if checksums are enabled, so that the changes might never get written out. On a standby server, over time this would result in a map wildly at variance with the table's actual contents. While the map is only used as a hint, this condition could cause significant performance degradation for some period of time after the standby server is promoted to be active, until most of the map has been repaired by updates.

  • Fix crashes in some ecpg functions when called without any established connection (Shruthi Gowda) §

  • In pg_upgrade, take care to use the correct protocol version when connecting to older source servers (Jacob Champion) §

    This could be problematic when attempting to upgrade from a pre-2018 server.

  • Fix contrib/ltree to cope when case-folding changes a string's byte length (Jeff Davis) §

    Previously, lquery patterns specifying case-insensitive matching might fail to match labels they should match.

  • In contrib/pg_stat_statements, don't leak memory if an error occurs while parsing the pgss_query_texts.stat file (Heikki Linnakangas) §

  • In contrib/postgres_fdw, avoid crash due to premature cleanup of a failed connection (Etsuro Fujita) §

    If a remote connection fails abort cleanup, we can't use it any longer. But delay closing the connection object until end of transaction, because there might still be references to it within data structures such as open cursors.

  • Update time zone data files to tzdata release 2026b (Tom Lane) §

    British Columbia (America/Vancouver) will be on year-round UTC-07 (effectively, permanent DST) beginning in November 2026. This release assumes that their TZ abbreviation will be MST from that time forward. That seems likely to change, but it's unclear what new abbreviation will be used. Also a historical correction for Moldova: they have followed EU DST transition times since 2022.