diff options
Diffstat (limited to 'src/backend/access/nbtree/nbtxlog.c')
-rw-r--r-- | src/backend/access/nbtree/nbtxlog.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c index bed1dd2a098..233c3965d95 100644 --- a/src/backend/access/nbtree/nbtxlog.c +++ b/src/backend/access/nbtree/nbtxlog.c @@ -51,9 +51,15 @@ _bt_restore_page(Page page, char *from, int len) i = 0; while (from < end) { - /* Need to copy tuple header due to alignment considerations */ + /* + * As we step through the items, 'from' won't always be properly + * aligned, so we need to use memcpy(). Further, we use Item (which + * is just a char*) here for our items array for the same reason; + * wouldn't want the compiler or anyone thinking that an item is + * aligned when it isn't. + */ memcpy(&itupdata, from, sizeof(IndexTupleData)); - itemsz = IndexTupleDSize(itupdata); + itemsz = IndexTupleSize(&itupdata); itemsz = MAXALIGN(itemsz); items[i] = (Item) from; @@ -205,7 +211,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record) BTPageOpaque ropaque; char *datapos; Size datalen; - Item left_hikey = NULL; + IndexTuple left_hikey = NULL; Size left_hikeysz = 0; BlockNumber leftsib; BlockNumber rightsib; @@ -248,7 +254,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record) { ItemId hiItemId = PageGetItemId(rpage, P_FIRSTDATAKEY(ropaque)); - left_hikey = PageGetItem(rpage, hiItemId); + left_hikey = (IndexTuple) PageGetItem(rpage, hiItemId); left_hikeysz = ItemIdGetLength(hiItemId); } @@ -272,7 +278,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record) Page lpage = (Page) BufferGetPage(lbuf); BTPageOpaque lopaque = (BTPageOpaque) PageGetSpecialPointer(lpage); OffsetNumber off; - Item newitem = NULL; + IndexTuple newitem = NULL; Size newitemsz = 0; Page newlpage; OffsetNumber leftoff; @@ -281,7 +287,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record) if (onleft) { - newitem = (Item) datapos; + newitem = (IndexTuple) datapos; newitemsz = MAXALIGN(IndexTupleSize(newitem)); datapos += newitemsz; datalen -= newitemsz; @@ -290,7 +296,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record) /* Extract left hikey and its size (assuming 16-bit alignment) */ if (!isleaf) { - left_hikey = (Item) datapos; + left_hikey = (IndexTuple) datapos; left_hikeysz = MAXALIGN(IndexTupleSize(left_hikey)); datapos += left_hikeysz; datalen -= left_hikeysz; @@ -301,7 +307,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record) /* Set high key */ leftoff = P_HIKEY; - if (PageAddItem(newlpage, left_hikey, left_hikeysz, + if (PageAddItem(newlpage, (Item) left_hikey, left_hikeysz, P_HIKEY, false, false) == InvalidOffsetNumber) elog(PANIC, "failed to add high key to left page after split"); leftoff = OffsetNumberNext(leftoff); @@ -310,12 +316,12 @@ btree_xlog_split(bool onleft, XLogReaderState *record) { ItemId itemid; Size itemsz; - Item item; + IndexTuple item; /* add the new item if it was inserted on left page */ if (onleft && off == xlrec->newitemoff) { - if (PageAddItem(newlpage, newitem, newitemsz, leftoff, + if (PageAddItem(newlpage, (Item) newitem, newitemsz, leftoff, false, false) == InvalidOffsetNumber) elog(ERROR, "failed to add new item to left page after split"); leftoff = OffsetNumberNext(leftoff); @@ -323,8 +329,8 @@ btree_xlog_split(bool onleft, XLogReaderState *record) itemid = PageGetItemId(lpage, off); itemsz = ItemIdGetLength(itemid); - item = PageGetItem(lpage, itemid); - if (PageAddItem(newlpage, item, itemsz, leftoff, + item = (IndexTuple) PageGetItem(lpage, itemid); + if (PageAddItem(newlpage, (Item) item, itemsz, leftoff, false, false) == InvalidOffsetNumber) elog(ERROR, "failed to add old item to left page after split"); leftoff = OffsetNumberNext(leftoff); @@ -333,7 +339,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record) /* cope with possibility that newitem goes at the end */ if (onleft && off == xlrec->newitemoff) { - if (PageAddItem(newlpage, newitem, newitemsz, leftoff, + if (PageAddItem(newlpage, (Item) newitem, newitemsz, leftoff, false, false) == InvalidOffsetNumber) elog(ERROR, "failed to add new item to left page after split"); leftoff = OffsetNumberNext(leftoff); |