Go to file
Dean Rasheed 29ef1dd19b Fix handling of self-modified tuples in MERGE.
When an UPDATE or DELETE action in MERGE returns TM_SelfModified,
there are 2 possible causes:

1). The target tuple was already updated or deleted by the current
    command. This can happen if the target row joins to more than one
    source row, and the SQL standard explicitly says that this must be
    an error.

2). The target tuple was already updated or deleted by a later command
    in the current transaction. This can happen if the tuple is
    modified by a BEFORE trigger or a volatile function used in the
    query, and should be an error for the same reason that it is in a
    plain UPDATE or DELETE command.

In MERGE's primary error handling block, it failed to check for (2),
causing it to return a misleading error message in such cases.

In the secondary error handling block, following a concurrent update
from another session, it failed to check for (1), causing it to
silently ignore target rows joined to more than one source row,
instead of reporting an error.

Fix this, and add tests for both of these cases.

Per report from Wenjiang Zhang. Back-patch to v15, where MERGE was
introduced.

Discussion: https://postgr.es/m/tencent_41DE0FF443FE14B94A5898D373792109E408%40qq.com
2024-03-07 09:57:02 +00:00
config Remove AIX support 2024-02-28 15:17:23 +04:00
contrib Update sepgsql expected output. 2024-03-05 08:45:45 -08:00
doc Doc: Improve replication slot synchronization section. 2024-03-06 11:16:51 +05:30
src Fix handling of self-modified tuples in MERGE. 2024-03-07 09:57:02 +00:00
.cirrus.star Remove duplicate words in docs and code comments. 2023-10-09 09:18:47 +05:30
.cirrus.tasks.yml ci: Add test coverage of different pg_upgrade modes 2024-02-19 09:31:23 +01:00
.cirrus.yml ci: Make compute resources for CI configurable 2023-08-23 15:15:28 -07:00
.dir-locals.el
.editorconfig
.git-blame-ignore-revs Add a few recent commits to .git-blame-ignore-revs. 2024-03-05 14:15:06 -06:00
.gitattributes Remove non-existing file from .gitattributes 2024-02-16 11:39:09 +01:00
.gitignore
aclocal.m4
configure Add --copy-file-range option to pg_upgrade. 2024-03-06 12:01:01 +13:00
configure.ac Add --copy-file-range option to pg_upgrade. 2024-03-06 12:01:01 +13:00
COPYRIGHT Update copyright for 2024 2024-01-03 20:49:05 -05:00
GNUmakefile.in Stop generating plain-text INSTALL instructions. 2023-12-22 13:32:15 -05:00
HISTORY
Makefile Remove AIX support 2024-02-28 15:17:23 +04:00
meson_options.txt Add backend support for injection points 2024-01-22 10:15:50 +09:00
meson.build Add --copy-file-range option to pg_upgrade. 2024-03-06 12:01:01 +13:00
README.md Convert README to Markdown. 2024-02-28 14:53:52 -06:00

PostgreSQL Database Management System

This directory contains the source code distribution of the PostgreSQL database management system.

PostgreSQL is an advanced object-relational database management system that supports an extended subset of the SQL standard, including transactions, foreign keys, subqueries, triggers, user-defined types and functions. This distribution also contains C language bindings.

Copyright and license information can be found in the file COPYRIGHT.

General documentation about this version of PostgreSQL can be found at: https://www.postgresql.org/docs/devel/
In particular, information about building PostgreSQL from the source code can be found at: https://www.postgresql.org/docs/devel/installation.html

The latest version of this software, and related software, may be obtained at https://www.postgresql.org/download/. For more information look at our web site located at https://www.postgresql.org/.