From c2b175b94851e59765cc87243d8faf923e3d820b Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Thu, 3 Oct 2013 11:47:17 +0300 Subject: 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. --- src/backend/access/gin/ginxlog.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) (limited to 'src/backend/access/gin/ginxlog.c') diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c index 5daabb0eef..4d0ccb876f 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; -- cgit v1.2.1