From 2c20ba1fd284423e4652f2f6855d257339245e97 Mon Sep 17 00:00:00 2001 From: Robert Haas <rhaas@postgresql.org> Date: Fri, 11 Feb 2011 08:47:38 -0500 Subject: [PATCH] Tweak find_composite_type_dependencies API a bit more. Per discussion with Noah Misch, the previous coding, introduced by my commit 65377e0b9c0e0397b1598b38b6a7fb8b6f740d39 on 2011-02-06, was really an abuse of RELKIND_COMPOSITE_TYPE, since the caller in typecmds.c is actually passing the name of a domain. So go back having a type name argument, but make the first argument a Relation rather than just a string so we can tell whether it's a table or a foreign table and emit the proper error message. --- src/backend/commands/tablecmds.c | 25 +++++++++++++------------ src/backend/commands/typecmds.c | 2 +- src/include/commands/tablecmds.h | 3 ++- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 9c812397b1e..e4f352c6c7c 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -3422,8 +3422,7 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode) */ if (newrel) find_composite_type_dependencies(oldrel->rd_rel->reltype, - oldrel->rd_rel->relkind, - RelationGetRelationName(oldrel)); + oldrel, NULL); /* * Generate the constraint and default execution states @@ -3891,8 +3890,8 @@ ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, * to reject the ALTER. (How safe is this really?) */ void -find_composite_type_dependencies(Oid typeOid, char origRelkind, - const char *origRelname) +find_composite_type_dependencies(Oid typeOid, Relation origRelation, + const char *origTypeName) { Relation depRel; ScanKeyData key[2]; @@ -3936,16 +3935,20 @@ find_composite_type_dependencies(Oid typeOid, char origRelkind, if (rel->rd_rel->relkind == RELKIND_RELATION) { const char *msg; - if (origRelkind == RELKIND_COMPOSITE_TYPE) + + if (origTypeName + || origRelation->rd_rel->relkind == RELKIND_COMPOSITE_TYPE) msg = gettext_noop("cannot alter type \"%s\" because column \"%s\".\"%s\" uses it"); - else if (origRelkind == RELKIND_FOREIGN_TABLE) + else if (origRelation->rd_rel->relkind == RELKIND_FOREIGN_TABLE) msg = gettext_noop("cannot alter foreign table \"%s\" because column \"%s\".\"%s\" uses its rowtype"); else msg = gettext_noop("cannot alter table \"%s\" because column \"%s\".\"%s\" uses its rowtype"); + ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg(msg, - origRelname, + origTypeName ? origTypeName + : RelationGetRelationName(origRelation), RelationGetRelationName(rel), NameStr(att->attname)))); } @@ -3956,7 +3959,7 @@ find_composite_type_dependencies(Oid typeOid, char origRelkind, * recursively check for indirect dependencies via its rowtype. */ find_composite_type_dependencies(rel->rd_rel->reltype, - origRelkind, origRelname); + origRelation, origTypeName); } relation_close(rel, AccessShareLock); @@ -3972,7 +3975,7 @@ find_composite_type_dependencies(Oid typeOid, char origRelkind, */ arrayOid = get_array_type(typeOid); if (OidIsValid(arrayOid)) - find_composite_type_dependencies(arrayOid, origRelkind, origRelname); + find_composite_type_dependencies(arrayOid, origRelation, origTypeName); } @@ -6573,9 +6576,7 @@ ATPrepAlterColumnType(List **wqueue, * 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, - rel->rd_rel->relkind, - RelationGetRelationName(rel)); + find_composite_type_dependencies(rel->rd_rel->reltype, rel, NULL); } ReleaseSysCache(tuple); diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index fb9d67a30a5..f9da7816b25 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -2196,7 +2196,7 @@ get_rels_with_domain(Oid domainOid, LOCKMODE lockmode) */ if (OidIsValid(rel->rd_rel->reltype)) find_composite_type_dependencies(rel->rd_rel->reltype, - RELKIND_COMPOSITE_TYPE, + NULL, format_type_be(domainOid)); /* Otherwise we can ignore views, composite types, etc */ diff --git a/src/include/commands/tablecmds.h b/src/include/commands/tablecmds.h index b266230778f..d4383525db4 100644 --- a/src/include/commands/tablecmds.h +++ b/src/include/commands/tablecmds.h @@ -53,7 +53,8 @@ extern void RenameRelationInternal(Oid myrelid, Oid namespaceId); extern void find_composite_type_dependencies(Oid typeOid, - char origRelkind, const char *origRelname); + Relation origRelation, + const char *origTypeName); extern AttrNumber *varattnos_map(TupleDesc olddesc, TupleDesc newdesc); extern AttrNumber *varattnos_map_schema(TupleDesc old, List *schema); -- GitLab