diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 52c6986..b6f83f8 100644 *** a/src/backend/replication/logical/reorderbuffer.c --- b/src/backend/replication/logical/reorderbuffer.c *************** static void *** 2449,2463 **** ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn, char *data) { - ReorderBufferDiskChange *ondisk; ReorderBufferChange *change; - ondisk = (ReorderBufferDiskChange *) data; - change = ReorderBufferGetChange(rb); /* copy static part */ ! memcpy(change, &ondisk->change, sizeof(ReorderBufferChange)); data += sizeof(ReorderBufferDiskChange); --- 2449,2461 ---- ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn, char *data) { ReorderBufferChange *change; change = ReorderBufferGetChange(rb); /* copy static part */ ! memcpy(change, data + offsetof(ReorderBufferDiskChange, change), ! sizeof(ReorderBufferChange)); data += sizeof(ReorderBufferDiskChange); *************** ReorderBufferRestoreChange(ReorderBuffer *** 2471,2477 **** case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT: if (change->data.tp.oldtuple) { ! Size tuplelen = ((HeapTuple) data)->t_len; change->data.tp.oldtuple = ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader); --- 2469,2479 ---- case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT: if (change->data.tp.oldtuple) { ! uint32 tuplelen; ! ! /* Must get tuplelen the hard way in case it's misaligned */ ! memcpy(&tuplelen, data + offsetof(HeapTupleData, t_len), ! sizeof(uint32)); change->data.tp.oldtuple = ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader); *************** ReorderBufferRestoreChange(ReorderBuffer *** 2492,2498 **** if (change->data.tp.newtuple) { ! Size tuplelen = ((HeapTuple) data)->t_len; change->data.tp.newtuple = ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader); --- 2494,2504 ---- if (change->data.tp.newtuple) { ! uint32 tuplelen; ! ! /* Must get tuplelen the hard way in case it's misaligned */ ! memcpy(&tuplelen, data + offsetof(HeapTupleData, t_len), ! sizeof(uint32)); change->data.tp.newtuple = ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader); *************** ReorderBufferRestoreChange(ReorderBuffer *** 2538,2552 **** } case REORDER_BUFFER_CHANGE_INTERNAL_SNAPSHOT: { ! Snapshot oldsnap; Snapshot newsnap; Size size; ! oldsnap = (Snapshot) data; size = sizeof(SnapshotData) + ! sizeof(TransactionId) * oldsnap->xcnt + ! sizeof(TransactionId) * (oldsnap->subxcnt + 0); change->data.snapshot = MemoryContextAllocZero(rb->context, size); --- 2544,2558 ---- } case REORDER_BUFFER_CHANGE_INTERNAL_SNAPSHOT: { ! SnapshotData oldsnap; Snapshot newsnap; Size size; ! memcpy(&oldsnap, data, sizeof(SnapshotData)); size = sizeof(SnapshotData) + ! sizeof(TransactionId) * oldsnap.xcnt + ! sizeof(TransactionId) * oldsnap.subxcnt; change->data.snapshot = MemoryContextAllocZero(rb->context, size); *************** ReorderBufferRestoreChange(ReorderBuffer *** 2557,2562 **** --- 2563,2570 ---- (((char *) newsnap) + sizeof(SnapshotData)); newsnap->subxip = newsnap->xip + newsnap->xcnt; newsnap->copied = true; + + data += size; break; } /* the base struct contains all the data, easy peasy */