]> granicus.if.org Git - postgresql/commitdiff
Tweak find_composite_type_dependencies API a bit more.
authorRobert Haas <rhaas@postgresql.org>
Fri, 11 Feb 2011 13:47:38 +0000 (08:47 -0500)
committerRobert Haas <rhaas@postgresql.org>
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);