@@ -54,7 +54,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
5454 {
5555 stack -> off = FirstOffsetNumber ;
5656 stack -> predictNumber *= GinPageGetOpaque (page )-> maxoff ;
57- return btree -> getLeftMostPage (btree , page );
57+ return btree -> getLeftMostChild (btree , page );
5858 }
5959
6060 low = FirstOffsetNumber ;
@@ -680,17 +680,10 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems,
680680 */
681681 if (nitems > nrootitems )
682682 {
683- GinPostingTreeScan * gdi ;
684-
685- gdi = ginPrepareScanPostingTree (index , blkno , FALSE);
686- gdi -> btree .isBuild = (buildStats != NULL );
687-
688- ginInsertItemPointers (gdi ,
683+ ginInsertItemPointers (index , blkno ,
689684 items + nrootitems ,
690685 nitems - nrootitems ,
691686 buildStats );
692-
693- pfree (gdi );
694687 }
695688
696689 return blkno ;
@@ -704,76 +697,69 @@ ginPrepareDataScan(GinBtree btree, Relation index)
704697 btree -> index = index ;
705698
706699 btree -> findChildPage = dataLocateItem ;
700+ btree -> getLeftMostChild = dataGetLeftMostPage ;
707701 btree -> isMoveRight = dataIsMoveRight ;
708702 btree -> findItem = dataLocateLeafItem ;
709703 btree -> findChildPtr = dataFindChildPtr ;
710- btree -> getLeftMostPage = dataGetLeftMostPage ;
711704 btree -> placeToPage = dataPlaceToPage ;
712705 btree -> splitPage = dataSplitPage ;
713706 btree -> fillRoot = ginDataFillRoot ;
714707
715708 btree -> isData = TRUE;
716- btree -> searchMode = FALSE;
717709 btree -> isDelete = FALSE;
718710 btree -> fullScan = FALSE;
719711 btree -> isBuild = FALSE;
720712}
721713
722- GinPostingTreeScan *
723- ginPrepareScanPostingTree (Relation index , BlockNumber rootBlkno , bool searchMode )
724- {
725- GinPostingTreeScan * gdi = (GinPostingTreeScan * ) palloc0 (sizeof (GinPostingTreeScan ));
726-
727- ginPrepareDataScan (& gdi -> btree , index );
728-
729- gdi -> btree .searchMode = searchMode ;
730- gdi -> btree .fullScan = searchMode ;
731-
732- gdi -> stack = ginPrepareFindLeafPage (& gdi -> btree , rootBlkno );
733-
734- return gdi ;
735- }
736-
737714/*
738715 * Inserts array of item pointers, may execute several tree scan (very rare)
739716 */
740717void
741- ginInsertItemPointers (GinPostingTreeScan * gdi ,
718+ ginInsertItemPointers (Relation index , BlockNumber rootBlkno ,
742719 ItemPointerData * items , uint32 nitem ,
743720 GinStatsData * buildStats )
744721{
745- BlockNumber rootBlkno = gdi -> stack -> blkno ;
722+ GinBtreeData btree ;
723+ GinBtreeStack * stack ;
746724
747- gdi -> btree .items = items ;
748- gdi -> btree .nitem = nitem ;
749- gdi -> btree .curitem = 0 ;
725+ ginPrepareDataScan (& btree , index );
726+ btree .isBuild = (buildStats != NULL );
727+ btree .items = items ;
728+ btree .nitem = nitem ;
729+ btree .curitem = 0 ;
750730
751- while (gdi -> btree .curitem < gdi -> btree .nitem )
731+ while (btree .curitem < btree .nitem )
752732 {
753- if (!gdi -> stack )
754- gdi -> stack = ginPrepareFindLeafPage (& gdi -> btree , rootBlkno );
755-
756- gdi -> stack = ginFindLeafPage (& gdi -> btree , gdi -> stack );
733+ stack = ginFindLeafPage (& btree , rootBlkno , false);
757734
758- if (gdi -> btree .findItem (& ( gdi -> btree ), gdi -> stack ))
735+ if (btree .findItem (& btree , stack ))
759736 {
760737 /*
761- * gdi-> btree.items[gdi-> btree.curitem] already exists in index
738+ * btree.items[btree.curitem] already exists in index
762739 */
763- gdi -> btree .curitem ++ ;
764- LockBuffer (gdi -> stack -> buffer , GIN_UNLOCK );
765- freeGinBtreeStack (gdi -> stack );
740+ btree .curitem ++ ;
741+ LockBuffer (stack -> buffer , GIN_UNLOCK );
742+ freeGinBtreeStack (stack );
766743 }
767744 else
768- ginInsertValue (& (gdi -> btree ), gdi -> stack , buildStats );
769-
770- gdi -> stack = NULL ;
745+ ginInsertValue (& btree , stack , buildStats );
771746 }
772747}
773748
774- Buffer
775- ginScanBeginPostingTree (GinPostingTreeScan * gdi )
749+ /*
750+ * Starts a new scan on a posting tree.
751+ */
752+ GinBtreeStack *
753+ ginScanBeginPostingTree (Relation index , BlockNumber rootBlkno )
776754{
777- gdi -> stack = ginFindLeafPage (& gdi -> btree , gdi -> stack );
778- return gdi -> stack -> buffer ;
755+ GinBtreeData btree ;
756+ GinBtreeStack * stack ;
757+
758+ ginPrepareDataScan (& btree , index );
759+
760+ btree .fullScan = TRUE;
761+
762+ stack = ginFindLeafPage (& btree , rootBlkno , TRUE);
763+
764+ return stack ;
779765}
0 commit comments