diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2013-10-03 11:47:17 +0300 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2013-10-03 11:51:31 +0300 |
commit | c2b175b94851e59765cc87243d8faf923e3d820b (patch) | |
tree | 6b56f8aa03965c61874cbaa9010bde885593e095 /src/backend/access/gin/ginxlog.c | |
parent | 627882d0d8ad34c336b98ceb4eb90940fcd392cc (diff) | |
download | postgresql-c2b175b94851e59765cc87243d8faf923e3d820b.tar.gz postgresql-c2b175b94851e59765cc87243d8faf923e3d820b.zip |
Minor GIN code refactoring.
It makes for cleaner code to have separate Get/Add functions for PostingItems
and ItemPointers. A few callsites that have to deal with both types need to
be duplicated because of this, but all the callers have to know which one
they're dealing with anyway. Overall, this reduces the amount of casting
required.
Extracted from Alexander Korotkov's larger patch to change the data page
format.
Diffstat (limited to 'src/backend/access/gin/ginxlog.c')
-rw-r--r-- | src/backend/access/gin/ginxlog.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c index 5daabb0eef9..4d0ccb876f2 100644 --- a/src/backend/access/gin/ginxlog.c +++ b/src/backend/access/gin/ginxlog.c @@ -189,7 +189,7 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record) Assert(data->updateBlkno == InvalidBlockNumber); for (i = 0; i < data->nitem; i++) - GinDataPageAddItem(page, items + i, data->offset + i); + GinDataPageAddItemPointer(page, &items[i], data->offset + i); } else { @@ -200,13 +200,13 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record) if (data->updateBlkno != InvalidBlockNumber) { /* update link to right page after split */ - pitem = (PostingItem *) GinDataPageGetItem(page, data->offset); + pitem = GinDataPageGetPostingItem(page, data->offset); PostingItemSetBlockNumber(pitem, data->updateBlkno); } pitem = (PostingItem *) (XLogRecGetData(record) + sizeof(ginxlogInsert)); - GinDataPageAddItem(page, pitem, data->offset); + GinDataPageAddPostingItem(page, pitem, data->offset); } } else @@ -286,22 +286,28 @@ ginRedoSplit(XLogRecPtr lsn, XLogRecord *record) for (i = 0; i < data->separator; i++) { - GinDataPageAddItem(lpage, ptr, InvalidOffsetNumber); + if (data->isLeaf) + GinDataPageAddItemPointer(lpage, (ItemPointer) ptr, InvalidOffsetNumber); + else + GinDataPageAddPostingItem(lpage, (PostingItem *) ptr, InvalidOffsetNumber); ptr += sizeofitem; } for (i = data->separator; i < data->nitem; i++) { - GinDataPageAddItem(rpage, ptr, InvalidOffsetNumber); + if (data->isLeaf) + GinDataPageAddItemPointer(rpage, (ItemPointer) ptr, InvalidOffsetNumber); + else + GinDataPageAddPostingItem(rpage, (PostingItem *) ptr, InvalidOffsetNumber); ptr += sizeofitem; } /* set up right key */ bound = GinDataPageGetRightBound(lpage); if (data->isLeaf) - *bound = *(ItemPointerData *) GinDataPageGetItem(lpage, GinPageGetOpaque(lpage)->maxoff); + *bound = *GinDataPageGetItemPointer(lpage, GinPageGetOpaque(lpage)->maxoff); else - *bound = ((PostingItem *) GinDataPageGetItem(lpage, GinPageGetOpaque(lpage)->maxoff))->key; + *bound = GinDataPageGetPostingItem(lpage, GinPageGetOpaque(lpage)->maxoff)->key; bound = GinDataPageGetRightBound(rpage); *bound = data->rightbound; @@ -803,11 +809,11 @@ ginContinueSplit(ginIncompleteSplit *split) PostingItemSetBlockNumber(&(btree.pitem), split->leftBlkno); if (GinPageIsLeaf(page)) - btree.pitem.key = *(ItemPointerData *) GinDataPageGetItem(page, - GinPageGetOpaque(page)->maxoff); + btree.pitem.key = *GinDataPageGetItemPointer(page, + GinPageGetOpaque(page)->maxoff); else - btree.pitem.key = ((PostingItem *) GinDataPageGetItem(page, - GinPageGetOpaque(page)->maxoff))->key; + btree.pitem.key = GinDataPageGetPostingItem(page, + GinPageGetOpaque(page)->maxoff)->key; } btree.rightblkno = split->rightBlkno; |