diff options
author | Bruce Momjian <bruce@momjian.us> | 2002-11-23 04:05:52 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2002-11-23 04:05:52 +0000 |
commit | d46f3de3638029179546c863f2ca0af3e86c1db6 (patch) | |
tree | 92c98e13145ff7e69bab7400b09d529718e38a42 /src/backend/commands/cluster.c | |
parent | a2b4a7071d86c0c150ab9ea8260a4bffc3ae863f (diff) | |
download | postgresql-d46f3de3638029179546c863f2ca0af3e86c1db6.tar.gz postgresql-d46f3de3638029179546c863f2ca0af3e86c1db6.zip |
Transaction safe Truncate
Rod Taylor
Diffstat (limited to 'src/backend/commands/cluster.c')
-rw-r--r-- | src/backend/commands/cluster.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 1e5a11220c6..68b1f12e082 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.95 2002/11/18 17:12:07 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.96 2002/11/23 04:05:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -20,12 +20,13 @@ #include "access/genam.h" #include "access/heapam.h" #include "catalog/catalog.h" +#include "catalog/catname.h" #include "catalog/dependency.h" #include "catalog/heap.h" #include "catalog/index.h" #include "catalog/indexing.h" -#include "catalog/catname.h" #include "catalog/namespace.h" +#include "catalog/pg_constraint.h" #include "commands/cluster.h" #include "commands/tablecmds.h" #include "miscadmin.h" @@ -63,7 +64,6 @@ typedef struct static Oid make_new_heap(Oid OIDOldHeap, const char *NewName); static void copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex); -static List *get_indexattr_list(Relation OldHeap, Oid OldIndex); static void recreate_indexattr(Oid OIDOldHeap, List *indexes); static void swap_relfilenodes(Oid r1, Oid r2); static void cluster_rel(relToCluster *rv); @@ -92,11 +92,8 @@ static MemoryContext cluster_context = NULL; void cluster_rel(relToCluster *rvtc) { - Oid OIDNewHeap; Relation OldHeap, OldIndex; - char NewHeapName[NAMEDATALEN]; - ObjectAddress object; List *indexes; /* Check for user-requested abort. */ @@ -172,6 +169,22 @@ cluster_rel(relToCluster *rvtc) index_close(OldIndex); heap_close(OldHeap, NoLock); + /* rebuild_rel does all the dirty work */ + rebuild_rel(rvtc->tableOid, rvtc->indexOid, indexes, true); +} + +void +rebuild_rel(Oid tableOid, Oid indexOid, List *indexes, bool dataCopy) +{ + Oid OIDNewHeap; + char NewHeapName[NAMEDATALEN]; + ObjectAddress object; + + /* + * If dataCopy is true, we assume that we will be basing the + * copy off an index for cluster operations. + */ + Assert(!dataCopy || indexOid != NULL); /* * Create the new heap, using a temporary name in the same namespace * as the existing table. NOTE: there is some risk of collision with @@ -180,10 +193,9 @@ cluster_rel(relToCluster *rvtc) * namespace from the old, or we will have problems with the TEMP * status of temp tables. */ - snprintf(NewHeapName, NAMEDATALEN, "pg_temp_%u", rvtc->tableOid); - - OIDNewHeap = make_new_heap(rvtc->tableOid, NewHeapName); + snprintf(NewHeapName, NAMEDATALEN, "pg_temp_%u", tableOid); + OIDNewHeap = make_new_heap(tableOid, NewHeapName); /* * We don't need CommandCounterIncrement() because make_new_heap did * it. @@ -192,13 +204,14 @@ cluster_rel(relToCluster *rvtc) /* * Copy the heap data into the new table in the desired order. */ - copy_heap_data(OIDNewHeap, rvtc->tableOid, rvtc->indexOid); + if (dataCopy) + copy_heap_data(OIDNewHeap, tableOid, indexOid); /* To make the new heap's data visible (probably not needed?). */ CommandCounterIncrement(); /* Swap the relfilenodes of the old and new heaps. */ - swap_relfilenodes(rvtc->tableOid, OIDNewHeap); + swap_relfilenodes(tableOid, OIDNewHeap); CommandCounterIncrement(); @@ -219,7 +232,7 @@ cluster_rel(relToCluster *rvtc) * Recreate each index on the relation. We do not need * CommandCounterIncrement() because recreate_indexattr does it. */ - recreate_indexattr(rvtc->tableOid, indexes); + recreate_indexattr(tableOid, indexes); } /* @@ -322,7 +335,7 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex) * Get the necessary info about the indexes of the relation and * return a list of IndexAttrs structures. */ -static List * +List * get_indexattr_list(Relation OldHeap, Oid OldIndex) { List *indexes = NIL; |