Ensure that CLUSTER leaves the toast table and index with consistent names,
by renaming the new copies after the catalog games.
This commit is contained in:
parent
a303e4dc43
commit
c5eabafb6a
@ -11,7 +11,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.177 2008/06/19 00:46:04 alvherre Exp $
|
* $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.178 2008/10/14 17:19:50 alvherre Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -29,6 +29,7 @@
|
|||||||
#include "catalog/index.h"
|
#include "catalog/index.h"
|
||||||
#include "catalog/indexing.h"
|
#include "catalog/indexing.h"
|
||||||
#include "catalog/namespace.h"
|
#include "catalog/namespace.h"
|
||||||
|
#include "catalog/pg_namespace.h"
|
||||||
#include "catalog/toasting.h"
|
#include "catalog/toasting.h"
|
||||||
#include "commands/cluster.h"
|
#include "commands/cluster.h"
|
||||||
#include "commands/tablecmds.h"
|
#include "commands/tablecmds.h"
|
||||||
@ -568,6 +569,7 @@ rebuild_relation(Relation OldHeap, Oid indexOid)
|
|||||||
char NewHeapName[NAMEDATALEN];
|
char NewHeapName[NAMEDATALEN];
|
||||||
TransactionId frozenXid;
|
TransactionId frozenXid;
|
||||||
ObjectAddress object;
|
ObjectAddress object;
|
||||||
|
Relation newrel;
|
||||||
|
|
||||||
/* Mark the correct index as clustered */
|
/* Mark the correct index as clustered */
|
||||||
mark_index_clustered(OldHeap, indexOid);
|
mark_index_clustered(OldHeap, indexOid);
|
||||||
@ -622,6 +624,35 @@ rebuild_relation(Relation OldHeap, Oid indexOid)
|
|||||||
* because reindex_relation does it.
|
* because reindex_relation does it.
|
||||||
*/
|
*/
|
||||||
reindex_relation(tableOid, false);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user