@@ -570,8 +570,7 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
570570 Size lsize = 0 ,
571571 size ;
572572 char * ptr ;
573- IndexTuple itup ,
574- leftrightmost = NULL ;
573+ IndexTuple itup ;
575574 Page page ;
576575 Page lpage = PageGetTempPageCopy (BufferGetPage (lbuf ));
577576 Page rpage = BufferGetPage (rbuf );
@@ -635,7 +634,6 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
635634 }
636635 else
637636 {
638- leftrightmost = itup ;
639637 lsize += MAXALIGN (IndexTupleSize (itup )) + sizeof (ItemIdData );
640638 }
641639
@@ -645,11 +643,6 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
645643 ptr += MAXALIGN (IndexTupleSize (itup ));
646644 }
647645
648- btree -> entry = GinFormInteriorTuple (leftrightmost , lpage ,
649- BufferGetBlockNumber (lbuf ));
650-
651- btree -> rightblkno = BufferGetBlockNumber (rbuf );
652-
653646 data .node = btree -> index -> rd_node ;
654647 data .rootBlkno = InvalidBlockNumber ;
655648 data .lblkno = BufferGetBlockNumber (lbuf );
@@ -674,19 +667,20 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
674667}
675668
676669/*
677- * return newly allocated rightmost tuple
670+ * Prepare the state in 'btree' for inserting a downlink for given buffer.
678671 */
679- IndexTuple
680- ginPageGetLinkItup ( Buffer buf )
672+ static void
673+ entryPrepareDownlink ( GinBtree btree , Buffer lbuf )
681674{
682- IndexTuple itup ,
683- nitup ;
684- Page page = BufferGetPage (buf );
675+ Page lpage = BufferGetPage (lbuf );
676+ IndexTuple itup ;
685677
686- itup = getRightMostTuple (page );
687- nitup = GinFormInteriorTuple (itup , page , BufferGetBlockNumber (buf ));
678+ itup = getRightMostTuple (lpage );
688679
689- return nitup ;
680+ btree -> entry = GinFormInteriorTuple (itup ,
681+ lpage ,
682+ BufferGetBlockNumber (lbuf ));
683+ btree -> rightblkno = GinPageGetOpaque (lpage )-> rightlink ;
690684}
691685
692686/*
@@ -696,17 +690,21 @@ ginPageGetLinkItup(Buffer buf)
696690void
697691ginEntryFillRoot (GinBtree btree , Buffer root , Buffer lbuf , Buffer rbuf )
698692{
699- Page page ;
693+ Page page = BufferGetPage (root );
694+ Page lpage = BufferGetPage (lbuf );
695+ Page rpage = BufferGetPage (rbuf );
700696 IndexTuple itup ;
701697
702- page = BufferGetPage ( root );
703-
704- itup = ginPageGetLinkItup (lbuf );
698+ itup = GinFormInteriorTuple ( getRightMostTuple ( lpage ),
699+ lpage ,
700+ BufferGetBlockNumber (lbuf ) );
705701 if (PageAddItem (page , (Item ) itup , IndexTupleSize (itup ), InvalidOffsetNumber , false, false) == InvalidOffsetNumber )
706702 elog (ERROR , "failed to add item to index root page" );
707703 pfree (itup );
708704
709- itup = ginPageGetLinkItup (rbuf );
705+ itup = GinFormInteriorTuple (getRightMostTuple (rpage ),
706+ rpage ,
707+ BufferGetBlockNumber (rbuf ));
710708 if (PageAddItem (page , (Item ) itup , IndexTupleSize (itup ), InvalidOffsetNumber , false, false) == InvalidOffsetNumber )
711709 elog (ERROR , "failed to add item to index root page" );
712710 pfree (itup );
@@ -736,6 +734,7 @@ ginPrepareEntryScan(GinBtree btree, OffsetNumber attnum,
736734 btree -> placeToPage = entryPlaceToPage ;
737735 btree -> splitPage = entrySplitPage ;
738736 btree -> fillRoot = ginEntryFillRoot ;
737+ btree -> prepareDownlink = entryPrepareDownlink ;
739738
740739 btree -> isData = FALSE;
741740 btree -> fullScan = FALSE;
0 commit comments