diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/heap/heapam.c | 8 | ||||
-rw-r--r-- | src/backend/replication/logical/decode.c | 12 | ||||
-rw-r--r-- | src/include/access/heapam_xlog.h | 2 |
3 files changed, 20 insertions, 2 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 1accdd9d99a..e8199b309b7 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -2513,6 +2513,14 @@ heap_multi_insert(Relation relation, HeapTuple *tuples, int ntuples, info |= XLOG_HEAP_INIT_PAGE; } + /* + * Signal that this is the last xl_heap_multi_insert record + * emitted by this call to heap_multi_insert(). Needed for logical + * decoding so it knows when to cleanup temporary data. + */ + if (ndone + nthispage == ntuples) + xlrec->flags |= XLOG_HEAP_LAST_MULTI_INSERT; + recptr = XLogInsert(RM_HEAP2_ID, info, rdata); PageSetLSN(page, recptr); diff --git a/src/backend/replication/logical/decode.c b/src/backend/replication/logical/decode.c index 1734ec96599..8f8732afdce 100644 --- a/src/backend/replication/logical/decode.c +++ b/src/backend/replication/logical/decode.c @@ -802,8 +802,16 @@ DecodeMultiInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) tuple->header.t_hoff = xlhdr->t_hoff; } - /* reset toast reassembly only after the last chunk */ - change->data.tp.clear_toast_afterwards = (i + 1) == xlrec->ntuples; + /* + * Reset toast reassembly state only after the last row in the last + * xl_multi_insert_tuple record emitted by one heap_multi_insert() + * call. + */ + if (xlrec->flags & XLOG_HEAP_LAST_MULTI_INSERT && + (i + 1) == xlrec->ntuples) + change->data.tp.clear_toast_afterwards = true; + else + change->data.tp.clear_toast_afterwards = false; ReorderBufferQueueChange(ctx->reorder, r->xl_xid, buf->origptr, change); diff --git a/src/include/access/heapam_xlog.h b/src/include/access/heapam_xlog.h index cfdd1ffbefc..9557486635a 100644 --- a/src/include/access/heapam_xlog.h +++ b/src/include/access/heapam_xlog.h @@ -69,6 +69,8 @@ #define XLOG_HEAP_CONTAINS_NEW_TUPLE (1<<4) #define XLOG_HEAP_PREFIX_FROM_OLD (1<<5) #define XLOG_HEAP_SUFFIX_FROM_OLD (1<<6) +/* last xl_heap_multi_insert record for one heap_multi_insert() call */ +#define XLOG_HEAP_LAST_MULTI_INSERT (1<<7) /* convenience macro for checking whether any form of old tuple was logged */ #define XLOG_HEAP_CONTAINS_OLD \ |