• Tom Lane's avatar
    Fix connection string handling in psql's \connect command. · 85c54287
    Tom Lane authored
    psql's \connect claims to be able to re-use previous connection
    parameters, but in fact it only re-uses the database name, user name,
    host name (and possibly hostaddr, depending on version), and port.
    This is problematic for assorted use cases.  Notably, pg_dump[all]
    emits "\connect databasename" commands which we would like to have
    re-use all other parameters.  If such a script is loaded in a psql run
    that initially had "-d connstring" with some non-default parameters,
    those other parameters would be lost, potentially causing connection
    failure.  (Thus, this is the same kind of bug addressed in commits
    a45bc8a4 and 8e5793ab, although the details are much different.)
    
    To fix, redesign do_connect() so that it pulls out all properties
    of the old PGconn using PQconninfo(), and then replaces individual
    properties in that array.  In the case where we don't wish to re-use
    anything, get libpq's default settings using PQconndefaults() and
    replace entries in that, so that we don't need different code paths
    for the two cases.
    
    This does result in an additional behavioral change for cases where
    the original connection parameters allowed multiple hosts, say
    "psql -h host1,host2", and the \connect request allows re-use of the
    host setting.  Because the previous coding relied on PQhost(), it
    would only permit reconnection to the same host originally selected.
    Although one can think of scenarios where that's a good thing, there
    are others where it is not.  Moreover, that behavior doesn't seem to
    meet the principle of least surprise, nor was it documented; nor is
    it even clear it was intended, since that coding long pre-dates the
    addition of multi-host support to libpq.  Hence, this patch is content
    to drop it and re-use the host list as given.
    
    Per Peter Eisentraut's comments on bug #16604.  Back-patch to all
    supported branches.
    
    Discussion: https://postgr.es/m/16604-933f4b8791227b15@postgresql.org
    85c54287
command.c 132 KB