pgsql: Prevent multicolumn expansion of "foo.*" in an UPDATE source exp
От | Tom Lane |
---|---|
Тема | pgsql: Prevent multicolumn expansion of "foo.*" in an UPDATE source exp |
Дата | |
Msg-id | E1c8XlG-0001vz-ML@gemulon.postgresql.org обсуждение исходный текст |
Список | pgsql-committers |
Prevent multicolumn expansion of "foo.*" in an UPDATE source expression. Because we use transformTargetList() for UPDATE as well as SELECT tlists, the code accidentally tried to expand a "*" reference into several columns. This is nonsensical, because the UPDATE syntax provides exactly one target column to put the value into. The immediate result was that transformUpdateTargetList() got confused and reported "UPDATE target count mismatch --- internal error". It seems better to treat such a reference as a plain whole-row variable, as it would be in other contexts. (This could produce useful results when the target column is of composite type.) Fix by tweaking transformTargetList() to perform *-expansion only conditionally, depending on its exprKind parameter. Back-patch to 9.3. The problem exists further back, but a fix would be much more invasive before that, because transformTargetList() wasn't told what kind of list it was working on. Doesn't seem worth the trouble given the lack of field reports. (I only noticed it because I was checking the code while trying to improve the documentation about how we handle "foo.*".) Discussion: <4308.1479595330@sss.pgh.pa.us> Branch ------ REL9_6_STABLE Details ------- http://git.postgresql.org/pg/commitdiff/90f8b4be5b9c86a3a609b7cf2d8a76e0a74a75a4 Modified Files -------------- src/backend/parser/parse_target.c | 53 ++++++++++++++++++++++-------------- src/test/regress/expected/update.out | 18 ++++++++++++ src/test/regress/sql/update.sql | 9 ++++++ 3 files changed, 59 insertions(+), 21 deletions(-)
В списке pgsql-committers по дате отправления: