↑↓ select ↵ open ⌫ change scope Open full search

PG.CENTER connects PostgreSQL documentation, reference, and ecosystem knowledge. Maintained by Pigsty.

DocumentationVersion comparison

POSTGRESQL · VERSION COMPARE

PostgreSQL 9.6.20 release changes

All features, fixes, and compatibility notes in this release, with related records from other versions.

All changes in this release
All changes in this release

Includes changes after the source version through the target. A major version name means its initial release.

From PostgreSQL 9.0 onward: 17 major branches and 352 release notes. Updated 2026-09-26.

Complete release changes

9.6.20

2020-11-12

Export JSON
36changesFeatures, fixes, improvements
1releaseGrouped by release
3CVEsVulnerability IDs mentioned in these notes

9.6.20 HistoricalSupport ends 2021-11-11

Security records mentioned in this release 3 CVEs
CVEs mentioned in these notes, including possible follow-up fixes for earlier vulnerabilities
CVE / issueSeverityFixed version
CVE-2020-25695

Block DECLARE CURSOR ... WITH HOLD and firing of deferred triggers within index expressions and materialized view queries

8.89.6.20
CVE-2020-25694

Fix usage of complex connection-string parameters in pg_dump, pg_restore, clusterdb, reindexdb, and vacuumdb

8.19.6.20
CVE-2020-25696

Prevent psql's \gset command from modifying specially-treated variables

7.59.6.20

PostgreSQL 9.6.20

Migration and compatibility

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

However, if you are upgrading from a version earlier than 9.6.16, see Section E.9.

SecurityBlock DECLARE CURSOR ... WITH HOLD and firing of deferred triggers within index expressions and materialized view queries

Changes

Block DECLARE CURSOR ... WITH HOLD and firing of deferred triggers within index expressions and materialized view queries (Noah Misch)

This is essentially a leak in the "security restricted operation" sandbox mechanism. An attacker having permission to create non-temporary SQL objects could parlay this leak to execute arbitrary SQL code as a superuser.

The PostgreSQL Project thanks Etienne Stalmans for reporting this problem. (CVE-2020-25695)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

SecurityFix usage of complex connection-string parameters in pg_dump, pg_restore, clusterdb, reindexdb, and vacuumdb

Changes

Fix usage of complex connection-string parameters in pg_dump, pg_restore, clusterdb, reindexdb, and vacuumdb (Tom Lane)

The -d parameter of pg_dump and pg_restore, or the --maintenance-db parameter of the other programs mentioned, can be a "connection string" containing multiple connection parameters rather than just a database name. In cases where these programs need to initiate additional connections, such as parallel processing or processing of multiple databases, the connection string was forgotten and just the basic connection parameters (database name, host, port, and username) were used for the additional connections. This could lead to connection failures if the connection string included any other essential information, such as non-default SSL or GSS parameters. Worse, the connection might succeed but not be encrypted as intended, or be vulnerable to man-in-the-middle attacks that the intended connection parameters would have prevented. (CVE-2020-25694)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

SecurityWhen psql's \connect command re-uses connection parameters, ensure that all non-overridden parameters from a previous connection string are re-used

Changes

When psql's \connect command re-uses connection parameters, ensure that all non-overridden parameters from a previous connection string are re-used (Tom Lane)

This avoids cases where reconnection might fail due to omission of relevant parameters, such as non-default SSL or GSS options. Worse, the reconnection might succeed but not be encrypted as intended, or be vulnerable to man-in-the-middle attacks that the intended connection parameters would have prevented. This is largely the same problem as just cited for pg_dump et al, although psql's behavior is more complex since the user may intentionally override some connection parameters. (CVE-2020-25694)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

SecurityPrevent psql's \gset command from modifying specially-treated variables

Changes

Prevent psql's \gset command from modifying specially-treated variables (Noah Misch)

\gset without a prefix would overwrite whatever variables the server told it to. Thus, a compromised server could set specially-treated variables such as PROMPT1, giving the ability to execute arbitrary shell code in the user's session.

The PostgreSQL Project thanks Nick Cleaton for reporting this problem. (CVE-2020-25696)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsPrevent possible data loss from concurrent truncations of SLRU logs

Changes

Prevent possible data loss from concurrent truncations of SLRU logs (Noah Misch)

This rare problem would manifest in later "apparent wraparound" or "could not access status of transaction" errors.

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsEnsure that SLRU directories are properly fsync'd during checkpoints

Changes

Ensure that SLRU directories are properly fsync'd during checkpoints (Thomas Munro)

This prevents possible data loss in a subsequent operating system crash.

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

Bug fixesFix ALTER ROLE for users with the BYPASSRLS attribute

Changes

Fix ALTER ROLE for users with the BYPASSRLS attribute (Tom Lane, Stephen Frost)

The BYPASSRLS attribute is only allowed to be changed by superusers, but other ALTER ROLE operations, such as password changes, should be allowed with only ordinary permission checks. The previous coding erroneously restricted all changes on such a role to superusers.

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

Bug fixesFix handling of expressions in CREATE TABLE LIKE with inheritance

Changes

Fix handling of expressions in CREATE TABLE LIKE with inheritance (Tom Lane)

If a CREATE TABLE command uses both LIKE and traditional inheritance, column references in CHECK constraints and expression indexes that came from a LIKE parent table tended to get mis-numbered, resulting in wrong answers and/or bizarre error messages. The same could happen in GENERATED expressions, in branches that have that feature.

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

Bug fixesFix off-by-one conversion of negative years to BC dates in to_date() and to_timestamp()

Changes

Fix off-by-one conversion of negative years to BC dates in to_date() and to_timestamp() (Dar Alathar-Yemen, Tom Lane)

Also, arrange for the combination of a negative year and an explicit "BC" marker to cancel out and produce AD.

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsEnsure that standby servers will archive WAL timeline history files when archive_mode is set to always

Changes

Ensure that standby servers will archive WAL timeline history files when archive_mode is set to always (Grigory Smolkin, Fujii Masao)

This oversight could lead to failure of subsequent PITR recovery attempts.

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsDuring "smart" shutdown, don't terminate background processes until all client (foreground) sessions are done

Changes

During "smart" shutdown, don't terminate background processes until all client (foreground) sessions are done (Tom Lane)

The previous behavior broke parallel query processing, since the postmaster would terminate parallel workers and refuse to launch any new ones. It also caused autovacuum to cease functioning, which could have dire long-term effects if the surviving client sessions make a lot of data changes.

Related records (3)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsAvoid recursive consumption of stack space while processing signals in the postmaster

Changes

Avoid recursive consumption of stack space while processing signals in the postmaster (Tom Lane)

Heavy use of parallel processing has been observed to cause postmaster crashes due to too many concurrent signals requesting creation of a parallel worker process.

Related records (3)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsAvoid running atexit handlers when exiting due to SIGQUIT

Changes

Avoid running atexit handlers when exiting due to SIGQUIT (Kyotaro Horiguchi, Tom Lane)

Most server processes followed this practice already, but the archiver process was overlooked. Backends that were still waiting for a client startup packet got it wrong, too.

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsAvoid misoptimization of subquery qualifications that reference apparently-constant grouping columns

Changes

Avoid misoptimization of subquery qualifications that reference apparently-constant grouping columns (Tom Lane)

A "constant" subquery output column isn't really constant if it is a grouping column that appears in only some of the grouping sets.

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsAvoid failure when SQL function inlining changes the shape of a potentially-hashable subplan comparison expression

Changes

Avoid failure when SQL function inlining changes the shape of a potentially-hashable subplan comparison expression (Tom Lane)

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsWhile building or re-building an index, tolerate the appearance of new HOT chains due to concurrent updates

Changes

While building or re-building an index, tolerate the appearance of new HOT chains due to concurrent updates (Anastasia Lubennikova, Álvaro Herrera)

This oversight could lead to "failed to find parent tuple for heap-only tuple" errors.

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsEnsure that data is detoasted before being inserted into a BRIN index

Changes

Ensure that data is detoasted before being inserted into a BRIN index (Tomas Vondra)

Index entries are not supposed to contain out-of-line TOAST pointers, but BRIN didn't get that memo. This could lead to errors like "missing chunk number 0 for toast value NNN". (If you are faced with such an error from an existing index, REINDEX should be enough to fix it.)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsHandle concurrent desummarization correctly during BRIN index scans

Changes

Handle concurrent desummarization correctly during BRIN index scans (Alexander Lakhin, Álvaro Herrera)

Previously, if a page range was desummarized at just the wrong time, an index scan might falsely raise an error indicating index corruption.

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

Bug fixesFix rare "lost saved point in index" errors in scans of multicolumn GIN indexes

Changes

Fix rare "lost saved point in index" errors in scans of multicolumn GIN indexes (Tom Lane)

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

Bug fixesFix use-after-free hazard when an event trigger monitors an ALTER TABLE operation

Changes

Fix use-after-free hazard when an event trigger monitors an ALTER TABLE operation (Jehan-Guillaume de Rorthais)

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

Bug fixesFix incorrect error message about inconsistent moving-aggregate data types

Changes

Fix incorrect error message about inconsistent moving-aggregate data types (Jeff Janes)

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsAvoid lockup when a parallel worker reports a very long error message

Changes

Avoid lockup when a parallel worker reports a very long error message (Vignesh C)

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsAvoid unnecessary failure when transferring very large payloads through shared memory queues

Changes

Avoid unnecessary failure when transferring very large payloads through shared memory queues (Markus Wanner)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

Bug fixesFix relation cache memory leaks with RLS policies

