pgsql: Implement UPDATE tab SET (col1,col2,...) = (SELECT ...), ...
От | Tom Lane |
---|---|
Тема | pgsql: Implement UPDATE tab SET (col1,col2,...) = (SELECT ...), ... |
Дата | |
Msg-id | E1WxJZY-0006Qk-5D@gemulon.postgresql.org обсуждение исходный текст |
Список | 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 по дате отправления: