Hi,
On 2020-11-29 12:10:21 -0500, Tom Lane wrote:
> Agreed. snprintf.c is meant to implement a recognized standard
> (ok, %m is a GNU extension, but it's still pretty standard).
> I'm not on board with putting PG-only extensions in there.
I wonder if there's something we could layer on the elog.c level
instead. But I also don't like the idea of increasing the use of wrapper
functions that need to allocate string buffers than then need to get
copied in turn.
We could do something like
errmsg("plain string arg: %s, conv string arg: %s", somestr, estr_lsn(lsn))
where estr_lsn() wouldn't do any conversion directly, instead setting up
a callback in ErrorData that knows how to do the type specific
conversion. Then during EVALUATE_MESSAGE() we'd evaluate the message
piecemeal and call the output callbacks for each arg, using the
StringInfo.
There's two main issues with something roughly like this:
1) We'd need to do format string parsing somewhere above snprintf.c,
which isn't free.
2) Without relying on C11 / _Generic() some ugly macro hackery would be
needed to have a argument-number indexed state. If we did rely on
_Generic() we probably could do better, even getting rid of the need
for something like estr_lsn().
Greetings,
Andres Freund