Commit d36228a9 authored by Tom Lane's avatar Tom Lane

Improve wording of two error messages related to generated columns.

Clarify that you can "insert" into a generated column as long as what
you're inserting is a DEFAULT placeholder.

Also, use ERRCODE_GENERATED_ALWAYS in place of ERRCODE_SYNTAX_ERROR;
there doesn't seem to be any reason to use the less specific errcode.

Discussion: https://postgr.es/m/9q0sgcr416t.fsf@gmx.us
parent fe051291
...@@ -861,7 +861,7 @@ rewriteTargetListIU(List *targetList, ...@@ -861,7 +861,7 @@ rewriteTargetListIU(List *targetList,
if (!apply_default) if (!apply_default)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_GENERATED_ALWAYS), (errcode(ERRCODE_GENERATED_ALWAYS),
errmsg("cannot insert into column \"%s\"", errmsg("cannot insert a non-DEFAULT value into column \"%s\"",
NameStr(att_tup->attname)), NameStr(att_tup->attname)),
errdetail("Column \"%s\" is an identity column defined as GENERATED ALWAYS.", errdetail("Column \"%s\" is an identity column defined as GENERATED ALWAYS.",
NameStr(att_tup->attname)), NameStr(att_tup->attname)),
...@@ -899,8 +899,8 @@ rewriteTargetListIU(List *targetList, ...@@ -899,8 +899,8 @@ rewriteTargetListIU(List *targetList,
if (!apply_default) if (!apply_default)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR), (errcode(ERRCODE_GENERATED_ALWAYS),
errmsg("cannot insert into column \"%s\"", errmsg("cannot insert a non-DEFAULT value into column \"%s\"",
NameStr(att_tup->attname)), NameStr(att_tup->attname)),
errdetail("Column \"%s\" is a generated column.", errdetail("Column \"%s\" is a generated column.",
NameStr(att_tup->attname)))); NameStr(att_tup->attname))));
...@@ -923,17 +923,20 @@ rewriteTargetListIU(List *targetList, ...@@ -923,17 +923,20 @@ rewriteTargetListIU(List *targetList,
*/ */
if (commandType == CMD_UPDATE) if (commandType == CMD_UPDATE)
{ {
if (att_tup->attidentity == ATTRIBUTE_IDENTITY_ALWAYS && new_tle && !apply_default) if (att_tup->attidentity == ATTRIBUTE_IDENTITY_ALWAYS &&
new_tle && !apply_default)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_GENERATED_ALWAYS), (errcode(ERRCODE_GENERATED_ALWAYS),
errmsg("column \"%s\" can only be updated to DEFAULT", NameStr(att_tup->attname)), errmsg("column \"%s\" can only be updated to DEFAULT",
NameStr(att_tup->attname)),
errdetail("Column \"%s\" is an identity column defined as GENERATED ALWAYS.", errdetail("Column \"%s\" is an identity column defined as GENERATED ALWAYS.",
NameStr(att_tup->attname)))); NameStr(att_tup->attname))));
if (att_tup->attgenerated && new_tle && !apply_default) if (att_tup->attgenerated && new_tle && !apply_default)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR), (errcode(ERRCODE_GENERATED_ALWAYS),
errmsg("column \"%s\" can only be updated to DEFAULT", NameStr(att_tup->attname)), errmsg("column \"%s\" can only be updated to DEFAULT",
NameStr(att_tup->attname)),
errdetail("Column \"%s\" is a generated column.", errdetail("Column \"%s\" is a generated column.",
NameStr(att_tup->attname)))); NameStr(att_tup->attname))));
} }
......
...@@ -93,16 +93,16 @@ LINE 1: ...E gtest_err_8 (a int PRIMARY KEY, b int GENERATED BY DEFAULT... ...@@ -93,16 +93,16 @@ LINE 1: ...E gtest_err_8 (a int PRIMARY KEY, b int GENERATED BY DEFAULT...
INSERT INTO gtest1 VALUES (1); INSERT INTO gtest1 VALUES (1);
INSERT INTO gtest1 VALUES (2, DEFAULT); -- ok INSERT INTO gtest1 VALUES (2, DEFAULT); -- ok
INSERT INTO gtest1 VALUES (3, 33); -- error INSERT INTO gtest1 VALUES (3, 33); -- error
ERROR: cannot insert into column "b" ERROR: cannot insert a non-DEFAULT value into column "b"
DETAIL: Column "b" is a generated column. DETAIL: Column "b" is a generated column.
INSERT INTO gtest1 VALUES (3, 33), (4, 44); -- error INSERT INTO gtest1 VALUES (3, 33), (4, 44); -- error
ERROR: cannot insert into column "b" ERROR: cannot insert a non-DEFAULT value into column "b"
DETAIL: Column "b" is a generated column. DETAIL: Column "b" is a generated column.
INSERT INTO gtest1 VALUES (3, DEFAULT), (4, 44); -- error INSERT INTO gtest1 VALUES (3, DEFAULT), (4, 44); -- error
ERROR: cannot insert into column "b" ERROR: cannot insert a non-DEFAULT value into column "b"
DETAIL: Column "b" is a generated column. DETAIL: Column "b" is a generated column.
INSERT INTO gtest1 VALUES (3, 33), (4, DEFAULT); -- error INSERT INTO gtest1 VALUES (3, 33), (4, DEFAULT); -- error
ERROR: cannot insert into column "b" ERROR: cannot insert a non-DEFAULT value into column "b"
DETAIL: Column "b" is a generated column. DETAIL: Column "b" is a generated column.
INSERT INTO gtest1 VALUES (3, DEFAULT), (4, DEFAULT); -- ok INSERT INTO gtest1 VALUES (3, DEFAULT), (4, DEFAULT); -- ok
SELECT * FROM gtest1 ORDER BY a; SELECT * FROM gtest1 ORDER BY a;
...@@ -193,25 +193,25 @@ SELECT * FROM gtest1v; ...@@ -193,25 +193,25 @@ SELECT * FROM gtest1v;
(1 row) (1 row)
INSERT INTO gtest1v VALUES (4, 8); -- error INSERT INTO gtest1v VALUES (4, 8); -- error
ERROR: cannot insert into column "b" ERROR: cannot insert a non-DEFAULT value into column "b"
DETAIL: Column "b" is a generated column. DETAIL: Column "b" is a generated column.
INSERT INTO gtest1v VALUES (5, DEFAULT); -- ok INSERT INTO gtest1v VALUES (5, DEFAULT); -- ok
INSERT INTO gtest1v VALUES (6, 66), (7, 77); -- error INSERT INTO gtest1v VALUES (6, 66), (7, 77); -- error
ERROR: cannot insert into column "b" ERROR: cannot insert a non-DEFAULT value into column "b"
DETAIL: Column "b" is a generated column. DETAIL: Column "b" is a generated column.
INSERT INTO gtest1v VALUES (6, DEFAULT), (7, 77); -- error INSERT INTO gtest1v VALUES (6, DEFAULT), (7, 77); -- error
ERROR: cannot insert into column "b" ERROR: cannot insert a non-DEFAULT value into column "b"
DETAIL: Column "b" is a generated column. DETAIL: Column "b" is a generated column.
INSERT INTO gtest1v VALUES (6, 66), (7, DEFAULT); -- error INSERT INTO gtest1v VALUES (6, 66), (7, DEFAULT); -- error
ERROR: cannot insert into column "b" ERROR: cannot insert a non-DEFAULT value into column "b"
DETAIL: Column "b" is a generated column. DETAIL: Column "b" is a generated column.
INSERT INTO gtest1v VALUES (6, DEFAULT), (7, DEFAULT); -- ok INSERT INTO gtest1v VALUES (6, DEFAULT), (7, DEFAULT); -- ok
ALTER VIEW gtest1v ALTER COLUMN b SET DEFAULT 100; ALTER VIEW gtest1v ALTER COLUMN b SET DEFAULT 100;
INSERT INTO gtest1v VALUES (8, DEFAULT); -- error INSERT INTO gtest1v VALUES (8, DEFAULT); -- error
ERROR: cannot insert into column "b" ERROR: cannot insert a non-DEFAULT value into column "b"
DETAIL: Column "b" is a generated column. DETAIL: Column "b" is a generated column.
INSERT INTO gtest1v VALUES (8, DEFAULT), (9, DEFAULT); -- error INSERT INTO gtest1v VALUES (8, DEFAULT), (9, DEFAULT); -- error
ERROR: cannot insert into column "b" ERROR: cannot insert a non-DEFAULT value into column "b"
DETAIL: Column "b" is a generated column. DETAIL: Column "b" is a generated column.
SELECT * FROM gtest1v; SELECT * FROM gtest1v;
a | b a | b
......
...@@ -107,20 +107,20 @@ SELECT * FROM itest4; ...@@ -107,20 +107,20 @@ SELECT * FROM itest4;
-- VALUES RTEs -- VALUES RTEs
CREATE TABLE itest5 (a int generated always as identity, b text); CREATE TABLE itest5 (a int generated always as identity, b text);
INSERT INTO itest5 VALUES (1, 'a'); -- error INSERT INTO itest5 VALUES (1, 'a'); -- error
ERROR: cannot insert into column "a" ERROR: cannot insert a non-DEFAULT value into column "a"
DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS.
HINT: Use OVERRIDING SYSTEM VALUE to override. HINT: Use OVERRIDING SYSTEM VALUE to override.
INSERT INTO itest5 VALUES (DEFAULT, 'a'); -- ok INSERT INTO itest5 VALUES (DEFAULT, 'a'); -- ok
INSERT INTO itest5 VALUES (2, 'b'), (3, 'c'); -- error INSERT INTO itest5 VALUES (2, 'b'), (3, 'c'); -- error
ERROR: cannot insert into column "a" ERROR: cannot insert a non-DEFAULT value into column "a"
DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS.
HINT: Use OVERRIDING SYSTEM VALUE to override. HINT: Use OVERRIDING SYSTEM VALUE to override.
INSERT INTO itest5 VALUES (DEFAULT, 'b'), (3, 'c'); -- error INSERT INTO itest5 VALUES (DEFAULT, 'b'), (3, 'c'); -- error
ERROR: cannot insert into column "a" ERROR: cannot insert a non-DEFAULT value into column "a"
DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS.
HINT: Use OVERRIDING SYSTEM VALUE to override. HINT: Use OVERRIDING SYSTEM VALUE to override.
INSERT INTO itest5 VALUES (2, 'b'), (DEFAULT, 'c'); -- error INSERT INTO itest5 VALUES (2, 'b'), (DEFAULT, 'c'); -- error
ERROR: cannot insert into column "a" ERROR: cannot insert a non-DEFAULT value into column "a"
DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS.
HINT: Use OVERRIDING SYSTEM VALUE to override. HINT: Use OVERRIDING SYSTEM VALUE to override.
INSERT INTO itest5 VALUES (DEFAULT, 'b'), (DEFAULT, 'c'); -- ok INSERT INTO itest5 VALUES (DEFAULT, 'b'), (DEFAULT, 'c'); -- ok
...@@ -197,7 +197,7 @@ SELECT * FROM itest1; ...@@ -197,7 +197,7 @@ SELECT * FROM itest1;
-- GENERATED ALWAYS -- GENERATED ALWAYS
-- This is an error: -- This is an error:
INSERT INTO itest2 VALUES (10, 'xyz'); INSERT INTO itest2 VALUES (10, 'xyz');
ERROR: cannot insert into column "a" ERROR: cannot insert a non-DEFAULT value into column "a"
DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS.
HINT: Use OVERRIDING SYSTEM VALUE to override. HINT: Use OVERRIDING SYSTEM VALUE to override.
-- This inserts the row as presented: -- This inserts the row as presented:
...@@ -313,7 +313,7 @@ SELECT * FROM itestv10; ...@@ -313,7 +313,7 @@ SELECT * FROM itestv10;
(4 rows) (4 rows)
INSERT INTO itestv11 VALUES (10, 'xyz'); INSERT INTO itestv11 VALUES (10, 'xyz');
ERROR: cannot insert into column "a" ERROR: cannot insert a non-DEFAULT value into column "a"
DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS. DETAIL: Column "a" is an identity column defined as GENERATED ALWAYS.
HINT: Use OVERRIDING SYSTEM VALUE to override. HINT: Use OVERRIDING SYSTEM VALUE to override.
INSERT INTO itestv11 OVERRIDING SYSTEM VALUE VALUES (11, 'xyz'); INSERT INTO itestv11 OVERRIDING SYSTEM VALUE VALUES (11, 'xyz');
......
...@@ -1475,10 +1475,10 @@ INSERT INTO rw_view1 (id) VALUES (2); ...@@ -1475,10 +1475,10 @@ INSERT INTO rw_view1 (id) VALUES (2);
INSERT INTO base_tbl (id, idplus1) VALUES (3, DEFAULT); INSERT INTO base_tbl (id, idplus1) VALUES (3, DEFAULT);
INSERT INTO rw_view1 (id, idplus1) VALUES (4, DEFAULT); INSERT INTO rw_view1 (id, idplus1) VALUES (4, DEFAULT);
INSERT INTO base_tbl (id, idplus1) VALUES (5, 6); -- error INSERT INTO base_tbl (id, idplus1) VALUES (5, 6); -- error
ERROR: cannot insert into column "idplus1" ERROR: cannot insert a non-DEFAULT value into column "idplus1"
DETAIL: Column "idplus1" is a generated column. DETAIL: Column "idplus1" is a generated column.
INSERT INTO rw_view1 (id, idplus1) VALUES (6, 7); -- error INSERT INTO rw_view1 (id, idplus1) VALUES (6, 7); -- error
ERROR: cannot insert into column "idplus1" ERROR: cannot insert a non-DEFAULT value into column "idplus1"
DETAIL: Column "idplus1" is a generated column. DETAIL: Column "idplus1" is a generated column.
SELECT * FROM base_tbl; SELECT * FROM base_tbl;
id | idplus1 id | idplus1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment