Issue properly WAL record for CID of first catalog tuple in multi-insert
authorMichael Paquier <michael@paquier.xyz>
Mon, 24 Feb 2020 22:55:22 +0000 (07:55 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 24 Feb 2020 22:55:22 +0000 (07:55 +0900)
Multi-insert for heap is not yet used actively for catalogs, but the
code to support this case is in place for logical decoding.  The
existing code forgot to issue a XLOG_HEAP2_NEW_CID record for the first
tuple inserted, leading to failures when attempting to use multiple
inserts for catalogs at decoding time.  This commit fixes the problem by
WAL-logging the needed CID.

This is not an active bug, so no back-patch is done.

Author: Daniel Gustafsson
Discussion: https://postgr.es/m/E0D4CC67-A1CF-4DF4-991D-B3AC2EB5FAE9@yesql.se

src/backend/access/heap/heapam.c

index db6fad76bc4f053f783b2ea0324d1137406262b8..5a32e62ed0e761aab4fc5710e2ff2fff80d75990 100644 (file)
@@ -2191,6 +2191,14 @@ heap_multi_insert(Relation relation, TupleTableSlot **slots, int ntuples,
         * Put that on the page, and then as many other tuples as fit.
         */
        RelationPutHeapTuple(relation, buffer, heaptuples[ndone], false);
+
+       /*
+        * Note that heap_multi_insert is not used for catalog tuples yet,
+        * but this will cover the gap once that is the case.
+        */
+       if (needwal && need_cids)
+           log_heap_new_cid(relation, heaptuples[ndone]);
+
        for (nthispage = 1; ndone + nthispage < ntuples; nthispage++)
        {
            HeapTuple   heaptup = heaptuples[ndone + nthispage];