diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 688bd5148f6049fed0bda380e4a922f1dc2ecccb..15218cd6ce83c771a8c6393d946b8c4621cda54e 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.52 2000/05/11 03:54:17 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.53 2000/05/12 16:10:09 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -258,11 +258,11 @@ copy_index(Oid OIDOldIndex, Oid OIDNewHeap) Assert(pg_proc_Tuple); pg_proc_Form = (Form_pg_proc) GETSTRUCT(pg_proc_Tuple); namecpy(&(finfo->funcName), &(pg_proc_Form->proname)); + natts = 1; /* function result is a single column */ } else { finfo = (FuncIndexInfo *) NULL; - natts = 1; } index_create(RelationGetRelationName(NewHeap), @@ -273,7 +273,8 @@ copy_index(Oid OIDOldIndex, Oid OIDNewHeap) natts, Old_pg_index_Form->indkey, Old_pg_index_Form->indclass, - (uint16) 0, (Datum) NULL, NULL, + (uint16) 0, (Datum *) NULL, + (Node *) NULL, /* XXX where's the predicate? */ Old_pg_index_Form->indislossy, Old_pg_index_Form->indisunique, Old_pg_index_Form->indisprimary); @@ -313,8 +314,20 @@ rebuildheap(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex) LocalHeapTuple.t_datamcxt = NULL; LocalHeapTuple.t_data = NULL; heap_fetch(LocalOldHeap, SnapshotNow, &LocalHeapTuple, &LocalBuffer); - heap_insert(LocalNewHeap, &LocalHeapTuple); - ReleaseBuffer(LocalBuffer); + if (LocalHeapTuple.t_data != NULL) { + /* + * We must copy the tuple because heap_insert() will overwrite + * the commit-status fields of the tuple it's handed, and the + * retrieved tuple will actually be in a disk buffer! Thus, + * the source relation would get trashed, which is bad news + * if we abort later on. (This was a bug in releases thru 7.0) + */ + HeapTuple copiedTuple = heap_copytuple(&LocalHeapTuple); + + ReleaseBuffer(LocalBuffer); + heap_insert(LocalNewHeap, copiedTuple); + heap_freetuple(copiedTuple); + } pfree(ScanResult); }