@@ -346,39 +346,41 @@ ginPostingListDecodeAllSegmentsToTbm(GinPostingList *ptr, int len,
346
346
347
347
/*
348
348
* 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.
351
349
*
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.
353
352
*/
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 )
358
357
{
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 ));
363
361
364
362
/*
365
363
* If the argument arrays don't overlap, we can just append them to
366
364
* each other.
367
365
*/
368
366
if (na == 0 || nb == 0 || ginCompareItemPointers (& a [na - 1 ], & b [0 ]) < 0 )
369
367
{
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 ;
373
371
}
374
372
else if (ginCompareItemPointers (& b [nb - 1 ], & a [0 ]) < 0 )
375
373
{
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 ;
379
377
}
380
378
else
381
379
{
380
+ ItemPointerData * dptr = dst ;
381
+ ItemPointerData * aptr = a ;
382
+ ItemPointerData * bptr = b ;
383
+
382
384
while (aptr - a < na && bptr - b < nb )
383
385
{
384
386
int cmp = ginCompareItemPointers (aptr , bptr );
@@ -401,8 +403,8 @@ ginMergeItemPointers(ItemPointerData *dst,
401
403
while (bptr - b < nb )
402
404
* dptr ++ = * bptr ++ ;
403
405
404
- result = dptr - dst ;
406
+ * nmerged = dptr - dst ;
405
407
}
406
408
407
- return result ;
409
+ return dst ;
408
410
}
0 commit comments