Skip to content

Commit 4d68a04

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 478846e commit 4d68a04

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

src/backend/commands/tablecmds.c

+12-1
Original file line numberDiff line numberDiff line change
@@ -12677,6 +12677,16 @@ ATPrepAlterColumnType(List **wqueue,
1267712677
errmsg("cannot alter system column \"%s\"",
1267812678
colName)));
1267912679

12680+
/*
12681+
* Cannot specify USING when altering type of a generated column, because
12682+
* that would violate the generation expression.
12683+
*/
12684+
if (attTup->attgenerated && def->cooked_default)
12685+
ereport(ERROR,
12686+
(errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
12687+
errmsg("cannot specify USING when altering type of generated column"),
12688+
errdetail("Column \"%s\" is a generated column.", colName)));
12689+
1268012690
/*
1268112691
* Don't alter inherited columns. At outer level, there had better not be
1268212692
* any inherited definition; when recursing, we assume this was checked at
@@ -12753,11 +12763,12 @@ ATPrepAlterColumnType(List **wqueue,
1275312763
(errcode(ERRCODE_DATATYPE_MISMATCH),
1275412764
errmsg("column \"%s\" cannot be cast automatically to type %s",
1275512765
colName, format_type_be(targettype)),
12766+
!attTup->attgenerated ?
1275612767
/* translator: USING is SQL, don't translate it */
1275712768
errhint("You might need to specify \"USING %s::%s\".",
1275812769
quote_identifier(colName),
1275912770
format_type_with_typemod(targettype,
12760-
targettypmod))));
12771+
targettypmod)) : 0));
1276112772
}
1276212773

1276312774
/* Fix collations after all else */

src/test/regress/expected/generated.out

+2-1
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)