postgres-github.git / summary / log / commit / refs

commit    d21604e17e491eef39626a2eff518b9731fefb91
Author:   Michael Paquier <michael@paquier.xyz>
Date:     Tue Jun 02 23:58:26 2026 +0000

    psql: Fix issues with deferred errors in pipelines
    
    When an error is raised while processing a Sync message in a pipeline,
    like a deferred constraint violation, the error was not associated with
    the piped command and was not counted in available_results.  This caused
    assertion failures in discardAbortedPipelineResults(), keeping an
    incorrect state at pipeline exit, because the code assumed that the
    number of available and requested results would always be positive,
    expecting all the counters to be 0 at the end of a pipeline.
    
    This commit switches discardAbortedPipelineResults() and
    ExecQueryAndProcessResults() to take a softer approach when consuming
    and draining the results after an error.  If there are still piped syncs
    in the pipeline when it ends, we now attempt to consume them before
    leaving the pipeline mode.
    
    Alexander has been able to reach two assertion failures through his
    testing.  While investigating more this issue, I have bumped into two
    more.  Most of these cases are covered by the regression tests added in
    this commit, plus some cases with mixes of pipelines, deferred errors
    and results fetched.  Some of the tests discussed (like the backend
    termination one) could not be included in this commit but have been
    tested manually.  Another test scenario discussed involved the injection
    of an error state in the backend, that was able to trick libpq
    internally and put its queue out of sync.  This scenario is not going to
    happen in practice, but if we were to do something about it we would
    need to make libpq understand that it needs to fail in some cases but
    not block.
    
    Reported-by: Alexander Lakhin <exclusion@gmail.com>
    Author: Michael Paquier <michael@paquier.xyz>
    Discussion: https://postgr.es/m/19494-97a86d84fee71c47@postgresql.org
    Backpatch-through: 18