aboutsummaryrefslogtreecommitdiff
path: root/src/backend/replication/logical/reorderbuffer.c
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2016-03-05 18:02:20 -0800
committerAndres Freund <andres@anarazel.de>2016-03-05 18:02:20 -0800
commit0bda14d54cf24dedcd2011559a53cc62702e421b (patch)
tree6d64f33c804fa137f83d4fa699798d78b9e2314c /src/backend/replication/logical/reorderbuffer.c
parentd9e903f3cbbd00c7ba7d4974e6852c3d2cbf4447 (diff)
downloadpostgresql-0bda14d54cf24dedcd2011559a53cc62702e421b.tar.gz
postgresql-0bda14d54cf24dedcd2011559a53cc62702e421b.zip
logical decoding: old/newtuple in spooled UPDATE changes was switched around.
Somehow I managed to flip the order of restoring old & new tuples when de-spooling a change in a large transaction from disk. This happens to only take effect when a change is spooled to disk which has old/new versions of the tuple. That only is the case for UPDATEs where he primary key changed or where replica identity is changed to FULL. The tests didn't catch this because either spooled updates, or updates that changed primary keys, were tested; not both at the same time. Found while adding tests for the following commit. Backpatch: 9.4, where logical decoding was added
Diffstat (limited to 'src/backend/replication/logical/reorderbuffer.c')
-rw-r--r--src/backend/replication/logical/reorderbuffer.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index 513fcde3d48..e20c5114e2a 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -2335,27 +2335,27 @@ ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
case REORDER_BUFFER_CHANGE_UPDATE:
case REORDER_BUFFER_CHANGE_DELETE:
case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT:
- if (change->data.tp.newtuple)
+ if (change->data.tp.oldtuple)
{
Size len = offsetof(ReorderBufferTupleBuf, t_data) +
((ReorderBufferTupleBuf *) data)->tuple.t_len;
- change->data.tp.newtuple = ReorderBufferGetTupleBuf(rb);
- memcpy(change->data.tp.newtuple, data, len);
- change->data.tp.newtuple->tuple.t_data =
- &change->data.tp.newtuple->t_data.header;
+ change->data.tp.oldtuple = ReorderBufferGetTupleBuf(rb);
+ memcpy(change->data.tp.oldtuple, data, len);
+ change->data.tp.oldtuple->tuple.t_data =
+ &change->data.tp.oldtuple->t_data.header;
data += len;
}
- if (change->data.tp.oldtuple)
+ if (change->data.tp.newtuple)
{
Size len = offsetof(ReorderBufferTupleBuf, t_data) +
((ReorderBufferTupleBuf *) data)->tuple.t_len;
- change->data.tp.oldtuple = ReorderBufferGetTupleBuf(rb);
- memcpy(change->data.tp.oldtuple, data, len);
- change->data.tp.oldtuple->tuple.t_data =
- &change->data.tp.oldtuple->t_data.header;
+ change->data.tp.newtuple = ReorderBufferGetTupleBuf(rb);
+ memcpy(change->data.tp.newtuple, data, len);
+ change->data.tp.newtuple->tuple.t_data =
+ &change->data.tp.newtuple->t_data.header;
data += len;
}
break;