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

Commitbb42e21

Browse files
committed
Change ginMergeItemPointers to return a palloc'd array.
That seems nicer than making it the caller's responsibility to pass asuitable-sized array. All the callers were just palloc'ing an array anyway.
1 parentcf5d38f commitbb42e21

File tree

4 files changed

+30
-32
lines changed

4 files changed

+30
-32
lines changed

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,10 +1303,9 @@ addItemsToLeaf(disassembledLeaf *leaf, ItemPointer newItems, int nNewItems)
13031303
if (!cur->items)
13041304
cur->items=ginPostingListDecode(cur->seg,&cur->nitems);
13051305

1306-
tmpitems=palloc((cur->nitems+nthis)*sizeof(ItemPointerData));
1307-
ntmpitems=ginMergeItemPointers(tmpitems,
1308-
cur->items,cur->nitems,
1309-
nextnew,nthis);
1306+
tmpitems=ginMergeItemPointers(cur->items,cur->nitems,
1307+
nextnew,nthis,
1308+
&ntmpitems);
13101309
if (ntmpitems!=cur->nitems)
13111310
{
13121311
cur->items=tmpitems;

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,9 @@ addItemPointersToLeafTuple(GinState *ginstate,
6767
/* merge the old and new posting lists */
6868
oldItems=ginReadTuple(ginstate,attnum,old,&oldNPosting);
6969

70-
newNPosting=oldNPosting+nitem;
71-
newItems= (ItemPointerData*)palloc(sizeof(ItemPointerData)*newNPosting);
72-
73-
newNPosting=ginMergeItemPointers(newItems,
74-
items,nitem,
75-
oldItems,oldNPosting);
70+
newItems=ginMergeItemPointers(items,nitem,
71+
oldItems,oldNPosting,
72+
&newNPosting);
7673

7774
/* Compress the posting list, and try to a build tuple with room for it */
7875
res=NULL;

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

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -346,39 +346,41 @@ ginPostingListDecodeAllSegmentsToTbm(GinPostingList *ptr, int len,
346346

347347
/*
348348
* Merge two ordered arrays of itempointers, eliminating any duplicates.
349-
* Returns the number of items in the result.
350-
* Caller is responsible that there is enough space at *dst.
351349
*
352-
* It's OK if 'dst' overlaps with the *beginning* of one of the arguments.
350+
* Returns a palloc'd array, and *nmerged is set to the number of items in
351+
* the result, after eliminating duplicates.
353352
*/
354-
int
355-
ginMergeItemPointers(ItemPointerData*dst,
356-
ItemPointerData*a,uint32na,
357-
ItemPointerData*b,uint32nb)
353+
ItemPointer
354+
ginMergeItemPointers(ItemPointerData*a,uint32na,
355+
ItemPointerData*b,uint32nb,
356+
int*nmerged)
358357
{
359-
ItemPointerData*dptr=dst;
360-
ItemPointerData*aptr=a,
361-
*bptr=b;
362-
intresult;
358+
ItemPointerData*dst;
359+
360+
dst= (ItemPointer)palloc((na+nb)*sizeof(ItemPointerData));
363361

364362
/*
365363
* If the argument arrays don't overlap, we can just append them to
366364
* each other.
367365
*/
368366
if (na==0||nb==0||ginCompareItemPointers(&a[na-1],&b[0])<0)
369367
{
370-
memmove(dst,a,na*sizeof(ItemPointerData));
371-
memmove(&dst[na],b,nb*sizeof(ItemPointerData));
372-
result=na+nb;
368+
memcpy(dst,a,na*sizeof(ItemPointerData));
369+
memcpy(&dst[na],b,nb*sizeof(ItemPointerData));
370+
*nmerged=na+nb;
373371
}
374372
elseif (ginCompareItemPointers(&b[nb-1],&a[0])<0)
375373
{
376-
memmove(dst,b,nb*sizeof(ItemPointerData));
377-
memmove(&dst[nb],a,na*sizeof(ItemPointerData));
378-
result=na+nb;
374+
memcpy(dst,b,nb*sizeof(ItemPointerData));
375+
memcpy(&dst[nb],a,na*sizeof(ItemPointerData));
376+
*nmerged=na+nb;
379377
}
380378
else
381379
{
380+
ItemPointerData*dptr=dst;
381+
ItemPointerData*aptr=a;
382+
ItemPointerData*bptr=b;
383+
382384
while (aptr-a<na&&bptr-b<nb)
383385
{
384386
intcmp=ginCompareItemPointers(aptr,bptr);
@@ -401,8 +403,8 @@ ginMergeItemPointers(ItemPointerData *dst,
401403
while (bptr-b<nb)
402404
*dptr++=*bptr++;
403405

404-
result=dptr-dst;
406+
*nmerged=dptr-dst;
405407
}
406408

407-
returnresult;
409+
returndst;
408410
}

‎src/include/access/gin_private.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -919,9 +919,9 @@ extern int ginPostingListDecodeAllSegmentsToTbm(GinPostingList *ptr, int totalsi
919919

920920
externItemPointerginPostingListDecodeAllSegments(GinPostingList*ptr,intlen,int*ndecoded);
921921
externItemPointerginPostingListDecode(GinPostingList*ptr,int*ndecoded);
922-
externintginMergeItemPointers(ItemPointerData*dst,
923-
ItemPointerData*a,uint32na,
924-
ItemPointerData*b,uint32nb);
922+
externItemPointerginMergeItemPointers(ItemPointerData*a,uint32na,
923+
ItemPointerData*b,uint32nb,
924+
int*nmerged);
925925

926926
/*
927927
* Merging the results of several gin scans compares item pointers a lot,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp