Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit c2b175b

Browse files
committed
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.
1 parent 627882d commit c2b175b

File tree

5 files changed

+123
-55
lines changed

5 files changed

+123
-55
lines changed

src/backend/access/gin/gindatapage.c

+88-33
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
105105
{
106106
OffsetNumber mid = low + ((high - low) / 2);
107107

108-
pitem = (PostingItem *) GinDataPageGetItem(page, mid);
108+
pitem = GinDataPageGetPostingItem(page, mid);
109109

110110
if (mid == maxoff)
111111
{
@@ -117,7 +117,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
117117
}
118118
else
119119
{
120-
pitem = (PostingItem *) GinDataPageGetItem(page, mid);
120+
pitem = GinDataPageGetPostingItem(page, mid);
121121
result = ginCompareItemPointers(btree->items + btree->curitem, &(pitem->key));
122122
}
123123

@@ -135,7 +135,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
135135
Assert(high >= FirstOffsetNumber && high <= maxoff);
136136

137137
stack->off = high;
138-
pitem = (PostingItem *) GinDataPageGetItem(page, high);
138+
pitem = GinDataPageGetPostingItem(page, high);
139139
return PostingItemGetBlockNumber(pitem);
140140
}
141141

@@ -176,7 +176,8 @@ dataLocateLeafItem(GinBtree btree, GinBtreeStack *stack)
176176
{
177177
OffsetNumber mid = low + ((high - low) / 2);
178178

179-
result = ginCompareItemPointers(btree->items + btree->curitem, (ItemPointer) GinDataPageGetItem(page, mid));
179+
result = ginCompareItemPointers(btree->items + btree->curitem,
180+
GinDataPageGetItemPointer(page, mid));
180181

181182
if (result == 0)
182183
{
@@ -210,7 +211,7 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor
210211
/* if page isn't changed, we return storedOff */
211212
if (storedOff >= FirstOffsetNumber && storedOff <= maxoff)
212213
{
213-
pitem = (PostingItem *) GinDataPageGetItem(page, storedOff);
214+
pitem = GinDataPageGetPostingItem(page, storedOff);
214215
if (PostingItemGetBlockNumber(pitem) == blkno)
215216
return storedOff;
216217

@@ -220,7 +221,7 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor
220221
*/
221222
for (i = storedOff + 1; i <= maxoff; i++)
222223
{
223-
pitem = (PostingItem *) GinDataPageGetItem(page, i);
224+
pitem = GinDataPageGetPostingItem(page, i);
224225
if (PostingItemGetBlockNumber(pitem) == blkno)
225226
return i;
226227
}
@@ -231,7 +232,7 @@ dataFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber stor
231232
/* last chance */
232233
for (i = FirstOffsetNumber; i <= maxoff; i++)
233234
{
234-
pitem = (PostingItem *) GinDataPageGetItem(page, i);
235+
pitem = GinDataPageGetPostingItem(page, i);
235236
if (PostingItemGetBlockNumber(pitem) == blkno)
236237
return i;
237238
}
@@ -251,33 +252,62 @@ dataGetLeftMostPage(GinBtree btree, Page page)
251252
Assert(GinPageIsData(page));
252253
Assert(GinPageGetOpaque(page)->maxoff >= FirstOffsetNumber);
253254

254-
pitem = (PostingItem *) GinDataPageGetItem(page, FirstOffsetNumber);
255+
pitem = GinDataPageGetPostingItem(page, FirstOffsetNumber);
255256
return PostingItemGetBlockNumber(pitem);
256257
}
257258

258259
/*
259-
* add ItemPointer or PostingItem to page. data should point to
260-
* correct value! depending on leaf or non-leaf page
260+
* add ItemPointer to a leaf page.
261261
*/
262262
void
263-
GinDataPageAddItem(Page page, void *data, OffsetNumber offset)
263+
GinDataPageAddItemPointer(Page page, ItemPointer data, OffsetNumber offset)
264264
{
265265
OffsetNumber maxoff = GinPageGetOpaque(page)->maxoff;
266266
char *ptr;
267267

268+
Assert(GinPageIsLeaf(page));
269+
270+
if (offset == InvalidOffsetNumber)
271+
{
272+
ptr = (char *) GinDataPageGetItemPointer(page, maxoff + 1);
273+
}
274+
else
275+
{
276+
ptr = (char *) GinDataPageGetItemPointer(page, offset);
277+
if (maxoff + 1 - offset != 0)
278+
memmove(ptr + sizeof(ItemPointerData),
279+
ptr,
280+
(maxoff - offset + 1) * sizeof(ItemPointerData));
281+
}
282+
memcpy(ptr, data, sizeof(ItemPointerData));
283+
284+
GinPageGetOpaque(page)->maxoff++;
285+
}
286+
287+
/*
288+
* add PostingItem to a non-leaf page.
289+
*/
290+
void
291+
GinDataPageAddPostingItem(Page page, PostingItem *data, OffsetNumber offset)
292+
{
293+
OffsetNumber maxoff = GinPageGetOpaque(page)->maxoff;
294+
char *ptr;
295+
296+
Assert(!GinPageIsLeaf(page));
297+
268298
if (offset == InvalidOffsetNumber)
269299
{
270-
ptr = GinDataPageGetItem(page, maxoff + 1);
300+
ptr = (char *) GinDataPageGetPostingItem(page, maxoff + 1);
271301
}
272302
else
273303
{
274-
ptr = GinDataPageGetItem(page, offset);
304+
ptr = (char *) GinDataPageGetPostingItem(page, offset);
275305
if (maxoff + 1 - offset != 0)
276-
memmove(ptr + GinSizeOfDataPageItem(page),
306+
memmove(ptr + sizeof(PostingItem),
277307
ptr,
278-
(maxoff - offset + 1) * GinSizeOfDataPageItem(page));
308+
(maxoff - offset + 1) * sizeof(PostingItem));
279309
}
280-
memcpy(ptr, data, GinSizeOfDataPageItem(page));
310+
memcpy(ptr, data, sizeof(PostingItem));
281311

282312
GinPageGetOpaque(page)->maxoff++;
283313
}
@@ -294,7 +324,8 @@ GinPageDeletePostingItem(Page page, OffsetNumber offset)
294324
Assert(offset >= FirstOffsetNumber && offset <= maxoff);
295325

296326
if (offset != maxoff)
297-
memmove(GinDataPageGetItem(page, offset), GinDataPageGetItem(page, offset + 1),
327+
memmove(GinDataPageGetPostingItem(page, offset),
328+
GinDataPageGetPostingItem(page, offset + 1),
298329
sizeof(PostingItem) * (maxoff - offset));
299330

300331
GinPageGetOpaque(page)->maxoff--;
@@ -342,7 +373,7 @@ dataPrepareData(GinBtree btree, Page page, OffsetNumber off)
342373

343374
if (!GinPageIsLeaf(page) && btree->rightblkno != InvalidBlockNumber)
344375
{
345-
PostingItem *pitem = (PostingItem *) GinDataPageGetItem(page, off);
376+
PostingItem *pitem = GinDataPageGetPostingItem(page, off);
346377

347378
PostingItemSetBlockNumber(pitem, btree->rightblkno);
348379
ret = btree->rightblkno;
@@ -418,7 +449,7 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prda
418449

419450
while (btree->curitem < btree->nitem)
420451
{
421-
GinDataPageAddItem(page, btree->items + btree->curitem, off);
452+
GinDataPageAddItemPointer(page, btree->items + btree->curitem, off);
422453
off++;
423454
btree->curitem++;
424455
}
@@ -427,12 +458,12 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off, XLogRecData **prda
427458
}
428459
else
429460
{
430-
GinDataPageAddItem(page, btree->items + btree->curitem, off);
461+
GinDataPageAddItemPointer(page, btree->items + btree->curitem, off);
431462
btree->curitem++;
432463
}
433464
}
434465
else
435-
GinDataPageAddItem(page, &(btree->pitem), off);
466+
GinDataPageAddPostingItem(page, &(btree->pitem), off);
436467
}
437468

438469
/*
@@ -448,6 +479,7 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
448479
OffsetNumber separator;
449480
ItemPointer bound;
450481
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
482+
bool isleaf = GinPageIsLeaf(lpage);
451483
ItemPointerData oldbound = *GinDataPageGetRightBound(lpage);
452484
int sizeofitem = GinSizeOfDataPageItem(lpage);
453485
OffsetNumber maxoff = GinPageGetOpaque(lpage)->maxoff;
@@ -469,10 +501,20 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
469501
InvalidOffsetNumber : PostingItemGetBlockNumber(&(btree->pitem));
470502
data.updateBlkno = dataPrepareData(btree, lpage, off);
471503

472-
memcpy(vector, GinDataPageGetItem(lpage, FirstOffsetNumber),
473-
maxoff * sizeofitem);
504+
if (isleaf)
505+
{
506+
memcpy(vector,
507+
GinDataPageGetItemPointer(lpage, FirstOffsetNumber),
508+
maxoff * sizeof(ItemPointerData));
509+
}
510+
else
511+
{
512+
memcpy(vector,
513+
GinDataPageGetPostingItem(lpage, FirstOffsetNumber),
514+
maxoff * sizeof(PostingItem));
515+
}
474516

475-
if (GinPageIsLeaf(lpage) && GinPageRightMost(lpage) && off > GinPageGetOpaque(lpage)->maxoff)
517+
if (isleaf && GinPageRightMost(lpage) && off > GinPageGetOpaque(lpage)->maxoff)
476518
{
477519
nCopied = 0;
478520
while (btree->curitem < btree->nitem &&
@@ -491,7 +533,7 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
491533
ptr = vector + (off - 1) * sizeofitem;
492534
if (maxoff + 1 - off != 0)
493535
memmove(ptr + sizeofitem, ptr, (maxoff - off + 1) * sizeofitem);
494-
if (GinPageIsLeaf(lpage))
536+
if (isleaf)
495537
{
496538
memcpy(ptr, btree->items + btree->curitem, sizeofitem);
497539
btree->curitem++;
@@ -514,19 +556,32 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
514556
GinInitPage(rpage, GinPageGetOpaque(lpage)->flags, pageSize);
515557
GinInitPage(lpage, GinPageGetOpaque(rpage)->flags, pageSize);
516558

517-
memcpy(GinDataPageGetItem(lpage, FirstOffsetNumber), vector, separator * sizeofitem);
559+
if (isleaf)
560+
memcpy(GinDataPageGetItemPointer(lpage, FirstOffsetNumber),
561+
vector, separator * sizeof(ItemPointerData));
562+
else
563+
memcpy(GinDataPageGetPostingItem(lpage, FirstOffsetNumber),
564+
vector, separator * sizeof(PostingItem));
565+
518566
GinPageGetOpaque(lpage)->maxoff = separator;
519-
memcpy(GinDataPageGetItem(rpage, FirstOffsetNumber),
520-
vector + separator * sizeofitem, (maxoff - separator) * sizeofitem);
567+
if (isleaf)
568+
memcpy(GinDataPageGetItemPointer(rpage, FirstOffsetNumber),
569+
vector + separator * sizeof(ItemPointerData),
570+
(maxoff - separator) * sizeof(ItemPointerData));
571+
else
572+
memcpy(GinDataPageGetPostingItem(rpage, FirstOffsetNumber),
573+
vector + separator * sizeof(PostingItem),
574+
(maxoff - separator) * sizeof(PostingItem));
575+
521576
GinPageGetOpaque(rpage)->maxoff = maxoff - separator;
522577

523578
PostingItemSetBlockNumber(&(btree->pitem), BufferGetBlockNumber(lbuf));
524579
if (GinPageIsLeaf(lpage))
525-
btree->pitem.key = *(ItemPointerData *) GinDataPageGetItem(lpage,
580+
btree->pitem.key = *GinDataPageGetItemPointer(lpage,
526581
GinPageGetOpaque(lpage)->maxoff);
527582
else
528-
btree->pitem.key = ((PostingItem *) GinDataPageGetItem(lpage,
529-
GinPageGetOpaque(lpage)->maxoff))->key;
583+
btree->pitem.key = GinDataPageGetPostingItem(lpage,
584+
GinPageGetOpaque(lpage)->maxoff)->key;
530585
btree->rightblkno = BufferGetBlockNumber(rbuf);
531586

532587
/* set up right bound for left page */
@@ -576,11 +631,11 @@ ginDataFillRoot(GinBtree btree, Buffer root, Buffer lbuf, Buffer rbuf)
576631

577632
li.key = *GinDataPageGetRightBound(lpage);
578633
PostingItemSetBlockNumber(&li, BufferGetBlockNumber(lbuf));
579-
GinDataPageAddItem(page, &li, InvalidOffsetNumber);
634+
GinDataPageAddPostingItem(page, &li, InvalidOffsetNumber);
580635

581636
ri.key = *GinDataPageGetRightBound(rpage);
582637
PostingItemSetBlockNumber(&ri, BufferGetBlockNumber(rbuf));
583-
GinDataPageAddItem(page, &ri, InvalidOffsetNumber);
638+
GinDataPageAddPostingItem(page, &ri, InvalidOffsetNumber);
584639
}
585640

