• Michael Paquier's avatar
    Fix psql's single transaction mode on client-side errors with -c/-f switches · a04ccf6d
    Michael Paquier authored
    psql --single-transaction is able to handle multiple -c and -f switches
    in a single transaction since d5563d7d, but this had the surprising
    behavior of forcing a transaction COMMIT even if psql failed with an
    error in the client (for example incorrect path given to \copy), which
    would generate an error, but still commit any changes that were already
    applied in the backend.  This commit makes the behavior more consistent,
    by enforcing a transaction ROLLBACK if any commands fail, both
    client-side and backend-side, so as no changes are applied if one error
    happens in any of them.
    
    Some tests are added on HEAD to provide some coverage about all that.
    Backend-side errors are unreliable as IPC::Run can complain on SIGPIPE
    if psql quits before reading a query result, but that should work
    properly in the case where any errors come from psql itself, which is
    what the original report is about.
    
    Reported-by: Christoph Berg
    Author: Kyotaro Horiguchi, Michael Paquier
    Discussion: https://postgr.es/m/17504-76b68018e130415e@postgresql.org
    Backpatch-through: 10
    a04ccf6d
startup.c 29 KB