mirror of
https://github.com/postgres/postgres.git
synced 2025-07-07 00:36:50 +03:00
Logical decoding of TRUNCATE
Add a new WAL record type for TRUNCATE, which is only used when wal_level >= logical. (For physical replication, TRUNCATE is already replicated via SMGR records.) Add new callback for logical decoding output plugins to receive TRUNCATE actions. Author: Simon Riggs <simon@2ndquadrant.com> Author: Marco Nenciarini <marco.nenciarini@2ndquadrant.it> Author: Peter Eisentraut <peter.eisentraut@2ndquadrant.com> Reviewed-by: Petr Jelinek <petr.jelinek@2ndquadrant.com> Reviewed-by: Andres Freund <andres@anarazel.de> Reviewed-by: Alvaro Herrera <alvherre@alvh.no-ip.org>
This commit is contained in:
@ -65,6 +65,7 @@ static void DecodeLogicalMsgOp(LogicalDecodingContext *ctx, XLogRecordBuffer *bu
|
||||
static void DecodeInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf);
|
||||
static void DecodeUpdate(LogicalDecodingContext *ctx, XLogRecordBuffer *buf);
|
||||
static void DecodeDelete(LogicalDecodingContext *ctx, XLogRecordBuffer *buf);
|
||||
static void DecodeTruncate(LogicalDecodingContext *ctx, XLogRecordBuffer *buf);
|
||||
static void DecodeMultiInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf);
|
||||
static void DecodeSpecConfirm(LogicalDecodingContext *ctx, XLogRecordBuffer *buf);
|
||||
|
||||
@ -450,6 +451,11 @@ DecodeHeapOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
|
||||
DecodeDelete(ctx, buf);
|
||||
break;
|
||||
|
||||
case XLOG_HEAP_TRUNCATE:
|
||||
if (SnapBuildProcessChange(builder, xid, buf->origptr))
|
||||
DecodeTruncate(ctx, buf);
|
||||
break;
|
||||
|
||||
case XLOG_HEAP_INPLACE:
|
||||
|
||||
/*
|
||||
@ -826,6 +832,41 @@ DecodeDelete(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
|
||||
ReorderBufferQueueChange(ctx->reorder, XLogRecGetXid(r), buf->origptr, change);
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse XLOG_HEAP_TRUNCATE from wal
|
||||
*/
|
||||
static void
|
||||
DecodeTruncate(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
|
||||
{
|
||||
XLogReaderState *r = buf->record;
|
||||
xl_heap_truncate *xlrec;
|
||||
ReorderBufferChange *change;
|
||||
|
||||
xlrec = (xl_heap_truncate *) XLogRecGetData(r);
|
||||
|
||||
/* only interested in our database */
|
||||
if (xlrec->dbId != ctx->slot->data.database)
|
||||
return;
|
||||
|
||||
/* output plugin doesn't look for this origin, no need to queue */
|
||||
if (FilterByOrigin(ctx, XLogRecGetOrigin(r)))
|
||||
return;
|
||||
|
||||
change = ReorderBufferGetChange(ctx->reorder);
|
||||
change->action = REORDER_BUFFER_CHANGE_TRUNCATE;
|
||||
change->origin_id = XLogRecGetOrigin(r);
|
||||
if (xlrec->flags & XLH_TRUNCATE_CASCADE)
|
||||
change->data.truncate.cascade = true;
|
||||
if (xlrec->flags & XLH_TRUNCATE_RESTART_SEQS)
|
||||
change->data.truncate.restart_seqs = true;
|
||||
change->data.truncate.nrelids = xlrec->nrelids;
|
||||
change->data.truncate.relids = palloc(xlrec->nrelids * sizeof(Oid));
|
||||
memcpy(change->data.truncate.relids, xlrec->relids,
|
||||
xlrec->nrelids * sizeof(Oid));
|
||||
ReorderBufferQueueChange(ctx->reorder, XLogRecGetXid(r),
|
||||
buf->origptr, change);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode XLOG_HEAP2_MULTI_INSERT_insert record into multiple tuplebufs.
|
||||
*
|
||||
|
Reference in New Issue
Block a user