> + ereport(errlevel, > (errcode(ERRCODE_TOO_MANY_ROWS), > errmsg("query returned more than one row"), > - errdetail ? errdetail_internal("parameters: %s", errdetail) : 0)); > + errdetail ? errdetail_internal("parameters: %s", errdetail) : 0, > + use_errhint ? errhint("too_many_rows check of extra_%s is active.", > + too_many_rows_level == ERROR ? "errors" : "warnings") : 0));
Please write this in a way that results in less translatable messages, and don't build setting names at runtime. Concretely I suggest this:
errhint(too_many_rows_level == ERROR ? gettext_noop("%s check of extra_errors is active.") : gettext_noop("%s check of extra_warnings is active."), "too_many_rows");
This way, 1. only two messages need translation, not one per type of warning/error 2. the translator doesn't need to scratch their head to figure out what the second %s is 3. they don't have to worry about introducing a typo in the string "too_many_rows" or the strings "extra_errors", "extra_warnings". (Laugh all you want. It's a real problem).
If you can add a /* translator: */ comment to indicate what the first %s is, all the better. I'm just not sure *where* it needs to go. I'm not 100% sure the gettext_noop() is really needed either.
> + ereport(strict_multiassignment_level, > + (errcode(ERRCODE_DATATYPE_MISMATCH), > + errmsg("Number of source and target fields in assignment do not match."),
Please, no uppercase in errmsg(), and no ending period.
Thank you for notes. Tomorrow morning I'll spend few hours in train and I'll send updated patch