• Tom Lane's avatar
    In libpq, always append new error messages to conn->errorMessage. · ffa2e467
    Tom Lane authored
    Previously, we had an undisciplined mish-mash of printfPQExpBuffer and
    appendPQExpBuffer calls to report errors within libpq.  This commit
    establishes a uniform rule that appendPQExpBuffer[Str] should be used.
    conn->errorMessage is reset only at the start of an application request,
    and then accumulates messages till we're done.  We can remove no less
    than three different ad-hoc mechanisms that were used to get the effect
    of concatenation of error messages within a sequence of operations.
    
    Although this makes things quite a bit cleaner conceptually, the main
    reason to do it is to make the world safer for the multiple-target-host
    feature that was added awhile back.  Previously, there were many cases
    in which an error occurring during an individual host connection attempt
    would wipe out the record of what had happened during previous attempts.
    (The reporting is still inadequate, in that it can be hard to tell which
    host got the failure, but that seems like a matter for a separate commit.)
    
    Currently, lo_import and lo_export contain exceptions to the "never
    use printfPQExpBuffer" rule.  If we changed them, we'd risk reporting
    an incidental lo_close failure before the actual read or write
    failure, which would be confusing, not least because lo_close happened
    after the main failure.  We could improve this by inventing an
    internal version of lo_close that doesn't reset the errorMessage; but
    we'd also need a version of PQfn() that does that, and it didn't quite
    seem worth the trouble for now.
    
    Discussion: https://postgr.es/m/BN6PR05MB3492948E4FD76C156E747E8BC9160@BN6PR05MB3492.namprd05.prod.outlook.com
    ffa2e467
fe-exec.c 92.3 KB