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

Commit bb42e21

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

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, uint32 na,
357-
ItemPointerData *b, uint32 nb)
353+
ItemPointer
354+
ginMergeItemPointers(ItemPointerData *a, uint32 na,
355+
ItemPointerData *b, uint32 nb,
356+
int *nmerged)
358357
{
359-
ItemPointerData *dptr = dst;
360-
ItemPointerData *aptr = a,
361-
*bptr = b;
362-
int result;
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
else if (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
int cmp = 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-
return result;
409+
return dst;
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
extern ItemPointer ginPostingListDecodeAllSegments(GinPostingList *ptr, int len, int *ndecoded);
921921
extern ItemPointer ginPostingListDecode(GinPostingList *ptr, int *ndecoded);
922-
extern int ginMergeItemPointers(ItemPointerData *dst,
923-
ItemPointerData *a, uint32 na,
924-
ItemPointerData *b, uint32 nb);
922+
extern ItemPointer ginMergeItemPointers(ItemPointerData *a, uint32 na,
923+
ItemPointerData *b, uint32 nb,
924+
int *nmerged);
925925

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

0 commit comments

Comments
 (0)