Do The Right Thing (tm) if asked to cluster a temp table. Previous
authorTom Lane
Wed, 10 Jan 2001 01:12:28 +0000 (01:12 +0000)
committerTom Lane
Wed, 10 Jan 2001 01:12:28 +0000 (01:12 +0000)
code would cluster, but table would magically lose its tempness.

src/backend/commands/cluster.c

index 57ffd12134fba3847941f1923ae46d456ebb8976..c81cb041e944bcd8621014d35e7e4d12bc0e831f 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.61 2001/01/01 21:35:00 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.62 2001/01/10 01:12:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "miscadmin.h"
 #include "utils/builtins.h"
 #include "utils/syscache.h"
+#include "utils/temprel.h"
 
-static Oid copy_heap(Oid OIDOldHeap, char *NewName);
+
+static Oid copy_heap(Oid OIDOldHeap, char *NewName, bool istemp);
 static void copy_index(Oid OIDOldIndex, Oid OIDNewHeap, char *NewIndexName);
 static void rebuildheap(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex);
 
@@ -60,6 +62,7 @@ cluster(char *oldrelname, char *oldindexname)
    Relation    OldHeap,
                OldIndex;
    HeapTuple   tuple;
+   bool        istemp;
    char        NewHeapName[NAMEDATALEN];
    char        NewIndexName[NAMEDATALEN];
    char        saveoldrelname[NAMEDATALEN];
@@ -82,6 +85,8 @@ cluster(char *oldrelname, char *oldindexname)
    LockRelation(OldIndex, AccessExclusiveLock);
    OIDOldIndex = RelationGetRelid(OldIndex);
 
+   istemp = is_temp_rel_name(saveoldrelname);
+
    /*
     * Check that index is in fact an index on the given relation
     */
@@ -105,7 +110,7 @@ cluster(char *oldrelname, char *oldindexname)
     */
    snprintf(NewHeapName, NAMEDATALEN, "temp_%u", OIDOldHeap);
 
-   OIDNewHeap = copy_heap(OIDOldHeap, NewHeapName);
+   OIDNewHeap = copy_heap(OIDOldHeap, NewHeapName, istemp);
 
    /* We do not need CommandCounterIncrement() because copy_heap did it. */
 
@@ -138,7 +143,7 @@ cluster(char *oldrelname, char *oldindexname)
 }
 
 static Oid
-copy_heap(Oid OIDOldHeap, char *NewName)
+copy_heap(Oid OIDOldHeap, char *NewName, bool istemp)
 {
    TupleDesc   OldHeapDesc,
                tupdesc;
@@ -155,7 +160,7 @@ copy_heap(Oid OIDOldHeap, char *NewName)
    tupdesc = CreateTupleDescCopy(OldHeapDesc);
 
    OIDNewHeap = heap_create_with_catalog(NewName, tupdesc,
-                                         RELKIND_RELATION, false,
+                                         RELKIND_RELATION, istemp,
                                          allowSystemTableMods);
 
    /*
@@ -192,9 +197,13 @@ copy_index(Oid OIDOldIndex, Oid OIDNewHeap, char *NewIndexName)
    OldIndex = index_open(OIDOldIndex);
 
    /*
-    * Create a new (temporary) index like the one that's already here.
-    * To do this I get the info from pg_index, and add a new index with
-    * a temporary name.
+    * Create a new index like the old one.  To do this I get the info
+    * from pg_index, and add a new index with a temporary name (that
+    * will be changed later).
+    *
+    * NOTE: index_create will cause the new index to be a temp relation
+    * if its parent table is, so we don't need to do anything special
+    * for the temp-table case here.
     */
    Old_pg_index_Tuple = SearchSysCache(INDEXRELID,
                                        ObjectIdGetDatum(OIDOldIndex),