aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/heap/heapam.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/heap/heapam.c')
-rw-r--r--src/backend/access/heap/heapam.c47
1 files changed, 23 insertions, 24 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index cb0c28c778a..7ef0bf2d558 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.150 2003/02/13 05:35:07 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.151 2003/02/23 20:32:11 tgl Exp $
*
*
* INTERFACE ROUTINES
@@ -1891,36 +1891,40 @@ heap_restrpos(HeapScanDesc scan)
}
XLogRecPtr
-log_heap_clean(Relation reln, Buffer buffer, char *unused, int unlen)
+log_heap_clean(Relation reln, Buffer buffer, OffsetNumber *unused, int uncnt)
{
xl_heap_clean xlrec;
XLogRecPtr recptr;
- XLogRecData rdata[3];
+ XLogRecData rdata[2];
/* Caller should not call me on a temp relation */
Assert(!reln->rd_istemp);
xlrec.node = reln->rd_node;
xlrec.block = BufferGetBlockNumber(buffer);
+
rdata[0].buffer = InvalidBuffer;
rdata[0].data = (char *) &xlrec;
rdata[0].len = SizeOfHeapClean;
rdata[0].next = &(rdata[1]);
- if (unlen > 0)
+ /*
+ * The unused-offsets array is not actually in the buffer, but pretend
+ * that it is. When XLogInsert stores the whole buffer, the offsets
+ * array need not be stored too.
+ */
+ rdata[1].buffer = buffer;
+ if (uncnt > 0)
{
- rdata[1].buffer = buffer;
- rdata[1].data = unused;
- rdata[1].len = unlen;
- rdata[1].next = &(rdata[2]);
+ rdata[1].data = (char *) unused;
+ rdata[1].len = uncnt * sizeof(OffsetNumber);
}
else
- rdata[0].next = &(rdata[2]);
-
- rdata[2].buffer = buffer;
- rdata[2].data = NULL;
- rdata[2].len = 0;
- rdata[2].next = NULL;
+ {
+ rdata[1].data = NULL;
+ rdata[1].len = 0;
+ }
+ rdata[1].next = NULL;
recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_CLEAN, rdata);
@@ -2032,7 +2036,6 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
return;
reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->node);
-
if (!RelationIsValid(reln))
return;
@@ -2052,18 +2055,14 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
if (record->xl_len > SizeOfHeapClean)
{
- OffsetNumber unbuf[BLCKSZ / sizeof(OffsetNumber)];
- OffsetNumber *unused = unbuf;
- char *unend;
+ OffsetNumber *unused;
+ OffsetNumber *unend;
ItemId lp;
- Assert((record->xl_len - SizeOfHeapClean) <= BLCKSZ);
- memcpy((char *) unbuf,
- (char *) xlrec + SizeOfHeapClean,
- record->xl_len - SizeOfHeapClean);
- unend = (char *) unbuf + (record->xl_len - SizeOfHeapClean);
+ unused = (OffsetNumber *) ((char *) xlrec + SizeOfHeapClean);
+ unend = (OffsetNumber *) ((char *) xlrec + record->xl_len);
- while ((char *) unused < unend)
+ while (unused < unend)
{
lp = PageGetItemId(page, *unused + 1);
lp->lp_flags &= ~LP_USED;