• Tom Lane's avatar
    Fix unwanted flushing of libpq's input buffer when socket EOF is seen. · c4059188
    Tom Lane authored
    In commit 210eb9b7 I centralized libpq's logic for closing down
    the backend communication socket, and made the new pqDropConnection
    routine always reset the I/O buffers to empty.  Many of the call sites
    previously had not had such code, and while that amounted to an oversight
    in some cases, there was one place where it was intentional and necessary
    *not* to flush the input buffer: pqReadData should never cause that to
    happen, since we probably still want to process whatever data we read.
    
    This is the true cause of the problem Robert was attempting to fix in
    c3e7c24a, namely that libpq no longer reported the backend's final
    ERROR message before reporting "server closed the connection unexpectedly".
    But that only accidentally fixed it, by invoking parseInput before the
    input buffer got flushed; and very likely there are timing scenarios
    where we'd still lose the message before processing it.
    
    To fix, pass a flag to pqDropConnection to tell it whether to flush the
    input buffer or not.  On review I think flushing is actually correct for
    every other call site.
    
    Back-patch to 9.3 where the problem was introduced.  In HEAD, also improve
    the comments added by c3e7c24a.
    c4059188
fe-misc.c 30 KB