diff options
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r-- | src/backend/commands/tablecmds.c | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 7a028991213..6a17399eb6f 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -3391,8 +3391,8 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode) */ if (newrel) find_composite_type_dependencies(oldrel->rd_rel->reltype, - RelationGetRelationName(oldrel), - NULL); + oldrel->rd_rel->relkind, + RelationGetRelationName(oldrel)); /* * Generate the constraint and default execution states @@ -3860,9 +3860,8 @@ ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, * to reject the ALTER. (How safe is this really?) */ void -find_composite_type_dependencies(Oid typeOid, - const char *origTblName, - const char *origTypeName) +find_composite_type_dependencies(Oid typeOid, char origRelkind, + const char *origRelname) { Relation depRel; ScanKeyData key[2]; @@ -3905,20 +3904,19 @@ find_composite_type_dependencies(Oid typeOid, if (rel->rd_rel->relkind == RELKIND_RELATION) { - if (origTblName) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot alter table \"%s\" because column \"%s\".\"%s\" uses its rowtype", - origTblName, - RelationGetRelationName(rel), - NameStr(att->attname)))); + const char *msg; + if (origRelkind == RELKIND_COMPOSITE_TYPE) + msg = gettext_noop("cannot alter type \"%s\" because column \"%s\".\"%s\" uses it"); + else if (origRelkind == RELKIND_FOREIGN_TABLE) + msg = gettext_noop("cannot alter foreign table \"%s\" because column \"%s\".\"%s\" uses its rowtype"); else - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot alter type \"%s\" because column \"%s\".\"%s\" uses it", - origTypeName, - RelationGetRelationName(rel), - NameStr(att->attname)))); + msg = gettext_noop("cannot alter table \"%s\" because column \"%s\".\"%s\" uses its rowtype"); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg(msg, + origRelname, + RelationGetRelationName(rel), + NameStr(att->attname)))); } else if (OidIsValid(rel->rd_rel->reltype)) { @@ -3927,7 +3925,7 @@ find_composite_type_dependencies(Oid typeOid, * recursively check for indirect dependencies via its rowtype. */ find_composite_type_dependencies(rel->rd_rel->reltype, - origTblName, origTypeName); + origRelkind, origRelname); } relation_close(rel, AccessShareLock); @@ -3943,7 +3941,7 @@ find_composite_type_dependencies(Oid typeOid, */ arrayOid = get_array_type(typeOid); if (OidIsValid(arrayOid)) - find_composite_type_dependencies(arrayOid, origTblName, origTypeName); + find_composite_type_dependencies(arrayOid, origRelkind, origRelname); } @@ -6444,14 +6442,15 @@ ATPrepAlterColumnType(List **wqueue, errmsg("ALTER TYPE USING is not supported on foreign tables"))); } - if (tab->relkind == RELKIND_COMPOSITE_TYPE) + if (tab->relkind == RELKIND_COMPOSITE_TYPE + || tab->relkind == RELKIND_FOREIGN_TABLE) { /* * For composite types, do this check now. Tables will check * it later when the table is being rewritten. */ find_composite_type_dependencies(rel->rd_rel->reltype, - NULL, + rel->rd_rel->relkind, RelationGetRelationName(rel)); } |