diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 8253ced0c5..d62cbdce32 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -80,8 +80,8 @@ typedef struct char *buf1; /* 1st string, or abbreviation original string * buf */ char *buf2; /* 2nd string, or abbreviation strxfrm() buf */ - int buflen1; - int buflen2; + int buflen1; /* Allocated length of buf1 */ + int buflen2; /* Allocated length of buf2 */ int last_len1; /* Length of last buf1 string/strxfrm() input */ int last_len2; /* Length of last buf2 string/strxfrm() blob */ int last_returned; /* Last comparison result (cache) */ @@ -2340,15 +2340,13 @@ varstrfastcmp_locale(char *a1p, int len1, char *a2p, int len2, SortSupport ssup) if (len1 >= sss->buflen1) { - pfree(sss->buf1); sss->buflen1 = Max(len1 + 1, Min(sss->buflen1 * 2, MaxAllocSize)); - sss->buf1 = MemoryContextAlloc(ssup->ssup_cxt, sss->buflen1); + sss->buf1 = repalloc(sss->buf1, sss->buflen1); } if (len2 >= sss->buflen2) { - pfree(sss->buf2); sss->buflen2 = Max(len2 + 1, Min(sss->buflen2 * 2, MaxAllocSize)); - sss->buf2 = MemoryContextAlloc(ssup->ssup_cxt, sss->buflen2); + sss->buf2 = repalloc(sss->buf2, sss->buflen2); } /* @@ -2549,9 +2547,8 @@ varstr_abbrev_convert(Datum original, SortSupport ssup) /* By convention, we use buffer 1 to store and NUL-terminate */ if (len >= sss->buflen1) { - pfree(sss->buf1); sss->buflen1 = Max(len + 1, Min(sss->buflen1 * 2, MaxAllocSize)); - sss->buf1 = palloc(sss->buflen1); + sss->buf1 = repalloc(sss->buf1, sss->buflen1); } /* Might be able to reuse strxfrm() blob from last call */ @@ -2638,10 +2635,9 @@ varstr_abbrev_convert(Datum original, SortSupport ssup) /* * Grow buffer and retry. */ - pfree(sss->buf2); sss->buflen2 = Max(bsize + 1, Min(sss->buflen2 * 2, MaxAllocSize)); - sss->buf2 = palloc(sss->buflen2); + sss->buf2 = repalloc(sss->buf2, sss->buflen2); } /*