@@ -105,7 +105,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
105
105
{
106
106
OffsetNumber mid = low + ((high - low ) / 2 );
107
107
108
- pitem = ( PostingItem * ) GinDataPageGetItem (page , mid );
108
+ pitem = GinDataPageGetPostingItem (page , mid );
109
109
110
110
if (mid == maxoff )
111
111
{
@@ -117,7 +117,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
117
117
}
118
118
else
119
119
{
120
- pitem = ( PostingItem * ) GinDataPageGetItem (page , mid );
120
+ pitem = GinDataPageGetPostingItem (page , mid );
121
121
result = ginCompareItemPointers (btree -> items + btree -> curitem , & (pitem -> key ));
122
122
}
123
123
@@ -135,7 +135,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
135
135
Assert (high >= FirstOffsetNumber && high <= maxoff );
136
136
137
137
stack -> off = high ;
138
- pitem = ( PostingItem * ) GinDataPageGetItem (page , high );
138
+ pitem = GinDataPageGetPostingItem (page , high );
139
139
return PostingItemGetBlockNumber (pitem );
140
140
}
141
141
@@ -176,7 +176,8 @@ dataLocateLeafItem(GinBtree btree, GinBtreeStack *stack)
176
176
{
177
177
OffsetNumber mid = low + ((high - low ) / 2 );
178
178
179
- result = ginCompareItemPointers (btree -> items + btree -> curitem , (ItemPointer ) GinDataPageGetItem (page , mid ));
179
+ result = ginCompareItemPointers (btree -> items + btree -> curitem ,
180
+ GinDataPageGetItemPointer (page , mid ));
180
181
181
182
if (result == 0 )
182
183
{
@@ -210,7 +211,7 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor
210
211
/* if page isn't changed, we return storedOff */
211
212
if (storedOff >= FirstOffsetNumber && storedOff <= maxoff )
212
213
{
213
- pitem = ( PostingItem * ) GinDataPageGetItem (page , storedOff );
214
+ pitem = GinDataPageGetPostingItem (page , storedOff );
214
215
if (PostingItemGetBlockNumber (pitem ) == blkno )
215
216
return storedOff ;
216
217
@@ -220,7 +221,7 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor
220
221
*/
221
222
for (i = storedOff + 1 ; i <= maxoff ; i ++ )
222
223
{
223
- pitem = ( PostingItem * ) GinDataPageGetItem (page , i );
224
+ pitem = GinDataPageGetPostingItem (page , i );
224
225
if (PostingItemGetBlockNumber (pitem ) == blkno )
225
226
return i ;
226
227
}
@@ -231,7 +232,7 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor
231
232
/* last chance */
232
233
for (i = FirstOffsetNumber ; i <= maxoff ; i ++ )
233
234
{
234
- pitem = ( PostingItem * ) GinDataPageGetItem (page , i );
235
+ pitem = GinDataPageGetPostingItem (page , i );
235
236
if (PostingItemGetBlockNumber (pitem ) == blkno )
236
237
return i ;
237
238
}
@@ -251,33 +252,62 @@ dataGetLeftMostPage(GinBtree btree, Page page)
251
252
Assert (GinPageIsData (page ));
252
253
Assert (GinPageGetOpaque (page )-> maxoff >= FirstOffsetNumber );
253
254
254
- pitem = ( PostingItem * ) GinDataPageGetItem (page , FirstOffsetNumber );
255
+ pitem = GinDataPageGetPostingItem (page , FirstOffsetNumber );
255
256
return PostingItemGetBlockNumber (pitem );
256
257
}
257
258
258
259
/*
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.
261
261
*/
262
262
void
263
- GinDataPageAddItem (Page page , void * data , OffsetNumber offset )
263
+ GinDataPageAddItemPointer (Page page , ItemPointer data , OffsetNumber offset )
264
264
{
265
265
OffsetNumber maxoff = GinPageGetOpaque (page )-> maxoff ;
266
266
char * ptr ;
267
267
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
+
268
298
if (offset == InvalidOffsetNumber )
269
299
{
270
- ptr = GinDataPageGetItem (page , maxoff + 1 );
300
+ ptr = ( char * ) GinDataPageGetPostingItem (page , maxoff + 1 );
271
301
}
272
302
else
273
303
{
274
- ptr = GinDataPageGetItem (page , offset );
304
+ ptr = ( char * ) GinDataPageGetPostingItem (page , offset );
275
305
if (maxoff + 1 - offset != 0 )
276
- memmove (ptr + GinSizeOfDataPageItem ( page ),
306
+ memmove (ptr + sizeof ( PostingItem ),
277
307
ptr ,
278
- (maxoff - offset + 1 ) * GinSizeOfDataPageItem ( page ));
308
+ (maxoff - offset + 1 ) * sizeof ( PostingItem ));
279
309
}
280
- memcpy (ptr , data , GinSizeOfDataPageItem ( page ));
310
+ memcpy (ptr , data , sizeof ( PostingItem ));
281
311
282
312
GinPageGetOpaque (page )-> maxoff ++ ;
283
313
}
@@ -294,7 +324,8 @@ GinPageDeletePostingItem(Page page, OffsetNumber offset)
294
324
Assert (offset >= FirstOffsetNumber && offset <= maxoff );
295
325
296
326
if (offset != maxoff )
297
- memmove (GinDataPageGetItem (page , offset ), GinDataPageGetItem (page , offset + 1 ),
327
+ memmove (GinDataPageGetPostingItem (page , offset ),
328
+ GinDataPageGetPostingItem (page , offset + 1 ),
298
329
sizeof (PostingItem ) * (maxoff - offset ));
299
330
300
331
GinPageGetOpaque (page )-> maxoff -- ;
@@ -342,7 +373,7 @@ dataPrepareData(GinBtree btree, Page page, OffsetNumber off)
342
373
343
374
if (!GinPageIsLeaf (page ) && btree -> rightblkno != InvalidBlockNumber )
344
375
{
345
- PostingItem * pitem = ( PostingItem * ) GinDataPageGetItem (page , off );
376
+ PostingItem * pitem = GinDataPageGetPostingItem (page , off );
346
377
347
378
PostingItemSetBlockNumber (pitem , btree -> rightblkno );
348
379
ret = btree -> rightblkno ;
@@ -418,7 +449,7 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prda
418
449
419
450
while (btree -> curitem < btree -> nitem )
420
451
{
421
- GinDataPageAddItem (page , btree -> items + btree -> curitem , off );
452
+ GinDataPageAddItemPointer (page , btree -> items + btree -> curitem , off );
422
453
off ++ ;
423
454
btree -> curitem ++ ;
424
455
}
@@ -427,12 +458,12 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prda
427
458
}
428
459
else
429
460
{
430
- GinDataPageAddItem (page , btree -> items + btree -> curitem , off );
461
+ GinDataPageAddItemPointer (page , btree -> items + btree -> curitem , off );
431
462
btree -> curitem ++ ;
432
463
}
433
464
}
434
465
else
435
- GinDataPageAddItem (page , & (btree -> pitem ), off );
466
+ GinDataPageAddPostingItem (page , & (btree -> pitem ), off );
436
467
}
437
468
438
469
/*
@@ -448,6 +479,7 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
448
479
OffsetNumber separator ;
449
480
ItemPointer bound ;
450
481
Page lpage = PageGetTempPageCopy (BufferGetPage (lbuf ));
482
+ bool isleaf = GinPageIsLeaf (lpage );
451
483
ItemPointerData oldbound = * GinDataPageGetRightBound (lpage );
452
484
int sizeofitem = GinSizeOfDataPageItem (lpage );
453
485
OffsetNumber maxoff = GinPageGetOpaque (lpage )-> maxoff ;
@@ -469,10 +501,20 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
469
501
InvalidOffsetNumber : PostingItemGetBlockNumber (& (btree -> pitem ));
470
502
data .updateBlkno = dataPrepareData (btree , lpage , off );
471
503
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
+ }
474
516
475
- if (GinPageIsLeaf ( lpage ) && GinPageRightMost (lpage ) && off > GinPageGetOpaque (lpage )-> maxoff )
517
+ if (isleaf && GinPageRightMost (lpage ) && off > GinPageGetOpaque (lpage )-> maxoff )
476
518
{
477
519
nCopied = 0 ;
478
520
while (btree -> curitem < btree -> nitem &&
@@ -491,7 +533,7 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
491
533
ptr = vector + (off - 1 ) * sizeofitem ;
492
534
if (maxoff + 1 - off != 0 )
493
535
memmove (ptr + sizeofitem , ptr , (maxoff - off + 1 ) * sizeofitem );
494
- if (GinPageIsLeaf ( lpage ) )
536
+ if (isleaf )
495
537
{
496
538
memcpy (ptr , btree -> items + btree -> curitem , sizeofitem );
497
539
btree -> curitem ++ ;
@@ -514,19 +556,32 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
514
556
GinInitPage (rpage , GinPageGetOpaque (lpage )-> flags , pageSize );
515
557
GinInitPage (lpage , GinPageGetOpaque (rpage )-> flags , pageSize );
516
558
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
+
518
566
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
+
521
576
GinPageGetOpaque (rpage )-> maxoff = maxoff - separator ;
522
577
523
578
PostingItemSetBlockNumber (& (btree -> pitem ), BufferGetBlockNumber (lbuf ));
524
579
if (GinPageIsLeaf (lpage ))
525
- btree -> pitem .key = * ( ItemPointerData * ) GinDataPageGetItem (lpage ,
580
+ btree -> pitem .key = * GinDataPageGetItemPointer (lpage ,
526
581
GinPageGetOpaque (lpage )-> maxoff );
527
582
else
528
- btree -> pitem .key = (( PostingItem * ) GinDataPageGetItem (lpage ,
529
- GinPageGetOpaque (lpage )-> maxoff )) -> key ;
583
+ btree -> pitem .key = GinDataPageGetPostingItem (lpage ,
584
+ GinPageGetOpaque (lpage )-> maxoff )-> key ;
530
585
btree -> rightblkno = BufferGetBlockNumber (rbuf );
531
586
532
587
/* set up right bound for left page */
@@ -576,11 +631,11 @@ ginDataFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf)
576
631
577
632
li .key = * GinDataPageGetRightBound (lpage );
578
633
PostingItemSetBlockNumber (& li , BufferGetBlockNumber (lbuf ));
579
- GinDataPageAddItem (page , & li , InvalidOffsetNumber );
634
+ GinDataPageAddPostingItem (page , & li , InvalidOffsetNumber );
580
635
581
636
ri .key = * GinDataPageGetRightBound (rpage );
582
637
PostingItemSetBlockNumber (& ri , BufferGetBlockNumber (rbuf ));
583
- GinDataPageAddItem (page , & ri , InvalidOffsetNumber );
638
+ GinDataPageAddPostingItem (page , & ri , InvalidOffsetNumber );
584
639
}
585
640
586
641
void
0 commit comments