Make renamerel take an OID, not a RangeVar, to identify the relation
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 31 Mar 2002 07:49:30 +0000 (07:49 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 31 Mar 2002 07:49:30 +0000 (07:49 +0000)
to rename.  Avoids some corner-case bugs in cluster.c, improves
consistency with renameatt.

src/backend/commands/cluster.c
src/backend/commands/rename.c
src/backend/tcop/utility.c
src/include/commands/rename.h

index c801c53f406b40f5172f3275817379b009a15328..aad5361b6b837d085c4ed7b8df261ece8b8b21ee 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.76 2002/03/31 06:26:30 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.77 2002/03/31 07:49:30 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -37,8 +37,9 @@
 #include "utils/syscache.h"
 
 
-static Oid copy_heap(Oid OIDOldHeap, char *NewName);
-static void copy_index(Oid OIDOldIndex, Oid OIDNewHeap, char *NewIndexName);
+static Oid copy_heap(Oid OIDOldHeap, const char *NewName);
+static Oid copy_index(Oid OIDOldIndex, Oid OIDNewHeap,
+                      const char *NewIndexName);
 static void rebuildheap(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex);
 
 /*
@@ -58,13 +59,12 @@ cluster(RangeVar *oldrelation, char *oldindexname)
 {
    Oid         OIDOldHeap,
                OIDOldIndex,
-               OIDNewHeap;
+               OIDNewHeap,
+               OIDNewIndex;
    Relation    OldHeap,
                OldIndex;
    char        NewHeapName[NAMEDATALEN];
    char        NewIndexName[NAMEDATALEN];
-   RangeVar   *NewHeap;
-   RangeVar   *NewIndex;
 
    /*
     * We grab exclusive access to the target rel and index for the
@@ -115,7 +115,7 @@ cluster(RangeVar *oldrelation, char *oldindexname)
    /* Create new index over the tuples of the new heap. */
    snprintf(NewIndexName, NAMEDATALEN, "temp_%u", OIDOldIndex);
 
-   copy_index(OIDOldIndex, OIDNewHeap, NewIndexName);
+   OIDNewIndex = copy_index(OIDOldIndex, OIDNewHeap, NewIndexName);
 
    CommandCounterIncrement();
 
@@ -124,23 +124,16 @@ cluster(RangeVar *oldrelation, char *oldindexname)
 
    CommandCounterIncrement();
 
-   /* XXX ugly, and possibly wrong in the presence of schemas... */
-   /* would be better to pass OIDs to renamerel. */
-   NewHeap = copyObject(oldrelation);
-   NewHeap->relname = NewHeapName;
-   NewIndex = copyObject(oldrelation);
-   NewIndex->relname = NewIndexName;
-   
-   renamerel(NewHeap, oldrelation->relname);
+   renamerel(OIDNewHeap, oldrelation->relname);
 
    /* This one might be unnecessary, but let's be safe. */
    CommandCounterIncrement();
 
-   renamerel(NewIndex, oldindexname);
+   renamerel(OIDNewIndex, oldindexname);
 }
 
 static Oid
-copy_heap(Oid OIDOldHeap, char *NewName)
+copy_heap(Oid OIDOldHeap, const char *NewName)
 {
    TupleDesc   OldHeapDesc,
                tupdesc;
@@ -181,9 +174,10 @@ copy_heap(Oid OIDOldHeap, char *NewName)
    return OIDNewHeap;
 }
 
-static void
-copy_index(Oid OIDOldIndex, Oid OIDNewHeap, char *NewIndexName)
+static Oid
+copy_index(Oid OIDOldIndex, Oid OIDNewHeap, const char *NewIndexName)
 {
+   Oid         OIDNewIndex;
    Relation    OldIndex,
                NewHeap;
    IndexInfo  *indexInfo;
@@ -198,19 +192,21 @@ copy_index(Oid OIDOldIndex, Oid OIDNewHeap, char *NewIndexName)
     */
    indexInfo = BuildIndexInfo(OldIndex->rd_index);
 
-   index_create(OIDNewHeap,
-                NewIndexName,
-                indexInfo,
-                OldIndex->rd_rel->relam,
-                OldIndex->rd_index->indclass,
-                OldIndex->rd_index->indisprimary,
-                allowSystemTableMods);
+   OIDNewIndex = index_create(OIDNewHeap,
+                              NewIndexName,
+                              indexInfo,
+                              OldIndex->rd_rel->relam,
+                              OldIndex->rd_index->indclass,
+                              OldIndex->rd_index->indisprimary,
+                              allowSystemTableMods);
 
    setRelhasindex(OIDNewHeap, true,
                   OldIndex->rd_index->indisprimary, InvalidOid);
 
    index_close(OldIndex);
    heap_close(NewHeap, NoLock);
+
+   return OIDNewIndex;
 }
 
 
