Q: text palloc() size vs. SET_VARSIZE() - Mailing list pgsql-general

From Albrecht Dreß
Subject Q: text palloc() size vs. SET_VARSIZE()
Date
Msg-id I4NJ4KUY.YUJI5WKV.EDRTQQUJ@WDR6Z6G7.7HHA5U57.KVGNKQOS
Whole thread Raw
Responses Re: Q: text palloc() size vs. SET_VARSIZE()
List 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.
Attachment

pgsql-general by date:

Previous
From: Vick Khera
Date:
Subject: Re: Jira database won't start after disk filled up
Next
From: Tom Lane
Date:
Subject: Re: Q: text palloc() size vs. SET_VARSIZE()