Hi

2016-02-16 10:47 GMT+01:00 Kyotaro HORIGUCHI <
horiguchi.kyot...@lab.ntt.co.jp>:

> Hello.
>
> I'm planning to change the error level of a specific error
> message.  We can use emit_log_hook for this purpose but we have
> no reliable means to identify what a message is.
>
> For messages without valid sqlerrcode, filename:lineno could be
> used to identify but lineno is too unstable.  One possible and
> most straightforward way to solve this is defining identifiers
> covering all error messages but such identifiers are too hard to
> manage.  ErrorData.message could also be used but NLS translation
> and placeholders prevent it from being identified by simple means
> like strcmp(3).
>
> As a solution for this problem, I'd like to porpose to have an
> additional member in the struct ErrorData to hold a message id,
> that is, the format string for errmsg(). This is not best but
> useful enough.
>
> It is somewhat a crude way, but the attached small patch would
> do.
>
> Is there any opinions or suggestions?
>

It looks like workaround. The fixing missing sqlerrcode is much better.

Regards

Pavel



>
> regards,
>
> --
> Kyotaro Horiguchi
> NTT Open Source Software Center
>
> diff --git a/src/backend/utils/error/elog.c
> b/src/backend/utils/error/elog.c
> index 9005b26..2d13101 100644
> --- a/src/backend/utils/error/elog.c
> +++ b/src/backend/utils/error/elog.c
> @@ -801,6 +801,7 @@ errmsg(const char *fmt,...)
>         CHECK_STACK_DEPTH();
>         oldcontext = MemoryContextSwitchTo(edata->assoc_context);
>
> +       edata->message_id = fmt;
>         EVALUATE_MESSAGE(edata->domain, message, false, true);
>
>         MemoryContextSwitchTo(oldcontext);
> @@ -830,6 +831,7 @@ errmsg_internal(const char *fmt,...)
>         CHECK_STACK_DEPTH();
>         oldcontext = MemoryContextSwitchTo(edata->assoc_context);
>
> +       edata->message_id = fmt;
>         EVALUATE_MESSAGE(edata->domain, message, false, false);
>
>         MemoryContextSwitchTo(oldcontext);
> @@ -853,6 +855,7 @@ errmsg_plural(const char *fmt_singular, const char
> *fmt_plural,
>         CHECK_STACK_DEPTH();
>         oldcontext = MemoryContextSwitchTo(edata->assoc_context);
>
> +       edata->message_id = fmt_singular;
>         EVALUATE_MESSAGE_PLURAL(edata->domain, message, false);
>
>         MemoryContextSwitchTo(oldcontext);
> @@ -1361,6 +1364,7 @@ elog_finish(int elevel, const char *fmt,...)
>         recursion_depth++;
>         oldcontext = MemoryContextSwitchTo(edata->assoc_context);
>
> +       edata->message_id = fmt;
>         EVALUATE_MESSAGE(edata->domain, message, false, false);
>
>         MemoryContextSwitchTo(oldcontext);
> @@ -1420,6 +1424,7 @@ format_elog_string(const char *fmt,...)
>
>         oldcontext = MemoryContextSwitchTo(ErrorContext);
>
> +       edata->message_id = fmt;
>         EVALUATE_MESSAGE(edata->domain, message, false, true);
>
>         MemoryContextSwitchTo(oldcontext);
> diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h
> index 326896f..4df76da 100644
> --- a/src/include/utils/elog.h
> +++ b/src/include/utils/elog.h
> @@ -354,6 +354,7 @@ typedef struct ErrorData
>         char       *detail_log;         /* detail error message for server
> log only */
>         char       *hint;                       /* hint message */
>         char       *context;            /* context message */
> +       const char *message_id;         /* message id of .message */
>         char       *schema_name;        /* name of schema */
>         char       *table_name;         /* name of table */
>         char       *column_name;        /* name of column */
>
>
> --
> Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers
>
>

Reply via email to