aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/clog.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c
index 0a7e2b310f1..41778584ba8 100644
--- a/src/backend/access/transam/clog.c
+++ b/src/backend/access/transam/clog.c
@@ -227,21 +227,27 @@ set_status_by_pages(int nsubxids, TransactionId *subxids,
int offset = 0;
int i = 0;
+ Assert(nsubxids > 0); /* else the pageno fetch above is unsafe */
+
while (i < nsubxids)
{
int num_on_page = 0;
+ int nextpageno;
- while (TransactionIdToPage(subxids[i]) == pageno && i < nsubxids)
+ do
{
+ nextpageno = TransactionIdToPage(subxids[i]);
+ if (nextpageno != pageno)
+ break;
num_on_page++;
i++;
- }
+ } while (i < nsubxids);
TransactionIdSetPageStatus(InvalidTransactionId,
num_on_page, subxids + offset,
status, lsn, pageno);
offset = i;
- pageno = TransactionIdToPage(subxids[offset]);
+ pageno = nextpageno;
}
}