@@ -51,9 +51,15 @@ _bt_restore_page(Page page, char *from, int len)
51
51
i = 0 ;
52
52
while (from < end )
53
53
{
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
+ */
55
61
memcpy (& itupdata ,from ,sizeof (IndexTupleData ));
56
- itemsz = IndexTupleDSize ( itupdata );
62
+ itemsz = IndexTupleSize ( & itupdata );
57
63
itemsz = MAXALIGN (itemsz );
58
64
59
65
items [i ]= (Item )from ;
@@ -205,7 +211,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
205
211
BTPageOpaque ropaque ;
206
212
char * datapos ;
207
213
Size datalen ;
208
- Item left_hikey = NULL ;
214
+ IndexTuple left_hikey = NULL ;
209
215
Size left_hikeysz = 0 ;
210
216
BlockNumber leftsib ;
211
217
BlockNumber rightsib ;
@@ -248,7 +254,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
248
254
{
249
255
ItemId hiItemId = PageGetItemId (rpage ,P_FIRSTDATAKEY (ropaque ));
250
256
251
- left_hikey = PageGetItem (rpage ,hiItemId );
257
+ left_hikey = ( IndexTuple ) PageGetItem (rpage ,hiItemId );
252
258
left_hikeysz = ItemIdGetLength (hiItemId );
253
259
}
254
260
@@ -272,7 +278,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
272
278
Page lpage = (Page )BufferGetPage (lbuf );
273
279
BTPageOpaque lopaque = (BTPageOpaque )PageGetSpecialPointer (lpage );
274
280
OffsetNumber off ;
275
- Item newitem = NULL ;
281
+ IndexTuple newitem = NULL ;
276
282
Size newitemsz = 0 ;
277
283
Page newlpage ;
278
284
OffsetNumber leftoff ;
@@ -281,7 +287,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
281
287
282
288
if (onleft )
283
289
{
284
- newitem = (Item )datapos ;
290
+ newitem = (IndexTuple )datapos ;
285
291
newitemsz = MAXALIGN (IndexTupleSize (newitem ));
286
292
datapos += newitemsz ;
287
293
datalen -= newitemsz ;
@@ -290,7 +296,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
290
296
/* Extract left hikey and its size (assuming 16-bit alignment) */
291
297
if (!isleaf )
292
298
{
293
- left_hikey = (Item )datapos ;
299
+ left_hikey = (IndexTuple )datapos ;
294
300
left_hikeysz = MAXALIGN (IndexTupleSize (left_hikey ));
295
301
datapos += left_hikeysz ;
296
302
datalen -= left_hikeysz ;
@@ -301,7 +307,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
301
307
302
308
/* Set high key */
303
309
leftoff = P_HIKEY ;
304
- if (PageAddItem (newlpage ,left_hikey ,left_hikeysz ,
310
+ if (PageAddItem (newlpage ,( Item ) left_hikey ,left_hikeysz ,
305
311
P_HIKEY , false, false)== InvalidOffsetNumber )
306
312
elog (PANIC ,"failed to add high key to left page after split" );
307
313
leftoff = OffsetNumberNext (leftoff );
@@ -310,21 +316,21 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
310
316
{
311
317
ItemId itemid ;
312
318
Size itemsz ;
313
- Item item ;
319
+ IndexTuple item ;
314
320
315
321
/* add the new item if it was inserted on left page */
316
322
if (onleft && off == xlrec -> newitemoff )
317
323
{
318
- if (PageAddItem (newlpage ,newitem ,newitemsz ,leftoff ,
324
+ if (PageAddItem (newlpage ,( Item ) newitem ,newitemsz ,leftoff ,
319
325
false, false)== InvalidOffsetNumber )
320
326
elog (ERROR ,"failed to add new item to left page after split" );
321
327
leftoff = OffsetNumberNext (leftoff );
322
328
}
323
329
324
330
itemid = PageGetItemId (lpage ,off );
325
331
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 ,
328
334
false, false)== InvalidOffsetNumber )
329
335
elog (ERROR ,"failed to add old item to left page after split" );
330
336
leftoff = OffsetNumberNext (leftoff );
@@ -333,7 +339,7 @@ btree_xlog_split(bool onleft, XLogReaderState *record)
333
339
/* cope with possibility that newitem goes at the end */
334
340
if (onleft && off == xlrec -> newitemoff )
335
341
{
336
- if (PageAddItem (newlpage ,newitem ,newitemsz ,leftoff ,
342
+ if (PageAddItem (newlpage ,( Item ) newitem ,newitemsz ,leftoff ,
337
343
false, false)== InvalidOffsetNumber )
338
344
elog (ERROR ,"failed to add new item to left page after split" );
339
345
leftoff = OffsetNumberNext (leftoff );