Skip to content

Commit cf49a60

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 5d91706 commit cf49a60

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
@@ -12307,6 +12307,16 @@ ATPrepAlterColumnType(List **wqueue,
1230712307
errmsg("cannot alter system column \"%s\"",
1230812308
colName)));
1230912309

12310+
/*
12311+
* Cannot specify USING when altering type of a generated column, because
12312+
* that would violate the generation expression.
12313+
*/
12314+
if (attTup->attgenerated && def->cooked_default)
12315+
ereport(ERROR,
12316+
(errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
12317+
errmsg("cannot specify USING when altering type of generated column"),
12318+
errdetail("Column \"%s\" is a generated column.", colName)));
12319+
1231012320
/*
1231112321
* Don't alter inherited columns. At outer level, there had better not be
1231212322
* any inherited definition; when recursing, we assume this was checked at
@@ -12383,11 +12393,12 @@ ATPrepAlterColumnType(List **wqueue,
1238312393
(errcode(ERRCODE_DATATYPE_MISMATCH),
1238412394
errmsg("column \"%s\" cannot be cast automatically to type %s",
1238512395
colName, format_type_be(targettype)),
12396+
!attTup->attgenerated ?
1238612397
/* translator: USING is SQL, don't translate it */
1238712398
errhint("You might need to specify \"USING %s::%s\".",
1238812399
quote_identifier(colName),
1238912400
format_type_with_typemod(targettype,
12390-
targettypmod))));
12401+
targettypmod)) : 0));
1239112402
}
1239212403

1239312404
/* Fix collations after all else */

src/test/regress/expected/generated.out

+2-1
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,8 @@ SELECT * FROM gtest27;
836836
(2 rows)
837837

838838
ALTER TABLE gtest27 ALTER COLUMN x TYPE boolean USING x <> 0; -- error
839-
ERROR: generation expression for column "x" cannot be cast automatically to type boolean
839+
ERROR: cannot specify USING when altering type of generated column
840+
DETAIL: Column "x" is a generated column.
840841
ALTER TABLE gtest27 ALTER COLUMN x DROP DEFAULT; -- error
841842
ERROR: column "x" of relation "gtest27" is a generated column
842843
HINT: Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead.

0 commit comments

Comments
 (0)