Use correct text domain for errcontext() appearing within ereport().
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 12 Jan 2015 17:40:16 +0000 (12:40 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 12 Jan 2015 17:40:31 +0000 (12:40 -0500)
commit19f326619696bfb1be9a3b80090e5f39e805b359
tree03b8caa562cec3e36428547777d8ec96ce5b14d4
parente71111972d7e914b84bf79ea346b438d7d815108
Use correct text domain for errcontext() appearing within ereport().

The mechanism added in commit dbdf9679d7d61b03a3bf73af9b095831b7010eb5
for associating the correct translation domain with errcontext strings
potentially fails in cases where errcontext() is used within an ereport()
macro.  Such usage was not originally envisioned for errcontext(), but we
do have a few places that do it.  In this situation, the intended comma
expression becomes just a couple of arguments to errfinish(), which the
compiler might choose to evaluate right-to-left.

Fortunately, in such cases the textdomain for the errcontext string must
be the same as for the surrounding ereport.  So we can fix this by letting
errstart initialize context_domain along with domain; then it will have
the correct value no matter which order the calls occur in.  (Note that
error stack callback functions are not invoked until errfinish, so normal
usage of errcontext won't affect what happens for errcontext calls within
the ereport macro.)

In passing, make sure that errcontext calls within the main backend set
context_domain to something non-NULL.  This isn't a live bug because
NULL would select the current textdomain() setting which should be the
right thing anyway --- but it seems better to handle this completely
consistently with the regular domain field.

Per report from Dmitry Voronin.  Backpatch to 9.3; before that, there
wasn't any attempt to ensure that errcontext strings were translated
in an appropriate domain.
src/backend/utils/error/elog.c