Ensure that CLUSTER leaves the toast table and index with consistent names,
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 14 Oct 2008 17:19:50 +0000 (17:19 +0000)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 14 Oct 2008 17:19:50 +0000 (17:19 +0000)
by renaming the new copies after the catalog games.

src/backend/commands/cluster.c

index df75c48dcea5eb711269632853d4934656fd0d96..d482ffbd8a21070a454ba2180ae5910e50d2e3a8 100644 (file)
@@ -29,6 +29,7 @@
 #include "catalog/index.h"
 #include "catalog/indexing.h"
 #include "catalog/namespace.h"
+#include "catalog/pg_namespace.h"
 #include "catalog/toasting.h"
 #include "commands/cluster.h"
 #include "commands/tablecmds.h"
@@ -568,6 +569,7 @@ rebuild_relation(Relation OldHeap, Oid indexOid)
        char            NewHeapName[NAMEDATALEN];
        TransactionId frozenXid;
        ObjectAddress object;
+       Relation        newrel;
 
        /* Mark the correct index as clustered */
        mark_index_clustered(OldHeap, indexOid);
@@ -622,6 +624,35 @@ rebuild_relation(Relation OldHeap, Oid indexOid)
         * because reindex_relation does it.
         */
        reindex_relation(tableOid, false);
+
+       /*
+        * At this point, everything is kosher except that the toast table's name
+        * corresponds to the temporary table.  The name is irrelevant to
+        * the backend because it's referenced by OID, but users looking at the
+        * catalogs could be confused.  Rename it to prevent this problem.
+        *
+        * Note no lock required on the relation, because we already hold an
+        * exclusive lock on it.
+        */
+       newrel = heap_open(tableOid, NoLock);
+       if (OidIsValid(newrel->rd_rel->reltoastrelid))
+       {
+               char            NewToastName[NAMEDATALEN];
+               Relation        toastrel;
+
+               /* rename the toast table ... */
+               snprintf(NewToastName, NAMEDATALEN, "pg_toast_%u", tableOid);
+               RenameRelationInternal(newrel->rd_rel->reltoastrelid, NewToastName,
+                                                          PG_TOAST_NAMESPACE);
+
+               /* ... and its index too */
+               toastrel = relation_open(newrel->rd_rel->reltoastrelid, AccessShareLock);
+               snprintf(NewToastName, NAMEDATALEN, "pg_toast_%u_index", tableOid);
+               RenameRelationInternal(toastrel->rd_rel->reltoastidxid, NewToastName,
+                                                          PG_TOAST_NAMESPACE);
+               relation_close(toastrel, AccessShareLock);
+       }
+       relation_close(newrel, NoLock);
 }
 
 /*