From 14e2a260a5187a1e83c6ec77f9db7fa5893e177e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 15 Jan 2008 21:20:28 +0000 Subject: [PATCH] Prevent CLUSTER from decreasing a relation's relfrozenxid. Bug introduced in rewrite to make CLUSTER MVCC-safe. --- src/backend/commands/cluster.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 5176e8d6ac..a2a94f1e82 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.167 2008/01/02 23:34:42 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.168 2008/01/15 21:20:28 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -751,6 +751,13 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex) vacuum_set_xid_limits(-1, OldHeap->rd_rel->relisshared, &OldestXmin, &FreezeXid); + /* + * FreezeXid will become the table's new relfrozenxid, and that mustn't + * go backwards, so take the max. + */ + if (TransactionIdPrecedes(FreezeXid, OldHeap->rd_rel->relfrozenxid)) + FreezeXid = OldHeap->rd_rel->relfrozenxid; + /* Initialize the rewrite operation */ rwstate = begin_heap_rewrite(NewHeap, OldestXmin, FreezeXid, use_wal);