Q: text palloc() size vs. SET_VARSIZE()
От | Albrecht Dreß |
---|---|
Тема | Q: text palloc() size vs. SET_VARSIZE() |
Дата | |
Msg-id | I4NJ4KUY.YUJI5WKV.EDRTQQUJ@WDR6Z6G7.7HHA5U57.KVGNKQOS обсуждение исходный текст |
Ответы |
Re: Q: text palloc() size vs. SET_VARSIZE()
|
Список | pgsql-general |
Hi all, I have a (hopefully not too dumb) question regarding the size allocation of a text return value in a C user-defined function. Basically, the function is somewhat similar to the copytext() example on <https://www.postgresql.org/docs/10/static/xfunc-c.html>. However, the function shall perform some “decoding” of the inputtext, so the result is either as long as the input, or shorter. In order to avoid time-consuming double-scanning of the input or re-allocation of memory, the idea is to allocate the resultto the maximum possible size, which may or may not be filled completely. Copied from the example in the manual: ---8<-------------------------------------------------------------------------- Datum decode_text(PG_FUNCTION_ARGS) { 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); } ---8<-------------------------------------------------------------------------- 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)? If this approach is wrong, would it be possible in the example above to just re-size new_t to the correct size by callingrepalloc()? Thanks in advance, Albrecht.
Вложения
В списке pgsql-general по дате отправления: