↑↓ 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 12.1 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

12.1

2019-11-14

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

12.1 HistoricalSupport ends 2024-11-21

PostgreSQL 12.1

Migration and compatibility

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

Bug fixesFix crash when ALTER TABLE adds a column without a default value along with making other changes that require a table rewrite

Changes

Fix crash when ALTER TABLE adds a column without a default value along with making other changes that require a table rewrite (Andres Freund) § §

Bug fixesFix lock handling in REINDEX CONCURRENTLY

Changes

Fix lock handling in REINDEX CONCURRENTLY (Michael Paquier) § §

REINDEX CONCURRENTLY neglected to take a session-level lock on the new index version, potentially allowing other sessions to manipulate it too soon. Also, a query-cancel or session-termination interrupt arriving at the wrong time could result in failure to release the session-level locks that REINDEX CONCURRENTLY does hold.

Bug fixesAvoid crash due to race condition when reporting the progress of a CREATE INDEX CONCURRENTLY or REINDEX CONCURRENTLY command

Changes

Avoid crash due to race condition when reporting the progress of a CREATE INDEX CONCURRENTLY or REINDEX CONCURRENTLY command (Álvaro Herrera) §

ImprovementsAvoid creating duplicate dependency entries during REINDEX CONCURRENTLY

Changes

Avoid creating duplicate dependency entries during REINDEX CONCURRENTLY (Michael Paquier) §

This bug resulted in bloat in pg_depend, but no worse consequences than that.

ImprovementsPrevent VACUUM from trying to freeze an old multixact ID involving a still-running transaction

Changes

Prevent VACUUM from trying to freeze an old multixact ID involving a still-running transaction (Nathan Bossart, Jeremy Schneider) §

This case would lead to VACUUM failing until the old transaction terminates.

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 “wrong type of slot” error when trying to CLUSTER on an expression index

Changes

Fix “wrong type of slot” error when trying to CLUSTER on an expression index (Andres Freund) §

ImprovementsSET CONSTRAINTS ... DEFERRED failed on partitioned tables, incorrectly complaining about lack of triggers

Changes

SET CONSTRAINTS ... DEFERRED failed on partitioned tables, incorrectly complaining about lack of triggers (Álvaro Herrera) §

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.

Bug fixesFix failure when creating indexes for a partition, if the parent partitioned table contains any dropped columns

Changes

Fix failure when creating indexes for a partition, if the parent partitioned table contains any dropped columns (Michael Paquier) §

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.

Bug fixesFix dropping of indexed columns in partitioned tables

Changes

Fix dropping of indexed columns in partitioned tables (Amit Langote, Michael Paquier) § §

Previously this might fail with an error message complaining about the dependencies of the indexes. It should automatically drop the indexes, instead.

ImprovementsEnsure that a partition index can be dropped after a failure to reindex it concurrently

Changes

Ensure that a partition index can be dropped after a failure to reindex it concurrently (Michael Paquier) §

The index's pg_class.relispartition flag was left in the wrong state in such a case, causing DROP INDEX to fail.

Bug fixesFix handling of equivalence class members for partition-wise joins

Changes

Fix handling of equivalence class members for partition-wise joins (Amit Langote) §

This oversight could lead either to failure to use a feasible partition-wise join plan, or to a “could not find pathkey item to sort” planner failure.

ImprovementsEnsure that offset expressions in WINDOW clauses are processed when a query's expressions are manipulated

Changes

Ensure that offset expressions in WINDOW clauses are processed when a query's expressions are manipulated (Andrew Gierth) §

This oversight could result in assorted failures when the offsets are nontrivial expressions. One example is that a function parameter reference in such an expression would fail if the function was inlined.

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.

ImprovementsAvoid postmaster failure if a parallel query requests a background worker when no postmaster child process array slots remain free

Changes

Avoid postmaster failure if a parallel query requests a background worker when no postmaster child process array slots remain free (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 crash triggered by an EvalPlanQual recheck on a table with a BEFORE UPDATE trigger

Changes

Fix crash triggered by an EvalPlanQual recheck on a table with a BEFORE UPDATE trigger (Andres Freund) §

Bug fixesFix “unexpected relkind” error when a query tries to access a TOAST table

Changes

Fix “unexpected relkind” error when a query tries to access a TOAST table (John Hsu, Michael Paquier, Tom Lane) §

The error should say that permission is denied, but this case got broken during code refactoring.

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.

ImprovementsProvide a relevant error context line when an error occurs while setting GUC parameters during parallel worker startup

Changes

Provide a relevant error context line when an error occurs while setting GUC parameters during parallel worker startup (Thomas Munro) §

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 fsync() is applied only to files that are opened read/write

Changes

Ensure that fsync() is applied only to files that are opened read/write (Andres Freund, Michael Paquier) § §

Some code paths tried to do this after opening a file read-only, but on some platforms that causes “bad file descriptor” or similar errors.

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.

ImprovementsAllow encoding conversion to succeed on longer strings than before

Changes

Allow encoding conversion to succeed on longer strings than before (Álvaro Herrera, Tom Lane) §

Previously, there was a hard limit of 0.25GB on the input string, but now it will work as long as the converted output is not over 1GB.

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.

ImprovementsAvoid creating unnecessarily-bulky tuple stores for window functions

Changes

Avoid creating unnecessarily-bulky tuple stores for window functions (Andrew Gierth) §

In some cases the tuple storage would include all columns of the source table(s), not just the ones that are needed by the query.

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.

ImprovementsAllow repalloc() to give back space when a large chunk is reduced in size

Changes

Allow repalloc() to give back space when a large chunk is reduced in size (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.

ImprovementsEnsure that temporary WAL and history files are removed at the end of archive recovery

Changes

Ensure that temporary WAL and history files are removed at the end of archive recovery (Sawada Masahiko) §

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 in archive recovery if recovery_min_apply_delay is enabled

Changes

Avoid failure in archive recovery if recovery_min_apply_delay is enabled (Fujii Masao) §

recovery_min_apply_delay is not typically used in this configuration, but it should work.

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.

ImprovementsIgnore restore_command, recovery_end_command, and recovery_min_apply_delay settings during crash recovery

Changes

Ignore restore_command, recovery_end_command, and recovery_min_apply_delay settings during crash recovery (Fujii Masao) § §

Now that these settings can be specified in postgresql.conf, they could be turned on during crash recovery, but honoring them then is undesirable. Ignore these settings until crash recovery is complete.

Bug fixesFix logical replication failure when publisher and subscriber have different ideas about a table's replica identity columns

Changes

Fix logical replication failure when publisher and subscriber have different ideas about a table's replica identity columns (Jehan-Guillaume de Rorthais, Peter Eisentraut) § §

Declaring a column as part of the replica identity on the subscriber, when it does not exist at all on the publisher, led to “negative bitmapset member not allowed” errors.

Related records (2)

“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 unwanted delay during shutdown of a logical replication walsender

Changes

Avoid unwanted delay during shutdown of a logical replication walsender (Craig Ringer, Álvaro Herrera) §

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 timeout handling in logical replication walreceiver processes

Changes

Fix timeout handling in logical replication walreceiver processes (Julien Rouhaud) §

Erroneous logic prevented wal_receiver_timeout from working in logical replication deployments.

Related records (2)

“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.

ImprovementsCorrectly time-stamp replication messages for logical decoding

Changes

Correctly time-stamp replication messages for logical decoding (Jeff Janes) §

This oversight resulted, for example, in pg_stat_subscription.last_msg_send_time usually reading as NULL.

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 race condition during backend exit, when the backend process has previously waited for synchronous replication to occur

Changes

Fix race condition during backend exit, when the backend process has previously waited for synchronous replication to occur (Dongming Liu) §

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.

ImprovementsAvoid logging complaints about abandoned connections when using PAM authentication

Changes

Avoid logging complaints about abandoned connections when using PAM authentication (Tom Lane) §

libpq-based clients will typically make two connection attempts when a password is required, since they don't prompt their user for a password until their first connection attempt fails. Therefore the server is coded not to generate useless log spam when a client closes the connection upon being asked for a password. However, the PAM authentication code hadn't gotten that memo, and would generate several messages about a phantom authentication failure.

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 misbehavior of bitshiftright()

Changes

Fix misbehavior of bitshiftright() (Tom Lane) § §

The bitstring right shift operator failed to zero out padding space that exists in the last byte of the result when the bitstring length is not a multiple of 8. While invisible to most operations, any nonzero bits there would result in unexpected comparison behavior, since bitstring comparisons don't bother to ignore the extra bits, expecting them to always be zero.

If you have inconsistent data as a result of saving the output of bitshiftright() in a table, it's possible to fix it with something like

UPDATE mytab SET bitcol = ~(~bitcol) WHERE bitcol != ~(~bitcol);
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 result of text position() function (also known as strpos()) for an empty search string

Changes

Fix result of text position() function (also known as strpos()) for an empty search string (Tom Lane) §

Historically, and per the SQL standard, the result should be one in such cases, but 12.0 returned zero.

Bug fixesFix detection of edge-case integer overflow in interval multiplication

Changes

Fix detection of edge-case integer overflow in interval multiplication (Yuya Watari) §

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 fixesAvoid crashes if ispell text search dictionaries contain wrong affix data

Changes

Avoid crashes if ispell text search dictionaries contain wrong affix data (Arthur Zakirov) § §

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.

Bug fixesAvoid memory leak while vacuuming a GiST index

Changes

Avoid memory leak while vacuuming a GiST index (Dilip Kumar) §

ImprovementsOn Windows, recognize additional spellings of the “Norwegian (Bokmål)” locale name

Changes

On Windows, recognize additional spellings of the “Norwegian (Bokmål)” locale name (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 libpq to allow trailing whitespace in the string values of integer parameters

Changes

Fix libpq to allow trailing whitespace in the string values of integer parameters (Michael Paquier) § §

Version 12 tightened libpq's validation of integer parameters, but disallowing trailing whitespace seems undesirable.

ImprovementsIn libpq, correctly report CONNECTION_BAD connection status after a failure caused by a syntactically invalid connect_timeout parameter value

Changes

In libpq, correctly report CONNECTION_BAD connection status after a failure caused by a syntactically invalid connect_timeout parameter value (Lars Kanis) §

ImprovementsAvoid compile failure if an ECPG client includes ecpglib.h while having ENABLE_NLS defined

Changes

Avoid compile failure if an ECPG client includes ecpglib.h while having ENABLE_NLS defined (Tom Lane) §

This risk was created by a misplaced declaration: ecpg_gettext() should not be visible to client code.

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 scheduling of parallel restore of a foreign key constraint on a partitioned table

Changes

Fix scheduling of parallel restore of a foreign key constraint on a partitioned table (Álvaro Herrera) §

pg_dump failed to emit full dependency information for partitioned tables' foreign keys. This could allow parallel pg_restore to try to recreate a foreign key constraint too soon.

ImprovementsIn pg_dump, ensure stable output order for similarly-named triggers and row-level-security policy objects

Changes

In pg_dump, ensure stable output order for similarly-named triggers and row-level-security policy objects (Benjie Gillam) §

Previously, if two triggers on different tables had the same names, they would be sorted in OID-based order, which is less desirable than sorting them by table name. Likewise for RLS policies.

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.

ImprovementsIn pg_upgrade, reject tables with columns of type sql_identifier, as that has changed representation in version 12

Changes

In pg_upgrade, reject tables with columns of type sql_identifier, as that has changed representation in version 12 (Tomas Vondra) § §

ImprovementsImprove pg_upgrade's checks for the use of a data type that has changed representation, such as line

Changes

Improve pg_upgrade's checks for the use of a data type that has changed representation, such as line (Tomas Vondra) § §

The previous coding could be fooled by cases where the data type of interest underlies a stored column of a domain or composite type.

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.

ImprovementsIn pg_rewind with the --dry-run option, avoid updating pg_control

Changes

In pg_rewind with the --dry-run option, avoid updating pg_control (Alexey Kondratov) §

This could lead to failures in subsequent pg_rewind attempts.

Bug fixesFix failure in pg_waldump with the -s option, when a continuation WAL record ends exactly at a page boundary

Changes

Fix failure in pg_waldump with the -s option, when a continuation WAL record ends exactly at a page boundary (Andrey Lepikhov) §

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.

ImprovementsIn pg_waldump with the --bkp-details option, avoid emitting extra newlines for WAL records involving full-page writes

Changes

In pg_waldump with the --bkp-details option, avoid emitting extra newlines for WAL records involving full-page writes (Andres Freund) §

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 small memory leak in pg_waldump

Changes

Fix small memory leak in pg_waldump (Andres Freund) §

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.

ImprovementsPut back pqsignal() as an exported libpq symbol

Changes

Put back pqsignal() as an exported libpq symbol (Tom Lane) §

This function was removed on the grounds that no clients should be using it, but that turns out to break usage of current libpq with very old versions of psql, and perhaps other applications.

Bug fixesFix configure's test for presence of libperl so that it works on recent Red Hat releases

Changes

Fix configure's test for presence of libperl so that it works on recent Red Hat releases (Tom Lane) § §

Previously, it could fail if the user sets CFLAGS to -O0.

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 fixesEnsure correct code generation for spinlocks on PowerPC

Changes

Ensure correct code generation for spinlocks on PowerPC (Noah Misch) §

The previous spinlock coding allowed the compiler to select register zero for use with an assembly instruction that does not accept that register, causing a build failure. We have seen only one long-ago report that matches this bug, but it could cause problems for people trying to build modified PostgreSQL code or use atypical compiler options.

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 AIX, don't use the compiler option -qsrcmsg

Changes

On AIX, don't use the compiler option -qsrcmsg (Noah Misch) §

This avoids an internal compiler error with xlc v16.1.0, with little consequence other than changing the format of compiler error messages.

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 MSVC build process to cope with spaces in the file path of OpenSSL

Changes

Fix MSVC build process to cope with spaces in the file path of OpenSSL (Andrew Dunstan) §

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.