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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy