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