Prevent CLUSTER from decreasing a relation's relfrozenxid. Bug
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 Jan 2008 21:20:28 +0000 (21:20 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 Jan 2008 21:20:28 +0000 (21:20 +0000)
introduced in rewrite to make CLUSTER MVCC-safe.

src/backend/commands/cluster.c

index 9c4ff8e5cacbdebcb616fa3543815dbbc0554418..ecefb216af4203e5c6a666e54f23d0af8b831b9b 100644 (file)
@@ -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);