#include "postgres.h"#include "access/gin_private.h"#include "utils/rel.h"
Go to the source code of this file.
| static OffsetNumber dataFindChildPtr | ( | GinBtree | btree, | |
| Page | page, | |||
| BlockNumber | blkno, | |||
| OffsetNumber | storedOff | |||
| ) | [static] |
Definition at line 220 of file gindatapage.c.
References Assert, FirstOffsetNumber, GinDataPageGetItem, GinPageGetOpaque, GinPageIsData, GinPageIsLeaf, i, and PostingItemGetBlockNumber.
{
OffsetNumber i,
maxoff = GinPageGetOpaque(page)->maxoff;
PostingItem *pitem;
Assert(!GinPageIsLeaf(page));
Assert(GinPageIsData(page));
/* if page isn't changed, we return storedOff */
if (storedOff >= FirstOffsetNumber && storedOff <= maxoff)
{
pitem = (PostingItem *) GinDataPageGetItem(page, storedOff);
if (PostingItemGetBlockNumber(pitem) == blkno)
return storedOff;
/*
* we hope, that needed pointer goes to right. It's true if there
* wasn't a deletion
*/
for (i = storedOff + 1; i <= maxoff; i++)
{
pitem = (PostingItem *) GinDataPageGetItem(page, i);
if (PostingItemGetBlockNumber(pitem) == blkno)
return i;
}
maxoff = storedOff - 1;
}
/* last chance */
for (i = FirstOffsetNumber; i <= maxoff; i++)
{
pitem = (PostingItem *) GinDataPageGetItem(page, i);
if (PostingItemGetBlockNumber(pitem) == blkno)
return i;
}
return InvalidOffsetNumber;
}
| static BlockNumber dataGetLeftMostPage | ( | GinBtree | btree, | |
| Page | page | |||
| ) | [static] |
Definition at line 265 of file gindatapage.c.
References Assert, FirstOffsetNumber, GinDataPageGetItem, GinPageGetOpaque, GinPageIsData, GinPageIsLeaf, and PostingItemGetBlockNumber.
{
PostingItem *pitem;
Assert(!GinPageIsLeaf(page));
Assert(GinPageIsData(page));
Assert(GinPageGetOpaque(page)->maxoff >= FirstOffsetNumber);
pitem = (PostingItem *) GinDataPageGetItem(page, FirstOffsetNumber);
return PostingItemGetBlockNumber(pitem);
}
| static bool dataIsEnoughSpace | ( | GinBtree | btree, | |
| Buffer | buf, | |||
| OffsetNumber | off | |||
| ) | [static] |
Definition at line 327 of file gindatapage.c.
References Assert, BufferGetPage, GinBtreeData::curitem, GinDataPageGetFreeSpace, GinPageGetOpaque, GinPageIsData, GinPageIsLeaf, GinPageRightMost, GinBtreeData::isDelete, and GinBtreeData::nitem.
{
Page page = BufferGetPage(buf);
Assert(GinPageIsData(page));
Assert(!btree->isDelete);
if (GinPageIsLeaf(page))
{
if (GinPageRightMost(page) && off > GinPageGetOpaque(page)->maxoff)
{
if ((btree->nitem - btree->curitem) * sizeof(ItemPointerData) <= GinDataPageGetFreeSpace(page))
return true;
}
else if (sizeof(ItemPointerData) <= GinDataPageGetFreeSpace(page))
return true;
}
else if (sizeof(PostingItem) <= GinDataPageGetFreeSpace(page))
return true;
return false;
}
Definition at line 83 of file gindatapage.c.
References GinBtreeData::curitem, ginCompareItemPointers(), GinDataPageGetRightBound, GinPageRightMost, GinBtreeData::items, and TRUE.
{
ItemPointer iptr = GinDataPageGetRightBound(page);
if (GinPageRightMost(page))
return FALSE;
return (ginCompareItemPointers(btree->items + btree->curitem, iptr) > 0) ? TRUE : FALSE;
}
| static BlockNumber dataLocateItem | ( | GinBtree | btree, | |
| GinBtreeStack * | stack | |||
| ) | [static] |
Definition at line 98 of file gindatapage.c.
References Assert, GinBtreeStack::buffer, BufferGetPage, GinBtreeData::curitem, FirstOffsetNumber, GinBtreeData::fullScan, GinBtreeData::getLeftMostPage, ginCompareItemPointers(), GinDataPageGetItem, GinPageGetOpaque, GinPageIsData, GinPageIsLeaf, GinBtreeData::items, PostingItem::key, GinBtreeStack::off, PostingItemGetBlockNumber, and GinBtreeStack::predictNumber.
{
OffsetNumber low,
high,
maxoff;
PostingItem *pitem = NULL;
int result;
Page page = BufferGetPage(stack->buffer);
Assert(!GinPageIsLeaf(page));
Assert(GinPageIsData(page));
if (btree->fullScan)
{
stack->off = FirstOffsetNumber;
stack->predictNumber *= GinPageGetOpaque(page)->maxoff;
return btree->getLeftMostPage(btree, page);
}
low = FirstOffsetNumber;
maxoff = high = GinPageGetOpaque(page)->maxoff;
Assert(high >= low);
high++;
while (high > low)
{
OffsetNumber mid = low + ((high - low) / 2);
pitem = (PostingItem *) GinDataPageGetItem(page, mid);
if (mid == maxoff)
{
/*
* Right infinity, page already correctly chosen with a help of
* dataIsMoveRight
*/
result = -1;
}
else
{
pitem = (PostingItem *) GinDataPageGetItem(page, mid);
result = ginCompareItemPointers(btree->items + btree->curitem, &(pitem->key));
}
if (result == 0)
{
stack->off = mid;
return PostingItemGetBlockNumber(pitem);
}
else if (result > 0)
low = mid + 1;
else
high = mid;
}
Assert(high >= FirstOffsetNumber && high <= maxoff);
stack->off = high;
pitem = (PostingItem *) GinDataPageGetItem(page, high);
return PostingItemGetBlockNumber(pitem);
}
| static bool dataLocateLeafItem | ( | GinBtree | btree, | |
| GinBtreeStack * | stack | |||
| ) | [static] |
Definition at line 167 of file gindatapage.c.
References Assert, GinBtreeStack::buffer, BufferGetPage, GinBtreeData::curitem, GinBtreeData::fullScan, ginCompareItemPointers(), GinDataPageGetItem, GinPageGetOpaque, GinPageIsData, GinPageIsLeaf, GinBtreeData::items, and GinBtreeStack::off.
{
Page page = BufferGetPage(stack->buffer);
OffsetNumber low,
high;
int result;
Assert(GinPageIsLeaf(page));
Assert(GinPageIsData(page));
if (btree->fullScan)
{
stack->off = FirstOffsetNumber;
return TRUE;
}
low = FirstOffsetNumber;
high = GinPageGetOpaque(page)->maxoff;
if (high < low)
{
stack->off = FirstOffsetNumber;
return false;
}
high++;
while (high > low)
{
OffsetNumber mid = low + ((high - low) / 2);
result = ginCompareItemPointers(btree->items + btree->curitem, (ItemPointer) GinDataPageGetItem(page, mid));
if (result == 0)
{
stack->off = mid;
return true;
}
else if (result > 0)
low = mid + 1;
else
high = mid;
}
stack->off = high;
return false;
}
| static void dataPlaceToPage | ( | GinBtree | btree, | |
| Buffer | buf, | |||
| OffsetNumber | off, | |||
| XLogRecData ** | prdata | |||
| ) | [static] |
Definition at line 380 of file gindatapage.c.
References Assert, ginxlogInsert::blkno, XLogRecData::buffer, XLogRecData::buffer_std, BufferGetBlockNumber(), BufferGetPage, GinBtreeData::curitem, XLogRecData::data, dataPrepareData(), GinDataPageAddItem(), GinPageGetOpaque, GinPageIsData, GinPageIsLeaf, GinPageRightMost, GinSizeOfDataPageItem, GinBtreeData::index, InvalidBlockNumber, ginxlogInsert::isData, ginxlogInsert::isDelete, ginxlogInsert::isLeaf, GinBtreeData::items, XLogRecData::len, XLogRecData::next, GinBtreeData::nitem, ginxlogInsert::nitem, ginxlogInsert::node, ginxlogInsert::offset, GinBtreeData::pitem, RelationData::rd_node, TRUE, and ginxlogInsert::updateBlkno.
{
Page page = BufferGetPage(buf);
int sizeofitem = GinSizeOfDataPageItem(page);
int cnt = 0;
/* these must be static so they can be returned to caller */
static XLogRecData rdata[3];
static ginxlogInsert data;
*prdata = rdata;
Assert(GinPageIsData(page));
data.updateBlkno = dataPrepareData(btree, page, off);
data.node = btree->index->rd_node;
data.blkno = BufferGetBlockNumber(buf);
data.offset = off;
data.nitem = 1;
data.isDelete = FALSE;
data.isData = TRUE;
data.isLeaf = GinPageIsLeaf(page) ? TRUE : FALSE;
/*
* Prevent full page write if child's split occurs. That is needed to
* remove incomplete splits while replaying WAL
*
* data.updateBlkno contains new block number (of newly created right
* page) for recently splited page.
*/
if (data.updateBlkno == InvalidBlockNumber)
{
rdata[0].buffer = buf;
rdata[0].buffer_std = FALSE;
rdata[0].data = NULL;
rdata[0].len = 0;
rdata[0].next = &rdata[1];
cnt++;
}
rdata[cnt].buffer = InvalidBuffer;
rdata[cnt].data = (char *) &data;
rdata[cnt].len = sizeof(ginxlogInsert);
rdata[cnt].next = &rdata[cnt + 1];
cnt++;
rdata[cnt].buffer = InvalidBuffer;
rdata[cnt].data = (GinPageIsLeaf(page)) ? ((char *) (btree->items + btree->curitem)) : ((char *) &(btree->pitem));
rdata[cnt].len = sizeofitem;
rdata[cnt].next = NULL;
if (GinPageIsLeaf(page))
{
if (GinPageRightMost(page) && off > GinPageGetOpaque(page)->maxoff)
{
/* usually, create index... */
uint32 savedPos = btree->curitem;
while (btree->curitem < btree->nitem)
{
GinDataPageAddItem(page, btree->items + btree->curitem, off);
off++;
btree->curitem++;
}
data.nitem = btree->curitem - savedPos;
rdata[cnt].len = sizeofitem * data.nitem;
}
else
{
GinDataPageAddItem(page, btree->items + btree->curitem, off);
btree->curitem++;
}
}
else
GinDataPageAddItem(page, &(btree->pitem), off);
}
| static BlockNumber dataPrepareData | ( | GinBtree | btree, | |
| Page | page, | |||
| OffsetNumber | off | |||
| ) | [static] |
Definition at line 356 of file gindatapage.c.
References Assert, GinDataPageGetItem, GinPageIsData, GinPageIsLeaf, InvalidBlockNumber, PostingItemSetBlockNumber, and GinBtreeData::rightblkno.
Referenced by dataPlaceToPage(), and dataSplitPage().
{
BlockNumber ret = InvalidBlockNumber;
Assert(GinPageIsData(page));
if (!GinPageIsLeaf(page) && btree->rightblkno != InvalidBlockNumber)
{
PostingItem *pitem = (PostingItem *) GinDataPageGetItem(page, off);
PostingItemSetBlockNumber(pitem, btree->rightblkno);
ret = btree->rightblkno;
}
btree->rightblkno = InvalidBlockNumber;
return ret;
}
| static Page dataSplitPage | ( | GinBtree | btree, | |
| Buffer | lbuf, | |||
| Buffer | rbuf, | |||
| OffsetNumber | off, | |||
| XLogRecData ** | prdata | |||
| ) | [static] |
Definition at line 464 of file gindatapage.c.
References XLogRecData::buffer, BufferGetBlockNumber(), BufferGetPage, GinBtreeData::curitem, XLogRecData::data, dataPrepareData(), FirstOffsetNumber, GinDataPageGetFreeSpace, GinDataPageGetItem, GinDataPageGetRightBound, GinInitPage(), GinPageGetOpaque, GinPageIsLeaf, GinPageRightMost, GinSizeOfDataPageItem, GinBtreeData::index, InvalidOffsetNumber, GinBtreeData::isBuild, ginxlogSplit::isData, ginxlogSplit::isLeaf, ginxlogSplit::isRootSplit, GinBtreeData::items, PostingItem::key, ginxlogSplit::lblkno, ginxlogSplit::leftChildBlkno, XLogRecData::len, MAXALIGN, memmove, XLogRecData::next, ginxlogSplit::nitem, GinBtreeData::nitem, ginxlogSplit::node, PageGetPageSize, PageGetTempPageCopy(), GinBtreeData::pitem, PostingItemGetBlockNumber, PostingItemSetBlockNumber, ginxlogSplit::rblkno, RelationData::rd_node, GinBtreeData::rightblkno, ginxlogSplit::rightbound, ginxlogSplit::rootBlkno, ginxlogSplit::separator, TRUE, and ginxlogSplit::updateBlkno.
{
char *ptr;
OffsetNumber separator;
ItemPointer bound;
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
ItemPointerData oldbound = *GinDataPageGetRightBound(lpage);
int sizeofitem = GinSizeOfDataPageItem(lpage);
OffsetNumber maxoff = GinPageGetOpaque(lpage)->maxoff;
Page rpage = BufferGetPage(rbuf);
Size pageSize = PageGetPageSize(lpage);
Size freeSpace;
uint32 nCopied = 1;
/* these must be static so they can be returned to caller */
static ginxlogSplit data;
static XLogRecData rdata[4];
static char vector[2 * BLCKSZ];
GinInitPage(rpage, GinPageGetOpaque(lpage)->flags, pageSize);
freeSpace = GinDataPageGetFreeSpace(rpage);
*prdata = rdata;
data.leftChildBlkno = (GinPageIsLeaf(lpage)) ?
InvalidOffsetNumber : PostingItemGetBlockNumber(&(btree->pitem));
data.updateBlkno = dataPrepareData(btree, lpage, off);
memcpy(vector, GinDataPageGetItem(lpage, FirstOffsetNumber),
maxoff * sizeofitem);
if (GinPageIsLeaf(lpage) && GinPageRightMost(lpage) && off > GinPageGetOpaque(lpage)->maxoff)
{
nCopied = 0;
while (btree->curitem < btree->nitem &&
maxoff * sizeof(ItemPointerData) < 2 * (freeSpace - sizeof(ItemPointerData)))
{
memcpy(vector + maxoff * sizeof(ItemPointerData),
btree->items + btree->curitem,
sizeof(ItemPointerData));
maxoff++;
nCopied++;
btree->curitem++;
}
}
else
{
ptr = vector + (off - 1) * sizeofitem;
if (maxoff + 1 - off != 0)
memmove(ptr + sizeofitem, ptr, (maxoff - off + 1) * sizeofitem);
if (GinPageIsLeaf(lpage))
{
memcpy(ptr, btree->items + btree->curitem, sizeofitem);
btree->curitem++;
}
else
memcpy(ptr, &(btree->pitem), sizeofitem);
maxoff++;
}
/*
* we suppose that during index creation table scaned from begin to end,
* so ItemPointers are monotonically increased..
*/
if (btree->isBuild && GinPageRightMost(lpage))
separator = freeSpace / sizeofitem;
else
separator = maxoff / 2;
GinInitPage(rpage, GinPageGetOpaque(lpage)->flags, pageSize);
GinInitPage(lpage, GinPageGetOpaque(rpage)->flags, pageSize);
memcpy(GinDataPageGetItem(lpage, FirstOffsetNumber), vector, separator * sizeofitem);
GinPageGetOpaque(lpage)->maxoff = separator;
memcpy(GinDataPageGetItem(rpage, FirstOffsetNumber),
vector + separator * sizeofitem, (maxoff - separator) * sizeofitem);
GinPageGetOpaque(rpage)->maxoff = maxoff - separator;
PostingItemSetBlockNumber(&(btree->pitem), BufferGetBlockNumber(lbuf));
if (GinPageIsLeaf(lpage))
btree->pitem.key = *(ItemPointerData *) GinDataPageGetItem(lpage,
GinPageGetOpaque(lpage)->maxoff);
else
btree->pitem.key = ((PostingItem *) GinDataPageGetItem(lpage,
GinPageGetOpaque(lpage)->maxoff))->key;
btree->rightblkno = BufferGetBlockNumber(rbuf);
/* set up right bound for left page */
bound = GinDataPageGetRightBound(lpage);
*bound = btree->pitem.key;
/* set up right bound for right page */
bound = GinDataPageGetRightBound(rpage);
*bound = oldbound;
data.node = btree->index->rd_node;
data.rootBlkno = InvalidBlockNumber;
data.lblkno = BufferGetBlockNumber(lbuf);
data.rblkno = BufferGetBlockNumber(rbuf);
data.separator = separator;
data.nitem = maxoff;
data.isData = TRUE;
data.isLeaf = GinPageIsLeaf(lpage) ? TRUE : FALSE;
data.isRootSplit = FALSE;
data.rightbound = oldbound;
rdata[0].buffer = InvalidBuffer;
rdata[0].data = (char *) &data;
rdata[0].len = sizeof(ginxlogSplit);
rdata[0].next = &rdata[1];
rdata[1].buffer = InvalidBuffer;
rdata[1].data = vector;
rdata[1].len = MAXALIGN(maxoff * sizeofitem);
rdata[1].next = NULL;
return lpage;
}
| int ginCompareItemPointers | ( | ItemPointer | a, | |
| ItemPointer | b | |||
| ) |
Definition at line 21 of file gindatapage.c.
References GinItemPointerGetBlockNumber, and GinItemPointerGetOffsetNumber.
Referenced by dataIsMoveRight(), dataLocateItem(), dataLocateLeafItem(), entryGetNextItem(), findItemInPostingPage(), ginCombineData(), ginMergeItemPointers(), keyGetItem(), qsortCompareItemPointers(), and scanGetItem().
{
BlockNumber ba = GinItemPointerGetBlockNumber(a);
BlockNumber bb = GinItemPointerGetBlockNumber(b);
if (ba == bb)
{
OffsetNumber oa = GinItemPointerGetOffsetNumber(a);
OffsetNumber ob = GinItemPointerGetOffsetNumber(b);
if (oa == ob)
return 0;
return (oa > ob) ? 1 : -1;
}
return (ba > bb) ? 1 : -1;
}
Definition at line 588 of file gindatapage.c.
References BufferGetBlockNumber(), BufferGetPage, GinDataPageAddItem(), GinDataPageGetRightBound, InvalidOffsetNumber, PostingItem::key, and PostingItemSetBlockNumber.
Referenced by ginRedoSplit().
{
Page page = BufferGetPage(root),
lpage = BufferGetPage(lbuf),
rpage = BufferGetPage(rbuf);
PostingItem li,
ri;
li.key = *GinDataPageGetRightBound(lpage);
PostingItemSetBlockNumber(&li, BufferGetBlockNumber(lbuf));
GinDataPageAddItem(page, &li, InvalidOffsetNumber);
ri.key = *GinDataPageGetRightBound(rpage);
PostingItemSetBlockNumber(&ri, BufferGetBlockNumber(rbuf));
GinDataPageAddItem(page, &ri, InvalidOffsetNumber);
}
| void GinDataPageAddItem | ( | Page | page, | |
| void * | data, | |||
| OffsetNumber | offset | |||
| ) |
Definition at line 282 of file gindatapage.c.
References GinDataPageGetItem, GinPageGetOpaque, GinSizeOfDataPageItem, InvalidOffsetNumber, and memmove.
Referenced by dataPlaceToPage(), ginDataFillRoot(), ginRedoInsert(), and ginRedoSplit().
{
OffsetNumber maxoff = GinPageGetOpaque(page)->maxoff;
char *ptr;
if (offset == InvalidOffsetNumber)
{
ptr = GinDataPageGetItem(page, maxoff + 1);
}
else
{
ptr = GinDataPageGetItem(page, offset);
if (maxoff + 1 - offset != 0)
memmove(ptr + GinSizeOfDataPageItem(page),
ptr,
(maxoff - offset + 1) * GinSizeOfDataPageItem(page));
}
memcpy(ptr, data, GinSizeOfDataPageItem(page));
GinPageGetOpaque(page)->maxoff++;
}
| void ginInsertItemPointers | ( | GinPostingTreeScan * | gdi, | |
| ItemPointerData * | items, | |||
| uint32 | nitem, | |||
| GinStatsData * | buildStats | |||
| ) |
Definition at line 648 of file gindatapage.c.
References GinBtreeStack::blkno, GinPostingTreeScan::btree, GinBtreeStack::buffer, GinBtreeData::curitem, GinBtreeData::findItem, freeGinBtreeStack(), GIN_UNLOCK, ginFindLeafPage(), ginInsertValue(), ginPrepareFindLeafPage(), GinBtreeData::items, LockBuffer(), GinBtreeData::nitem, and GinPostingTreeScan::stack.
Referenced by addItemPointersToLeafTuple(), buildFreshLeafTuple(), and ginEntryInsert().
{
BlockNumber rootBlkno = gdi->stack->blkno;
gdi->btree.items = items;
gdi->btree.nitem = nitem;
gdi->btree.curitem = 0;
while (gdi->btree.curitem < gdi->btree.nitem)
{
if (!gdi->stack)
gdi->stack = ginPrepareFindLeafPage(&gdi->btree, rootBlkno);
gdi->stack = ginFindLeafPage(&gdi->btree, gdi->stack);
if (gdi->btree.findItem(&(gdi->btree), gdi->stack))
{
/*
* gdi->btree.items[gdi->btree.curitem] already exists in index
*/
gdi->btree.curitem++;
LockBuffer(gdi->stack->buffer, GIN_UNLOCK);
freeGinBtreeStack(gdi->stack);
}
else
ginInsertValue(&(gdi->btree), gdi->stack, buildStats);
gdi->stack = NULL;
}
}
| uint32 ginMergeItemPointers | ( | ItemPointerData * | dst, | |
| ItemPointerData * | a, | |||
| uint32 | na, | |||
| ItemPointerData * | b, | |||
| uint32 | nb | |||
| ) |
Definition at line 45 of file gindatapage.c.
References cmp(), and ginCompareItemPointers().
Referenced by addItemPointersToLeafTuple().
{
ItemPointerData *dptr = dst;
ItemPointerData *aptr = a,
*bptr = b;
while (aptr - a < na && bptr - b < nb)
{
int cmp = ginCompareItemPointers(aptr, bptr);
if (cmp > 0)
*dptr++ = *bptr++;
else if (cmp == 0)
{
/* we want only one copy of the identical items */
*dptr++ = *bptr++;
aptr++;
}
else
*dptr++ = *aptr++;
}
while (aptr - a < na)
*dptr++ = *aptr++;
while (bptr - b < nb)
*dptr++ = *bptr++;
return dptr - dst;
}
| void GinPageDeletePostingItem | ( | Page | page, | |
| OffsetNumber | offset | |||
| ) |
Definition at line 308 of file gindatapage.c.
References Assert, FirstOffsetNumber, GinDataPageGetItem, GinPageGetOpaque, GinPageIsLeaf, and memmove.
Referenced by ginDeletePage(), and ginRedoDeletePage().
{
OffsetNumber maxoff = GinPageGetOpaque(page)->maxoff;
Assert(!GinPageIsLeaf(page));
Assert(offset >= FirstOffsetNumber && offset <= maxoff);
if (offset != maxoff)
memmove(GinDataPageGetItem(page, offset), GinDataPageGetItem(page, offset + 1),
sizeof(PostingItem) * (maxoff - offset));
GinPageGetOpaque(page)->maxoff--;
}
Definition at line 606 of file gindatapage.c.
References GinBtreeData::fillRoot, GinBtreeData::findChildPage, GinBtreeData::findChildPtr, GinBtreeData::findItem, GinBtreeData::fullScan, GinBtreeData::getLeftMostPage, GinBtreeData::index, GinBtreeData::isBuild, GinBtreeData::isData, GinBtreeData::isDelete, GinBtreeData::isEnoughSpace, GinBtreeData::isMoveRight, GinBtreeData::placeToPage, GinBtreeData::searchMode, and GinBtreeData::splitPage.
Referenced by ginContinueSplit(), and ginPrepareScanPostingTree().
{
memset(btree, 0, sizeof(GinBtreeData));
btree->index = index;
btree->findChildPage = dataLocateItem;
btree->isMoveRight = dataIsMoveRight;
btree->findItem = dataLocateLeafItem;
btree->findChildPtr = dataFindChildPtr;
btree->getLeftMostPage = dataGetLeftMostPage;
btree->isEnoughSpace = dataIsEnoughSpace;
btree->placeToPage = dataPlaceToPage;
btree->splitPage = dataSplitPage;
btree->fillRoot = ginDataFillRoot;
btree->isData = TRUE;
btree->searchMode = FALSE;
btree->isDelete = FALSE;
btree->fullScan = FALSE;
btree->isBuild = FALSE;
}
| GinPostingTreeScan* ginPrepareScanPostingTree | ( | Relation | index, | |
| BlockNumber | rootBlkno, | |||
| bool | searchMode | |||
| ) |
Definition at line 630 of file gindatapage.c.
References GinPostingTreeScan::btree, GinBtreeData::fullScan, ginPrepareDataScan(), ginPrepareFindLeafPage(), palloc0(), GinBtreeData::searchMode, and GinPostingTreeScan::stack.
Referenced by addItemPointersToLeafTuple(), buildFreshLeafTuple(), ginEntryInsert(), scanPostingTree(), and startScanEntry().
{
GinPostingTreeScan *gdi = (GinPostingTreeScan *) palloc0(sizeof(GinPostingTreeScan));
ginPrepareDataScan(&gdi->btree, index);
gdi->btree.searchMode = searchMode;
gdi->btree.fullScan = searchMode;
gdi->stack = ginPrepareFindLeafPage(&gdi->btree, rootBlkno);
return gdi;
}
| Buffer ginScanBeginPostingTree | ( | GinPostingTreeScan * | gdi | ) |
Definition at line 682 of file gindatapage.c.
References GinPostingTreeScan::btree, GinBtreeStack::buffer, ginFindLeafPage(), and GinPostingTreeScan::stack.
Referenced by scanPostingTree(), and startScanEntry().
1.7.1