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