pgsql: Implement UPDATE tab SET (col1,col2,...) = (SELECT ...), ... - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Implement UPDATE tab SET (col1,col2,...) = (SELECT ...), ...
Date
Msg-id E1WxJZY-0006Qk-5D@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Implement UPDATE tab SET (col1,col2,...) = (SELECT ...), ...

This SQL-standard feature allows a sub-SELECT yielding multiple columns
(but only one row) to be used to compute the new values of several columns
to be updated.  While the same results can be had with an independent
sub-SELECT per column, such a workaround can require a great deal of
duplicated computation.

The standard actually says that the source for a multi-column assignment
could be any row-valued expression.  The implementation used here is
tightly tied to our existing sub-SELECT support and can't handle other
cases; the Bison grammar would have some issues with them too.  However,
I don't feel too bad about this since other cases can be converted into
sub-SELECTs.  For instance, "SET (a,b,c) = row_valued_function(x)" could
be written "SET (a,b,c) = (SELECT * FROM row_valued_function(x))".

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/8f889b1083f38f4f5b3bd3512008a3f60e939244

Modified Files
--------------
contrib/pg_stat_statements/pg_stat_statements.c |    1 +
doc/src/sgml/ref/update.sgml                    |   74 +++++++++++---
doc/src/sgml/rules.sgml                         |   21 ++++
src/backend/executor/nodeSubplan.c              |   80 +++++++++++++--
src/backend/nodes/copyfuncs.c                   |   16 +++
src/backend/nodes/equalfuncs.c                  |   14 +++
src/backend/nodes/list.c                        |    2 +-
src/backend/nodes/nodeFuncs.c                   |   28 ++++--
src/backend/nodes/outfuncs.c                    |   15 +++
src/backend/nodes/readfuncs.c                   |    1 +
src/backend/optimizer/plan/planner.c            |    1 +
src/backend/optimizer/plan/setrefs.c            |   57 +++++++++--
src/backend/optimizer/plan/subselect.c          |  119 ++++++++++++++++-------
src/backend/optimizer/prep/prepjointree.c       |    1 +
src/backend/optimizer/util/tlist.c              |   21 ++++
src/backend/parser/gram.y                       |   52 +++++++++-
src/backend/parser/parse_expr.c                 |  101 ++++++++++++++++---
src/backend/parser/parse_target.c               |   26 ++++-
src/backend/rewrite/rewriteManip.c              |   35 +++++++
src/backend/utils/adt/ruleutils.c               |   97 +++++++++++++++++-
src/include/catalog/catversion.h                |    2 +-
src/include/nodes/execnodes.h                   |    1 +
src/include/nodes/nodes.h                       |    1 +
src/include/nodes/parsenodes.h                  |   17 ++++
src/include/nodes/pg_list.h                     |    1 +
src/include/nodes/primnodes.h                   |   38 ++++++--
src/include/nodes/relation.h                    |    3 +
src/include/optimizer/tlist.h                   |    2 +
src/include/parser/parse_node.h                 |    1 +
src/test/regress/expected/update.out            |   77 ++++++++++++---
src/test/regress/sql/update.sql                 |   22 ++++-
31 files changed, 805 insertions(+), 122 deletions(-)


pgsql-committers by date:

Previous
From: Noah Misch
Date:
Subject: pgsql: Fix the MSVC build process for uuid-ossp.
Next
From: Andrew Dunstan
Date:
Subject: pgsql: Document that jsonb has all the standard comparison operators.