@@ -51,9 +51,15 @@ _bt_restore_page(Page page, char *from, int len)
5151i = 0 ;
5252while (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+ */
5561memcpy (& itupdata ,from ,sizeof (IndexTupleData ));
56- itemsz = IndexTupleDSize ( itupdata );
62+ itemsz = IndexTupleSize ( & itupdata );
5763itemsz = MAXALIGN (itemsz );
5864
5965items [i ]= (Item )from ;
@@ -205,7 +211,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
205211BTPageOpaque ropaque ;
206212char * datapos ;
207213Size datalen ;
208- Item left_hikey = NULL ;
214+ IndexTuple left_hikey = NULL ;
209215Size left_hikeysz = 0 ;
210216BlockNumber leftsib ;
211217BlockNumber rightsib ;
@@ -248,7 +254,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
248254{
249255ItemId hiItemId = PageGetItemId (rpage ,P_FIRSTDATAKEY (ropaque ));
250256
251- left_hikey = PageGetItem (rpage ,hiItemId );
257+ left_hikey = ( IndexTuple ) PageGetItem (rpage ,hiItemId );
252258left_hikeysz = ItemIdGetLength (hiItemId );
253259}
254260
@@ -272,7 +278,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
272278Page lpage = (Page )BufferGetPage (lbuf );
273279BTPageOpaque lopaque = (BTPageOpaque )PageGetSpecialPointer (lpage );
274280OffsetNumber off ;
275- Item newitem = NULL ;
281+ IndexTuple newitem = NULL ;
276282Size newitemsz = 0 ;
277283Page newlpage ;
278284OffsetNumber leftoff ;
@@ -281,7 +287,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
281287
282288if (onleft )
283289{
284- newitem = (Item )datapos ;
290+ newitem = (IndexTuple )datapos ;
285291newitemsz = MAXALIGN (IndexTupleSize (newitem ));
286292datapos += newitemsz ;
287293datalen -= newitemsz ;
@@ -290,7 +296,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
290296/* Extract left hikey and its size (assuming 16-bit alignment) */
291297if (!isleaf )
292298{
293- left_hikey = (Item )datapos ;
299+ left_hikey = (IndexTuple )datapos ;
294300left_hikeysz = MAXALIGN (IndexTupleSize (left_hikey ));
295301datapos += left_hikeysz ;
296302datalen -= left_hikeysz ;
@@ -301,7 +307,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
301307
302308/* Set high key */
303309leftoff = P_HIKEY ;
304- if (PageAddItem (newlpage ,left_hikey ,left_hikeysz ,
310+ if (PageAddItem (newlpage ,( Item ) left_hikey ,left_hikeysz ,
305311P_HIKEY , false, false)== InvalidOffsetNumber )
306312elog (PANIC ,"failed to add high key to left page after split" );
307313leftoff = OffsetNumberNext (leftoff );
@@ -310,21 +316,21 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
310316{
311317ItemId itemid ;
312318Size itemsz ;
313- Item item ;
319+ IndexTuple item ;
314320
315321/* add the new item if it was inserted on left page */
316322if (onleft && off == xlrec -> newitemoff )
317323{
318- if (PageAddItem (newlpage ,newitem ,newitemsz ,leftoff ,
324+ if (PageAddItem (newlpage ,( Item ) newitem ,newitemsz ,leftoff ,
319325false, false)== InvalidOffsetNumber )
320326elog (ERROR ,"failed to add new item to left page after split" );
321327leftoff = OffsetNumberNext (leftoff );
322328}
323329
324330itemid = PageGetItemId (lpage ,off );
325331itemsz = 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 ,
328334false, false)== InvalidOffsetNumber )
329335elog (ERROR ,"failed to add old item to left page after split" );
330336leftoff = OffsetNumberNext (leftoff );
@@ -333,7 +339,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
333339/* cope with possibility that newitem goes at the end */
334340if (onleft && off == xlrec -> newitemoff )
335341{
336- if (PageAddItem (newlpage ,newitem ,newitemsz ,leftoff ,
342+ if (PageAddItem (newlpage ,( Item ) newitem ,newitemsz ,leftoff ,
337343false, false)== InvalidOffsetNumber )
338344elog (ERROR ,"failed to add new item to left page after split" );
339345leftoff = OffsetNumberNext (leftoff );