From 4d68a043245a6947d676a216aaac0714bcaf97d5 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 29 Aug 2024 08:38:29 +0200 Subject: 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 Reviewed-by: Yugo NAGATA Discussion: https://www.postgresql.org/message-id/flat/c7083982-69f4-4b14-8315-f9ddb20b9834%40eisentraut.org --- src/backend/commands/tablecmds.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/backend/commands/tablecmds.c') diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 94fc3a082b2..70cd2669164 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -12677,6 +12677,16 @@ ATPrepAlterColumnType(List **wqueue, errmsg("cannot alter system column \"%s\"", 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 * any inherited definition; when recursing, we assume this was checked at @@ -12753,11 +12763,12 @@ ATPrepAlterColumnType(List **wqueue, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("column \"%s\" cannot be cast automatically to type %s", colName, format_type_be(targettype)), + !attTup->attgenerated ? /* translator: USING is SQL, don't translate it */ errhint("You might need to specify \"USING %s::%s\".", quote_identifier(colName), format_type_with_typemod(targettype, - targettypmod)))); + targettypmod)) : 0)); } /* Fix collations after all else */ -- cgit v1.2.3