@@ -51,9 +51,15 @@ _bt_restore_page(Page page, char *from, int len)
5151 i = 0 ;
5252 while (from < end )
5353 {
54- /* Need to copy tuple header due to alignment considerations */
54+ /*
55+ * As we step through the items, 'from' won't always be properly
56+ * aligned, so we need to use memcpy(). Further, we use Item (which
57+ * is just a char*) here for our items array for the same reason;
58+ * wouldn't want the compiler or anyone thinking that an item is
59+ * aligned when it isn't.
60+ */
5561 memcpy (& itupdata , from , sizeof (IndexTupleData ));
56- itemsz = IndexTupleDSize ( itupdata );
62+ itemsz = IndexTupleSize ( & itupdata );
5763 itemsz = MAXALIGN (itemsz );
5864
5965 items [i ] = (Item ) from ;
@@ -205,7 +211,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
205211 BTPageOpaque ropaque ;
206212 char * datapos ;
207213 Size datalen ;
208- Item left_hikey = NULL ;
214+ IndexTuple left_hikey = NULL ;
209215 Size left_hikeysz = 0 ;
210216 BlockNumber leftsib ;
211217 BlockNumber rightsib ;
@@ -248,7 +254,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
248254 {
249255 ItemId hiItemId = PageGetItemId (rpage , P_FIRSTDATAKEY (ropaque ));
250256
251- left_hikey = PageGetItem (rpage , hiItemId );
257+ left_hikey = ( IndexTuple ) PageGetItem (rpage , hiItemId );
252258 left_hikeysz = ItemIdGetLength (hiItemId );
253259 }
254260
@@ -272,7 +278,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
272278 Page lpage = (Page ) BufferGetPage (lbuf );
273279 BTPageOpaque lopaque = (BTPageOpaque ) PageGetSpecialPointer (lpage );
274280 OffsetNumber off ;
275- Item newitem = NULL ;
281+ IndexTuple newitem = NULL ;
276282 Size newitemsz = 0 ;
277283 Page newlpage ;
278284 OffsetNumber leftoff ;
@@ -281,7 +287,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
281287
282288 if (onleft )
283289 {
284- newitem = (Item ) datapos ;
290+ newitem = (IndexTuple ) datapos ;
285291 newitemsz = MAXALIGN (IndexTupleSize (newitem ));
286292 datapos += newitemsz ;
287293 datalen -= newitemsz ;
@@ -290,7 +296,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
290296 /* Extract left hikey and its size (assuming 16-bit alignment) */
291297 if (!isleaf )
292298 {
293- left_hikey = (Item ) datapos ;
299+ left_hikey = (IndexTuple ) datapos ;
294300 left_hikeysz = MAXALIGN (IndexTupleSize (left_hikey ));
295301 datapos += left_hikeysz ;
296302 datalen -= left_hikeysz ;
@@ -301,7 +307,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
301307
302308 /* Set high key */
303309 leftoff = P_HIKEY ;
304- if (PageAddItem (newlpage , left_hikey , left_hikeysz ,
310+ if (PageAddItem (newlpage , ( Item ) left_hikey , left_hikeysz ,
305311 P_HIKEY , false, false) == InvalidOffsetNumber )
306312 elog (PANIC , "failed to add high key to left page after split" );
307313 leftoff = OffsetNumberNext (leftoff );
@@ -310,21 +316,21 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
310316 {
311317 ItemId itemid ;
312318 Size itemsz ;
313- Item item ;
319+ IndexTuple item ;
314320
315321 /* add the new item if it was inserted on left page */
316322 if (onleft && off == xlrec -> newitemoff )
317323 {
318- if (PageAddItem (newlpage , newitem , newitemsz , leftoff ,
324+ if (PageAddItem (newlpage , ( Item ) newitem , newitemsz , leftoff ,
319325 false, false) == InvalidOffsetNumber )
320326 elog (ERROR , "failed to add new item to left page after split" );
321327 leftoff = OffsetNumberNext (leftoff );
322328 }
323329
324330 itemid = PageGetItemId (lpage , off );
325331 itemsz = ItemIdGetLength (itemid );
326- item = PageGetItem (lpage , itemid );
327- if (PageAddItem (newlpage , item , itemsz , leftoff ,
332+ item = ( IndexTuple ) PageGetItem (lpage , itemid );
333+ if (PageAddItem (newlpage , ( Item ) item , itemsz , leftoff ,
328334 false, false) == InvalidOffsetNumber )
329335 elog (ERROR , "failed to add old item to left page after split" );
330336 leftoff = OffsetNumberNext (leftoff );
@@ -333,7 +339,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
333339 /* cope with possibility that newitem goes at the end */
334340 if (onleft && off == xlrec -> newitemoff )
335341 {
336- if (PageAddItem (newlpage , newitem , newitemsz , leftoff ,
342+ if (PageAddItem (newlpage , ( Item ) newitem , newitemsz , leftoff ,
337343 false, false) == InvalidOffsetNumber )
338344 elog (ERROR , "failed to add new item to left page after split" );
339345 leftoff = OffsetNumberNext (leftoff );
0 commit comments