mirror of
https://github.com/postgres/postgres.git
synced 2025-07-15 19:21:59 +03:00
Use correct text domain for translating errcontext() messages.
errcontext() is typically used in an error context callback function, not within an ereport() invocation like e.g errmsg and errdetail are. That means that the message domain that the TEXTDOMAIN magic in ereport() determines is not the right one for the errcontext() calls. The message domain needs to be determined by the C file containing the errcontext() call, not the file containing the ereport() call. Fix by turning errcontext() into a macro that passes the TEXTDOMAIN to use for the errcontext message. "errcontext" was used in a few places as a variable or struct field name, I had to rename those out of the way, now that errcontext is a macro. We've had this problem all along, but this isn't doesn't seem worth backporting. It's a fairly minor issue, and turning errcontext from a function to a macro requires at least a recompile of any external code that calls errcontext().
This commit is contained in:
@ -177,8 +177,19 @@ errhint(const char *fmt,...)
|
||||
the supplied arguments. */
|
||||
__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
|
||||
|
||||
/*
|
||||
* errcontext() is typically called in error context callback functions, not
|
||||
* within an ereport() invocation. The callback function can be in a different
|
||||
* module than the ereport() call, so the message domain passed in errstart()
|
||||
* is not usually the correct domain for translating the context message.
|
||||
* set_errcontext_domain() first sets the domain to be used, and
|
||||
* errcontext_msg() passes the actual message.
|
||||
*/
|
||||
#define errcontext set_errcontext_domain(TEXTDOMAIN), errcontext_msg
|
||||
|
||||
extern int set_errcontext_domain(const char *domain);
|
||||
extern int
|
||||
errcontext(const char *fmt,...)
|
||||
errcontext_msg(const char *fmt,...)
|
||||
/* This extension allows gcc to check the format string for consistency with
|
||||
the supplied arguments. */
|
||||
__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
|
||||
@ -320,6 +331,7 @@ typedef struct ErrorData
|
||||
int lineno; /* __LINE__ of ereport() call */
|
||||
const char *funcname; /* __func__ of ereport() call */
|
||||
const char *domain; /* message domain */
|
||||
const char *context_domain; /* message domain for context message */
|
||||
int sqlerrcode; /* encoded ERRSTATE */
|
||||
char *message; /* primary error message */
|
||||
char *detail; /* detail error message */
|
||||
|
Reference in New Issue
Block a user