On Thu, Sep 1, 2022 at 10:10 PM Tom Lane <t...@sss.pgh.pa.us> wrote: > > Junwang Zhao <zhjw...@gmail.com> writes: > > result = lappend(result, makeDefElem(pstrdup(s), val, -1)); > > + pfree(s); > > I wonder why it's pstrdup'ing s in the first place. > Maybe it's pstrdup'ing s so that the caller should take care of the free?
I'm a little confused when we should call *pfree* and when we should not. A few lines before there is a call *text_to_cstring* in which it invokes *pfree* to free the unpacked text [0]. I'm just thinking that since *s* has been duplicated, we should free it, that's where the patch comes from. [0]: ``` char * text_to_cstring(const text *t) { /* must cast away the const, unfortunately */ text *tunpacked = pg_detoast_datum_packed(unconstify(text *, t)); int len = VARSIZE_ANY_EXHDR(tunpacked); char *result; result = (char *) palloc(len + 1); memcpy(result, VARDATA_ANY(tunpacked), len); result[len] = '\0'; if (tunpacked != t) pfree(tunpacked); return result; } ``` > regards, tom lane -- Regards Junwang Zhao