586641
void

src/backend/access/gin/ginget.c

+7-5
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ findItemInPostingPage(Page page, ItemPointer item, OffsetNumber *off)
8383
*/
8484
for (*off = FirstOffsetNumber; *off <= maxoff; (*off)++)
8585
{
86-
res = ginCompareItemPointers(item, (ItemPointer) GinDataPageGetItem(page, *off));
86+
res = ginCompareItemPointers(item, GinDataPageGetItemPointer(page, *off));
8787

8888
if (res <= 0)
8989
return true;
@@ -154,7 +154,7 @@ scanPostingTree(Relation index, GinScanEntry scanEntry,
154154
GinPageGetOpaque(page)->maxoff >= FirstOffsetNumber)
155155
{
156156
tbm_add_tuples(scanEntry->matchBitmap,
157-
(ItemPointer) GinDataPageGetItem(page, FirstOffsetNumber),
157+
GinDataPageGetItemPointer(page, FirstOffsetNumber),
158158
GinPageGetOpaque(page)->maxoff, false);
159159
scanEntry->predictNumberResult += GinPageGetOpaque(page)->maxoff;
160160
}
@@ -467,7 +467,8 @@ startScanEntry(GinState *ginstate, GinScanEntry entry)
467467
*/
468468
entry->list = (ItemPointerData *) palloc(BLCKSZ);
469469
entry->nlist = GinPageGetOpaque(page)->maxoff;
470-
memcpy(entry->list, GinDataPageGetItem(page, FirstOffsetNumber),
470+
memcpy(entry->list,
471+
GinDataPageGetItemPointer(page, FirstOffsetNumber),
471472
GinPageGetOpaque(page)->maxoff * sizeof(ItemPointerData));
472473

473474
LockBuffer(entry->buffer, GIN_UNLOCK);
@@ -587,8 +588,9 @@ entryGetNextItem(GinState *ginstate, GinScanEntry entry)
587588
* Found position equal to or greater than stored
588589
*/
589590
entry->nlist = GinPageGetOpaque(page)->maxoff;
590-
memcpy(entry->list, GinDataPageGetItem(page, FirstOffsetNumber),
591-
GinPageGetOpaque(page)->maxoff * sizeof(ItemPointerData));
591+
memcpy(entry->list,
592+
GinDataPageGetItemPointer(page, FirstOffsetNumber),
593+
GinPageGetOpaque(page)->maxoff * sizeof(ItemPointerData));
592594

593595
LockBuffer(entry->buffer, GIN_UNLOCK);
594596

src/backend/access/gin/ginvacuum.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ ginVacuumPostingTreeLeaves(GinVacuumState *gvs, BlockNumber blkno, bool isRoot,
210210

211211
for (i = FirstOffsetNumber; i <= GinPageGetOpaque(page)->maxoff; i++)
212212
{
213-
PostingItem *pitem = (PostingItem *) GinDataPageGetItem(page, i);
213+
PostingItem *pitem = GinDataPageGetPostingItem(page, i);
214214

215215
if (ginVacuumPostingTreeLeaves(gvs, PostingItemGetBlockNumber(pitem), FALSE, NULL))
216216
isChildHasVoid = TRUE;
@@ -283,7 +283,7 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn
283283
#ifdef USE_ASSERT_CHECKING
284284
do
285285
{
286-
PostingItem *tod = (PostingItem *) GinDataPageGetItem(parentPage, myoff);
286+
PostingItem *tod = GinDataPageGetPostingItem(parentPage, myoff);
287287

288288
Assert(PostingItemGetBlockNumber(tod) == deleteBlkno);
289289
} while (0);
@@ -422,7 +422,7 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDel
422422
me->blkno = blkno;
423423
for (i = FirstOffsetNumber; i <= GinPageGetOpaque(page)->maxoff; i++)
424424
{
425-
PostingItem *pitem = (PostingItem *) GinDataPageGetItem(page, i);
425+
PostingItem *pitem = GinDataPageGetPostingItem(page, i);
426426

427427
if (ginScanToDelete(gvs, PostingItemGetBlockNumber(pitem), FALSE, me, i))
428428
i--;

0 commit comments

Comments
 (0)