@@ -105,7 +105,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
105105{
106106OffsetNumber mid = low + ((high - low ) /2 );
107107
108- pitem = ( PostingItem * ) GinDataPageGetItem (page ,mid );
108+ pitem = GinDataPageGetPostingItem (page ,mid );
109109
110110if (mid == maxoff )
111111{
@@ -117,7 +117,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
117117}
118118else
119119{
120- pitem = ( PostingItem * ) GinDataPageGetItem (page ,mid );
120+ pitem = GinDataPageGetPostingItem (page ,mid );
121121result = ginCompareItemPointers (btree -> items + btree -> curitem ,& (pitem -> key ));
122122}
123123
@@ -135,7 +135,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
135135Assert (high >=FirstOffsetNumber && high <=maxoff );
136136
137137stack -> off = high ;
138- pitem = ( PostingItem * ) GinDataPageGetItem (page ,high );
138+ pitem = GinDataPageGetPostingItem (page ,high );
139139return PostingItemGetBlockNumber (pitem );
140140}
141141
@@ -176,7 +176,8 @@ dataLocateLeafItem(GinBtree btree, GinBtreeStack *stack)
176176{
177177OffsetNumber mid = low + ((high - low ) /2 );
178178
179- result = ginCompareItemPointers (btree -> items + btree -> curitem , (ItemPointer )GinDataPageGetItem (page ,mid ));
179+ result = ginCompareItemPointers (btree -> items + btree -> curitem ,
180+ GinDataPageGetItemPointer (page ,mid ));
180181
181182if (result == 0 )
182183{
@@ -210,7 +211,7 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor
210211/* if page isn't changed, we return storedOff */
211212if (storedOff >=FirstOffsetNumber && storedOff <=maxoff )
212213{
213- pitem = ( PostingItem * ) GinDataPageGetItem (page ,storedOff );
214+ pitem = GinDataPageGetPostingItem (page ,storedOff );
214215if (PostingItemGetBlockNumber (pitem )== blkno )
215216return storedOff ;
216217
@@ -220,7 +221,7 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor
220221 */
221222for (i = storedOff + 1 ;i <=maxoff ;i ++ )
222223{
223- pitem = ( PostingItem * ) GinDataPageGetItem (page ,i );
224+ pitem = GinDataPageGetPostingItem (page ,i );
224225if (PostingItemGetBlockNumber (pitem )== blkno )
225226return i ;
226227}
@@ -231,7 +232,7 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor
231232/* last chance */
232233for (i = FirstOffsetNumber ;i <=maxoff ;i ++ )
233234{
234- pitem = ( PostingItem * ) GinDataPageGetItem (page ,i );
235+ pitem = GinDataPageGetPostingItem (page ,i );
235236if (PostingItemGetBlockNumber (pitem )== blkno )
236237return i ;
237238}
@@ -251,33 +252,62 @@ dataGetLeftMostPage(GinBtree btree, Page page)
251252Assert (GinPageIsData (page ));
252253Assert (GinPageGetOpaque (page )-> maxoff >=FirstOffsetNumber );
253254
254- pitem = ( PostingItem * ) GinDataPageGetItem (page ,FirstOffsetNumber );
255+ pitem = GinDataPageGetPostingItem (page ,FirstOffsetNumber );
255256return PostingItemGetBlockNumber (pitem );
256257}
257258
258259/*
259- * add ItemPointer or PostingItem to page. data should point to
260- * correct value! depending on leaf or non-leaf page
260+ * add ItemPointer to a leaf page.
261261 */
262262void
263- GinDataPageAddItem (Page page ,void * data ,OffsetNumber offset )
263+ GinDataPageAddItemPointer (Page page ,ItemPointer data ,OffsetNumber offset )
264264{
265265OffsetNumber maxoff = GinPageGetOpaque (page )-> maxoff ;
266266char * ptr ;
267267
268+ Assert (GinPageIsLeaf (page ));
269+
270+ if (offset == InvalidOffsetNumber )
271+ {
272+ ptr = (char * )GinDataPageGetItemPointer (page ,maxoff + 1 );
273+ }
274+ else
275+ {
276+ ptr = (char * )GinDataPageGetItemPointer (page ,offset );
277+ if (maxoff + 1 - offset != 0 )
278+ memmove (ptr + sizeof (ItemPointerData ),
279+ ptr ,
280+ (maxoff - offset + 1 )* sizeof (ItemPointerData ));
281+ }
282+ memcpy (ptr ,data ,sizeof (ItemPointerData ));
283+
284+ GinPageGetOpaque (page )-> maxoff ++ ;
285+ }
286+
287+ /*
288+ * add PostingItem to a non-leaf page.
289+ */
290+ void
291+ GinDataPageAddPostingItem (Page page ,PostingItem * data ,OffsetNumber offset )
292+ {
293+ OffsetNumber maxoff = GinPageGetOpaque (page )-> maxoff ;
294+ char * ptr ;
295+
296+ Assert (!GinPageIsLeaf (page ));
297+
268298if (offset == InvalidOffsetNumber )
269299{
270- ptr = GinDataPageGetItem (page ,maxoff + 1 );
300+ ptr = ( char * ) GinDataPageGetPostingItem (page ,maxoff + 1 );
271301}
272302else
273303{
274- ptr = GinDataPageGetItem (page ,offset );
304+ ptr = ( char * ) GinDataPageGetPostingItem (page ,offset );
275305if (maxoff + 1 - offset != 0 )
276- memmove (ptr + GinSizeOfDataPageItem ( page ),
306+ memmove (ptr + sizeof ( PostingItem ),
277307ptr ,
278- (maxoff - offset + 1 )* GinSizeOfDataPageItem ( page ));
308+ (maxoff - offset + 1 )* sizeof ( PostingItem ));
279309}
280- memcpy (ptr ,data ,GinSizeOfDataPageItem ( page ));
310+ memcpy (ptr ,data ,sizeof ( PostingItem ));
281311
282312GinPageGetOpaque (page )-> maxoff ++ ;
283313}
@@ -294,7 +324,8 @@ GinPageDeletePostingItem(Page page, OffsetNumber offset)
294324Assert (offset >=FirstOffsetNumber && offset <=maxoff );
295325
296326if (offset != maxoff )
297- memmove (GinDataPageGetItem (page ,offset ),GinDataPageGetItem (page ,offset + 1 ),
327+ memmove (GinDataPageGetPostingItem (page ,offset ),
328+ GinDataPageGetPostingItem (page ,offset + 1 ),
298329sizeof (PostingItem )* (maxoff - offset ));
299330
300331GinPageGetOpaque (page )-> maxoff -- ;
@@ -342,7 +373,7 @@ dataPrepareData(GinBtree btree, Page page, OffsetNumber off)
342373
343374if (!GinPageIsLeaf (page )&& btree -> rightblkno != InvalidBlockNumber )
344375{
345- PostingItem * pitem = ( PostingItem * ) GinDataPageGetItem (page ,off );
376+ PostingItem * pitem = GinDataPageGetPostingItem (page ,off );
346377
347378PostingItemSetBlockNumber (pitem ,btree -> rightblkno );
348379ret = btree -> rightblkno ;
@@ -418,7 +449,7 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prda
418449
419450while (btree -> curitem < btree -> nitem )
420451{
421- GinDataPageAddItem (page ,btree -> items + btree -> curitem ,off );
452+ GinDataPageAddItemPointer (page ,btree -> items + btree -> curitem ,off );
422453off ++ ;
423454btree -> curitem ++ ;
424455}
@@ -427,12 +458,12 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prda
427458}
428459else
429460{
430- GinDataPageAddItem (page ,btree -> items + btree -> curitem ,off );
461+ GinDataPageAddItemPointer (page ,btree -> items + btree -> curitem ,off );
431462btree -> curitem ++ ;
432463}
433464}
434465else
435- GinDataPageAddItem (page ,& (btree -> pitem ),off );
466+ GinDataPageAddPostingItem (page ,& (btree -> pitem ),off );
436467}
437468
438469/*
@@ -448,6 +479,7 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
448479OffsetNumber separator ;
449480ItemPointer bound ;
450481Page lpage = PageGetTempPageCopy (BufferGetPage (lbuf ));
482+ bool isleaf = GinPageIsLeaf (lpage );
451483ItemPointerData oldbound = * GinDataPageGetRightBound (lpage );
452484int sizeofitem = GinSizeOfDataPageItem (lpage );
453485OffsetNumber maxoff = GinPageGetOpaque (lpage )-> maxoff ;
@@ -469,10 +501,20 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
469501InvalidOffsetNumber :PostingItemGetBlockNumber (& (btree -> pitem ));
470502data .updateBlkno = dataPrepareData (btree ,lpage ,off );
471503
472- memcpy (vector ,GinDataPageGetItem (lpage ,FirstOffsetNumber ),
473- maxoff * sizeofitem );
504+ if (isleaf )
505+ {
506+ memcpy (vector ,
507+ GinDataPageGetItemPointer (lpage ,FirstOffsetNumber ),
508+ maxoff * sizeof (ItemPointerData ));
509+ }
510+ else
511+ {
512+ memcpy (vector ,
513+ GinDataPageGetPostingItem (lpage ,FirstOffsetNumber ),
514+ maxoff * sizeof (PostingItem ));
515+ }
474516
475- if (GinPageIsLeaf ( lpage ) && GinPageRightMost (lpage )&& off > GinPageGetOpaque (lpage )-> maxoff )
517+ if (isleaf && GinPageRightMost (lpage )&& off > GinPageGetOpaque (lpage )-> maxoff )
476518{
477519nCopied = 0 ;
478520while (btree -> curitem < btree -> nitem &&
@@ -491,7 +533,7 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
491533ptr = vector + (off - 1 )* sizeofitem ;
492534if (maxoff + 1 - off != 0 )
493535memmove (ptr + sizeofitem ,ptr , (maxoff - off + 1 )* sizeofitem );
494- if (GinPageIsLeaf ( lpage ) )
536+ if (isleaf )
495537{
496538memcpy (ptr ,btree -> items + btree -> curitem ,sizeofitem );
497539btree -> curitem ++ ;
@@ -514,19 +556,32 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
514556GinInitPage (rpage ,GinPageGetOpaque (lpage )-> flags ,pageSize );
515557GinInitPage (lpage ,GinPageGetOpaque (rpage )-> flags ,pageSize );
516558
517- memcpy (GinDataPageGetItem (lpage ,FirstOffsetNumber ),vector ,separator * sizeofitem );
559+ if (isleaf )
560+ memcpy (GinDataPageGetItemPointer (lpage ,FirstOffsetNumber ),
561+ vector ,separator * sizeof (ItemPointerData ));
562+ else
563+ memcpy (GinDataPageGetPostingItem (lpage ,FirstOffsetNumber ),
564+ vector ,separator * sizeof (PostingItem ));
565+
518566GinPageGetOpaque (lpage )-> maxoff = separator ;
519- memcpy (GinDataPageGetItem (rpage ,FirstOffsetNumber ),
520- vector + separator * sizeofitem , (maxoff - separator )* sizeofitem );
567+ if (isleaf )
568+ memcpy (GinDataPageGetItemPointer (rpage ,FirstOffsetNumber ),
569+ vector + separator * sizeof (ItemPointerData ),
570+ (maxoff - separator )* sizeof (ItemPointerData ));
571+ else
572+ memcpy (GinDataPageGetPostingItem (rpage ,FirstOffsetNumber ),
573+ vector + separator * sizeof (PostingItem ),
574+ (maxoff - separator )* sizeof (PostingItem ));
575+
521576GinPageGetOpaque (rpage )-> maxoff = maxoff - separator ;
522577
523578PostingItemSetBlockNumber (& (btree -> pitem ),BufferGetBlockNumber (lbuf ));
524579if (GinPageIsLeaf (lpage ))
525- btree -> pitem .key = * ( ItemPointerData * ) GinDataPageGetItem (lpage ,
580+ btree -> pitem .key = * GinDataPageGetItemPointer (lpage ,
526581GinPageGetOpaque (lpage )-> maxoff );
527582else
528- btree -> pitem .key = (( PostingItem * ) GinDataPageGetItem (lpage ,
529- GinPageGetOpaque (lpage )-> maxoff )) -> key ;
583+ btree -> pitem .key = GinDataPageGetPostingItem (lpage ,
584+ GinPageGetOpaque (lpage )-> maxoff )-> key ;
530585btree -> rightblkno = BufferGetBlockNumber (rbuf );
531586
532587/* set up right bound for left page */
@@ -576,11 +631,11 @@ ginDataFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf)
576631
577632li .key = * GinDataPageGetRightBound (lpage );
578633PostingItemSetBlockNumber (& li ,BufferGetBlockNumber (lbuf ));
579- GinDataPageAddItem (page ,& li ,InvalidOffsetNumber );
634+ GinDataPageAddPostingItem (page ,& li ,InvalidOffsetNumber );
580635
581636ri .key = * GinDataPageGetRightBound (rpage );
582637PostingItemSetBlockNumber (& ri ,BufferGetBlockNumber (rbuf ));
583- GinDataPageAddItem (page ,& ri ,InvalidOffsetNumber );
638+ GinDataPageAddPostingItem (page ,& ri ,InvalidOffsetNumber );
584639}
585640
586641void