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
This commit is contained in:
parent
5ff394503c
commit
1c57ae795b
@ -10953,6 +10953,16 @@ ATPrepAlterColumnType(List **wqueue,
|
|||||||
errmsg("cannot alter system column \"%s\"",
|
errmsg("cannot alter system column \"%s\"",
|
||||||
colName)));
|
colName)));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cannot specify USING when altering type of a generated column, because
|
||||||
|
* that would violate the generation expression.
|
||||||
|
*/
|
||||||
|
if (attTup->attgenerated && def->cooked_default)
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
|
||||||
|
errmsg("cannot specify USING when altering type of generated column"),
|
||||||
|
errdetail("Column \"%s\" is a generated column.", colName)));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't alter inherited columns. At outer level, there had better not be
|
* Don't alter inherited columns. At outer level, there had better not be
|
||||||
* any inherited definition; when recursing, we assume this was checked at
|
* any inherited definition; when recursing, we assume this was checked at
|
||||||
@ -11029,11 +11039,12 @@ ATPrepAlterColumnType(List **wqueue,
|
|||||||
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||||
errmsg("column \"%s\" cannot be cast automatically to type %s",
|
errmsg("column \"%s\" cannot be cast automatically to type %s",
|
||||||
colName, format_type_be(targettype)),
|
colName, format_type_be(targettype)),
|
||||||
|
!attTup->attgenerated ?
|
||||||
/* translator: USING is SQL, don't translate it */
|
/* translator: USING is SQL, don't translate it */
|
||||||
errhint("You might need to specify \"USING %s::%s\".",
|
errhint("You might need to specify \"USING %s::%s\".",
|
||||||
quote_identifier(colName),
|
quote_identifier(colName),
|
||||||
format_type_with_typemod(targettype,
|
format_type_with_typemod(targettype,
|
||||||
targettypmod))));
|
targettypmod)) : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fix collations after all else */
|
/* Fix collations after all else */
|
||||||
|
@ -747,7 +747,8 @@ SELECT * FROM gtest27;
|
|||||||
(2 rows)
|
(2 rows)
|
||||||
|
|
||||||
ALTER TABLE gtest27 ALTER COLUMN x TYPE boolean USING x <> 0; -- error
|
ALTER TABLE gtest27 ALTER COLUMN x TYPE boolean USING x <> 0; -- error
|
||||||
ERROR: generation expression for column "x" cannot be cast automatically to type boolean
|
ERROR: cannot specify USING when altering type of generated column
|
||||||
|
DETAIL: Column "x" is a generated column.
|
||||||
ALTER TABLE gtest27 ALTER COLUMN x DROP DEFAULT; -- error
|
ALTER TABLE gtest27 ALTER COLUMN x DROP DEFAULT; -- error
|
||||||
ERROR: column "x" of relation "gtest27" is a generated column
|
ERROR: column "x" of relation "gtest27" is a generated column
|
||||||
-- It's possible to alter the column types this way:
|
-- It's possible to alter the column types this way:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user