]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Backport addition of rs_old_rel to rewriteheap's state.
authorAndres Freund <andres@anarazel.de>
Fri, 15 Dec 2017 00:50:31 +0000 (16:50 -0800)
committerAndres Freund <andres@anarazel.de>
Fri, 15 Dec 2017 02:20:48 +0000 (18:20 -0800)
Originally part of b89e151054a05f0f6d356ca52e3b725dd0505e53, the
introduction of logical decoding, this is required to backport a
commit introducing error checks defending against recent bugs.

It's possible that extensions calls begin_heap_rewrite(), but it seems
highly unlikely. But if so, they'd break.

Author: Andres Freund
Discussion: https://postgr.es/m/20171215010029.3dxx56vjlymudvwo@alap3.anarazel.de

src/backend/access/heap/rewriteheap.c
src/backend/commands/cluster.c
src/include/access/rewriteheap.h

index 76f972e79f98bd2caf9b5e892292725c4ef6d13e..82fa7b2d53aad16f2f0a0d69b511d025f46f9a33 100644 (file)
  */
 typedef struct RewriteStateData
 {
+       Relation        rs_old_rel;             /* source heap */
        Relation        rs_new_rel;             /* destination heap */
        Page            rs_buffer;              /* page currently being built */
        BlockNumber rs_blockno;         /* block where page will go */
@@ -187,7 +188,7 @@ static void raw_heap_insert(RewriteState state, HeapTuple tup);
  * to be used in subsequent calls to the other functions.
  */
 RewriteState
-begin_heap_rewrite(Relation new_heap, TransactionId oldest_xmin,
+begin_heap_rewrite(Relation old_heap, Relation new_heap, TransactionId oldest_xmin,
                                   TransactionId freeze_xid, MultiXactId cutoff_multi,
                                   bool use_wal)
 {
@@ -210,6 +211,7 @@ begin_heap_rewrite(Relation new_heap, TransactionId oldest_xmin,
        /* Create and fill in the state struct */
        state = palloc0(sizeof(RewriteStateData));
 
+       state->rs_old_rel = old_heap;
        state->rs_new_rel = new_heap;
        state->rs_buffer = (Page) palloc(BLCKSZ);
        /* new_heap needn't be empty, just locked */
index 46b41c17d21f2078f39fdb7346144a62d3c4a8b1..e74c3d9a5fceaeb5fceaff94d5994bbe72b15977 100644 (file)
@@ -887,7 +887,7 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex,
        is_system_catalog = IsSystemRelation(OldHeap);
 
        /* Initialize the rewrite operation */
-       rwstate = begin_heap_rewrite(NewHeap, OldestXmin, FreezeXid,
+       rwstate = begin_heap_rewrite(OldHeap, NewHeap, OldestXmin, FreezeXid,
                                                                 MultiXactCutoff, use_wal);
 
        /*
index 67cf06620a0d84c76e99f19ed16c9cd9fd47df72..b1b5a0e18e74317cba3c3632ab7b53ed1ca4ce37 100644 (file)
@@ -19,7 +19,7 @@
 /* struct definition is private to rewriteheap.c */
 typedef struct RewriteStateData *RewriteState;
 
-extern RewriteState begin_heap_rewrite(Relation NewHeap,
+extern RewriteState begin_heap_rewrite(Relation OldHeap, Relation NewHeap,
                                   TransactionId OldestXmin, TransactionId FreezeXid,
                                   MultiXactId MultiXactCutoff, bool use_wal);
 extern void end_heap_rewrite(RewriteState state);