@@ -227,6 +227,7 @@ GinDataPageAddItemPointer(Page page, ItemPointer data, OffsetNumber offset)
227
227
OffsetNumber maxoff = GinPageGetOpaque (page )-> maxoff ;
228
228
char * ptr ;
229
229
230
+ Assert (ItemPointerIsValid (data ));
230
231
Assert (GinPageIsLeaf (page ));
231
232
232
233
if (offset == InvalidOffsetNumber )
@@ -255,6 +256,7 @@ GinDataPageAddPostingItem(Page page, PostingItem *data, OffsetNumber offset)
255
256
OffsetNumber maxoff = GinPageGetOpaque (page )-> maxoff ;
256
257
char * ptr ;
257
258
259
+ Assert (PostingItemGetBlockNumber (data ) != InvalidBlockNumber );
258
260
Assert (!GinPageIsLeaf (page ));
259
261
260
262
if (offset == InvalidOffsetNumber )
@@ -338,11 +340,8 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off,
338
340
XLogRecData * * prdata )
339
341
{
340
342
Page page = BufferGetPage (buf );
341
- int cnt = 0 ;
342
-
343
343
/* these must be static so they can be returned to caller */
344
- static XLogRecData rdata [3 ];
345
- static ginxlogInsert data ;
344
+ static XLogRecData rdata [2 ];
346
345
347
346
/* quick exit if it doesn't fit */
348
347
if (!dataIsEnoughSpace (btree , buf , off , insertdata ))
@@ -359,45 +358,10 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off,
359
358
PostingItemSetBlockNumber (pitem , updateblkno );
360
359
}
361
360
362
- data .updateBlkno = updateblkno ;
363
- data .node = btree -> index -> rd_node ;
364
- data .blkno = BufferGetBlockNumber (buf );
365
- data .offset = off ;
366
- data .nitem = 1 ;
367
- data .isDelete = FALSE;
368
- data .isData = TRUE;
369
- data .isLeaf = GinPageIsLeaf (page ) ? TRUE : FALSE;
370
-
371
- /*
372
- * Prevent full page write if child's split occurs. That is needed to
373
- * remove incomplete splits while replaying WAL
374
- *
375
- * data.updateBlkno contains new block number (of newly created right
376
- * page) for recently splited page.
377
- */
378
- if (data .updateBlkno == InvalidBlockNumber )
379
- {
380
- rdata [0 ].buffer = buf ;
381
- rdata [0 ].buffer_std = FALSE;
382
- rdata [0 ].data = NULL ;
383
- rdata [0 ].len = 0 ;
384
- rdata [0 ].next = & rdata [1 ];
385
- cnt ++ ;
386
- }
387
-
388
- rdata [cnt ].buffer = InvalidBuffer ;
389
- rdata [cnt ].data = (char * ) & data ;
390
- rdata [cnt ].len = sizeof (ginxlogInsert );
391
- rdata [cnt ].next = & rdata [cnt + 1 ];
392
- cnt ++ ;
393
-
394
- rdata [cnt ].buffer = InvalidBuffer ;
395
- /* data and len filled in below */
396
- rdata [cnt ].next = NULL ;
397
-
398
361
if (GinPageIsLeaf (page ))
399
362
{
400
363
GinBtreeDataLeafInsertData * items = insertdata ;
364
+ static ginxlogInsertDataLeaf data ;
401
365
uint32 savedPos = items -> curitem ;
402
366
403
367
if (GinPageRightMost (page ) && off > GinPageGetOpaque (page )-> maxoff )
@@ -415,19 +379,29 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off,
415
379
{
416
380
GinDataPageAddItemPointer (page , items -> items + items -> curitem , off );
417
381
items -> curitem ++ ;
382
+ data .nitem = 1 ;
418
383
}
419
384
420
- rdata [cnt ].data = (char * ) & items -> items [savedPos ];
421
- rdata [cnt ].len = sizeof (ItemPointerData ) * data .nitem ;
385
+ rdata [0 ].buffer = InvalidBuffer ;
386
+ rdata [0 ].data = (char * ) & data ;
387
+ rdata [0 ].len = offsetof(ginxlogInsertDataLeaf , items );
388
+ rdata [0 ].next = & rdata [1 ];
389
+
390
+ rdata [1 ].buffer = InvalidBuffer ;
391
+ rdata [1 ].data = (char * ) & items -> items [savedPos ];
392
+ rdata [1 ].len = sizeof (ItemPointerData ) * data .nitem ;
393
+ rdata [1 ].next = NULL ;
422
394
}
423
395
else
424
396
{
425
397
PostingItem * pitem = insertdata ;
426
398
427
399
GinDataPageAddPostingItem (page , pitem , off );
428
400
429
- rdata [cnt ].data = (char * ) pitem ;
430
- rdata [cnt ].len = sizeof (PostingItem );
401
+ rdata [0 ].buffer = InvalidBuffer ;
402
+ rdata [0 ].data = (char * ) pitem ;
403
+ rdata [0 ].len = sizeof (PostingItem );
404
+ rdata [0 ].next = NULL ;
431
405
}
432
406
433
407
return true;
@@ -456,8 +430,8 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off,
456
430
Size freeSpace ;
457
431
458
432
/* these must be static so they can be returned to caller */
459
- static ginxlogSplit data ;
460
- static XLogRecData rdata [4 ];
433
+ static ginxlogSplitData data ;
434
+ static XLogRecData rdata [2 ];
461
435
static char vector [2 * BLCKSZ ];
462
436
463
437
GinInitPage (rpage , GinPageGetOpaque (lpage )-> flags , pageSize );
@@ -488,6 +462,7 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off,
488
462
489
463
if (isleaf && GinPageRightMost (lpage ) && off > GinPageGetOpaque (lpage )-> maxoff )
490
464
{
465
+ /* append new items to the end */
491
466
GinBtreeDataLeafInsertData * items = insertdata ;
492
467
493
468
while (items -> curitem < items -> nitem &&
@@ -566,25 +541,18 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off,
566
541
bound = GinDataPageGetRightBound (rpage );
567
542
* bound = oldbound ;
568
543
569
- data .node = btree -> index -> rd_node ;
570
- data .rootBlkno = InvalidBlockNumber ;
571
- data .lblkno = BufferGetBlockNumber (lbuf );
572
- data .rblkno = BufferGetBlockNumber (rbuf );
573
544
data .separator = separator ;
574
545
data .nitem = maxoff ;
575
- data .isData = TRUE;
576
- data .isLeaf = GinPageIsLeaf (lpage ) ? TRUE : FALSE;
577
- data .isRootSplit = FALSE;
578
546
data .rightbound = oldbound ;
579
547
580
548
rdata [0 ].buffer = InvalidBuffer ;
581
549
rdata [0 ].data = (char * ) & data ;
582
- rdata [0 ].len = sizeof (ginxlogSplit );
550
+ rdata [0 ].len = sizeof (ginxlogSplitData );
583
551
rdata [0 ].next = & rdata [1 ];
584
552
585
553
rdata [1 ].buffer = InvalidBuffer ;
586
554
rdata [1 ].data = vector ;
587
- rdata [1 ].len = MAXALIGN ( maxoff * sizeofitem ) ;
555
+ rdata [1 ].len = maxoff * sizeofitem ;
588
556
rdata [1 ].next = NULL ;
589
557
590
558
return lpage ;
@@ -610,21 +578,18 @@ dataPrepareDownlink(GinBtree btree, Buffer lbuf)
610
578
* Also called from ginxlog, should not use btree
611
579
*/
612
580
void
613
- ginDataFillRoot (GinBtree btree , Buffer root , Buffer lbuf , Buffer rbuf )
581
+ ginDataFillRoot (GinBtree btree , Page root , BlockNumber lblkno , Page lpage , BlockNumber rblkno , Page rpage )
614
582
{
615
- Page page = BufferGetPage (root ),
616
- lpage = BufferGetPage (lbuf ),
617
- rpage = BufferGetPage (rbuf );
618
583
PostingItem li ,
619
584
ri ;
620
585
621
586
li .key = * GinDataPageGetRightBound (lpage );
622
- PostingItemSetBlockNumber (& li , BufferGetBlockNumber ( lbuf ) );
623
- GinDataPageAddPostingItem (page , & li , InvalidOffsetNumber );
587
+ PostingItemSetBlockNumber (& li , lblkno );
588
+ GinDataPageAddPostingItem (root , & li , InvalidOffsetNumber );
624
589
625
590
ri .key = * GinDataPageGetRightBound (rpage );
626
- PostingItemSetBlockNumber (& ri , BufferGetBlockNumber ( rbuf ) );
627
- GinDataPageAddPostingItem (page , & ri , InvalidOffsetNumber );
591
+ PostingItemSetBlockNumber (& ri , rblkno );
592
+ GinDataPageAddPostingItem (root , & ri , InvalidOffsetNumber );
628
593
}
629
594
630
595
/*
0 commit comments