Skip to content

Commit fdbf7e4

Browse files
committed
Disallow USING clause when altering type of generated column
This does not make sense. It would write the output of the USING clause into the converted column, which would violate the generation expression. This adds a check to error out if this is specified. There was a test for this, but that test errored out for a different reason, so it was not effective. Reported-by: Jian He <jian.universality@gmail.com> Reviewed-by: Yugo NAGATA <nagata@sraoss.co.jp> Discussion: https://www.postgresql.org/message-id/flat/c7083982-69f4-4b14-8315-f9ddb20b9834%40eisentraut.org
1 parent 135007a commit fdbf7e4

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

src/backend/commands/tablecmds.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12704,6 +12704,16 @@ ATPrepAlterColumnType(List **wqueue,
1270412704
errmsg("cannot alter system column \"%s\"",
1270512705
colName)));
1270612706

12707+
/*
12708+
* Cannot specify USING when altering type of a generated column, because
12709+
* that would violate the generation expression.
12710+
*/
12711+
if (attTup->attgenerated && def->cooked_default)
12712+
ereport(ERROR,
12713+
(errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
12714+
errmsg("cannot specify USING when altering type of generated column"),
12715+
errdetail("Column \"%s\" is a generated column.", colName)));
12716+
1270712717
/*
1270812718
* Don't alter inherited columns. At outer level, there had better not be
1270912719
* any inherited definition; when recursing, we assume this was checked at
@@ -12780,11 +12790,12 @@ ATPrepAlterColumnType(List **wqueue,
1278012790
(errcode(ERRCODE_DATATYPE_MISMATCH),
1278112791
errmsg("column \"%s\" cannot be cast automatically to type %s",
1278212792
colName, format_type_be(targettype)),
12793+
!attTup->attgenerated ?
1278312794
/* translator: USING is SQL, don't translate it */
1278412795
errhint("You might need to specify \"USING %s::%s\".",
1278512796
quote_identifier(colName),
1278612797
format_type_with_typemod(targettype,
12787-
targettypmod))));
12798+
targettypmod)) : 0));
1278812799
}
1278912800

1279012801
/* Fix collations after all else */

src/test/regress/expected/generated.out

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,8 @@ SELECT * FROM gtest27;
10261026
(2 rows)
10271027

10281028
ALTER TABLE gtest27 ALTER COLUMN x TYPE boolean USING x <> 0; -- error
1029-
ERROR: generation expression for column "x" cannot be cast automatically to type boolean
1029+
ERROR: cannot specify USING when altering type of generated column
1030+
DETAIL: Column "x" is a generated column.
10301031
ALTER TABLE gtest27 ALTER COLUMN x DROP DEFAULT; -- error
10311032
ERROR: column "x" of relation "gtest27" is a generated column
10321033
HINT: Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead.

0 commit comments

Comments
 (0)