diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2013-11-27 15:43:05 +0200 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2013-11-27 15:43:05 +0200 |
commit | ce5326eed386959aac7a322880896ddeade7fd52 (patch) | |
tree | 16f903bb47df48ab748c485c7e350e5dced2c253 /src/include | |
parent | 4118f7e8ede8a3616189b53983aea293fd0b3cb1 (diff) | |
download | postgresql-ce5326eed386959aac7a322880896ddeade7fd52.tar.gz postgresql-ce5326eed386959aac7a322880896ddeade7fd52.zip |
More GIN refactoring.
Separate the insertion payload from the more static portions of GinBtree.
GinBtree now only contains information related to searching the tree, and
the information of what to insert is passed separately.
Add root block number to GinBtree, instead of passing it around all the
functions as argument.
Split off ginFinishSplit() from ginInsertValue(). ginFinishSplit is
responsible for finding the parent and inserting the downlink to it.
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/access/gin_private.h | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/src/include/access/gin_private.h b/src/include/access/gin_private.h index 39529353d17..bd407fe342a 100644 --- a/src/include/access/gin_private.h +++ b/src/include/access/gin_private.h @@ -485,41 +485,59 @@ typedef struct GinBtreeData /* insert methods */ OffsetNumber (*findChildPtr) (GinBtree, Page, BlockNumber, OffsetNumber); - bool (*placeToPage) (GinBtree, Buffer, OffsetNumber, XLogRecData **); - Page (*splitPage) (GinBtree, Buffer, Buffer, OffsetNumber, XLogRecData **); - void (*prepareDownlink) (GinBtree, Buffer); + bool (*placeToPage) (GinBtree, Buffer, OffsetNumber, void *, BlockNumber, XLogRecData **); + Page (*splitPage) (GinBtree, Buffer, Buffer, OffsetNumber, void *, BlockNumber, XLogRecData **); + void *(*prepareDownlink) (GinBtree, Buffer); void (*fillRoot) (GinBtree, Buffer, Buffer, Buffer); bool isData; Relation index; + BlockNumber rootBlkno; GinState *ginstate; /* not valid in a data scan */ bool fullScan; bool isBuild; - BlockNumber rightblkno; - - /* Entry options */ + /* Search key for Entry tree */ OffsetNumber entryAttnum; Datum entryKey; GinNullCategory entryCategory; - IndexTuple entry; - bool isDelete; - /* Data (posting tree) options */ + /* Search key for data tree (posting tree) */ + ItemPointerData itemptr; +} GinBtreeData; + +/* This represents a tuple to be inserted to entry tree. */ +typedef struct +{ + IndexTuple entry; /* tuple to insert */ + bool isDelete; /* delete old tuple at same offset? */ +} GinBtreeEntryInsertData; + +/* + * This represents an itempointer, or many itempointers, to be inserted to + * a data (posting tree) leaf page + */ +typedef struct +{ ItemPointerData *items; uint32 nitem; uint32 curitem; +} GinBtreeDataLeafInsertData; - PostingItem pitem; -} GinBtreeData; +/* + * For internal data (posting tree) pages, the insertion payload is a + * PostingItem + */ -extern GinBtreeStack *ginFindLeafPage(GinBtree btree, BlockNumber rootBlkno, bool searchMode); +extern GinBtreeStack *ginFindLeafPage(GinBtree btree, bool searchMode); extern Buffer ginStepRight(Buffer buffer, Relation index, int lockmode); extern void freeGinBtreeStack(GinBtreeStack *stack); extern void ginInsertValue(GinBtree btree, GinBtreeStack *stack, + void *insertdata, GinStatsData *buildStats); +extern void ginFindParents(GinBtree btree, GinBtreeStack *stack); +extern void ginFinishSplit(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats); -extern void ginFindParents(GinBtree btree, GinBtreeStack *stack, BlockNumber rootBlkno); /* ginentrypage.c */ extern IndexTuple GinFormTuple(GinState *ginstate, @@ -543,7 +561,7 @@ extern void ginInsertItemPointers(Relation index, BlockNumber rootBlkno, GinStatsData *buildStats); extern GinBtreeStack *ginScanBeginPostingTree(Relation index, BlockNumber rootBlkno); extern void ginDataFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf); -extern void ginPrepareDataScan(GinBtree btree, Relation index); +extern void ginPrepareDataScan(GinBtree btree, Relation index, BlockNumber rootBlkno); /* ginscan.c */ |