Changes

Fix relation cache memory leaks with RLS policies (Tom Lane)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

Bug fixesFix small memory leak when SIGHUP processing decides that a new GUC variable value cannot be applied without a restart

Changes

Fix small memory leak when SIGHUP processing decides that a new GUC variable value cannot be applied without a restart (Tom Lane)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsMake libpq support arbitrary-length lines in .pgpass files

Changes

Make libpq support arbitrary-length lines in .pgpass files (Tom Lane)

This is mostly useful to allow using very long security tokens as passwords.

Related records (4)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsIn libpq for Windows, call WSAStartup() once per process and WSACleanup() not at all

Changes

In libpq for Windows, call WSAStartup() once per process and WSACleanup() not at all (Tom Lane, Alexander Lakhin)

Previously, libpq invoked WSAStartup() at connection start and WSACleanup() at connection cleanup. However, it appears that calling WSACleanup() can interfere with other program operations; notably, we have observed rare failures to emit expected output to stdout. There appear to be no ill effects from omitting the call, so do that. (This also eliminates a performance issue from repeated DLL loads and unloads when a program performs a series of database connections.)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

Bug fixesFix ecpg library's per-thread initialization logic for Windows

Changes

Fix ecpg library's per-thread initialization logic for Windows (Tom Lane, Alexander Lakhin)

Multi-threaded ecpg applications could suffer rare misbehavior due to incorrect locking.

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsOn Windows, make psql read the output of a backtick command in text mode, not binary mode

Changes

On Windows, make psql read the output of a backtick command in text mode, not binary mode (Tom Lane)

This ensures proper handling of newlines.

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsEnsure that pg_dump collects per-column information about extension configuration tables

Changes

Ensure that pg_dump collects per-column information about extension configuration tables (Fabrízio de Royes Mello, Tom Lane)

Failure to do this led to crashes when specifying --inserts, or underspecified (though usually correct) COPY commands when using COPY to reload the tables' data.

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsMake pg_upgrade check for pre-existence of tablespace directories in the target cluster

Changes

Make pg_upgrade check for pre-existence of tablespace directories in the target cluster (Bruce Momjian)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

Bug fixesFix potential memory leak in contrib/pgcrypto

Changes

Fix potential memory leak in contrib/pgcrypto (Michael Paquier)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsAdd check for an unlikely failure case in contrib/pgcrypto

Changes

Add check for an unlikely failure case in contrib/pgcrypto (Daniel Gustafsson)

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsUse return not exit() in configure's test programs

Changes

Use return not exit() in configure's test programs (Peter Eisentraut)

This avoids failures with pickier compilers.

Related records (1)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsUpdate time zone data files to tzdata release 2020d for DST law changes in Fiji, Morocco, Palestine, the Canadian Yukon, Macquarie Island, and Casey Station (Antarctica); plus historical corrections for France, Hungary, Monaco, and Palestine.

Changes

Update time zone data files to tzdata release 2020d for DST law changes in Fiji, Morocco, Palestine, the Canadian Yukon, Macquarie Island, and Casey Station (Antarctica); plus historical corrections for France, Hungary, Monaco, and Palestine.

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

ImprovementsSync our copy of the timezone library with IANA tzcode release 2020d

Changes

Sync our copy of the timezone library with IANA tzcode release 2020d (Tom Lane)

This absorbs upstream's change of zic's default output option from "fat" to "slim". That's just cosmetic for our purposes, as we continue to select the "fat" mode in pre-v13 branches. This change also ensures that strftime() does not change errno unless it fails.

Related records (5)

“Same change” requires complete matching evidence. “Related commits” can cover independent changes, a partial backport, or a follow-up correction; each release keeps its own explanation.

How is this comparison generated?

The comparison follows PostgreSQL release notes from just after the source through the target version. For a major upgrade, maintenance releases from each older branch are included only up to the next major release date, and never after the target date. A major version such as 18 means its initial release, 18.0. Previews and development snapshots are labeled separately.

Entries come from the original English manuals. Release coverage and commit evidence are verified against upstream sources. Every entry retains its complete explanation and source link. Categories aid browsing; read the full notes for impact, conditions, and migration steps.

Fixes can be backported to several branches. Confirmed duplicates are merged conservatively, with every branch explanation retained. A note describing several independent fixes is excluded only when all are already present in the source. Major-release features remain distinct from related maintenance patches unless their complete original descriptions match. Uncertain matches are retained. This is a release-note history, not an exhaustive comparison of compiled binaries.

CVE results are calculated independently from the PostgreSQL security registry and vulnerability records. A CVE counts as gained protection only when the source is affected and the target is fixed or unaffected. Remaining vulnerabilities are listed separately. Security entries and distinct CVEs are counted separately.

Interaction inspired by pgversions.com and pgversionreport. Content comes from PostgreSQL release notes. See the release notes archive.