Commit 4c8495a1 authored by Tom Lane's avatar Tom Lane

Remove the mostly-stubbed-out-anyway support routines for WAL UNDO.

That code is never going to be used in the foreseeable future, and
where it's more than a stub it's making the redo routines harder to
read.
parent 928b06a6
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.117 2005/05/17 03:34:18 neilc Exp $ * $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.118 2005/06/06 17:01:21 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1732,12 +1732,6 @@ gist_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -1732,12 +1732,6 @@ gist_redo(XLogRecPtr lsn, XLogRecord *record)
elog(PANIC, "gist_redo: unimplemented"); elog(PANIC, "gist_redo: unimplemented");
} }
void
gist_undo(XLogRecPtr lsn, XLogRecord *record)
{
elog(PANIC, "gist_undo: unimplemented");
}
void void
gist_desc(char *buf, uint8 xl_info, char *rec) gist_desc(char *buf, uint8 xl_info, char *rec)
{ {
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/hash/hash.c,v 1.79 2005/05/11 06:24:51 neilc Exp $ * $PostgreSQL: pgsql/src/backend/access/hash/hash.c,v 1.80 2005/06/06 17:01:21 tgl Exp $
* *
* NOTES * NOTES
* This file contains only the public interface routines. * This file contains only the public interface routines.
...@@ -671,12 +671,6 @@ hash_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -671,12 +671,6 @@ hash_redo(XLogRecPtr lsn, XLogRecord *record)
elog(PANIC, "hash_redo: unimplemented"); elog(PANIC, "hash_redo: unimplemented");
} }
void
hash_undo(XLogRecPtr lsn, XLogRecord *record)
{
elog(PANIC, "hash_undo: unimplemented");
}
void void
hash_desc(char *buf, uint8 xl_info, char *rec) hash_desc(char *buf, uint8 xl_info, char *rec)
{ {
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.191 2005/05/19 21:35:44 tgl Exp $ * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.192 2005/06/06 17:01:22 tgl Exp $
* *
* *
* INTERFACE ROUTINES * INTERFACE ROUTINES
...@@ -2452,17 +2452,17 @@ log_heap_move(Relation reln, Buffer oldbuf, ItemPointerData from, ...@@ -2452,17 +2452,17 @@ log_heap_move(Relation reln, Buffer oldbuf, ItemPointerData from,
} }
static void static void
heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record) heap_xlog_clean(XLogRecPtr lsn, XLogRecord *record)
{ {
xl_heap_clean *xlrec = (xl_heap_clean *) XLogRecGetData(record); xl_heap_clean *xlrec = (xl_heap_clean *) XLogRecGetData(record);
Relation reln; Relation reln;
Buffer buffer; Buffer buffer;
Page page; Page page;
if (!redo || (record->xl_info & XLR_BKP_BLOCK_1)) if (record->xl_info & XLR_BKP_BLOCK_1)
return; return;
reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->node); reln = XLogOpenRelation(xlrec->node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
...@@ -2507,7 +2507,7 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -2507,7 +2507,7 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
} }
static void static void
heap_xlog_newpage(bool redo, XLogRecPtr lsn, XLogRecord *record) heap_xlog_newpage(XLogRecPtr lsn, XLogRecord *record)
{ {
xl_heap_newpage *xlrec = (xl_heap_newpage *) XLogRecGetData(record); xl_heap_newpage *xlrec = (xl_heap_newpage *) XLogRecGetData(record);
Relation reln; Relation reln;
...@@ -2519,10 +2519,10 @@ heap_xlog_newpage(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -2519,10 +2519,10 @@ heap_xlog_newpage(bool redo, XLogRecPtr lsn, XLogRecord *record)
* do not do anything that assumes we are touching a heap. * do not do anything that assumes we are touching a heap.
*/ */
if (!redo || (record->xl_info & XLR_BKP_BLOCK_1)) if (record->xl_info & XLR_BKP_BLOCK_1)
return; return;
reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->node); reln = XLogOpenRelation(xlrec->node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
buffer = XLogReadBuffer(true, reln, xlrec->blkno); buffer = XLogReadBuffer(true, reln, xlrec->blkno);
...@@ -2540,7 +2540,7 @@ heap_xlog_newpage(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -2540,7 +2540,7 @@ heap_xlog_newpage(bool redo, XLogRecPtr lsn, XLogRecord *record)
} }
static void static void
heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record) heap_xlog_delete(XLogRecPtr lsn, XLogRecord *record)
{ {
xl_heap_delete *xlrec = (xl_heap_delete *) XLogRecGetData(record); xl_heap_delete *xlrec = (xl_heap_delete *) XLogRecGetData(record);
Relation reln; Relation reln;
...@@ -2550,10 +2550,10 @@ heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -2550,10 +2550,10 @@ heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
ItemId lp = NULL; ItemId lp = NULL;
HeapTupleHeader htup; HeapTupleHeader htup;
if (redo && (record->xl_info & XLR_BKP_BLOCK_1)) if (record->xl_info & XLR_BKP_BLOCK_1)
return; return;
reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->target.node); reln = XLogOpenRelation(xlrec->target.node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
...@@ -2561,153 +2561,129 @@ heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -2561,153 +2561,129 @@ heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
buffer = XLogReadBuffer(false, reln, buffer = XLogReadBuffer(false, reln,
ItemPointerGetBlockNumber(&(xlrec->target.tid))); ItemPointerGetBlockNumber(&(xlrec->target.tid)));
if (!BufferIsValid(buffer)) if (!BufferIsValid(buffer))
elog(PANIC, "heap_delete_%sdo: no block", (redo) ? "re" : "un"); elog(PANIC, "heap_delete_redo: no block");
page = (Page) BufferGetPage(buffer); page = (Page) BufferGetPage(buffer);
if (PageIsNew((PageHeader) page)) if (PageIsNew((PageHeader) page))
elog(PANIC, "heap_delete_%sdo: uninitialized page", (redo) ? "re" : "un"); elog(PANIC, "heap_delete_redo: uninitialized page");
if (redo) if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{ {
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */ LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
{ ReleaseBuffer(buffer);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK); return;
ReleaseBuffer(buffer);
return;
}
} }
else if (XLByteLT(PageGetLSN(page), lsn)) /* changes are not applied
* ?! */
elog(PANIC, "heap_delete_undo: bad page LSN");
offnum = ItemPointerGetOffsetNumber(&(xlrec->target.tid)); offnum = ItemPointerGetOffsetNumber(&(xlrec->target.tid));
if (PageGetMaxOffsetNumber(page) >= offnum) if (PageGetMaxOffsetNumber(page) >= offnum)
lp = PageGetItemId(page, offnum); lp = PageGetItemId(page, offnum);
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsUsed(lp)) if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsUsed(lp))
elog(PANIC, "heap_delete_%sdo: invalid lp", (redo) ? "re" : "un"); elog(PANIC, "heap_delete_redo: invalid lp");
htup = (HeapTupleHeader) PageGetItem(page, lp); htup = (HeapTupleHeader) PageGetItem(page, lp);
if (redo) htup->t_infomask &= ~(HEAP_XMAX_COMMITTED |
{ HEAP_XMAX_INVALID |
htup->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_IS_MULTI |
HEAP_XMAX_INVALID | HEAP_IS_LOCKED |
HEAP_XMAX_IS_MULTI | HEAP_MOVED);
HEAP_IS_LOCKED | HeapTupleHeaderSetXmax(htup, record->xl_xid);
HEAP_MOVED); HeapTupleHeaderSetCmax(htup, FirstCommandId);
HeapTupleHeaderSetXmax(htup, record->xl_xid); /* Make sure there is no forward chain link in t_ctid */
HeapTupleHeaderSetCmax(htup, FirstCommandId); htup->t_ctid = xlrec->target.tid;
/* Make sure there is no forward chain link in t_ctid */ PageSetLSN(page, lsn);
htup->t_ctid = xlrec->target.tid; PageSetTLI(page, ThisTimeLineID);
PageSetLSN(page, lsn); LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
PageSetTLI(page, ThisTimeLineID); WriteBuffer(buffer);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer);
return;
}
elog(PANIC, "heap_delete_undo: unimplemented");
} }
static void static void
heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record) heap_xlog_insert(XLogRecPtr lsn, XLogRecord *record)
{ {
xl_heap_insert *xlrec = (xl_heap_insert *) XLogRecGetData(record); xl_heap_insert *xlrec = (xl_heap_insert *) XLogRecGetData(record);
Relation reln; Relation reln;
Buffer buffer; Buffer buffer;
Page page; Page page;
OffsetNumber offnum; OffsetNumber offnum;
struct
{
HeapTupleHeaderData hdr;
char data[MaxTupleSize];
} tbuf;
HeapTupleHeader htup;
xl_heap_header xlhdr;
uint32 newlen;
if (redo && (record->xl_info & XLR_BKP_BLOCK_1)) if (record->xl_info & XLR_BKP_BLOCK_1)
return; return;
reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->target.node); reln = XLogOpenRelation(xlrec->target.node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
buffer = XLogReadBuffer((redo) ? true : false, reln, buffer = XLogReadBuffer(true, reln,
ItemPointerGetBlockNumber(&(xlrec->target.tid))); ItemPointerGetBlockNumber(&(xlrec->target.tid)));
if (!BufferIsValid(buffer)) if (!BufferIsValid(buffer))
return; return;
page = (Page) BufferGetPage(buffer); page = (Page) BufferGetPage(buffer);
if (PageIsNew((PageHeader) page) && if (PageIsNew((PageHeader) page) &&
(!redo || !(record->xl_info & XLOG_HEAP_INIT_PAGE))) !(record->xl_info & XLOG_HEAP_INIT_PAGE))
elog(PANIC, "heap_insert_%sdo: uninitialized page", (redo) ? "re" : "un"); elog(PANIC, "heap_insert_redo: uninitialized page");
if (redo) if (record->xl_info & XLOG_HEAP_INIT_PAGE)
{ PageInit(page, BufferGetPageSize(buffer), 0);
struct
{
HeapTupleHeaderData hdr;
char data[MaxTupleSize];
} tbuf;
HeapTupleHeader htup;
xl_heap_header xlhdr;
uint32 newlen;
if (record->xl_info & XLOG_HEAP_INIT_PAGE)
PageInit(page, BufferGetPageSize(buffer), 0);
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
ReleaseBuffer(buffer);
return;
}
offnum = ItemPointerGetOffsetNumber(&(xlrec->target.tid));
if (PageGetMaxOffsetNumber(page) + 1 < offnum)
elog(PANIC, "heap_insert_redo: invalid max offset number");
newlen = record->xl_len - SizeOfHeapInsert - SizeOfHeapHeader;
Assert(newlen <= MaxTupleSize);
memcpy((char *) &xlhdr,
(char *) xlrec + SizeOfHeapInsert,
SizeOfHeapHeader);
htup = &tbuf.hdr;
MemSet((char *) htup, 0, sizeof(HeapTupleHeaderData));
/* PG73FORMAT: get bitmap [+ padding] [+ oid] + data */
memcpy((char *) htup + offsetof(HeapTupleHeaderData, t_bits),
(char *) xlrec + SizeOfHeapInsert + SizeOfHeapHeader,
newlen);
newlen += offsetof(HeapTupleHeaderData, t_bits);
htup->t_natts = xlhdr.t_natts;
htup->t_infomask = xlhdr.t_infomask;
htup->t_hoff = xlhdr.t_hoff;
HeapTupleHeaderSetXmin(htup, record->xl_xid);
HeapTupleHeaderSetCmin(htup, FirstCommandId);
htup->t_ctid = xlrec->target.tid;
offnum = PageAddItem(page, (Item) htup, newlen, offnum, if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
LP_USED | OverwritePageMode); {
if (offnum == InvalidOffsetNumber)
elog(PANIC, "heap_insert_redo: failed to add tuple");
PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK); LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer); ReleaseBuffer(buffer);
return; return;
} }
/* undo insert */ offnum = ItemPointerGetOffsetNumber(&(xlrec->target.tid));
if (XLByteLT(PageGetLSN(page), lsn)) /* changes are not applied if (PageGetMaxOffsetNumber(page) + 1 < offnum)
* ?! */ elog(PANIC, "heap_insert_redo: invalid max offset number");
elog(PANIC, "heap_insert_undo: bad page LSN");
newlen = record->xl_len - SizeOfHeapInsert - SizeOfHeapHeader;
elog(PANIC, "heap_insert_undo: unimplemented"); Assert(newlen <= MaxTupleSize);
memcpy((char *) &xlhdr,
(char *) xlrec + SizeOfHeapInsert,
SizeOfHeapHeader);
htup = &tbuf.hdr;
MemSet((char *) htup, 0, sizeof(HeapTupleHeaderData));
/* PG73FORMAT: get bitmap [+ padding] [+ oid] + data */
memcpy((char *) htup + offsetof(HeapTupleHeaderData, t_bits),
(char *) xlrec + SizeOfHeapInsert + SizeOfHeapHeader,
newlen);
newlen += offsetof(HeapTupleHeaderData, t_bits);
htup->t_natts = xlhdr.t_natts;
htup->t_infomask = xlhdr.t_infomask;
htup->t_hoff = xlhdr.t_hoff;
HeapTupleHeaderSetXmin(htup, record->xl_xid);
HeapTupleHeaderSetCmin(htup, FirstCommandId);
htup->t_ctid = xlrec->target.tid;
offnum = PageAddItem(page, (Item) htup, newlen, offnum,
LP_USED | OverwritePageMode);
if (offnum == InvalidOffsetNumber)
elog(PANIC, "heap_insert_redo: failed to add tuple");
PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer);
} }
/* /*
* Handles UPDATE & MOVE * Handles UPDATE & MOVE
*/ */
static void static void
heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move) heap_xlog_update(XLogRecPtr lsn, XLogRecord *record, bool move)
{ {
xl_heap_update *xlrec = (xl_heap_update *) XLogRecGetData(record); xl_heap_update *xlrec = (xl_heap_update *) XLogRecGetData(record);
Relation reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->target.node); Relation reln = XLogOpenRelation(xlrec->target.node);
Buffer buffer; Buffer buffer;
bool samepage = bool samepage =
(ItemPointerGetBlockNumber(&(xlrec->newtid)) == (ItemPointerGetBlockNumber(&(xlrec->newtid)) ==
...@@ -2716,11 +2692,19 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move) ...@@ -2716,11 +2692,19 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move)
OffsetNumber offnum; OffsetNumber offnum;
ItemId lp = NULL; ItemId lp = NULL;
HeapTupleHeader htup; HeapTupleHeader htup;
struct
{
HeapTupleHeaderData hdr;
char data[MaxTupleSize];
} tbuf;
xl_heap_header xlhdr;
int hsize;
uint32 newlen;
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
if (redo && (record->xl_info & XLR_BKP_BLOCK_1)) if (record->xl_info & XLR_BKP_BLOCK_1)
goto newt; goto newt;
/* Deal with old tuple version */ /* Deal with old tuple version */
...@@ -2728,81 +2712,68 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move) ...@@ -2728,81 +2712,68 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move)
buffer = XLogReadBuffer(false, reln, buffer = XLogReadBuffer(false, reln,
ItemPointerGetBlockNumber(&(xlrec->target.tid))); ItemPointerGetBlockNumber(&(xlrec->target.tid)));
if (!BufferIsValid(buffer)) if (!BufferIsValid(buffer))
elog(PANIC, "heap_update_%sdo: no block", (redo) ? "re" : "un"); elog(PANIC, "heap_update_redo: no block");
page = (Page) BufferGetPage(buffer); page = (Page) BufferGetPage(buffer);
if (PageIsNew((PageHeader) page)) if (PageIsNew((PageHeader) page))
elog(PANIC, "heap_update_%sdo: uninitialized old page", (redo) ? "re" : "un"); elog(PANIC, "heap_update_redo: uninitialized old page");
if (redo) if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{ {
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */ LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
{ ReleaseBuffer(buffer);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK); if (samepage)
ReleaseBuffer(buffer); return;
if (samepage) goto newt;
return;
goto newt;
}
} }
else if (XLByteLT(PageGetLSN(page), lsn)) /* changes are not applied
* ?! */
elog(PANIC, "heap_update_undo: bad old tuple page LSN");
offnum = ItemPointerGetOffsetNumber(&(xlrec->target.tid)); offnum = ItemPointerGetOffsetNumber(&(xlrec->target.tid));
if (PageGetMaxOffsetNumber(page) >= offnum) if (PageGetMaxOffsetNumber(page) >= offnum)
lp = PageGetItemId(page, offnum); lp = PageGetItemId(page, offnum);
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsUsed(lp)) if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsUsed(lp))
elog(PANIC, "heap_update_%sdo: invalid lp", (redo) ? "re" : "un"); elog(PANIC, "heap_update_redo: invalid lp");
htup = (HeapTupleHeader) PageGetItem(page, lp); htup = (HeapTupleHeader) PageGetItem(page, lp);
if (redo) if (move)
{ {
if (move) htup->t_infomask &= ~(HEAP_XMIN_COMMITTED |
{ HEAP_XMIN_INVALID |
htup->t_infomask &= ~(HEAP_XMIN_COMMITTED | HEAP_MOVED_IN);
HEAP_XMIN_INVALID | htup->t_infomask |= HEAP_MOVED_OFF;
HEAP_MOVED_IN); HeapTupleHeaderSetXvac(htup, record->xl_xid);
htup->t_infomask |= HEAP_MOVED_OFF; /* Make sure there is no forward chain link in t_ctid */
HeapTupleHeaderSetXvac(htup, record->xl_xid); htup->t_ctid = xlrec->target.tid;
/* Make sure there is no forward chain link in t_ctid */
htup->t_ctid = xlrec->target.tid;
}
else
{
htup->t_infomask &= ~(HEAP_XMAX_COMMITTED |
HEAP_XMAX_INVALID |
HEAP_XMAX_IS_MULTI |
HEAP_IS_LOCKED |
HEAP_MOVED);
HeapTupleHeaderSetXmax(htup, record->xl_xid);
HeapTupleHeaderSetCmax(htup, FirstCommandId);
/* Set forward chain link in t_ctid */
htup->t_ctid = xlrec->newtid;
}
if (samepage)
goto newsame;
PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer);
goto newt;
} }
else
elog(PANIC, "heap_update_undo: unimplemented"); {
htup->t_infomask &= ~(HEAP_XMAX_COMMITTED |
HEAP_XMAX_INVALID |
HEAP_XMAX_IS_MULTI |
HEAP_IS_LOCKED |
HEAP_MOVED);
HeapTupleHeaderSetXmax(htup, record->xl_xid);
HeapTupleHeaderSetCmax(htup, FirstCommandId);
/* Set forward chain link in t_ctid */
htup->t_ctid = xlrec->newtid;
}
if (samepage)
goto newsame;
PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer);
/* Deal with new tuple */ /* Deal with new tuple */
newt:; newt:;
if (redo && if ((record->xl_info & XLR_BKP_BLOCK_2) ||
((record->xl_info & XLR_BKP_BLOCK_2) || ((record->xl_info & XLR_BKP_BLOCK_1) && samepage))
((record->xl_info & XLR_BKP_BLOCK_1) && samepage)))
return; return;
buffer = XLogReadBuffer((redo) ? true : false, reln, buffer = XLogReadBuffer(true, reln,
ItemPointerGetBlockNumber(&(xlrec->newtid))); ItemPointerGetBlockNumber(&(xlrec->newtid)));
if (!BufferIsValid(buffer)) if (!BufferIsValid(buffer))
return; return;
...@@ -2811,94 +2782,74 @@ newt:; ...@@ -2811,94 +2782,74 @@ newt:;
newsame:; newsame:;
if (PageIsNew((PageHeader) page) && if (PageIsNew((PageHeader) page) &&
(!redo || !(record->xl_info & XLOG_HEAP_INIT_PAGE))) !(record->xl_info & XLOG_HEAP_INIT_PAGE))
elog(PANIC, "heap_update_%sdo: uninitialized page", (redo) ? "re" : "un"); elog(PANIC, "heap_update_redo: uninitialized page");
if (redo) if (record->xl_info & XLOG_HEAP_INIT_PAGE)
{ PageInit(page, BufferGetPageSize(buffer), 0);
struct
{
HeapTupleHeaderData hdr;
char data[MaxTupleSize];
} tbuf;
xl_heap_header xlhdr;
int hsize;
uint32 newlen;
if (record->xl_info & XLOG_HEAP_INIT_PAGE)
PageInit(page, BufferGetPageSize(buffer), 0);
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
ReleaseBuffer(buffer);
return;
}
offnum = ItemPointerGetOffsetNumber(&(xlrec->newtid));
if (PageGetMaxOffsetNumber(page) + 1 < offnum)
elog(PANIC, "heap_update_redo: invalid max offset number");
hsize = SizeOfHeapUpdate + SizeOfHeapHeader;
if (move)
hsize += (2 * sizeof(TransactionId));
newlen = record->xl_len - hsize;
Assert(newlen <= MaxTupleSize);
memcpy((char *) &xlhdr,
(char *) xlrec + SizeOfHeapUpdate,
SizeOfHeapHeader);
htup = &tbuf.hdr;
MemSet((char *) htup, 0, sizeof(HeapTupleHeaderData));
/* PG73FORMAT: get bitmap [+ padding] [+ oid] + data */
memcpy((char *) htup + offsetof(HeapTupleHeaderData, t_bits),
(char *) xlrec + hsize,
newlen);
newlen += offsetof(HeapTupleHeaderData, t_bits);
htup->t_natts = xlhdr.t_natts;
htup->t_infomask = xlhdr.t_infomask;
htup->t_hoff = xlhdr.t_hoff;
if (move)
{
TransactionId xid[2]; /* xmax, xmin */
memcpy((char *) xid,
(char *) xlrec + SizeOfHeapUpdate + SizeOfHeapHeader,
2 * sizeof(TransactionId));
HeapTupleHeaderSetXmin(htup, xid[1]);
HeapTupleHeaderSetXmax(htup, xid[0]);
HeapTupleHeaderSetXvac(htup, record->xl_xid);
}
else
{
HeapTupleHeaderSetXmin(htup, record->xl_xid);
HeapTupleHeaderSetCmin(htup, FirstCommandId);
}
/* Make sure there is no forward chain link in t_ctid */
htup->t_ctid = xlrec->newtid;
offnum = PageAddItem(page, (Item) htup, newlen, offnum, if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
LP_USED | OverwritePageMode); {
if (offnum == InvalidOffsetNumber)
elog(PANIC, "heap_update_redo: failed to add tuple");
PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK); LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer); ReleaseBuffer(buffer);
return; return;
} }
/* undo */ offnum = ItemPointerGetOffsetNumber(&(xlrec->newtid));
if (XLByteLT(PageGetLSN(page), lsn)) /* changes not applied?! */ if (PageGetMaxOffsetNumber(page) + 1 < offnum)
elog(PANIC, "heap_update_undo: bad new tuple page LSN"); elog(PANIC, "heap_update_redo: invalid max offset number");
elog(PANIC, "heap_update_undo: unimplemented"); hsize = SizeOfHeapUpdate + SizeOfHeapHeader;
if (move)
hsize += (2 * sizeof(TransactionId));
newlen = record->xl_len - hsize;
Assert(newlen <= MaxTupleSize);
memcpy((char *) &xlhdr,
(char *) xlrec + SizeOfHeapUpdate,
SizeOfHeapHeader);
htup = &tbuf.hdr;
MemSet((char *) htup, 0, sizeof(HeapTupleHeaderData));
/* PG73FORMAT: get bitmap [+ padding] [+ oid] + data */
memcpy((char *) htup + offsetof(HeapTupleHeaderData, t_bits),
(char *) xlrec + hsize,
newlen);
newlen += offsetof(HeapTupleHeaderData, t_bits);
htup->t_natts = xlhdr.t_natts;
htup->t_infomask = xlhdr.t_infomask;
htup->t_hoff = xlhdr.t_hoff;
if (move)
{
TransactionId xid[2]; /* xmax, xmin */
memcpy((char *) xid,
(char *) xlrec + SizeOfHeapUpdate + SizeOfHeapHeader,
2 * sizeof(TransactionId));
HeapTupleHeaderSetXmin(htup, xid[1]);
HeapTupleHeaderSetXmax(htup, xid[0]);
HeapTupleHeaderSetXvac(htup, record->xl_xid);
}
else
{
HeapTupleHeaderSetXmin(htup, record->xl_xid);
HeapTupleHeaderSetCmin(htup, FirstCommandId);
}
/* Make sure there is no forward chain link in t_ctid */
htup->t_ctid = xlrec->newtid;
offnum = PageAddItem(page, (Item) htup, newlen, offnum,
LP_USED | OverwritePageMode);
if (offnum == InvalidOffsetNumber)
elog(PANIC, "heap_update_redo: failed to add tuple");
PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer);
} }
static void static void
heap_xlog_lock(bool redo, XLogRecPtr lsn, XLogRecord *record) heap_xlog_lock(XLogRecPtr lsn, XLogRecord *record)
{ {
xl_heap_lock *xlrec = (xl_heap_lock *) XLogRecGetData(record); xl_heap_lock *xlrec = (xl_heap_lock *) XLogRecGetData(record);
Relation reln; Relation reln;
...@@ -2908,10 +2859,10 @@ heap_xlog_lock(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -2908,10 +2859,10 @@ heap_xlog_lock(bool redo, XLogRecPtr lsn, XLogRecord *record)
ItemId lp = NULL; ItemId lp = NULL;
HeapTupleHeader htup; HeapTupleHeader htup;
if (redo && (record->xl_info & XLR_BKP_BLOCK_1)) if (record->xl_info & XLR_BKP_BLOCK_1)
return; return;
reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->target.node); reln = XLogOpenRelation(xlrec->target.node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
...@@ -2919,58 +2870,46 @@ heap_xlog_lock(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -2919,58 +2870,46 @@ heap_xlog_lock(bool redo, XLogRecPtr lsn, XLogRecord *record)
buffer = XLogReadBuffer(false, reln, buffer = XLogReadBuffer(false, reln,
ItemPointerGetBlockNumber(&(xlrec->target.tid))); ItemPointerGetBlockNumber(&(xlrec->target.tid)));
if (!BufferIsValid(buffer)) if (!BufferIsValid(buffer))
elog(PANIC, "heap_lock_%sdo: no block", (redo) ? "re" : "un"); elog(PANIC, "heap_lock_redo: no block");
page = (Page) BufferGetPage(buffer); page = (Page) BufferGetPage(buffer);
if (PageIsNew((PageHeader) page)) if (PageIsNew((PageHeader) page))
elog(PANIC, "heap_lock_%sdo: uninitialized page", (redo) ? "re" : "un"); elog(PANIC, "heap_lock_redo: uninitialized page");
if (redo) if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{ {
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */ LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
{ ReleaseBuffer(buffer);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK); return;
ReleaseBuffer(buffer);
return;
}
} }
else if (XLByteLT(PageGetLSN(page), lsn)) /* changes are not applied
* ?! */
elog(PANIC, "heap_lock_undo: bad page LSN");
offnum = ItemPointerGetOffsetNumber(&(xlrec->target.tid)); offnum = ItemPointerGetOffsetNumber(&(xlrec->target.tid));
if (PageGetMaxOffsetNumber(page) >= offnum) if (PageGetMaxOffsetNumber(page) >= offnum)
lp = PageGetItemId(page, offnum); lp = PageGetItemId(page, offnum);
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsUsed(lp)) if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsUsed(lp))
elog(PANIC, "heap_lock_%sdo: invalid lp", (redo) ? "re" : "un"); elog(PANIC, "heap_lock_redo: invalid lp");
htup = (HeapTupleHeader) PageGetItem(page, lp); htup = (HeapTupleHeader) PageGetItem(page, lp);
if (redo) /*
{ * Presently, we don't bother to restore the locked state, but
/* * just set the XMAX_INVALID bit.
* Presently, we don't bother to restore the locked state, but */
* just set the XMAX_INVALID bit. htup->t_infomask &= ~(HEAP_XMAX_COMMITTED |
*/ HEAP_XMAX_INVALID |
htup->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_IS_MULTI |
HEAP_XMAX_INVALID | HEAP_IS_LOCKED |
HEAP_XMAX_IS_MULTI | HEAP_MOVED);
HEAP_IS_LOCKED | htup->t_infomask |= HEAP_XMAX_INVALID;
HEAP_MOVED); HeapTupleHeaderSetXmax(htup, record->xl_xid);
htup->t_infomask |= HEAP_XMAX_INVALID; HeapTupleHeaderSetCmax(htup, FirstCommandId);
HeapTupleHeaderSetXmax(htup, record->xl_xid); /* Make sure there is no forward chain link in t_ctid */
HeapTupleHeaderSetCmax(htup, FirstCommandId); htup->t_ctid = xlrec->target.tid;
/* Make sure there is no forward chain link in t_ctid */ PageSetLSN(page, lsn);
htup->t_ctid = xlrec->target.tid; PageSetTLI(page, ThisTimeLineID);
PageSetLSN(page, lsn); LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
PageSetTLI(page, ThisTimeLineID); WriteBuffer(buffer);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer);
return;
}
elog(PANIC, "heap_lock_undo: unimplemented");
} }
void void
...@@ -2980,47 +2919,23 @@ heap_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -2980,47 +2919,23 @@ heap_redo(XLogRecPtr lsn, XLogRecord *record)
info &= XLOG_HEAP_OPMASK; info &= XLOG_HEAP_OPMASK;
if (info == XLOG_HEAP_INSERT) if (info == XLOG_HEAP_INSERT)
heap_xlog_insert(true, lsn, record); heap_xlog_insert(lsn, record);
else if (info == XLOG_HEAP_DELETE) else if (info == XLOG_HEAP_DELETE)
heap_xlog_delete(true, lsn, record); heap_xlog_delete(lsn, record);
else if (info == XLOG_HEAP_UPDATE) else if (info == XLOG_HEAP_UPDATE)
heap_xlog_update(true, lsn, record, false); heap_xlog_update(lsn, record, false);
else if (info == XLOG_HEAP_MOVE) else if (info == XLOG_HEAP_MOVE)
heap_xlog_update(true, lsn, record, true); heap_xlog_update(lsn, record, true);
else if (info == XLOG_HEAP_CLEAN) else if (info == XLOG_HEAP_CLEAN)
heap_xlog_clean(true, lsn, record); heap_xlog_clean(lsn, record);
else if (info == XLOG_HEAP_NEWPAGE) else if (info == XLOG_HEAP_NEWPAGE)
heap_xlog_newpage(true, lsn, record); heap_xlog_newpage(lsn, record);
else if (info == XLOG_HEAP_LOCK) else if (info == XLOG_HEAP_LOCK)
heap_xlog_lock(true, lsn, record); heap_xlog_lock(lsn, record);
else else
elog(PANIC, "heap_redo: unknown op code %u", info); elog(PANIC, "heap_redo: unknown op code %u", info);
} }
void
heap_undo(XLogRecPtr lsn, XLogRecord *record)
{
uint8 info = record->xl_info & ~XLR_INFO_MASK;
info &= XLOG_HEAP_OPMASK;
if (info == XLOG_HEAP_INSERT)
heap_xlog_insert(false, lsn, record);
else if (info == XLOG_HEAP_DELETE)
heap_xlog_delete(false, lsn, record);
else if (info == XLOG_HEAP_UPDATE)
heap_xlog_update(false, lsn, record, false);
else if (info == XLOG_HEAP_MOVE)
heap_xlog_update(false, lsn, record, true);
else if (info == XLOG_HEAP_CLEAN)
heap_xlog_clean(false, lsn, record);
else if (info == XLOG_HEAP_NEWPAGE)
heap_xlog_newpage(false, lsn, record);
else if (info == XLOG_HEAP_LOCK)
heap_xlog_lock(false, lsn, record);
else
elog(PANIC, "heap_undo: unknown op code %u", info);
}
static void static void
out_target(char *buf, xl_heaptid *target) out_target(char *buf, xl_heaptid *target)
{ {
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.21 2005/06/02 05:55:28 tgl Exp $ * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.22 2005/06/06 17:01:22 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -149,7 +149,7 @@ _bt_restore_meta(Relation reln, XLogRecPtr lsn, ...@@ -149,7 +149,7 @@ _bt_restore_meta(Relation reln, XLogRecPtr lsn,
} }
static void static void
btree_xlog_insert(bool redo, bool isleaf, bool ismeta, btree_xlog_insert(bool isleaf, bool ismeta,
XLogRecPtr lsn, XLogRecord *record) XLogRecPtr lsn, XLogRecord *record)
{ {
xl_btree_insert *xlrec = (xl_btree_insert *) XLogRecGetData(record); xl_btree_insert *xlrec = (xl_btree_insert *) XLogRecGetData(record);
...@@ -170,70 +170,51 @@ btree_xlog_insert(bool redo, bool isleaf, bool ismeta, ...@@ -170,70 +170,51 @@ btree_xlog_insert(bool redo, bool isleaf, bool ismeta,
datalen -= sizeof(xl_btree_metadata); datalen -= sizeof(xl_btree_metadata);
} }
if (redo && (record->xl_info & XLR_BKP_BLOCK_1) && !ismeta && if ((record->xl_info & XLR_BKP_BLOCK_1) && !ismeta &&
incomplete_splits == NIL) incomplete_splits == NIL)
return; /* nothing to do */ return; /* nothing to do */
reln = XLogOpenRelation(redo, RM_BTREE_ID, xlrec->target.node); reln = XLogOpenRelation(xlrec->target.node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
if (!redo || !(record->xl_info & XLR_BKP_BLOCK_1)) if (!(record->xl_info & XLR_BKP_BLOCK_1))
{ {
buffer = XLogReadBuffer(false, reln, buffer = XLogReadBuffer(false, reln,
ItemPointerGetBlockNumber(&(xlrec->target.tid))); ItemPointerGetBlockNumber(&(xlrec->target.tid)));
if (!BufferIsValid(buffer)) if (!BufferIsValid(buffer))
elog(PANIC, "btree_insert_%sdo: block unfound", (redo) ? "re" : "un"); elog(PANIC, "btree_insert_redo: block unfound");
page = (Page) BufferGetPage(buffer); page = (Page) BufferGetPage(buffer);
if (PageIsNew((PageHeader) page)) if (PageIsNew((PageHeader) page))
elog(PANIC, "btree_insert_%sdo: uninitialized page", (redo) ? "re" : "un"); elog(PANIC, "btree_insert_redo: uninitialized page");
pageop = (BTPageOpaque) PageGetSpecialPointer(page); pageop = (BTPageOpaque) PageGetSpecialPointer(page);
if (redo) if (XLByteLE(lsn, PageGetLSN(page)))
{ {
if (XLByteLE(lsn, PageGetLSN(page))) LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
{ ReleaseBuffer(buffer);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
ReleaseBuffer(buffer);
}
else
{
if (PageAddItem(page, (Item) datapos, datalen,
ItemPointerGetOffsetNumber(&(xlrec->target.tid)),
LP_USED) == InvalidOffsetNumber)
elog(PANIC, "btree_insert_redo: failed to add item");
PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer);
}
} }
else else
{ {
if (XLByteLT(PageGetLSN(page), lsn)) if (PageAddItem(page, (Item) datapos, datalen,
elog(PANIC, "btree_insert_undo: bad page LSN"); ItemPointerGetOffsetNumber(&(xlrec->target.tid)),
LP_USED) == InvalidOffsetNumber)
elog(PANIC, "btree_insert_redo: failed to add item");
if (!P_ISLEAF(pageop)) PageSetLSN(page, lsn);
{ PageSetTLI(page, ThisTimeLineID);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK); LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
ReleaseBuffer(buffer); WriteBuffer(buffer);
}
else
elog(PANIC, "btree_insert_undo: unimplemented");
} }
} }
if (redo) /* metapage changes not undoable */ if (ismeta)
{ _bt_restore_meta(reln, lsn,
if (ismeta) md.root, md.level,
_bt_restore_meta(reln, lsn, md.fastroot, md.fastlevel);
md.root, md.level,
md.fastroot, md.fastlevel);
}
/* Forget any split this insertion completes */ /* Forget any split this insertion completes */
if (redo && !isleaf && incomplete_splits != NIL) if (!isleaf && incomplete_splits != NIL)
{ {
forget_matching_split(reln, xlrec->target.node, forget_matching_split(reln, xlrec->target.node,
ItemPointerGetBlockNumber(&(xlrec->target.tid)), ItemPointerGetBlockNumber(&(xlrec->target.tid)),
...@@ -243,7 +224,7 @@ btree_xlog_insert(bool redo, bool isleaf, bool ismeta, ...@@ -243,7 +224,7 @@ btree_xlog_insert(bool redo, bool isleaf, bool ismeta,
} }
static void static void
btree_xlog_split(bool redo, bool onleft, bool isroot, btree_xlog_split(bool onleft, bool isroot,
XLogRecPtr lsn, XLogRecord *record) XLogRecPtr lsn, XLogRecord *record)
{ {
xl_btree_split *xlrec = (xl_btree_split *) XLogRecGetData(record); xl_btree_split *xlrec = (xl_btree_split *) XLogRecGetData(record);
...@@ -254,9 +235,8 @@ btree_xlog_split(bool redo, bool onleft, bool isroot, ...@@ -254,9 +235,8 @@ btree_xlog_split(bool redo, bool onleft, bool isroot,
Buffer buffer; Buffer buffer;
Page page; Page page;
BTPageOpaque pageop; BTPageOpaque pageop;
char *op = (redo) ? "redo" : "undo";
reln = XLogOpenRelation(redo, RM_BTREE_ID, xlrec->target.node); reln = XLogOpenRelation(xlrec->target.node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
...@@ -267,77 +247,51 @@ btree_xlog_split(bool redo, bool onleft, bool isroot, ...@@ -267,77 +247,51 @@ btree_xlog_split(bool redo, bool onleft, bool isroot,
/* Left (original) sibling */ /* Left (original) sibling */
buffer = XLogReadBuffer(false, reln, leftsib); buffer = XLogReadBuffer(false, reln, leftsib);
if (!BufferIsValid(buffer)) if (!BufferIsValid(buffer))
elog(PANIC, "btree_split_%s: lost left sibling", op); elog(PANIC, "btree_split_redo: lost left sibling");
page = (Page) BufferGetPage(buffer); page = (Page) BufferGetPage(buffer);
if (redo) _bt_pageinit(page, BufferGetPageSize(buffer));
_bt_pageinit(page, BufferGetPageSize(buffer));
else if (PageIsNew((PageHeader) page))
elog(PANIC, "btree_split_undo: uninitialized left sibling");
pageop = (BTPageOpaque) PageGetSpecialPointer(page); pageop = (BTPageOpaque) PageGetSpecialPointer(page);
if (redo) pageop->btpo_prev = xlrec->leftblk;
{ pageop->btpo_next = rightsib;
pageop->btpo_prev = xlrec->leftblk; pageop->btpo.level = xlrec->level;
pageop->btpo_next = rightsib; pageop->btpo_flags = (xlrec->level == 0) ? BTP_LEAF : 0;
pageop->btpo.level = xlrec->level;
pageop->btpo_flags = (xlrec->level == 0) ? BTP_LEAF : 0;
_bt_restore_page(page, _bt_restore_page(page,
(char *) xlrec + SizeOfBtreeSplit, (char *) xlrec + SizeOfBtreeSplit,
xlrec->leftlen); xlrec->leftlen);
PageSetLSN(page, lsn); PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID); PageSetTLI(page, ThisTimeLineID);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK); LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer); WriteBuffer(buffer);
}
else
{
/* undo */
if (XLByteLT(PageGetLSN(page), lsn))
elog(PANIC, "btree_split_undo: bad left sibling LSN");
elog(PANIC, "btree_split_undo: unimplemented");
}
/* Right (new) sibling */ /* Right (new) sibling */
buffer = XLogReadBuffer((redo) ? true : false, reln, rightsib); buffer = XLogReadBuffer(true, reln, rightsib);
if (!BufferIsValid(buffer)) if (!BufferIsValid(buffer))
elog(PANIC, "btree_split_%s: lost right sibling", op); elog(PANIC, "btree_split_redo: lost right sibling");
page = (Page) BufferGetPage(buffer); page = (Page) BufferGetPage(buffer);
if (redo) _bt_pageinit(page, BufferGetPageSize(buffer));
_bt_pageinit(page, BufferGetPageSize(buffer));
else if (PageIsNew((PageHeader) page))
elog(PANIC, "btree_split_undo: uninitialized right sibling");
pageop = (BTPageOpaque) PageGetSpecialPointer(page); pageop = (BTPageOpaque) PageGetSpecialPointer(page);
if (redo) pageop->btpo_prev = leftsib;
{ pageop->btpo_next = xlrec->rightblk;
pageop->btpo_prev = leftsib; pageop->btpo.level = xlrec->level;
pageop->btpo_next = xlrec->rightblk; pageop->btpo_flags = (xlrec->level == 0) ? BTP_LEAF : 0;
pageop->btpo.level = xlrec->level;
pageop->btpo_flags = (xlrec->level == 0) ? BTP_LEAF : 0;
_bt_restore_page(page, _bt_restore_page(page,
(char *) xlrec + SizeOfBtreeSplit + xlrec->leftlen, (char *) xlrec + SizeOfBtreeSplit + xlrec->leftlen,
record->xl_len - SizeOfBtreeSplit - xlrec->leftlen); record->xl_len - SizeOfBtreeSplit - xlrec->leftlen);
PageSetLSN(page, lsn); PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID); PageSetTLI(page, ThisTimeLineID);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK); LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer); WriteBuffer(buffer);
}
else
{
/* undo */
if (XLByteLT(PageGetLSN(page), lsn))
elog(PANIC, "btree_split_undo: bad right sibling LSN");
elog(PANIC, "btree_split_undo: unimplemented");
}
/* Fix left-link of right (next) page */ /* Fix left-link of right (next) page */
if (redo && !(record->xl_info & XLR_BKP_BLOCK_1)) if (!(record->xl_info & XLR_BKP_BLOCK_1))
{ {
if (xlrec->rightblk != P_NONE) if (xlrec->rightblk != P_NONE)
{ {
...@@ -368,7 +322,7 @@ btree_xlog_split(bool redo, bool onleft, bool isroot, ...@@ -368,7 +322,7 @@ btree_xlog_split(bool redo, bool onleft, bool isroot,
} }
/* Forget any split this insertion completes */ /* Forget any split this insertion completes */
if (redo && xlrec->level > 0 && incomplete_splits != NIL) if (xlrec->level > 0 && incomplete_splits != NIL)
{ {
forget_matching_split(reln, xlrec->target.node, forget_matching_split(reln, xlrec->target.node,
ItemPointerGetBlockNumber(&(xlrec->target.tid)), ItemPointerGetBlockNumber(&(xlrec->target.tid)),
...@@ -382,18 +336,18 @@ btree_xlog_split(bool redo, bool onleft, bool isroot, ...@@ -382,18 +336,18 @@ btree_xlog_split(bool redo, bool onleft, bool isroot,
} }
static void static void
btree_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record) btree_xlog_delete(XLogRecPtr lsn, XLogRecord *record)
{ {
xl_btree_delete *xlrec; xl_btree_delete *xlrec;
Relation reln; Relation reln;
Buffer buffer; Buffer buffer;
Page page; Page page;
if (!redo || (record->xl_info & XLR_BKP_BLOCK_1)) if (record->xl_info & XLR_BKP_BLOCK_1)
return; return;
xlrec = (xl_btree_delete *) XLogRecGetData(record); xlrec = (xl_btree_delete *) XLogRecGetData(record);
reln = XLogOpenRelation(redo, RM_BTREE_ID, xlrec->node); reln = XLogOpenRelation(xlrec->node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
buffer = XLogReadBuffer(false, reln, xlrec->block); buffer = XLogReadBuffer(false, reln, xlrec->block);
...@@ -428,7 +382,7 @@ btree_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -428,7 +382,7 @@ btree_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
} }
static void static void
btree_xlog_delete_page(bool redo, bool ismeta, btree_xlog_delete_page(bool ismeta,
XLogRecPtr lsn, XLogRecord *record) XLogRecPtr lsn, XLogRecord *record)
{ {
xl_btree_delete_page *xlrec = (xl_btree_delete_page *) XLogRecGetData(record); xl_btree_delete_page *xlrec = (xl_btree_delete_page *) XLogRecGetData(record);
...@@ -440,9 +394,8 @@ btree_xlog_delete_page(bool redo, bool ismeta, ...@@ -440,9 +394,8 @@ btree_xlog_delete_page(bool redo, bool ismeta,
Buffer buffer; Buffer buffer;
Page page; Page page;
BTPageOpaque pageop; BTPageOpaque pageop;
char *op = (redo) ? "redo" : "undo";
reln = XLogOpenRelation(redo, RM_BTREE_ID, xlrec->target.node); reln = XLogOpenRelation(xlrec->target.node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
...@@ -452,7 +405,7 @@ btree_xlog_delete_page(bool redo, bool ismeta, ...@@ -452,7 +405,7 @@ btree_xlog_delete_page(bool redo, bool ismeta,
rightsib = xlrec->rightblk; rightsib = xlrec->rightblk;
/* parent page */ /* parent page */
if (redo && !(record->xl_info & XLR_BKP_BLOCK_1)) if (!(record->xl_info & XLR_BKP_BLOCK_1))
{ {
buffer = XLogReadBuffer(false, reln, parent); buffer = XLogReadBuffer(false, reln, parent);
if (!BufferIsValid(buffer)) if (!BufferIsValid(buffer))
...@@ -498,7 +451,7 @@ btree_xlog_delete_page(bool redo, bool ismeta, ...@@ -498,7 +451,7 @@ btree_xlog_delete_page(bool redo, bool ismeta,
} }
/* Fix left-link of right sibling */ /* Fix left-link of right sibling */
if (redo && !(record->xl_info & XLR_BKP_BLOCK_2)) if (!(record->xl_info & XLR_BKP_BLOCK_2))
{ {
buffer = XLogReadBuffer(false, reln, rightsib); buffer = XLogReadBuffer(false, reln, rightsib);
if (!BufferIsValid(buffer)) if (!BufferIsValid(buffer))
...@@ -524,7 +477,7 @@ btree_xlog_delete_page(bool redo, bool ismeta, ...@@ -524,7 +477,7 @@ btree_xlog_delete_page(bool redo, bool ismeta,
} }
/* Fix right-link of left sibling, if any */ /* Fix right-link of left sibling, if any */
if (redo && !(record->xl_info & XLR_BKP_BLOCK_3)) if (!(record->xl_info & XLR_BKP_BLOCK_3))
{ {
if (leftsib != P_NONE) if (leftsib != P_NONE)
{ {
...@@ -555,52 +508,36 @@ btree_xlog_delete_page(bool redo, bool ismeta, ...@@ -555,52 +508,36 @@ btree_xlog_delete_page(bool redo, bool ismeta,
/* Rewrite target page as empty deleted page */ /* Rewrite target page as empty deleted page */
buffer = XLogReadBuffer(false, reln, target); buffer = XLogReadBuffer(false, reln, target);
if (!BufferIsValid(buffer)) if (!BufferIsValid(buffer))
elog(PANIC, "btree_delete_page_%s: lost target page", op); elog(PANIC, "btree_delete_page_redo: lost target page");
page = (Page) BufferGetPage(buffer); page = (Page) BufferGetPage(buffer);
if (redo) _bt_pageinit(page, BufferGetPageSize(buffer));
_bt_pageinit(page, BufferGetPageSize(buffer));
else if (PageIsNew((PageHeader) page))
elog(PANIC, "btree_delete_page_undo: uninitialized target page");
pageop = (BTPageOpaque) PageGetSpecialPointer(page); pageop = (BTPageOpaque) PageGetSpecialPointer(page);
if (redo) pageop->btpo_prev = leftsib;
{ pageop->btpo_next = rightsib;
pageop->btpo_prev = leftsib; pageop->btpo.xact = FrozenTransactionId;
pageop->btpo_next = rightsib; pageop->btpo_flags = BTP_DELETED;
pageop->btpo.xact = FrozenTransactionId;
pageop->btpo_flags = BTP_DELETED;
PageSetLSN(page, lsn); PageSetLSN(page, lsn);
PageSetTLI(page, ThisTimeLineID); PageSetTLI(page, ThisTimeLineID);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK); LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer); WriteBuffer(buffer);
}
else
{
/* undo */
if (XLByteLT(PageGetLSN(page), lsn))
elog(PANIC, "btree_delete_page_undo: bad left sibling LSN");
elog(PANIC, "btree_delete_page_undo: unimplemented");
}
/* Update metapage if needed */ /* Update metapage if needed */
if (redo) /* metapage changes not undoable */ if (ismeta)
{ {
if (ismeta) xl_btree_metadata md;
{
xl_btree_metadata md;
memcpy(&md, (char *) xlrec + SizeOfBtreeDeletePage, memcpy(&md, (char *) xlrec + SizeOfBtreeDeletePage,
sizeof(xl_btree_metadata)); sizeof(xl_btree_metadata));
_bt_restore_meta(reln, lsn, _bt_restore_meta(reln, lsn,
md.root, md.level, md.root, md.level,
md.fastroot, md.fastlevel); md.fastroot, md.fastlevel);
}
} }
} }
static void static void
btree_xlog_newroot(bool redo, XLogRecPtr lsn, XLogRecord *record) btree_xlog_newroot(XLogRecPtr lsn, XLogRecord *record)
{ {
xl_btree_newroot *xlrec = (xl_btree_newroot *) XLogRecGetData(record); xl_btree_newroot *xlrec = (xl_btree_newroot *) XLogRecGetData(record);
Relation reln; Relation reln;
...@@ -608,10 +545,7 @@ btree_xlog_newroot(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -608,10 +545,7 @@ btree_xlog_newroot(bool redo, XLogRecPtr lsn, XLogRecord *record)
Page page; Page page;
BTPageOpaque pageop; BTPageOpaque pageop;
if (!redo) reln = XLogOpenRelation(xlrec->node);
return; /* not undoable */
reln = XLogOpenRelation(redo, RM_BTREE_ID, xlrec->node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
buffer = XLogReadBuffer(true, reln, xlrec->rootblk); buffer = XLogReadBuffer(true, reln, xlrec->rootblk);
...@@ -654,15 +588,12 @@ btree_xlog_newroot(bool redo, XLogRecPtr lsn, XLogRecord *record) ...@@ -654,15 +588,12 @@ btree_xlog_newroot(bool redo, XLogRecPtr lsn, XLogRecord *record)
} }
static void static void
btree_xlog_newmeta(bool redo, XLogRecPtr lsn, XLogRecord *record) btree_xlog_newmeta(XLogRecPtr lsn, XLogRecord *record)
{ {
xl_btree_newmeta *xlrec = (xl_btree_newmeta *) XLogRecGetData(record); xl_btree_newmeta *xlrec = (xl_btree_newmeta *) XLogRecGetData(record);
Relation reln; Relation reln;
if (!redo) reln = XLogOpenRelation(xlrec->node);
return; /* not undoable */
reln = XLogOpenRelation(redo, RM_BTREE_ID, xlrec->node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
...@@ -680,94 +611,46 @@ btree_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -680,94 +611,46 @@ btree_redo(XLogRecPtr lsn, XLogRecord *record)
switch (info) switch (info)
{ {
case XLOG_BTREE_INSERT_LEAF: case XLOG_BTREE_INSERT_LEAF:
btree_xlog_insert(true, true, false, lsn, record); btree_xlog_insert(true, false, lsn, record);
break; break;
case XLOG_BTREE_INSERT_UPPER: case XLOG_BTREE_INSERT_UPPER:
btree_xlog_insert(true, false, false, lsn, record); btree_xlog_insert(false, false, lsn, record);
break; break;
case XLOG_BTREE_INSERT_META: case XLOG_BTREE_INSERT_META:
btree_xlog_insert(true, false, true, lsn, record); btree_xlog_insert(false, true, lsn, record);
break; break;
case XLOG_BTREE_SPLIT_L: case XLOG_BTREE_SPLIT_L:
btree_xlog_split(true, true, false, lsn, record); btree_xlog_split(true, false, lsn, record);
break; break;
case XLOG_BTREE_SPLIT_R: case XLOG_BTREE_SPLIT_R:
btree_xlog_split(true, false, false, lsn, record); btree_xlog_split(false, false, lsn, record);
break; break;
case XLOG_BTREE_SPLIT_L_ROOT: case XLOG_BTREE_SPLIT_L_ROOT:
btree_xlog_split(true, true, true, lsn, record); btree_xlog_split(true, true, lsn, record);
break; break;
case XLOG_BTREE_SPLIT_R_ROOT: case XLOG_BTREE_SPLIT_R_ROOT:
btree_xlog_split(true, false, true, lsn, record); btree_xlog_split(false, true, lsn, record);
break; break;
case XLOG_BTREE_DELETE: case XLOG_BTREE_DELETE:
btree_xlog_delete(true, lsn, record); btree_xlog_delete(lsn, record);
break; break;
case XLOG_BTREE_DELETE_PAGE: case XLOG_BTREE_DELETE_PAGE:
btree_xlog_delete_page(true, false, lsn, record); btree_xlog_delete_page(false, lsn, record);
break; break;
case XLOG_BTREE_DELETE_PAGE_META: case XLOG_BTREE_DELETE_PAGE_META:
btree_xlog_delete_page(true, true, lsn, record); btree_xlog_delete_page(true, lsn, record);
break; break;
case XLOG_BTREE_NEWROOT: case XLOG_BTREE_NEWROOT:
btree_xlog_newroot(true, lsn, record); btree_xlog_newroot(lsn, record);
break; break;
case XLOG_BTREE_NEWMETA: case XLOG_BTREE_NEWMETA:
btree_xlog_newmeta(true, lsn, record); btree_xlog_newmeta(lsn, record);
break; break;
default: default:
elog(PANIC, "btree_redo: unknown op code %u", info); elog(PANIC, "btree_redo: unknown op code %u", info);
} }
} }
void
btree_undo(XLogRecPtr lsn, XLogRecord *record)
{
uint8 info = record->xl_info & ~XLR_INFO_MASK;
switch (info)
{
case XLOG_BTREE_INSERT_LEAF:
btree_xlog_insert(false, true, false, lsn, record);
break;
case XLOG_BTREE_INSERT_UPPER:
btree_xlog_insert(false, false, false, lsn, record);
break;
case XLOG_BTREE_INSERT_META:
btree_xlog_insert(false, false, true, lsn, record);
break;
case XLOG_BTREE_SPLIT_L:
btree_xlog_split(false, true, false, lsn, record);
break;
case XLOG_BTREE_SPLIT_R:
btree_xlog_split(false, false, false, lsn, record);
break;
case XLOG_BTREE_SPLIT_L_ROOT:
btree_xlog_split(false, true, true, lsn, record);
break;
case XLOG_BTREE_SPLIT_R_ROOT:
btree_xlog_split(false, false, true, lsn, record);
break;
case XLOG_BTREE_DELETE:
btree_xlog_delete(false, lsn, record);
break;
case XLOG_BTREE_DELETE_PAGE:
btree_xlog_delete_page(false, false, lsn, record);
break;
case XLOG_BTREE_DELETE_PAGE_META:
btree_xlog_delete_page(false, true, lsn, record);
break;
case XLOG_BTREE_NEWROOT:
btree_xlog_newroot(false, lsn, record);
break;
case XLOG_BTREE_NEWMETA:
btree_xlog_newmeta(false, lsn, record);
break;
default:
elog(PANIC, "btree_undo: unknown op code %u", info);
}
}
static void static void
out_target(char *buf, xl_btreetid *target) out_target(char *buf, xl_btreetid *target)
{ {
...@@ -918,7 +801,7 @@ btree_xlog_cleanup(void) ...@@ -918,7 +801,7 @@ btree_xlog_cleanup(void)
rpageop; rpageop;
bool is_only; bool is_only;
reln = XLogOpenRelation(true, RM_BTREE_ID, split->node); reln = XLogOpenRelation(split->node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
continue; continue;
lbuf = XLogReadBuffer(false, reln, split->leftblk); lbuf = XLogReadBuffer(false, reln, split->leftblk);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/rtree/rtree.c,v 1.89 2005/05/11 06:24:54 neilc Exp $ * $PostgreSQL: pgsql/src/backend/access/rtree/rtree.c,v 1.90 2005/06/06 17:01:22 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1303,12 +1303,6 @@ rtree_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -1303,12 +1303,6 @@ rtree_redo(XLogRecPtr lsn, XLogRecord *record)
elog(PANIC, "rtree_redo: unimplemented"); elog(PANIC, "rtree_redo: unimplemented");
} }
void
rtree_undo(XLogRecPtr lsn, XLogRecord *record)
{
elog(PANIC, "rtree_undo: unimplemented");
}
void void
rtree_desc(char *buf, uint8 xl_info, char *rec) rtree_desc(char *buf, uint8 xl_info, char *rec)
{ {
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/backend/access/transam/clog.c,v 1.28 2004/12/31 21:59:29 pgsql Exp $ * $PostgreSQL: pgsql/src/backend/access/transam/clog.c,v 1.29 2005/06/06 17:01:22 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -411,11 +411,6 @@ clog_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -411,11 +411,6 @@ clog_redo(XLogRecPtr lsn, XLogRecord *record)
} }
} }
void
clog_undo(XLogRecPtr lsn, XLogRecord *record)
{
}
void void
clog_desc(char *buf, uint8 xl_info, char *rec) clog_desc(char *buf, uint8 xl_info, char *rec)
{ {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Resource managers definition * Resource managers definition
* *
* $PostgreSQL: pgsql/src/backend/access/transam/rmgr.c,v 1.17 2005/05/17 03:34:18 neilc Exp $ * $PostgreSQL: pgsql/src/backend/access/transam/rmgr.c,v 1.18 2005/06/06 17:01:22 tgl Exp $
*/ */
#include "postgres.h" #include "postgres.h"
...@@ -22,21 +22,20 @@ ...@@ -22,21 +22,20 @@
const RmgrData RmgrTable[RM_MAX_ID + 1] = { const RmgrData RmgrTable[RM_MAX_ID + 1] = {
{"XLOG", xlog_redo, xlog_undo, xlog_desc, NULL, NULL}, {"XLOG", xlog_redo, xlog_desc, NULL, NULL},
{"Transaction", xact_redo, xact_undo, xact_desc, NULL, NULL}, {"Transaction", xact_redo, xact_desc, NULL, NULL},
{"Storage", smgr_redo, smgr_undo, smgr_desc, NULL, NULL}, {"Storage", smgr_redo, smgr_desc, NULL, NULL},
{"CLOG", clog_redo, clog_undo, clog_desc, NULL, NULL}, {"CLOG", clog_redo, clog_desc, NULL, NULL},
{"Database", dbase_redo, dbase_undo, dbase_desc, NULL, NULL}, {"Database", dbase_redo, dbase_desc, NULL, NULL},
{"Tablespace", tblspc_redo, tblspc_undo, tblspc_desc, NULL, NULL}, {"Tablespace", tblspc_redo, tblspc_desc, NULL, NULL},
{"Reserved 6", NULL, NULL, NULL, NULL, NULL}, {"Reserved 6", NULL, NULL, NULL, NULL},
{"Reserved 7", NULL, NULL, NULL, NULL, NULL}, {"Reserved 7", NULL, NULL, NULL, NULL},
{"Reserved 8", NULL, NULL, NULL, NULL, NULL}, {"Reserved 8", NULL, NULL, NULL, NULL},
{"Reserved 9", NULL, NULL, NULL, NULL, NULL}, {"Reserved 9", NULL, NULL, NULL, NULL},
{"Heap", heap_redo, heap_undo, heap_desc, NULL, NULL}, {"Heap", heap_redo, heap_desc, NULL, NULL},
{"Btree", btree_redo, btree_undo, btree_desc, {"Btree", btree_redo, btree_desc, btree_xlog_startup, btree_xlog_cleanup},
btree_xlog_startup, btree_xlog_cleanup}, {"Hash", hash_redo, hash_desc, NULL, NULL},
{"Hash", hash_redo, hash_undo, hash_desc, NULL, NULL}, {"Rtree", rtree_redo, rtree_desc, NULL, NULL},
{"Rtree", rtree_redo, rtree_undo, rtree_desc, NULL, NULL}, {"Gist", gist_redo, gist_desc, NULL, NULL},
{"Gist", gist_redo, gist_undo, gist_desc, NULL, NULL}, {"Sequence", seq_redo, seq_desc, NULL, NULL}
{"Sequence", seq_redo, seq_undo, seq_desc, NULL, NULL}
}; };
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.202 2005/05/19 23:58:51 tgl Exp $ * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.203 2005/06/06 17:01:22 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -3844,17 +3844,6 @@ xact_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -3844,17 +3844,6 @@ xact_redo(XLogRecPtr lsn, XLogRecord *record)
elog(PANIC, "xact_redo: unknown op code %u", info); elog(PANIC, "xact_redo: unknown op code %u", info);
} }
void
xact_undo(XLogRecPtr lsn, XLogRecord *record)
{
uint8 info = record->xl_info & ~XLR_INFO_MASK;
if (info == XLOG_XACT_COMMIT) /* shouldn't be called by XLOG */
elog(PANIC, "xact_undo: can't undo committed xaction");
else if (info != XLOG_XACT_ABORT)
elog(PANIC, "xact_redo: unknown op code %u", info);
}
void void
xact_desc(char *buf, uint8 xl_info, char *rec) xact_desc(char *buf, uint8 xl_info, char *rec)
{ {
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.195 2005/06/02 05:55:28 tgl Exp $ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.196 2005/06/06 17:01:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -2372,7 +2372,7 @@ RestoreBkpBlocks(XLogRecord *record, XLogRecPtr lsn) ...@@ -2372,7 +2372,7 @@ RestoreBkpBlocks(XLogRecord *record, XLogRecPtr lsn)
memcpy(&bkpb, blk, sizeof(BkpBlock)); memcpy(&bkpb, blk, sizeof(BkpBlock));
blk += sizeof(BkpBlock); blk += sizeof(BkpBlock);
reln = XLogOpenRelation(true, record->xl_rmid, bkpb.node); reln = XLogOpenRelation(bkpb.node);
if (reln) if (reln)
{ {
...@@ -5308,11 +5308,6 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -5308,11 +5308,6 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record)
} }
} }
void
xlog_undo(XLogRecPtr lsn, XLogRecord *record)
{
}
void void
xlog_desc(char *buf, uint8 xl_info, char *rec) xlog_desc(char *buf, uint8 xl_info, char *rec)
{ {
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/backend/access/transam/xlogutils.c,v 1.37 2005/05/29 04:23:03 tgl Exp $ * $PostgreSQL: pgsql/src/backend/access/transam/xlogutils.c,v 1.38 2005/06/06 17:01:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -186,7 +186,7 @@ XLogCloseRelationCache(void) ...@@ -186,7 +186,7 @@ XLogCloseRelationCache(void)
* Open a relation during XLOG replay * Open a relation during XLOG replay
*/ */
Relation Relation
XLogOpenRelation(bool redo, RmgrId rmid, RelFileNode rnode) XLogOpenRelation(RelFileNode rnode)
{ {
XLogRelDesc *res; XLogRelDesc *res;
XLogRelCacheEntry *hentry; XLogRelCacheEntry *hentry;
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.157 2005/05/19 21:35:45 tgl Exp $ * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.158 2005/06/06 17:01:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1334,12 +1334,6 @@ dbase_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -1334,12 +1334,6 @@ dbase_redo(XLogRecPtr lsn, XLogRecord *record)
elog(PANIC, "dbase_redo: unknown op code %u", info); elog(PANIC, "dbase_redo: unknown op code %u", info);
} }
void
dbase_undo(XLogRecPtr lsn, XLogRecord *record)
{
elog(PANIC, "dbase_undo: unimplemented");
}
void void
dbase_desc(char *buf, uint8 xl_info, char *rec) dbase_desc(char *buf, uint8 xl_info, char *rec)
{ {
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.120 2005/05/27 00:57:49 neilc Exp $ * $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.121 2005/06/06 17:01:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1077,7 +1077,7 @@ seq_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -1077,7 +1077,7 @@ seq_redo(XLogRecPtr lsn, XLogRecord *record)
if (info != XLOG_SEQ_LOG) if (info != XLOG_SEQ_LOG)
elog(PANIC, "seq_redo: unknown op code %u", info); elog(PANIC, "seq_redo: unknown op code %u", info);
reln = XLogOpenRelation(true, RM_SEQ_ID, xlrec->node); reln = XLogOpenRelation(xlrec->node);
if (!RelationIsValid(reln)) if (!RelationIsValid(reln))
return; return;
...@@ -1107,11 +1107,6 @@ seq_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -1107,11 +1107,6 @@ seq_redo(XLogRecPtr lsn, XLogRecord *record)
WriteBuffer(buffer); WriteBuffer(buffer);
} }
void
seq_undo(XLogRecPtr lsn, XLogRecord *record)
{
}
void void
seq_desc(char *buf, uint8 xl_info, char *rec) seq_desc(char *buf, uint8 xl_info, char *rec)
{ {
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.19 2005/05/10 22:27:29 momjian Exp $ * $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.20 2005/06/06 17:01:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1064,12 +1064,6 @@ tblspc_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -1064,12 +1064,6 @@ tblspc_redo(XLogRecPtr lsn, XLogRecord *record)
elog(PANIC, "tblspc_redo: unknown op code %u", info); elog(PANIC, "tblspc_redo: unknown op code %u", info);
} }
void
tblspc_undo(XLogRecPtr lsn, XLogRecord *record)
{
elog(PANIC, "tblspc_undo: unimplemented");
}
void void
tblspc_desc(char *buf, uint8 xl_info, char *rec) tblspc_desc(char *buf, uint8 xl_info, char *rec)
{ {
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/storage/smgr/smgr.c,v 1.87 2005/05/29 04:23:05 tgl Exp $ * $PostgreSQL: pgsql/src/backend/storage/smgr/smgr.c,v 1.88 2005/06/06 17:01:24 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -908,13 +908,6 @@ smgr_redo(XLogRecPtr lsn, XLogRecord *record) ...@@ -908,13 +908,6 @@ smgr_redo(XLogRecPtr lsn, XLogRecord *record)
elog(PANIC, "smgr_redo: unknown op code %u", info); elog(PANIC, "smgr_redo: unknown op code %u", info);
} }
void
smgr_undo(XLogRecPtr lsn, XLogRecord *record)
{
/* Since we have no transactional WAL entries, should never undo */
elog(PANIC, "smgr_undo: cannot undo");
}
void void
smgr_desc(char *buf, uint8 xl_info, char *rec) smgr_desc(char *buf, uint8 xl_info, char *rec)
{ {
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.6 2005/04/14 20:03:26 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.7 2005/06/06 17:01:24 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -645,7 +645,7 @@ BuildFlatFiles(bool database_only) ...@@ -645,7 +645,7 @@ BuildFlatFiles(bool database_only)
rnode.relNode = DatabaseRelationId; rnode.relNode = DatabaseRelationId;
/* No locking is needed because no one else is alive yet */ /* No locking is needed because no one else is alive yet */
rel = XLogOpenRelation(true, 0, rnode); rel = XLogOpenRelation(rnode);
write_database_file(rel); write_database_file(rel);
if (!database_only) if (!database_only)
...@@ -655,7 +655,7 @@ BuildFlatFiles(bool database_only) ...@@ -655,7 +655,7 @@ BuildFlatFiles(bool database_only)
rnode.dbNode = 0; rnode.dbNode = 0;
rnode.relNode = GroupRelationId; rnode.relNode = GroupRelationId;
rel = XLogOpenRelation(true, 0, rnode); rel = XLogOpenRelation(rnode);
write_group_file(rel); write_group_file(rel);
/* hard-wired path to pg_shadow */ /* hard-wired path to pg_shadow */
...@@ -663,7 +663,7 @@ BuildFlatFiles(bool database_only) ...@@ -663,7 +663,7 @@ BuildFlatFiles(bool database_only)
rnode.dbNode = 0; rnode.dbNode = 0;
rnode.relNode = ShadowRelationId; rnode.relNode = ShadowRelationId;
rel = XLogOpenRelation(true, 0, rnode); rel = XLogOpenRelation(rnode);
write_user_file(rel); write_user_file(rel);
} }
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/clog.h,v 1.12 2004/12/31 22:03:21 pgsql Exp $ * $PostgreSQL: pgsql/src/include/access/clog.h,v 1.13 2005/06/06 17:01:24 tgl Exp $
*/ */
#ifndef CLOG_H #ifndef CLOG_H
#define CLOG_H #define CLOG_H
...@@ -44,7 +44,6 @@ extern void TruncateCLOG(TransactionId oldestXact); ...@@ -44,7 +44,6 @@ extern void TruncateCLOG(TransactionId oldestXact);
#define CLOG_ZEROPAGE 0x00 #define CLOG_ZEROPAGE 0x00
extern void clog_redo(XLogRecPtr lsn, XLogRecord *record); extern void clog_redo(XLogRecPtr lsn, XLogRecord *record);
extern void clog_undo(XLogRecPtr lsn, XLogRecord *record);
extern void clog_desc(char *buf, uint8 xl_info, char *rec); extern void clog_desc(char *buf, uint8 xl_info, char *rec);
#endif /* CLOG_H */ #endif /* CLOG_H */
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/gist_private.h,v 1.1 2005/05/17 03:34:18 neilc Exp $ * $PostgreSQL: pgsql/src/include/access/gist_private.h,v 1.2 2005/06/06 17:01:24 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -99,8 +99,8 @@ extern void freeGISTstate(GISTSTATE *giststate); ...@@ -99,8 +99,8 @@ extern void freeGISTstate(GISTSTATE *giststate);
extern void gistdentryinit(GISTSTATE *giststate, int nkey, GISTENTRY *e, extern void gistdentryinit(GISTSTATE *giststate, int nkey, GISTENTRY *e,
Datum k, Relation r, Page pg, OffsetNumber o, Datum k, Relation r, Page pg, OffsetNumber o,
int b, bool l, bool isNull); int b, bool l, bool isNull);
extern void gist_redo(XLogRecPtr lsn, XLogRecord *record); extern void gist_redo(XLogRecPtr lsn, XLogRecord *record);
extern void gist_undo(XLogRecPtr lsn, XLogRecord *record);
extern void gist_desc(char *buf, uint8 xl_info, char *rec); extern void gist_desc(char *buf, uint8 xl_info, char *rec);
/* gistget.c */ /* gistget.c */
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/hash.h,v 1.61 2005/03/27 23:53:04 tgl Exp $ * $PostgreSQL: pgsql/src/include/access/hash.h,v 1.62 2005/06/06 17:01:24 tgl Exp $
* *
* NOTES * NOTES
* modeled after Margo Seltzer's hash implementation for unix. * modeled after Margo Seltzer's hash implementation for unix.
...@@ -314,7 +314,6 @@ extern void _hash_checkpage(Relation rel, Page page, int flags); ...@@ -314,7 +314,6 @@ extern void _hash_checkpage(Relation rel, Page page, int flags);
/* hash.c */ /* hash.c */
extern void hash_redo(XLogRecPtr lsn, XLogRecord *record); extern void hash_redo(XLogRecPtr lsn, XLogRecord *record);
extern void hash_undo(XLogRecPtr lsn, XLogRecord *record);
extern void hash_desc(char *buf, uint8 xl_info, char *rec); extern void hash_desc(char *buf, uint8 xl_info, char *rec);
#endif /* HASH_H */ #endif /* HASH_H */
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/heapam.h,v 1.100 2005/04/28 21:47:16 tgl Exp $ * $PostgreSQL: pgsql/src/include/access/heapam.h,v 1.101 2005/06/06 17:01:24 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -173,7 +173,6 @@ extern void heap_markpos(HeapScanDesc scan); ...@@ -173,7 +173,6 @@ extern void heap_markpos(HeapScanDesc scan);
extern void heap_restrpos(HeapScanDesc scan); extern void heap_restrpos(HeapScanDesc scan);
extern void heap_redo(XLogRecPtr lsn, XLogRecord *rptr); extern void heap_redo(XLogRecPtr lsn, XLogRecord *rptr);
extern void heap_undo(XLogRecPtr lsn, XLogRecord *rptr);
extern void heap_desc(char *buf, uint8 xl_info, char *rec); extern void heap_desc(char *buf, uint8 xl_info, char *rec);
extern XLogRecPtr log_heap_clean(Relation reln, Buffer buffer, extern XLogRecPtr log_heap_clean(Relation reln, Buffer buffer,
OffsetNumber *unused, int uncnt); OffsetNumber *unused, int uncnt);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/nbtree.h,v 1.85 2005/03/27 23:53:04 tgl Exp $ * $PostgreSQL: pgsql/src/include/access/nbtree.h,v 1.86 2005/06/06 17:01:24 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -485,7 +485,6 @@ extern void _bt_leafbuild(BTSpool *btspool, BTSpool *spool2); ...@@ -485,7 +485,6 @@ extern void _bt_leafbuild(BTSpool *btspool, BTSpool *spool2);
* prototypes for functions in nbtxlog.c * prototypes for functions in nbtxlog.c
*/ */
extern void btree_redo(XLogRecPtr lsn, XLogRecord *record); extern void btree_redo(XLogRecPtr lsn, XLogRecord *record);
extern void btree_undo(XLogRecPtr lsn, XLogRecord *record);
extern void btree_desc(char *buf, uint8 xl_info, char *rec); extern void btree_desc(char *buf, uint8 xl_info, char *rec);
extern void btree_xlog_startup(void); extern void btree_xlog_startup(void);
extern void btree_xlog_cleanup(void); extern void btree_xlog_cleanup(void);
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Resource managers definition * Resource managers definition
* *
* $PostgreSQL: pgsql/src/include/access/rmgr.h,v 1.13 2004/08/29 21:08:47 tgl Exp $ * $PostgreSQL: pgsql/src/include/access/rmgr.h,v 1.14 2005/06/06 17:01:24 tgl Exp $
*/ */
#ifndef RMGR_H #ifndef RMGR_H
#define RMGR_H #define RMGR_H
...@@ -19,6 +19,7 @@ typedef uint8 RmgrId; ...@@ -19,6 +19,7 @@ typedef uint8 RmgrId;
#define RM_CLOG_ID 3 #define RM_CLOG_ID 3
#define RM_DBASE_ID 4 #define RM_DBASE_ID 4
#define RM_TBLSPC_ID 5 #define RM_TBLSPC_ID 5
#define RM_MULTIXACT_ID 6
#define RM_HEAP_ID 10 #define RM_HEAP_ID 10
#define RM_BTREE_ID 11 #define RM_BTREE_ID 11
#define RM_HASH_ID 12 #define RM_HASH_ID 12
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/rtree.h,v 1.38 2005/03/27 23:53:04 tgl Exp $ * $PostgreSQL: pgsql/src/include/access/rtree.h,v 1.39 2005/06/06 17:01:24 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -127,7 +127,6 @@ extern Datum rtbuild(PG_FUNCTION_ARGS); ...@@ -127,7 +127,6 @@ extern Datum rtbuild(PG_FUNCTION_ARGS);
extern void _rtdump(Relation r); extern void _rtdump(Relation r);
extern void rtree_redo(XLogRecPtr lsn, XLogRecord *record); extern void rtree_redo(XLogRecPtr lsn, XLogRecord *record);
extern void rtree_undo(XLogRecPtr lsn, XLogRecord *record);
extern void rtree_desc(char *buf, uint8 xl_info, char *rec); extern void rtree_desc(char *buf, uint8 xl_info, char *rec);
/* rtscan.c */ /* rtscan.c */
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/xact.h,v 1.75 2005/03/28 01:50:34 tgl Exp $ * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.76 2005/06/06 17:01:24 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -146,7 +146,6 @@ extern void RecordTransactionCommit(void); ...@@ -146,7 +146,6 @@ extern void RecordTransactionCommit(void);
extern int xactGetCommittedChildren(TransactionId **ptr); extern int xactGetCommittedChildren(TransactionId **ptr);
extern void xact_redo(XLogRecPtr lsn, XLogRecord *record); extern void xact_redo(XLogRecPtr lsn, XLogRecord *record);
extern void xact_undo(XLogRecPtr lsn, XLogRecord *record);
extern void xact_desc(char *buf, uint8 xl_info, char *rec); extern void xact_desc(char *buf, uint8 xl_info, char *rec);
#endif /* XACT_H */ #endif /* XACT_H */
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.62 2005/06/02 05:55:29 tgl Exp $ * $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.63 2005/06/06 17:01:24 tgl Exp $
*/ */
#ifndef XLOG_H #ifndef XLOG_H
#define XLOG_H #define XLOG_H
...@@ -135,7 +135,6 @@ extern XLogRecPtr XLogInsert(RmgrId rmid, uint8 info, XLogRecData *rdata); ...@@ -135,7 +135,6 @@ extern XLogRecPtr XLogInsert(RmgrId rmid, uint8 info, XLogRecData *rdata);
extern void XLogFlush(XLogRecPtr RecPtr); extern void XLogFlush(XLogRecPtr RecPtr);
extern void xlog_redo(XLogRecPtr lsn, XLogRecord *record); extern void xlog_redo(XLogRecPtr lsn, XLogRecord *record);
extern void xlog_undo(XLogRecPtr lsn, XLogRecord *record);
extern void xlog_desc(char *buf, uint8 xl_info, char *rec); extern void xlog_desc(char *buf, uint8 xl_info, char *rec);
extern void UpdateControlFile(void); extern void UpdateControlFile(void);
......
...@@ -5,13 +5,13 @@ ...@@ -5,13 +5,13 @@
* *
* NOTE: this file is intended to contain declarations useful for * NOTE: this file is intended to contain declarations useful for
* manipulating the XLOG files directly, but it is not supposed to be * manipulating the XLOG files directly, but it is not supposed to be
* needed by rmgr routines (redo/undo support for individual record types). * needed by rmgr routines (redo support for individual record types).
* So the XLogRecord typedef and associated stuff appear in xlog.h. * So the XLogRecord typedef and associated stuff appear in xlog.h.
* *
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/xlog_internal.h,v 1.7 2005/06/02 05:55:29 tgl Exp $ * $PostgreSQL: pgsql/src/include/access/xlog_internal.h,v 1.8 2005/06/06 17:01:25 tgl Exp $
*/ */
#ifndef XLOG_INTERNAL_H #ifndef XLOG_INTERNAL_H
#define XLOG_INTERNAL_H #define XLOG_INTERNAL_H
...@@ -224,7 +224,6 @@ typedef struct RmgrData ...@@ -224,7 +224,6 @@ typedef struct RmgrData
{ {
const char *rm_name; const char *rm_name;
void (*rm_redo) (XLogRecPtr lsn, XLogRecord *rptr); void (*rm_redo) (XLogRecPtr lsn, XLogRecord *rptr);
void (*rm_undo) (XLogRecPtr lsn, XLogRecord *rptr);
void (*rm_desc) (char *buf, uint8 xl_info, char *rec); void (*rm_desc) (char *buf, uint8 xl_info, char *rec);
void (*rm_startup) (void); void (*rm_startup) (void);
void (*rm_cleanup) (void); void (*rm_cleanup) (void);
......
...@@ -6,12 +6,11 @@ ...@@ -6,12 +6,11 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/access/xlogutils.h,v 1.17 2004/12/31 22:03:21 pgsql Exp $ * $PostgreSQL: pgsql/src/include/access/xlogutils.h,v 1.18 2005/06/06 17:01:25 tgl Exp $
*/ */
#ifndef XLOG_UTILS_H #ifndef XLOG_UTILS_H
#define XLOG_UTILS_H #define XLOG_UTILS_H
#include "access/rmgr.h"
#include "storage/buf.h" #include "storage/buf.h"
#include "utils/rel.h" #include "utils/rel.h"
...@@ -19,7 +18,7 @@ ...@@ -19,7 +18,7 @@
extern void XLogInitRelationCache(void); extern void XLogInitRelationCache(void);
extern void XLogCloseRelationCache(void); extern void XLogCloseRelationCache(void);
extern Relation XLogOpenRelation(bool redo, RmgrId rmid, RelFileNode rnode); extern Relation XLogOpenRelation(RelFileNode rnode);
extern void XLogCloseRelation(RelFileNode rnode); extern void XLogCloseRelation(RelFileNode rnode);
extern Buffer XLogReadBuffer(bool extend, Relation reln, BlockNumber blkno); extern Buffer XLogReadBuffer(bool extend, Relation reln, BlockNumber blkno);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/commands/dbcommands.h,v 1.37 2005/03/23 00:03:37 tgl Exp $ * $PostgreSQL: pgsql/src/include/commands/dbcommands.h,v 1.38 2005/06/06 17:01:25 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -71,7 +71,6 @@ extern Oid get_database_oid(const char *dbname); ...@@ -71,7 +71,6 @@ extern Oid get_database_oid(const char *dbname);
extern char *get_database_name(Oid dbid); extern char *get_database_name(Oid dbid);
extern void dbase_redo(XLogRecPtr lsn, XLogRecord *rptr); extern void dbase_redo(XLogRecPtr lsn, XLogRecord *rptr);
extern void dbase_undo(XLogRecPtr lsn, XLogRecord *rptr);
extern void dbase_desc(char *buf, uint8 xl_info, char *rec); extern void dbase_desc(char *buf, uint8 xl_info, char *rec);
#endif /* DBCOMMANDS_H */ #endif /* DBCOMMANDS_H */
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/commands/sequence.h,v 1.30 2004/12/31 22:03:28 pgsql Exp $ * $PostgreSQL: pgsql/src/include/commands/sequence.h,v 1.31 2005/06/06 17:01:25 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -89,7 +89,6 @@ extern void DefineSequence(CreateSeqStmt *stmt); ...@@ -89,7 +89,6 @@ extern void DefineSequence(CreateSeqStmt *stmt);
extern void AlterSequence(AlterSeqStmt *stmt); extern void AlterSequence(AlterSeqStmt *stmt);
extern void seq_redo(XLogRecPtr lsn, XLogRecord *rptr); extern void seq_redo(XLogRecPtr lsn, XLogRecord *rptr);
extern void seq_undo(XLogRecPtr lsn, XLogRecord *rptr);
extern void seq_desc(char *buf, uint8 xl_info, char *rec); extern void seq_desc(char *buf, uint8 xl_info, char *rec);
/* Set the upper and lower bounds of a sequence */ /* Set the upper and lower bounds of a sequence */
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/commands/tablespace.h,v 1.8 2004/12/31 22:03:28 pgsql Exp $ * $PostgreSQL: pgsql/src/include/commands/tablespace.h,v 1.9 2005/06/06 17:01:25 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -48,7 +48,6 @@ extern char *get_tablespace_name(Oid spc_oid); ...@@ -48,7 +48,6 @@ extern char *get_tablespace_name(Oid spc_oid);
extern bool directory_is_empty(const char *path); extern bool directory_is_empty(const char *path);
extern void tblspc_redo(XLogRecPtr lsn, XLogRecord *rptr); extern void tblspc_redo(XLogRecPtr lsn, XLogRecord *rptr);
extern void tblspc_undo(XLogRecPtr lsn, XLogRecord *rptr);
extern void tblspc_desc(char *buf, uint8 xl_info, char *rec); extern void tblspc_desc(char *buf, uint8 xl_info, char *rec);
#endif /* TABLESPACE_H */ #endif /* TABLESPACE_H */
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/storage/smgr.h,v 1.50 2005/01/10 20:02:23 tgl Exp $ * $PostgreSQL: pgsql/src/include/storage/smgr.h,v 1.51 2005/06/06 17:01:25 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -84,7 +84,6 @@ extern void smgrabort(void); ...@@ -84,7 +84,6 @@ extern void smgrabort(void);
extern void smgrsync(void); extern void smgrsync(void);
extern void smgr_redo(XLogRecPtr lsn, XLogRecord *record); extern void smgr_redo(XLogRecPtr lsn, XLogRecord *record);
extern void smgr_undo(XLogRecPtr lsn, XLogRecord *record);
extern void smgr_desc(char *buf, uint8 xl_info, char *rec); extern void smgr_desc(char *buf, uint8 xl_info, char *rec);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment