pgsql: Add support for INSERT ... ON CONFLICT DO SELECT.

From: Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Add support for INSERT ... ON CONFLICT DO SELECT.
Date: 2026-02-12 10:00:38
Message-ID: E1vqTUz-000MJ9-0T@gemulon.postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Add support for INSERT ... ON CONFLICT DO SELECT.

This adds a new ON CONFLICT action DO SELECT [FOR UPDATE/SHARE], which
returns the pre-existing rows when conflicts are detected. The INSERT
statement must have a RETURNING clause, when DO SELECT is specified.

The optional FOR UPDATE/SHARE clause allows the rows to be locked
before they are are returned. As with a DO UPDATE conflict action, an
optional WHERE clause may be used to prevent rows from being selected
for return (but as with a DO UPDATE action, rows filtered out by the
WHERE clause are still locked).

Bumps catversion as stored rules change.

Author: Andreas Karlsson <andreas(at)proxel(dot)se>
Author: Marko Tiikkaja <marko(at)joh(dot)to>
Author: Viktor Holmberg <v(at)viktorh(dot)net>
Reviewed-by: Joel Jacobson <joel(at)compiler(dot)org>
Reviewed-by: Kirill Reshke <reshkekirill(at)gmail(dot)com>
Reviewed-by: Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>
Reviewed-by: Jian He <jian(dot)universality(at)gmail(dot)com>
Discussion: https://postgr.es/m/d631b406-13b7-433e-8c0b-c6040c4b4663@Spark
Discussion: https://postgr.es/m/5fca222d-62ae-4a2f-9fcb-0eca56277094@Spark
Discussion: https://postgr.es/m/2b5db2e6-8ece-44d0-9890-f256fdca9f7e@proxel.se
Discussion: https://postgr.es/m/CAL9smLCdV-v3KgOJX3mU19FYK82N7yzqJj2HAwWX70E=P98kgQ@mail.gmail.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/88327092ff06c48676d2a603420089bf493770f3

Modified Files
--------------
contrib/postgres_fdw/postgres_fdw.c | 2 +-
doc/src/sgml/dml.sgml | 2 +-
doc/src/sgml/fdwhandler.sgml | 2 +-
doc/src/sgml/mvcc.sgml | 12 +
doc/src/sgml/postgres-fdw.sgml | 2 +-
doc/src/sgml/ref/create_policy.sgml | 29 +-
doc/src/sgml/ref/create_view.sgml | 4 +-
doc/src/sgml/ref/insert.sgml | 135 ++++++--
doc/src/sgml/ref/merge.sgml | 3 +-
src/backend/access/heap/heapam.c | 8 +-
src/backend/commands/explain.c | 36 +-
src/backend/executor/execIndexing.c | 6 +-
src/backend/executor/execPartition.c | 134 +++++---
src/backend/executor/nodeModifyTable.c | 375 ++++++++++++++++-----
src/backend/optimizer/plan/createplan.c | 4 +
src/backend/optimizer/plan/setrefs.c | 5 +-
src/backend/optimizer/util/plancat.c | 27 +-
src/backend/parser/analyze.c | 54 ++-
src/backend/parser/gram.y | 20 +-
src/backend/parser/parse_clause.c | 14 +-
src/backend/rewrite/rewriteHandler.c | 27 +-
src/backend/rewrite/rowsecurity.c | 111 +++---
src/backend/utils/adt/ruleutils.c | 77 +++--
src/include/catalog/catversion.h | 2 +-
src/include/nodes/execnodes.h | 13 +-
src/include/nodes/lockoptions.h | 3 +-
src/include/nodes/nodes.h | 1 +
src/include/nodes/parsenodes.h | 10 +-
src/include/nodes/plannodes.h | 4 +-
src/include/nodes/primnodes.h | 12 +-
.../expected/insert-conflict-do-select.out | 138 ++++++++
src/test/isolation/isolation_schedule | 1 +
.../isolation/specs/insert-conflict-do-select.spec | 53 +++
src/test/regress/expected/constraints.out | 4 +
src/test/regress/expected/insert_conflict.out | 216 +++++++++++-
src/test/regress/expected/privileges.out | 26 ++
src/test/regress/expected/rowsecurity.out | 94 +++++-
src/test/regress/expected/rules.out | 55 +++
src/test/regress/expected/triggers.out | 10 +-
src/test/regress/expected/updatable_views.out | 82 ++++-
src/test/regress/sql/constraints.sql | 3 +
src/test/regress/sql/insert_conflict.sql | 74 +++-
src/test/regress/sql/privileges.sql | 18 +
src/test/regress/sql/rowsecurity.sql | 57 +++-
src/test/regress/sql/rules.sql | 26 ++
src/test/regress/sql/triggers.sql | 3 +-
src/test/regress/sql/updatable_views.sql | 31 +-
src/tools/pgindent/typedefs.list | 2 +-
48 files changed, 1675 insertions(+), 352 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Peter Eisentraut 2026-02-12 12:02:12 Re: pgsql: Add file_extend_method=posix_fallocate,write_zeros.
Previous Message Amit Kapila 2026-02-12 09:15:25 pgsql: Refactor slot synchronization logic in slotsync.c.