mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Refactor the internal GIN B-tree interface for forming a downlink.
This creates a new gin-btree callback function for creating a downlink for a page. Previously, ginxlog.c duplicated the logic used during normal operation.
This commit is contained in:
@ -570,8 +570,7 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
|
||||
Size lsize = 0,
|
||||
size;
|
||||
char *ptr;
|
||||
IndexTuple itup,
|
||||
leftrightmost = NULL;
|
||||
IndexTuple itup;
|
||||
Page page;
|
||||
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
|
||||
Page rpage = BufferGetPage(rbuf);
|
||||
@ -635,7 +634,6 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
|
||||
}
|
||||
else
|
||||
{
|
||||
leftrightmost = itup;
|
||||
lsize += MAXALIGN(IndexTupleSize(itup)) + sizeof(ItemIdData);
|
||||
}
|
||||
|
||||
@ -645,11 +643,6 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
|
||||
ptr += MAXALIGN(IndexTupleSize(itup));
|
||||
}
|
||||
|
||||
btree->entry = GinFormInteriorTuple(leftrightmost, lpage,
|
||||
BufferGetBlockNumber(lbuf));
|
||||
|
||||
btree->rightblkno = BufferGetBlockNumber(rbuf);
|
||||
|
||||
data.node = btree->index->rd_node;
|
||||
data.rootBlkno = InvalidBlockNumber;
|
||||
data.lblkno = BufferGetBlockNumber(lbuf);
|
||||
@ -674,19 +667,20 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
|
||||
}
|
||||
|
||||
/*
|
||||
* return newly allocated rightmost tuple
|
||||
* Prepare the state in 'btree' for inserting a downlink for given buffer.
|
||||
*/
|
||||
IndexTuple
|
||||
ginPageGetLinkItup(Buffer buf)
|
||||
static void
|
||||
entryPrepareDownlink(GinBtree btree, Buffer lbuf)
|
||||
{
|
||||
IndexTuple itup,
|
||||
nitup;
|
||||
Page page = BufferGetPage(buf);
|
||||
Page lpage = BufferGetPage(lbuf);
|
||||
IndexTuple itup;
|
||||
|
||||
itup = getRightMostTuple(page);
|
||||
nitup = GinFormInteriorTuple(itup, page, BufferGetBlockNumber(buf));
|
||||
itup = getRightMostTuple(lpage);
|
||||
|
||||
return nitup;
|
||||
btree->entry = GinFormInteriorTuple(itup,
|
||||
lpage,
|
||||
BufferGetBlockNumber(lbuf));
|
||||
btree->rightblkno = GinPageGetOpaque(lpage)->rightlink;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -696,17 +690,21 @@ ginPageGetLinkItup(Buffer buf)
|
||||
void
|
||||
ginEntryFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf)
|
||||
{
|
||||
Page page;
|
||||
Page page = BufferGetPage(root);
|
||||
Page lpage = BufferGetPage(lbuf);
|
||||
Page rpage = BufferGetPage(rbuf);
|
||||
IndexTuple itup;
|
||||
|
||||
page = BufferGetPage(root);
|
||||
|
||||
itup = ginPageGetLinkItup(lbuf);
|
||||
itup = GinFormInteriorTuple(getRightMostTuple(lpage),
|
||||
lpage,
|
||||
BufferGetBlockNumber(lbuf));
|
||||
if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), InvalidOffsetNumber, false, false) == InvalidOffsetNumber)
|
||||
elog(ERROR, "failed to add item to index root page");
|
||||
pfree(itup);
|
||||
|
||||
itup = ginPageGetLinkItup(rbuf);
|
||||
itup = GinFormInteriorTuple(getRightMostTuple(rpage),
|
||||
rpage,
|
||||
BufferGetBlockNumber(rbuf));
|
||||
if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), InvalidOffsetNumber, false, false) == InvalidOffsetNumber)
|
||||
elog(ERROR, "failed to add item to index root page");
|
||||
pfree(itup);
|
||||
@ -736,6 +734,7 @@ ginPrepareEntryScan(GinBtree btree, OffsetNumber attnum,
|
||||
btree->placeToPage = entryPlaceToPage;
|
||||
btree->splitPage = entrySplitPage;
|
||||
btree->fillRoot = ginEntryFillRoot;
|
||||
btree->prepareDownlink = entryPrepareDownlink;
|
||||
|
||||
btree->isData = FALSE;
|
||||
btree->fullScan = FALSE;
|
||||
|
Reference in New Issue
Block a user