Tom Lane wrote:
> Alvaro Herrera <[EMAIL PROTECTED]> writes:
> >> Yeah, that seems like the best answer.
> 
> > Seems like this patch fixes it.
> 
> Um, not for tables that don't have toast tables ...

Right, this seems better.

Note that it needs to open the toast table and grab AccessShare to get
the toast index OID.  I don't think it needs a stronger lock.

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Index: src/backend/commands/cluster.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/commands/cluster.c,v
retrieving revision 1.177
diff -c -p -r1.177 cluster.c
*** src/backend/commands/cluster.c	19 Jun 2008 00:46:04 -0000	1.177
--- src/backend/commands/cluster.c	10 Oct 2008 19:46:56 -0000
***************
*** 29,34 ****
--- 29,35 ----
  #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"
*************** rebuild_relation(Relation OldHeap, Oid i
*** 568,573 ****
--- 569,575 ----
  	char		NewHeapName[NAMEDATALEN];
  	TransactionId frozenXid;
  	ObjectAddress object;
+ 	Relation	newrel;
  
  	/* Mark the correct index as clustered */
  	mark_index_clustered(OldHeap, indexOid);
*************** rebuild_relation(Relation OldHeap, Oid i
*** 622,627 ****
--- 624,658 ----
  	 * 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);
  }
  
  /*
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to