]> granicus.if.org Git - postgresql/commitdiff
Fix bugs in the COPY heap-insert batching patch.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 9 Nov 2011 19:24:26 +0000 (21:24 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 9 Nov 2011 19:28:25 +0000 (21:28 +0200)
Forgot to call RestoreBkpBlocks() in the redo-function, as pointed out by
Simon Riggs. In redo of a regular heap insert, it's taken care of in
heap_redo(), but this new record type uses the heap2 RM, and heap2_redo()
does not take care of that for you.

Also, failed to reset the vmbuffer and all_visibile_cleared local variables
after switching to a new buffer.

src/backend/access/heap/heapam.c

index 72ed6325384d3c53bc545b99a12ba7beb9009882..9b49302c789b33ce75728ab571284b4a4cf86d1c 100644 (file)
@@ -2088,9 +2088,6 @@ heap_multi_insert(Relation relation, HeapTuple *tuples, int ntuples,
 {
        TransactionId xid = GetCurrentTransactionId();
        HeapTuple  *heaptuples;
-       Buffer          buffer;
-       Buffer          vmbuffer = InvalidBuffer;
-       bool            all_visible_cleared = false;
        int                     i;
        int                     ndone;
        char       *scratch = NULL;
@@ -2128,6 +2125,9 @@ heap_multi_insert(Relation relation, HeapTuple *tuples, int ntuples,
        ndone = 0;
        while (ndone < ntuples)
        {
+               Buffer          buffer;
+               Buffer          vmbuffer = InvalidBuffer;
+               bool            all_visible_cleared = false;
                int nthispage;
 
                /*
@@ -5038,6 +5038,13 @@ heap_xlog_multi_insert(XLogRecPtr lsn, XLogRecord *record)
        int                     i;
        bool            isinit = (record->xl_info & XLOG_HEAP_INIT_PAGE) != 0;
 
+       /*
+        * Insertion doesn't overwrite MVCC data, so no conflict processing is
+        * required.
+        */
+
+       RestoreBkpBlocks(lsn, record, false);
+
        xlrec = (xl_heap_multi_insert *) recdata;
        recdata += SizeOfHeapMultiInsert;