diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 3a68a393d2..275ccc03be 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -222,6 +222,9 @@ static void ReorderBufferTransferSnapToParent(ReorderBufferTXN *txn, ReorderBufferTXN *subtxn); static void AssertTXNLsnOrder(ReorderBuffer *rb); +#ifdef USE_ASSERT_CHECKING +static bool ReorderBufferTXNIsEmpty(ReorderBufferTXN *txn); +#endif /* --------------------------------------- * support functions for lsn-order iterating over the ->changes of a @@ -918,9 +921,18 @@ AssertTXNLsnOrder(ReorderBuffer *rb) if (cur_txn->end_lsn != InvalidXLogRecPtr) Assert(cur_txn->first_lsn <= cur_txn->end_lsn); - /* Current initial LSN must be strictly higher than previous */ + /* + * Current initial LSN must be strictly higher than previous, except + * the transaction is empty. In such a case, the initial LSN must be + * the same as the previous one. + */ if (prev_first_lsn != InvalidXLogRecPtr) - Assert(prev_first_lsn < cur_txn->first_lsn); + { + if (prev_first_lsn == cur_txn->first_lsn) + Assert(ReorderBufferTXNIsEmpty(cur_txn)); + else + Assert(prev_first_lsn < cur_txn->first_lsn); + } /* known-as-subtxn txns must not be listed */ Assert(!rbtxn_is_known_subxact(cur_txn)); @@ -950,6 +962,23 @@ AssertTXNLsnOrder(ReorderBuffer *rb) #endif } +#ifdef USE_ASSERT_CHECKING +/* + * ReorderBufferTXNIsEmpty + * + * Check the transaction is empty or not. + */ +static bool +ReorderBufferTXNIsEmpty(ReorderBufferTXN *txn) +{ + return txn->nentries == 0 && + txn->nentries_mem == 0 && + txn->ntuplecids == 0 && + txn->nsubtxns == 0 && + txn->ninvalidations == 0; +} +#endif + /* * AssertChangeLsnOrder *