Tweak find_composite_type_dependencies API a bit more.
authorRobert Haas
Fri, 11 Feb 2011 13:47:38 +0000 (08:47 -0500)
committerRobert Haas
Fri, 11 Feb 2011 13:47:38 +0000 (08:47 -0500)
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
src/backend/commands/typecmds.c
src/include/commands/tablecmds.h

index 9c812397b1e5fa3614a11fb95f535bf014aaf9df..e4f352c6c7c6fb9927a43e01955cfd1fe5371bc7 100644 (file)
@@ -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);
index fb9d67a30a5f214aab73e74e1ca147e73bf761b8..f9da7816b2554c50d56dfb0adda218062e7634b4 100644 (file)
@@ -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 */
index b266230778f1bacc293afb954e34bc82f374859f..d4383525db485f33d24f550020ddcdff981ebdd4 100644 (file)
@@ -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);