index 7e08dade24d223be769fd188a8db12083caa15b2..4f3d300dae34fcfc1fb9d1431ce442094a5e805c 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.67 2002/03/31 06:26:30 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.68 2002/03/31 07:49:30 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -69,8 +69,8 @@ static void update_ri_trigger_args(Oid relid,
  */
 void
 renameatt(Oid relid,
-         char *oldattname,
-         char *newattname,
+         const char *oldattname,
+         const char *newattname,
          bool recurse)
 {
    Relation    targetrelation;
@@ -250,51 +250,36 @@ renameatt(Oid relid,
  *     renamerel       - change the name of a relation
  */
 void
-renamerel(const RangeVar *relation, const char *newrelname)
+renamerel(Oid relid, const char *newrelname)
 {
    Relation    targetrelation;
    Relation    relrelation;    /* for RELATION relation */
    HeapTuple   reltup;
    Oid         namespaceId;
-   Oid         reloid;
    char        relkind;
    bool        relhastriggers;
    Relation    irelations[Num_pg_class_indices];
 
-   if (!allowSystemTableMods && IsSystemRelationName(relation->relname))
-       elog(ERROR, "renamerel: system relation \"%s\" may not be renamed",
-            relation->relname);
-
-   if (!allowSystemTableMods && IsSystemRelationName(newrelname))
-       elog(ERROR, "renamerel: Illegal class name: \"%s\" -- pg_ is reserved for system catalogs",
-            newrelname);
-
    /*
     * Grab an exclusive lock on the target table or index, which we will
     * NOT release until end of transaction.
     */
-   targetrelation = relation_openrv(relation, AccessExclusiveLock);
+   targetrelation = relation_open(relid, AccessExclusiveLock);
 
    namespaceId = RelationGetNamespace(targetrelation);
-   reloid = RelationGetRelid(targetrelation);
-   relkind = targetrelation->rd_rel->relkind;
-   relhastriggers = (targetrelation->rd_rel->reltriggers > 0);
 
-   /*
-    * Close rel, but keep exclusive lock!
-    */
-   relation_close(targetrelation, NoLock);
+   /* Validity checks */
+   if (!allowSystemTableMods &&
+       IsSystemRelationName(RelationGetRelationName(targetrelation)))
+       elog(ERROR, "renamerel: system relation \"%s\" may not be renamed",
+            RelationGetRelationName(targetrelation));
 
-   /*
-    * Flush the relcache entry (easier than trying to change it at
-    * exactly the right instant).  It'll get rebuilt on next access to
-    * relation.
-    *
-    * XXX What if relation is myxactonly?
-    *
-    * XXX this is probably not necessary anymore?
-    */
-   RelationIdInvalidateRelationCacheByRelationId(reloid);
+   if (!allowSystemTableMods && IsSystemRelationName(newrelname))
+       elog(ERROR, "renamerel: Illegal class name: \"%s\" -- pg_ is reserved for system catalogs",
+            newrelname);
+
+   relkind = targetrelation->rd_rel->relkind;
+   relhastriggers = (targetrelation->rd_rel->reltriggers > 0);
 
    /*
     * Find relation's pg_class tuple, and make sure newrelname isn't in
@@ -303,11 +288,11 @@ renamerel(const RangeVar *relation, const char *newrelname)
    relrelation = heap_openr(RelationRelationName, RowExclusiveLock);
 
    reltup = SearchSysCacheCopy(RELOID,
-                               PointerGetDatum(reloid),
+                               PointerGetDatum(relid),
                                0, 0, 0);
    if (!HeapTupleIsValid(reltup))
        elog(ERROR, "renamerel: relation \"%s\" does not exist",
-            relation->relname);
+            RelationGetRelationName(targetrelation));
 
    if (get_relname_relid(newrelname, namespaceId) != InvalidOid)
        elog(ERROR, "renamerel: relation \"%s\" exists", newrelname);
@@ -332,7 +317,8 @@ renamerel(const RangeVar *relation, const char *newrelname)
     * Also rename the associated type, if any.
     */
    if (relkind != RELKIND_INDEX)
-       TypeRename(relation->relname, namespaceId, newrelname);
+       TypeRename(RelationGetRelationName(targetrelation), namespaceId,
+                  newrelname);
 
    /*
     * If it's a view, must also rename the associated ON SELECT rule.
@@ -342,7 +328,7 @@ renamerel(const RangeVar *relation, const char *newrelname)
        char       *oldrulename,
                   *newrulename;
 
-       oldrulename = MakeRetrieveViewRuleName(relation->relname);
+       oldrulename = MakeRetrieveViewRuleName(RelationGetRelationName(targetrelation));
        newrulename = MakeRetrieveViewRuleName(newrelname);
        RenameRewriteRule(oldrulename, newrulename);
    }
@@ -353,14 +339,21 @@ renamerel(const RangeVar *relation, const char *newrelname)
    if (relhastriggers)
    {
        /* update tgargs where relname is primary key */
-       update_ri_trigger_args(reloid,
-                              relation->relname, newrelname,
+       update_ri_trigger_args(relid,
+                              RelationGetRelationName(targetrelation),
+                              newrelname,
                               false, true);
        /* update tgargs where relname is foreign key */
-       update_ri_trigger_args(reloid,
-                              relation->relname, newrelname,
+       update_ri_trigger_args(relid,
+                              RelationGetRelationName(targetrelation),
+                              newrelname,
                               true, true);
    }
+
+   /*
+    * Close rel, but keep exclusive lock!
+    */
+   relation_close(targetrelation, NoLock);
 }
 
 /*
index 49d3c129f3dc339036d325d6269cdc270e605b40..6043177cb469a1313765f5f3363d27d80b232d76 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.143 2002/03/31 06:26:31 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.144 2002/03/31 07:49:30 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -385,32 +385,20 @@ ProcessUtility(Node *parsetree,
 
                CheckOwnership(stmt->relation, true);
 
-               /* ----------------
-                *  XXX using len == 3 to tell the difference
-                *      between "rename rel to newrel" and
-                *      "rename att in rel to newatt" will not
-                *      work soon because "rename type/operator/rule"
-                *      stuff is being added. - cim 10/24/90
-                * ----------------
-                * [another piece of amuzing but useless anecdote -- ay]
-                */
                if (stmt->column == NULL)
                {
                    /*
                     * rename relation
-                    *
-                    * Note: we also rename the "type" tuple corresponding to
-                    * the relation.
                     */
-                   renamerel(stmt->relation,   /* old relation */
-                             stmt->newname);   /* new name */
+                   renamerel(RangeVarGetRelid(stmt->relation, false),
+                             stmt->newname);
                }
                else
                {
                    /*
                     * rename attribute
                     */
-                   renameatt(RangeVarGetRelid(stmt->relation, false),  /* relation */
+                   renameatt(RangeVarGetRelid(stmt->relation, false),
                              stmt->column,     /* old att name */
                              stmt->newname,    /* new att name */
                              interpretInhOption(stmt->relation->inhOpt));      /* recursive? */
index 28aebc01d91b769b9b5134c92d2d1fea99ef6d58..48e1a1cbe0dbfb205f85a3e7a83d166996d3790a 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: rename.h,v 1.15 2002/03/29 19:06:22 tgl Exp $
+ * $Id: rename.h,v 1.16 2002/03/31 07:49:30 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #define RENAME_H
 
 extern void renameatt(Oid relid,
-         char *oldattname,
-         char *newattname,
+         const char *oldattname,
+         const char *newattname,
          bool recurse);
 
-extern void renamerel(const RangeVar *relation,
+extern void renamerel(Oid relid,
          const char *newrelname);
 
 #endif   /* RENAME_H */