Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc2b175b

Browse files
committed
Minor GIN code refactoring.
It makes for cleaner code to have separate Get/Add functions for PostingItemsand ItemPointers. A few callsites that have to deal with both types need tobe duplicated because of this, but all the callers have to know which onethey're dealing with anyway. Overall, this reduces the amount of castingrequired.Extracted from Alexander Korotkov's larger patch to change the data pageformat.
1 parent627882d commitc2b175b

File tree

5 files changed

+123
-55
lines changed

5 files changed

+123
-55
lines changed

‎src/backend/access/gin/gindatapage.c

Lines changed: 88 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ dataLocateItem(GinBtree btree, GinBtreeStack *stack)
105105
{
106106
OffsetNumbermid=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
returnPostingItemGetBlockNumber(pitem);
140140
}
141141

@@ -176,7 +176,8 @@ dataLocateLeafItem(GinBtree btree, GinBtreeStack *stack)
176176
{
177177
OffsetNumbermid=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
returnstoredOff;
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
returni;
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
returni;
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
returnPostingItemGetBlockNumber(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(Pagepage,void*data,OffsetNumberoffset)
263+
GinDataPageAddItemPointer(Pagepage,ItemPointerdata,OffsetNumberoffset)
264264
{
265265
OffsetNumbermaxoff=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(Pagepage,PostingItem*data,OffsetNumberoffset)
292+
{
293+
OffsetNumbermaxoff=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
OffsetNumberseparator;
449480
ItemPointerbound;
450481
Pagelpage=PageGetTempPageCopy(BufferGetPage(lbuf));
482+
boolisleaf=GinPageIsLeaf(lpage);
451483
ItemPointerDataoldbound=*GinDataPageGetRightBound(lpage);
452484
intsizeofitem=GinSizeOfDataPageItem(lpage);
453485
OffsetNumbermaxoff=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

Lines changed: 7 additions & 5 deletions
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

Lines changed: 3 additions & 3 deletions
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
#ifdefUSE_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)

[8]ページ先頭

©2009-2025 Movatter.jp