Add hint about not qualifying UPDATE...SET target with relation name.
Target columns in UPDATE ... SET must not be qualified with the target table; we disallow this because it'd create ambiguity about which name is the column name in case of field-qualified names. However, newbies have been seen to expect that they could qualify a target name just like other names. The error message when they do is confusing: "column "foo" of relation "foo" does not exist". To improve matters, issue a HINT if the invalid name is qualified and matches the relation's alias. James Coleman (editorialized a bit by me) Discussion: https://postgr.es/m/CAAaqYe8S2Qa060UV-YF5GoSd5PkEhLV94x-fEi3=TOtpaXCV+w@mail.gmail.com
This commit is contained in:
parent
075df6b208
commit
58447e3189
@ -2518,6 +2518,9 @@ transformUpdateTargetList(ParseState *pstate, List *origTlist)
|
|||||||
errmsg("column \"%s\" of relation \"%s\" does not exist",
|
errmsg("column \"%s\" of relation \"%s\" does not exist",
|
||||||
origTarget->name,
|
origTarget->name,
|
||||||
RelationGetRelationName(pstate->p_target_relation)),
|
RelationGetRelationName(pstate->p_target_relation)),
|
||||||
|
(origTarget->indirection != NIL &&
|
||||||
|
strcmp(origTarget->name, pstate->p_target_nsitem->p_names->aliasname) == 0) ?
|
||||||
|
errhint("SET target columns cannot be qualified with the relation name.") : 0,
|
||||||
parser_errposition(pstate, origTarget->location)));
|
parser_errposition(pstate, origTarget->location)));
|
||||||
|
|
||||||
updateTargetListEntry(pstate, tle, origTarget->name,
|
updateTargetListEntry(pstate, tle, origTarget->name,
|
||||||
|
@ -272,6 +272,12 @@ ERROR: invalid reference to FROM-clause entry for table "insertconflicttest"
|
|||||||
LINE 1: ...onfruit') on conflict (key) do update set fruit = insertconf...
|
LINE 1: ...onfruit') on conflict (key) do update set fruit = insertconf...
|
||||||
^
|
^
|
||||||
HINT: Perhaps you meant to reference the table alias "ict".
|
HINT: Perhaps you meant to reference the table alias "ict".
|
||||||
|
-- Check helpful hint when qualifying set column with target table
|
||||||
|
insert into insertconflicttest values (3, 'Kiwi') on conflict (key, fruit) do update set insertconflicttest.fruit = 'Mango';
|
||||||
|
ERROR: column "insertconflicttest" of relation "insertconflicttest" does not exist
|
||||||
|
LINE 1: ...3, 'Kiwi') on conflict (key, fruit) do update set insertconf...
|
||||||
|
^
|
||||||
|
HINT: SET target columns cannot be qualified with the relation name.
|
||||||
drop index key_index;
|
drop index key_index;
|
||||||
--
|
--
|
||||||
-- Composite key tests
|
-- Composite key tests
|
||||||
|
@ -44,6 +44,12 @@ SELECT * FROM update_test;
|
|||||||
10 | 20 |
|
10 | 20 |
|
||||||
(2 rows)
|
(2 rows)
|
||||||
|
|
||||||
|
-- error, you're not supposed to qualify the target column
|
||||||
|
UPDATE update_test t SET t.b = t.b + 10 WHERE t.a = 10;
|
||||||
|
ERROR: column "t" of relation "update_test" does not exist
|
||||||
|
LINE 1: UPDATE update_test t SET t.b = t.b + 10 WHERE t.a = 10;
|
||||||
|
^
|
||||||
|
HINT: SET target columns cannot be qualified with the relation name.
|
||||||
--
|
--
|
||||||
-- Test VALUES in FROM
|
-- Test VALUES in FROM
|
||||||
--
|
--
|
||||||
|
@ -118,6 +118,9 @@ insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (ke
|
|||||||
insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = ict.fruit; -- ok, alias
|
insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = ict.fruit; -- ok, alias
|
||||||
insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = insertconflicttest.fruit; -- error, references aliased away name
|
insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = insertconflicttest.fruit; -- error, references aliased away name
|
||||||
|
|
||||||
|
-- Check helpful hint when qualifying set column with target table
|
||||||
|
insert into insertconflicttest values (3, 'Kiwi') on conflict (key, fruit) do update set insertconflicttest.fruit = 'Mango';
|
||||||
|
|
||||||
drop index key_index;
|
drop index key_index;
|
||||||
|
|
||||||
--
|
--
|
||||||
|
@ -31,6 +31,9 @@ UPDATE update_test t SET b = t.b + 10 WHERE t.a = 10;
|
|||||||
|
|
||||||
SELECT * FROM update_test;
|
SELECT * FROM update_test;
|
||||||
|
|
||||||
|
-- error, you're not supposed to qualify the target column
|
||||||
|
UPDATE update_test t SET t.b = t.b + 10 WHERE t.a = 10;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Test VALUES in FROM
|
-- Test VALUES in FROM
|
||||||
--
|
--
|
||||||
|
Loading…
x
Reference in New Issue
Block a user