diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c index ca2a32bd25..e141e9d9d1 100644 --- a/src/backend/access/gin/ginfast.c +++ b/src/backend/access/gin/ginfast.c @@ -491,13 +491,33 @@ ginHeapTupleFastCollect(GinState *ginstate, */ if (collector->tuples == NULL) { - collector->lentuples = nentries * ginstate->origTupdesc->natts; + /* + * Determine the number of elements to allocate in the tuples array. + * We'll make this a power of 2 so we don't end up with a nonsensical + * number of elements when expanding the array below. + */ + collector->lentuples = 16; + while (collector->lentuples < nentries) + collector->lentuples *= 2; + collector->tuples = (IndexTuple *) palloc(sizeof(IndexTuple) * collector->lentuples); } - - while (collector->ntuples + nentries > collector->lentuples) + else if (collector->lentuples < collector->ntuples + nentries) { - collector->lentuples *= 2; + /* Determine the next power of 2 for lentuples */ + do { + /* + * Cap at INT_MAX to prevent overflow. The repalloc call will + * fail if we hit this, so no need to raise an error here. + */ + if (collector->lentuples > INT_MAX / 2) + { + collector->lentuples = INT_MAX; + break; + } + collector->lentuples *= 2; + } while (collector->lentuples < collector->ntuples + nentries); + collector->tuples = (IndexTuple *) repalloc(collector->tuples, sizeof(IndexTuple) * collector->lentuples); }