E.1. Release 18.5 #

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

Release date: 2026-08-13

This release contains a variety of fixes from 18.4. For information about new features in major release 18, see Section E.6.

E.1.1. Migration to Version 18.5 #

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

However, if you have any GIN indexes, see the changelog entry below about possibly-corrupt reltuples values for their tables.

Also, if you use contrib/btree_gist or contrib/ltree, you may need to reindex indexes made with those extensions; see the relevant entries below.

Also, if you are upgrading from a version earlier than 18.2, see Section E.4.

E.1.2. Changes #

  • Ensure that parallel GIN index builds update the table's pg_class.reltuples value correctly (Jan Nidzwetzki, Tomas Vondra) §

    A parallel worker could report an uninitialized value for the number of rows it processed, leading to a bogus value for reltuples, even Infinity or NaN. Such values could lead to subsequent autovacuum and autoanalyze operations never deciding that the table needs to be processed. If so, the situation will not self-heal. A manual ANALYZE command, or creation of another index, will be needed to reset reltuples to the correct value. If you have any tables with GIN indexes, it's recommended to check to see if their reltuples entries look sane. A query such as this may be helpful:

    SELECT DISTINCT t.oid::regclass, t.reltuples
    FROM pg_class t
      JOIN pg_index i ON t.oid = i.indrelid
      JOIN pg_class ic ON i.indexrelid = ic.oid
    WHERE t.relhasindex AND ic.relam = 2742;
    

  • Fix self-deadlock when replaying WAL generated by an older minor version (Andrey Borodin)

    This error was introduced in the previous set of minor releases. It caused standby servers that were following a primary of an older minor release version to get stuck in some scenarios.

  • Fix mis-handling of asynchronous reads when rescanning an asynchronous Append plan node (Alexander Korotkov, Gleb Kashkin, Etsuro Fujita) §

    When an upper plan node rescans an Append before having read the entire Append output, we need to discard any in-flight requests sent to external servers (by postgres_fdw for example). This was not done correctly in cases where a subplan has parameter changes or is discarded by partition pruning in the next scan. The outcome could be incorrect query results, an infinite loop, or an assertion failure.

  • Fix error in partition pruning for RANGE-partitioned tables (David Rowley) §

    In some cases the DEFAULT partition would be skipped when it should not be, which could lead to rows missing from query results.

  • Correctly update foreign-data-wrapper state in a ModifyTable plan node after pruning result relations (Ayush Tiwari, Rafia Sabih) § §

    Previously, if run-time partition pruning determined that some partitions of a partitioned target table need not be scanned and the table had any foreign-table partitions, a crash or erroneous behavior was likely.

  • Fix missed concurrent update in UPDATE with RETURNING OLD on a table that has a BEFORE UPDATE trigger (Dean Rasheed) §

    If the target row was concurrently updated, then at isolation level READ COMMITTED any OLD values in RETURNING should reflect the updated row. But stale values were returned if there was a trigger (although the trigger itself, and the final output row, saw the correct values).

  • Fix hash join performance issue when there are multiple join keys and many NULL values (David Rowley) §

    Null-keyed tuples should not get inserted into the hash table, since they will never match any other tuples. The code got this wrong if the null was in a non-last join column, bloating the hash table quite a lot if many inputs contain nulls.

  • Fix parsing of parenthesized OLD/NEW in RETURNING expressions (Marko Grujic) §

    Expressions such as (old).colname and (old).* were mis-handled, effectively converting them to NEW references.

  • Fix planner's nullability and strictness checks for value IN (array) expressions (Ayush Tiwari) §

    These checks should only succeed if the array operand is known to be non-empty, but that consideration was missed, allowing optimizations to be applied that should not be. This could result in wrong query answers if the array actually was empty.

  • Fix incorrect join removal logic (Matheus Alcantara, Richard Guo) § §

    In edge cases, it was possible for a constant output value coming from within the nullable side of an outer join to not be replaced by NULL when it should be.

  • Clean up PlaceHolderVars more thoroughly during join removal (Richard Guo, Arne Roland) § §

    This fix corrects various edge cases that could trip assertions or result in incorrect plans.

  • Add missed checks for hashability of equality comparisons on container datatypes (arrays, composites, ranges) (Andrei Lepikhov, Tom Lane) §

    The planner must verify hashability of the container's component type(s) before deciding it can use a hash-based plan type. This step was missed in some places, leading to could not identify a hash function failures at execution.

  • Avoid pushing WHERE clauses down past a grouping step that has a different equivalence rule (Richard Guo) §

    A test on a grouping column that is grouped by a nondeterministic collation is safe to push down only if it is a comparison using that same collation. Otherwise it might filter some rows the grouping would have merged.

  • Fix mis-optimization of COUNT window functions that have an EXCLUDE clause or lack ORDER BY (Chengpeng Yan, David Rowley) §

    These window functions were treated as monotonic when they should not be, allowing wrong answers to be computed.

  • Avoid cache lookup failed for collation 0 error when planner looks up statistics for a column of type "char" (Feng Wu) §

  • Fix ALTER COLUMN ... DROP EXPRESSION to work when there are multiple levels of partitions (Alberto Piai) §

  • Fix attaching partitions of indexes that are exclusion constraints (Japin Li) §

    Notably, this oversight broke dump/restore of partitioned exclusion constraints.

  • Prevent setting NO INHERIT on partitioned NOT NULL constraints via ALTER CONSTRAINT (Andreas Karlsson) §

    NOT NULL constraints on partitioned tables are supposed to be inherited by all partitions, and therefore must not be marked NO INHERIT. This rule was correctly enforced by constraint creation, but not by ALTER TABLE ... ALTER CONSTRAINT.

  • Disallow renaming a rule to _RETURN (Tom Lane) §

    That name is reserved for a view's ON SELECT rule, but ALTER RULE allowed renaming other rules to _RETURN, causing trouble later.

  • Fix missing lock release for role membership grants in DROP OWNED BY (Jeff Davis) §

    This oversight resulted in a warning message, followed by retaining a lock on the membership grant until the end of the transaction.

  • Fix failure of EXPLAIN when deparsing SQL/JSON aggregates (Richard Guo) §

    Some plan structures resulted in invalid JsonConstructorExpr underlying node type errors.

  • Fix use of REINDEX CONCURRENTLY with a deferred uniqueness constraint (Nitin Motiani) §

    The transient index copy created during REINDEX CONCURRENTLY was incorrectly marked as enforcing immediate uniqueness, causing spurious reports of constraint violation.

  • Fix LIKE matching with nondeterministic collations and backslashes (Nitin Motiani, Tom Lane) § §

    When using a nondeterministic collation, LIKE mishandled an escaped backslash (\\), treating it as effectively not there. It also did the wrong thing with a leading backslash preceding an ordinary character; in that case the backslash should be effectively ignored, but it caused the ordinary character to be matched exactly rather than allowing the nondeterministic collation to decide if there's a match.

  • Fix LIKE/regex optimization for indexscan with exact-match pattern (Jelte Fennema-Nio) §

    Refactoring for LIKE with non-deterministic collations accidentally broke the optimization for converting a LIKE or regex exact-match pattern to an equality index condition when the index collation doesn't match the expression collation. Among other things, that made psql's \d tablename command much slower.

  • Fix matching of localized month/day names in to_date() (Heikki Linnakangas) §

    The matching logic misbehaved in cases where case-folding changes the byte length of the string.

  • Correct case-folding rules for Greek final sigma (Jeff Davis) §

    If the string is preceded only by Case Ignorable characters, don't consider it to be a final sigma. This only affects the built-in pg_unicode_fast locale.

  • Fix incorrect NFC recomposition for Hangul U+11A7 (TBASE) (Diego Frias, Michael Paquier) §

    This character was treated as a valid T syllable, which it is not, and hence silently swallowed during normalization.

  • Avoid possible truncation of output lexemes in case-insensitive synonym dictionaries (Jeff Davis) §

    If folding to lower case increased the byte length of a lexeme, it was incorrectly truncated to its original byte length when emitted.

  • Defend against truncated UTF-8 characters in case-conversion logic (Jeff Davis) §

  • Fix typo in hash_record_extended() (Man Zeng) §

    The code failed to initialize the second isnull argument passed to FunctionCallInvoke(). This is harmless for existing in-core extended hash support functions, which will not examine that value. However, extension-provided hash functions could be affected if they inspect PG_ARGISNULL(1).

  • Fix pg_get_publication_tables() to not fail if a publishable table is dropped concurrently (Bharath Rupireddy) §

  • Prevent satisfies_hash_partition() from crashing with VARIADIC NULL (Robert Haas) §

  • Report invalid-weight errors more cleanly and consistently in tsvector_filter() and allied functions (Ewan Young) §

    In particular, report weight characters that are not printable ASCII in octal form (\nnn), as charout() would render them. This avoids possibly producing an invalidly-encoded error message.

  • Reject out-of-range timestamp shift values in uuidv7() (Baji Shaik) §

    The shift value must not be so large as to produce a timestamp out of the range that a v7 UUID can represent. Previously, a garbage UUID value was produced.

  • Fix mishandling of namespace nodes in xpath() (Michael Paquier) § §

    This fix avoids an unexpected could not copy node error.

  • Fix jsonpath's .decimal method to not throw a hard error for incorrect precision or scale (Ewan Young) § §

    Silent mode should suppress these errors, but failed to.

  • Treat an undefined jsonpath variable as an error even when no variables are supplied (Andrey Rachitskiy)

    The jsonb @? and @@ operators cannot supply any variables to be used in their jsonpath expressions. This code path erroneously treated an unknown jsonpath variable as a JSON null, rather than raising an error as expected. Aside from not being the expected behavior, this mistake could result in unbounded memory consumption.

  • Fix NULL-pointer crash when IS JSON or similar constructs have an argument that is of string category but lacks a cast to type text (Ayush Tiwari) §

    There are no such data types in core PostgreSQL, but the problem is reachable with some extension types.

  • Ensure that SQL/JSON ON EMPTY / ON ERROR DEFAULT values are coerced to the correct typmod (Ewan Young) §

    For example, the declared precision and scale of a numeric target column were not applied to the default value.

  • Avoid machine-dependent behavior when dividing the smallest possible money value by -1 (Andrey Rachitskiy) §

  • Fix crash after out-of-memory failure partway through creation of a cache entry for a text search dictionary (Tom Lane) §

  • Fix memory-safety bugs in processing of incorrect ispell/hunspell dictionary files (Andrey Rachitskiy) §

  • Prevent access to other sessions' temporary tables (Jim Jones, Daniil Davydov, Alexander Korotkov) § §

    Some code paths failed to prevent this, leading to silently wrong (inconsistent) results.

  • Prevent no empty local buffer available errors during temporary table access (Melanie Plageman) §

    Limit the number of local buffers that the read streaming mechanism is allowed to use. Previously, a large value of effective_io_concurrency could allow a single stream to use all the buffers, resulting in failure.

  • Fix the order in which autovacuum processes databases (Rustam Khamidullin) §

    It was unintentionally processing databases from lowest to highest score, when it should be doing the reverse.

  • Restore full use of shared buffer pool in VACUUM's wraparound failsafe mode (Melanie Plageman) § §

    An ordinary VACUUM is limited to use just a few shared buffers, so as not to impinge too much on other processing. However, in failsafe mode we want to reclaim transaction IDs as quickly as possible, so that limit is supposed to be abandoned to allow vacuuming to proceed as fast as possible. This behavior was accidentally broken during refactoring in v18; restore it.

  • Fix memory leak in parallel vacuum worker processes (Baji Shaik) §

    Progress reports from a parallel worker leaked about 1kB per report, with the waste accumulating for the life of the worker process.

  • Honor query cancel and vacuum delay during GIN index posting-tree cleanup (Paul Kim, Alexander Korotkov) §

    The posting tree for a common value can be large, so that this missed check could allow vacuum to run for a long time before noticing an interrupt.

  • Fix possible mis-decoding of index tuples during GiST and SP-GiST index-only scans (Peter Geoghegan) §

    This error could lead to emitting corrupted data from an index-only scan plan. The only affected core opclass is GiST's range_ops, and it could only fail if the range column were not the first index column.

  • Ensure that the new last block of a bulk-extended table is added to its free space map promptly (Jingtang Zhang) §

    An off-by-one error caused the last block of a multi-block table extension to not be marked as free in the map. This would eventually get corrected by vacuum, but meanwhile the space wouldn't be used.

  • Avoid possible double-free or infinite error recovery loop in resource cleanup during transaction abort (Tom Lane) §

  • When creating directories, tolerate concurrent creation of the same directory (Andrew Dunstan, Tom Lane) §

  • Fix JIT-compiled tuple deconstruction code to account correctly for virtual generated columns (David Rowley) §

  • Prevent creation of dangling object dependencies by acquiring a shared lock on any object being depended on (Bertrand Drouvot) § §

    The shared lock will conflict with any attempt to drop the depended-on object, eliminating the race condition that formerly existed. For example, if one session drops a schema (that appears empty to it) concurrently with some other session creating a function in that schema, previously both transactions could commit, leaving an invalid function definition behind. Now, one transaction or the other will fail.

  • Fix race condition in conflict detection for SERIALIZABLE isolation mode (Peter Geoghegan) §

    A conflict could be missed when examining an initially-empty btree index, allowing failure of serializability due to improperly allowing conflicting transactions to commit.

  • Fix race condition in ProcSignalBarrier code (Masahiko Sawada) §

    This error could result in processes getting stuck, typically after reporting still waiting for backend with PID nnnn to accept ProcSignalBarrier.

  • Fix race conditions when a set of processes that belong to the same lock group exit at the same time (Vlad Lesin) § §

    These errors could lead to PANIC aborts, with messages such as latch already owned. The issue does not normally arise in regular parallel query, since the leader won't exit before seeing its workers finish; but some extensions reach the problem.

  • Fix WAL logging of operations that clear bits in tables' visibility maps (Melanie Plageman, Andres Freund) § § §

    Such VM changes were missed by the WAL summarizer, potentially leading to incorrect incremental backups. We also failed to log full-page images of such VM pages when needed, potentially allowing torn page writes to go uncorrected. This could lead to misbehavior later, such as wrong results from index-only scans.

  • Prevent WAL summarizer process from getting stuck at a timeline switch (Robert Haas) § §

  • Fix race with timeline selection in logical decoding during standby promotion (Bertrand Drouvot) § §

    Logical decoding being performed on the standby could fail with a requested WAL segment has already been removed error. A repeat attempt would succeed, so there was no permanent problem but there was an availability hazard.

  • Avoid exposing a WAL receiver's full connection string during timeline jumps (Chao Li) §

    The pg_stat_wal_receiver view should show a sanitized version of the connection string, without sensitive data. But it transiently showed the full string when we re-use an existing WAL receiver.

  • Use run-time checks, not just Asserts, to verify the correct number of columns in tuples received during logical replication (Varik Matevosyan) §

    A malicious or buggy publisher could send inconsistent numbers of columns. While we could not find a scenario in which this would have serious ill effects, extra caution seems warranted.

  • Clean up quoting of string parameters within constructed replication commands (Tom Lane) §

    Various places that generate replication commands were not being adequately careful about quoting replication slot names and other parameters that need to be inserted into those commands. This could result in unexpected syntax errors in those commands. In principle, a crafted replication slot name could result in SQL injection; but such a scenario seems very unlikely to occur in practice, since replication operations can only be invoked by highly-privileged users and there is no reason for them to use a slot name coming from an untrustworthy source.

  • Fix logical decoding of empty prepared transactions (Masahiko Sawada) §

    A prepared transaction that did not cause any decodable updates could result in sending COMMIT/ROLLBACK PREPARED to the output plugin with no preceding PREPARE. For the built-in subscriber this breaks replication, and other plugins will probably not like it either.

  • Fix corruption of unlogged sequences after standby promotion (Fujii Masao) §

    Previously, if an unlogged sequence was created on the primary and replicated to a standby, accessing the sequence after promoting the standby could fail with bad magic number in sequence or related errors.

  • Fix cascading standby reconnect failure after archive fallback (Marco Nenciarini) §

    A cascading standby could fail to reconnect to its upstream standby with requested starting point ... is ahead of the WAL flush position after falling back to archive recovery.

  • Prevent accepting hot-standby connections before WAL replay has reached a consistent database state (Nikhil Sontakke) §

  • Do not try to clear pg_database.dathasloginevt locally on a standby server (Ayush Tiwari) §

    Event trigger cleanup tried to perform that action on standby servers as well as the primary. That can't work on a standby, and there's no need anyway since replay of the primary's database change will soon fix it.

  • Avoid race condition while dropping obsolete replication slots (Xuneng Zhou) §

    An incorrect unlock and log message could occur if another session immediately re-used the dropped slot's shared-memory entry.

  • Avoid race condition while dropping ephemeral replication slots (Zhijie Hou) §

    The slot-releasing code performed some additional updates to the replication slot's shared-memory entry after releasing the slot. This is unsafe since another session could immediately re-use the dropped slot's shared-memory entry. Skip those updates in the case of an ephemeral slot.

  • Fix stale progress reports during logical replication table synchronization (Shinya Kato) §

    Previously, the pg_stat_progress_copy view in the subscriber would continue to show the initial COPY operation as active even after the data copy had finished. The stale entry remained visible until synchronization caught up with the publisher.

  • Clear base backup progress on backup failure (Chao Li) § §

    Previously the pg_stat_progress_basebackup view would continue to show a stale progress entry after a failure, until the replication client disconnected. pg_basebackup normally disconnects immediately, but other clients might not.

  • Fix possible PANIC due to concurrent drop of pgstats entries when track_functions is enabled (Sami Imseih, Michael Paquier) § § §

  • Clean up broken local pgstats entry after failing to obtain space for the corresponding shared hashtable entry (Niall Newman) §

    Failure to do this led to a null-pointer dereference the next time the local entry was used.

  • Avoid recording incorrect I/O operation statistics after a failed read or write (Bertrand Drouvot) §

  • In PL/Perl, avoid NULL pointer dereference crash when working with an invalid PostgreSQL::InServer::ARRAY object (Xing Guo) §

  • In PL/Python, properly check for errors when working with sequence and mapping objects (Richard Guo) §

    Previously, a broken object or an unhandled exception could result in a NULL pointer dereference crash.

  • In libpq, always drain all pending bytes from the SSL or GSS decryption buffer during pqReadData() (Jacob Champion) § § § §

    This avoids edge cases where libpq or its calling application waits for more data to arrive on the socket, but actually all the data has already arrived.

  • Improve libpq's handling of out-of-memory conditions (Anthonin Bonnefoy) §

  • Fix libpq's trace facility to print new-style BackendKeyData and CancelRequest messages correctly (Anthonin Bonnefoy) §

  • Allow libpq to accept ParameterDescription messages exceeding 30000 bytes (Ning Sun) §

    Previously, this message type was not among those that libpq's validity heuristics believed could be long. The limit resulted in failure for prepared queries having more than 7498 parameters, which is unlikely but supported.

  • Fix null-pointer crash in ecpg compiler (Jehan-Guillaume de Rorthais) §

    ecpg failed on a DECLARE section containing a union nested inside a struct.

  • Reject multiple descriptor header items in ecpg's GET/SET DESCRIPTOR statements (Masashi Kamura) §

    Previously the grammar allowed this syntax, but broken C code was generated. Adjust the grammar and the documentation to allow only one header item.

  • Fix issues with deferred errors in pipeline mode in psql (Michael Paquier) §

    psql could get stuck or suffer an assertion failure in some scenarios where the server reports an error in response to a Sync message, such as a deferred constraint violation.

  • Make line widths match in psql's expanded aligned output format (Pavel Stehule) §

    When the table's data rows are narrower than the record header lines, widen the data rows to match the headers, avoiding unsightly output.

  • Enforce the intended upper limit for psql's special variable WATCH_INTERVAL (Sven Klemm, Daniel Gustafsson) §

    If a too-large value was given, psql reported an error but applied the setting anyway.

  • Fix psql's privilege check for showing database size in \l+ (Christoph Berg) §

    The underlying server function permits users who have pg_read_all_stats privileges to see the sizes of all databases, even if they lack CONNECT privilege. But psql was unaware of that provision and would not call the function unless the user has CONNECT privilege.

  • Fix psql's tab completion for \df to consider procedures too (Erik Wienhold) §

  • Fix thread-safety bug in pgbench (Fujii Masao) §

    When pgbench runs with multiple threads and the --verbose-errors option, different threads could attempt to use the same buffer to construct error messages, leading to corrupted log output.

  • In pg_combinebackup, prevent infinite loop if the source file is shorter than expected (Peter Eisentraut) §

  • Fix cleanup of publisher-side objects after errors in pg_createsubscriber (Nisha Moond) §

    When pg_createsubscriber fails after creating logical replication objects, it should remove the publication and replication slot that it created on the publisher. Some error cases failed to do so.

  • Use the source cluster's group-read file permissions for pg_recvlogical output files (Fujii Masao) §

    pg_recvlogical was documented to behave this way, but it never actually enabled group-read.

  • Fix inconsistent behavior of pg_restore with --statistics or --statistics-only (Chao Li, Michael Paquier) § §

    When combined with other selective-restore options such as --schema, these options failed to restore the expected items, unlike pg_dump with similar options.

  • Fix vacuumdb --missing-stats-only to ignore partitioned expression indexes (Baji Shaik) §

    Previously, vacuumdb would always attempt to ANALYZE the partitioned table, accomplishing nothing since statistics are never created for partitioned indexes, only for their leaf indexes.

  • In contrib/amcheck, fix failure to report corruption of a btree metapage's allequalimage flag (Chao Li) §

  • In contrib/amcheck, fix query-lifespan memory leak while verifying a GIN index (Kirill Reshke) §

  • In contrib/amcheck, handle short-header varlena datums correctly (Andrey Borodin) §

    This error could result in doing excess work while verifying a btree index, but seems not to have had any worse consequences.

  • In contrib/btree_gist, fix NaN handling in the float4 and float8 opclasses (Bill Kim, Tom Lane) §

    Comparisons, as well as the GiST penalty and distance functions, did not account for NaN and would give the wrong answer when handed one. It is recommended to reindex btree_gist indexes on float columns after installing this update, if there is any possibility that there are NaN entries in those columns.

  • In contrib/btree_gist, fix sorting of bit/varbit entries during GiST index construction (Tom Lane) §

    Values of bit types were sorted as though they were byteas, which did not cause any obvious failure but would result in an inefficient index, since the types' representations are different. It is recommended to reindex btree_gist indexes on bit columns after installing this update.

  • In contrib/btree_gist, fix searches using a not-equal operator (Ayush Tiwari) §

    For variable-length data types, the code for scanning non-leaf index pages applied the wrong comparison function, leading to wrong results and potentially crashes.

  • In contrib/dblink and contrib/postgres_fdw, ensure that a user-mapping setting for use_scram_passthrough overrides one for a foreign server (Matheus Alcantara) § §

    Previously the precedence went the other way, but that is inconsistent with the behavior of other foreign-table options.

  • Reject setting use_scram_passthrough on contrib/dblink foreign-data wrappers (Matheus Alcantara) §

    This option is only meaningful on foreign servers and user mappings, but dblink incorrectly allowed it at the FDW level as well (and then ignored it).

  • Fix unguarded recursion and loops in contrib/hstore_plperl, contrib/jsonb_plperl, and contrib/jsonb_plpython (Aleksander Alekseev) § §

    Prevent stack overflow when dealing with deeply nested jsonb values, and allow interruption of the infinite loop caused when attempting to dereference circular chains of Perl object references.

  • Fix missed release of statistics catcache entry in contrib/intarray (Man Zeng) §

    This oversight led to warnings like resource was not closed: cache pg_statistic.

  • In contrib/ltree, fix integer overflow in comparisons (Ayush Tiwari) §

    ltree values containing more than about 14,653 labels resulted in wrong comparison answers due to overflow. If a btree index contains such values, it is probably corrupt and should be reindexed after installing this update.

  • In contrib/pgcrypto, avoid double-free crash after encountering an error while using an OSSLCipher object (Yuelin Wang) §

  • Fix out-of-bounds access in contrib/pg_prewarm's autoprewarm worker (Matheus Alcantara) §

    The code tried to fetch a value from one past the end of an array, risking a segfault.

  • Fix array overrun in contrib/pg_surgery's heap_force_kill and heap_force_freeze functions (Michael Paquier) §

    Attempting to change a TID whose offset number equals MaxHeapTuplesPerPage wrote one byte past the end of the allocated array, potentially crashing the server.

  • In contrib/pg_surgery, avoid infinite loop with TID arrays having more than 64K elements (Andrey Rachitskiy) §

  • Avoid NULL-pointer dereference in contrib/refint's check_foreign_key() (Ayush Tiwari) §

    In the on-update-cascade case, a null value of a referenced column led to a crash. This is an oversight in the fix for CVE-2026-6637, but the code that was there before that wasn't really right either.

  • Remove the plan cache in contrib/refint (Ayush Tiwari) §

    This caching behavior has several serious bugs, notably that check_foreign_key() embeds the new key values in its cascade-UPDATE queries, so a cached plan reuses the originally-needed values rather than the key values that should be used. The simplest solution is to remove it.

  • Fix contrib/seg to print segments with ~ certainty indicators correctly (Ewan Young) §

    Due to a typo, seg_out() did not print a ~ certainty indicator attached to a segment's upper boundary. Worse, if the lower boundary had ~ while the upper boundary had no indicator, the upper boundary was not printed at all, incorrectly converting the value into an open interval.

  • Fix crash with namespace nodes in contrib/xml2's xpath_nodeset() function (Andrey Chernyy, Michael Paquier) §

  • Support building PostgreSQL with Visual Studio 2026 (Andrew Dunstan)

  • Support building PostgreSQL with OpenSSL 4 (Daniel Gustafsson) §

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

    Alberta (America/Edmonton) will be on year-round UTC-06 (effectively, permanent DST) beginning in November 2026. This release assumes that their TZ abbreviation will be CST from that time forward. That seems likely to change, but it's unclear what new abbreviation will be used.

    Morocco (Africa/Casablanca) will move to permanent UTC+00, without daylight saving time transitions, on 2026-09-20.