Re: Q: text palloc() size vs. SET_VARSIZE()

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: Q: text palloc() size vs. SET_VARSIZE()
Дата
Msg-id 26392.1520193134@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Q: text palloc() size vs. SET_VARSIZE()  (Albrecht Dreß <albrecht.dress@arcor.de>)
Ответы Re: Q: text palloc() size vs. SET_VARSIZE()
Список pgsql-general
Albrecht =?iso-8859-1?b?RHJl3w==?= <albrecht.dress@arcor.de> writes:
>      text     *t = PG_GETARG_TEXT_PP(0);
>      size_t    out_len = 0U;

>      // allocate to the max. possible output size
>      text     *new_t = (text *) palloc(VARSIZE_ANY_EXHDR(t) + VARHDRSZ);

>      // copy data to VARDATA(new_t), and count bytes in out_len

>      // set output size which is out_len <= VARSIZE_ANY_EXHDR(t)
>      SET_VARSIZE(new_t, out_len + VARHDRSZ);
>      PG_RETURN_TEXT_P(new_t);

That code looks fine to me.

>  From the docs, for me it is not clear whether the value assigned using SET_VARSIZE() must be the *exact* size of the
newlyallocated return value, or just the length of the text plus the header size.  IOW would the code above create a
memoryleak if out_len < VARSIZE_ANY_EXHDR(t)? 

No memory leak.  Your returned value would have some wasted memory at
the end of its palloc chunk, but function result values don't normally
live long enough that that's worth worrying about.

You could repalloc the result down to minimum size if you felt like it,
but I think it'd largely be a waste of cycles.  There are lots of similar
examples in the core backend, and few if any bother with a repalloc.

            regards, tom lane


В списке pgsql-general по дате отправления:

Предыдущее
От: Albrecht Dreß
Дата:
Сообщение: Q: text palloc() size vs. SET_VARSIZE()
Следующее
От: raf@raf.org
Дата:
Сообщение: Re: Is there a continuous backup for pg ?