mirror of
https://github.com/postgres/postgres.git
synced 2025-07-15 19:21:59 +03:00
Don't set a fast default for anything but a plain table
The fast default code added in Release 11 omitted to check that the table a fast default was being added to was a plain table. Thus one could be added to a foreign table, which predicably blows up. Here we perform that check. In addition, on the back branches, since some of these might have escaped into the wild, if we encounter a missing value for an attribute of something other than a plain table we ignore it. Fixes bug #17056 Backpatch to release 11, Reviewed by: Andres Freund, Álvaro Herrera and Tom Lane
This commit is contained in:
@ -2161,6 +2161,13 @@ SetAttrMissing(Oid relid, char *attname, char *value)
|
||||
/* lock the table the attribute belongs to */
|
||||
tablerel = table_open(relid, AccessExclusiveLock);
|
||||
|
||||
/* Don't do anything unless it's a plain table */
|
||||
if (tablerel->rd_rel->relkind != RELKIND_RELATION)
|
||||
{
|
||||
table_close(tablerel, AccessExclusiveLock);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Lock the attribute row and get the data */
|
||||
attrrel = table_open(AttributeRelationId, RowExclusiveLock);
|
||||
atttup = SearchSysCacheAttName(relid, attname);
|
||||
@ -2287,7 +2294,8 @@ StoreAttrDefault(Relation rel, AttrNumber attnum,
|
||||
valuesAtt[Anum_pg_attribute_atthasdef - 1] = true;
|
||||
replacesAtt[Anum_pg_attribute_atthasdef - 1] = true;
|
||||
|
||||
if (add_column_mode && !attgenerated)
|
||||
if (rel->rd_rel->relkind == RELKIND_RELATION && add_column_mode &&
|
||||
!attgenerated)
|
||||
{
|
||||
expr2 = expression_planner(expr2);
|
||||
estate = CreateExecutorState();
|
||||
|
Reference in New Issue
Block a user