diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 893f8a5b563..7112fb00069 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -1738,7 +1738,21 @@ CopyErrorData(void) newedata = (ErrorData *) palloc(sizeof(ErrorData)); memcpy(newedata, edata, sizeof(ErrorData)); - /* Make copies of separately-allocated fields */ + /* + * Make copies of separately-allocated strings. Note that we copy even + * theoretically-constant strings such as filename. This is because those + * could point into JIT-created code segments that might get unloaded at + * transaction cleanup. In some cases we need the copied ErrorData to + * survive transaction boundaries, so we'd better copy those strings too. + */ + if (newedata->filename) + newedata->filename = pstrdup(newedata->filename); + if (newedata->funcname) + newedata->funcname = pstrdup(newedata->funcname); + if (newedata->domain) + newedata->domain = pstrdup(newedata->domain); + if (newedata->context_domain) + newedata->context_domain = pstrdup(newedata->context_domain); if (newedata->message) newedata->message = pstrdup(newedata->message); if (newedata->detail) @@ -1751,6 +1765,8 @@ CopyErrorData(void) newedata->context = pstrdup(newedata->context); if (newedata->backtrace) newedata->backtrace = pstrdup(newedata->backtrace); + if (newedata->message_id) + newedata->message_id = pstrdup(newedata->message_id); if (newedata->schema_name) newedata->schema_name = pstrdup(newedata->schema_name); if (newedata->table_name)