@@ -105,7 +105,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
105105 {
106106 OffsetNumber mid = low + ((high - low ) / 2 );
107107
108- pitem = ( PostingItem * ) GinDataPageGetItem (page , mid );
108+ pitem = GinDataPageGetPostingItem (page , mid );
109109
110110 if (mid == maxoff )
111111 {
@@ -117,7 +117,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
117117 }
118118 else
119119 {
120- pitem = ( PostingItem * ) GinDataPageGetItem (page , mid );
120+ pitem = GinDataPageGetPostingItem (page , mid );
121121 result = ginCompareItemPointers (btree -> items + btree -> curitem , & (pitem -> key ));
122122 }
123123
@@ -135,7 +135,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
135135 Assert (high >= FirstOffsetNumber && high <= maxoff );
136136
137137 stack -> off = high ;
138- pitem = ( PostingItem * ) GinDataPageGetItem (page , high );
138+ pitem = GinDataPageGetPostingItem (page , high );
139139 return PostingItemGetBlockNumber (pitem );
140140}
141141
@@ -176,7 +176,8 @@ dataLocateLeafItem(GinBtree btree, GinBtreeStack *stack)
176176 {
177177 OffsetNumber 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
181182 if (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 */
211212 if (storedOff >= FirstOffsetNumber && storedOff <= maxoff )
212213 {
213- pitem = ( PostingItem * ) GinDataPageGetItem (page , storedOff );
214+ pitem = GinDataPageGetPostingItem (page , storedOff );
214215 if (PostingItemGetBlockNumber (pitem ) == blkno )
215216 return storedOff ;
216217
@@ -220,7 +221,7 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor
220221 */
221222 for (i = storedOff + 1 ; i <= maxoff ; i ++ )
222223 {
223- pitem = ( PostingItem * ) GinDataPageGetItem (page , i );
224+ pitem = GinDataPageGetPostingItem (page , i );
224225 if (PostingItemGetBlockNumber (pitem ) == blkno )
225226 return i ;
226227 }
@@ -231,7 +232,7 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor
231232 /* last chance */
232233 for (i = FirstOffsetNumber ; i <= maxoff ; i ++ )
233234 {
234- pitem = ( PostingItem * ) GinDataPageGetItem (page , i );
235+ pitem = GinDataPageGetPostingItem (page , i );
235236 if (PostingItemGetBlockNumber (pitem ) == blkno )
236237 return i ;
237238 }
@@ -251,33 +252,62 @@ dataGetLeftMostPage(GinBtree btree, Page page)
251252 Assert (GinPageIsData (page ));
252253 Assert (GinPageGetOpaque (page )-> maxoff >= FirstOffsetNumber );
253254
254- pitem = ( PostingItem * ) GinDataPageGetItem (page , FirstOffsetNumber );
255+ pitem = GinDataPageGetPostingItem (page , FirstOffsetNumber );
255256 return 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{
265265 OffsetNumber maxoff = GinPageGetOpaque (page )-> maxoff ;
266266 char * 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+
268298 if (offset == InvalidOffsetNumber )
269299 {
270- ptr = GinDataPageGetItem (page , maxoff + 1 );
300+ ptr = ( char * ) GinDataPageGetPostingItem (page , maxoff + 1 );
271301 }
272302 else
273303 {
274- ptr = GinDataPageGetItem (page , offset );
304+ ptr = ( char * ) GinDataPageGetPostingItem (page , offset );
275305 if (maxoff + 1 - offset != 0 )
276- memmove (ptr + GinSizeOfDataPageItem ( page ),
306+ memmove (ptr + sizeof ( PostingItem ),
277307 ptr ,
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
282312 GinPageGetOpaque (page )-> maxoff ++ ;
283313}
@@ -294,7 +324,8 @@ GinPageDeletePostingItem(Page page, OffsetNumber offset)
294324 Assert (offset >= FirstOffsetNumber && offset <= maxoff );
295325
296326 if (offset != maxoff )
297- memmove (GinDataPageGetItem (page , offset ), GinDataPageGetItem (page , offset + 1 ),
327+ memmove (GinDataPageGetPostingItem (page , offset ),
328+ GinDataPageGetPostingItem (page , offset + 1 ),
298329 sizeof (PostingItem ) * (maxoff - offset ));
299330
300331 GinPageGetOpaque (page )-> maxoff -- ;
@@ -342,7 +373,7 @@ dataPrepareData(GinBtree btree, Page page, OffsetNumber off)
342373
343374 if (!GinPageIsLeaf (page ) && btree -> rightblkno != InvalidBlockNumber )
344375 {
345- PostingItem * pitem = ( PostingItem * ) GinDataPageGetItem (page , off );
376+ PostingItem * pitem = GinDataPageGetPostingItem (page , off );
346377
347378 PostingItemSetBlockNumber (pitem , btree -> rightblkno );
348379 ret = btree -> rightblkno ;
@@ -418,7 +449,7 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prda
418449
419450 while (btree -> curitem < btree -> nitem )
420451 {
421- GinDataPageAddItem (page , btree -> items + btree -> curitem , off );
452+ GinDataPageAddItemPointer (page , btree -> items + btree -> curitem , off );
422453 off ++ ;
423454 btree -> curitem ++ ;
424455 }
@@ -427,12 +458,12 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prda
427458 }
428459 else
429460 {
430- GinDataPageAddItem (page , btree -> items + btree -> curitem , off );
461+ GinDataPageAddItemPointer (page , btree -> items + btree -> curitem , off );
431462 btree -> curitem ++ ;
432463 }
433464 }
434465 else
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
448479 OffsetNumber separator ;
449480 ItemPointer bound ;
450481 Page lpage = PageGetTempPageCopy (BufferGetPage (lbuf ));
482+ bool isleaf = GinPageIsLeaf (lpage );
451483 ItemPointerData oldbound = * GinDataPageGetRightBound (lpage );
452484 int sizeofitem = GinSizeOfDataPageItem (lpage );
453485 OffsetNumber maxoff = GinPageGetOpaque (lpage )-> maxoff ;
@@ -469,10 +501,20 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
469501 InvalidOffsetNumber : PostingItemGetBlockNumber (& (btree -> pitem ));
470502 data .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 {
477519 nCopied = 0 ;
478520 while (btree -> curitem < btree -> nitem &&
@@ -491,7 +533,7 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
491533 ptr = vector + (off - 1 ) * sizeofitem ;
492534 if (maxoff + 1 - off != 0 )
493535 memmove (ptr + sizeofitem , ptr , (maxoff - off + 1 ) * sizeofitem );
494- if (GinPageIsLeaf ( lpage ) )
536+ if (isleaf )
495537 {
496538 memcpy (ptr , btree -> items + btree -> curitem , sizeofitem );
497539 btree -> curitem ++ ;
@@ -514,19 +556,32 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
514556 GinInitPage (rpage , GinPageGetOpaque (lpage )-> flags , pageSize );
515557 GinInitPage (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+
518566 GinPageGetOpaque (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+
521576 GinPageGetOpaque (rpage )-> maxoff = maxoff - separator ;
522577
523578 PostingItemSetBlockNumber (& (btree -> pitem ), BufferGetBlockNumber (lbuf ));
524579 if (GinPageIsLeaf (lpage ))
525- btree -> pitem .key = * ( ItemPointerData * ) GinDataPageGetItem (lpage ,
580+ btree -> pitem .key = * GinDataPageGetItemPointer (lpage ,
526581 GinPageGetOpaque (lpage )-> maxoff );
527582 else
528- btree -> pitem .key = (( PostingItem * ) GinDataPageGetItem (lpage ,
529- GinPageGetOpaque (lpage )-> maxoff )) -> key ;
583+ btree -> pitem .key = GinDataPageGetPostingItem (lpage ,
584+ GinPageGetOpaque (lpage )-> maxoff )-> key ;
530585 btree -> 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
577632 li .key = * GinDataPageGetRightBound (lpage );
578633 PostingItemSetBlockNumber (& li , BufferGetBlockNumber (lbuf ));
579- GinDataPageAddItem (page , & li , InvalidOffsetNumber );
634+ GinDataPageAddPostingItem (page , & li , InvalidOffsetNumber );
580635
581636 ri .key = * GinDataPageGetRightBound (rpage );
582637 PostingItemSetBlockNumber (& ri , BufferGetBlockNumber (rbuf ));
583- GinDataPageAddItem (page , & ri , InvalidOffsetNumber );
638+ GinDataPageAddPostingItem (page , & ri , InvalidOffsetNumber );
584639}
585640
586641void
0 commit comments