1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-21 12:05:57 +03:00

pg_basebackup, pg_receivewal: fix failure to find password in ~/.pgpass.

Sloppy refactoring in commit cca97ce6a caused these programs
to pass dbname = NULL to libpq if there was no "--dbname" switch
on the command line, where before "replication" would be passed.
This didn't break things completely, because the source server doesn't
care about the dbname specified for a physical replication connection.
However, it did cause libpq to fail to match a ~/.pgpass entry that
has "replication" in the dbname field.  Restore the previous behavior
of passing "replication".

Also, closer inspection shows that if you do specify a dbname
in the connection string, that is what will be matched to ~/.pgpass,
not "replication".  This was the pre-existing behavior so we should
not change it, but the SGML docs were pretty misleading about it.
Improve that.

Per bug #18685 from Toshi Harada.  Back-patch to v17 where the
error crept in.

Discussion: https://postgr.es/m/18685-fee2dd142b9688f1@postgresql.org
Discussion: https://postgr.es/m/2702546.1730740456@sss.pgh.pa.us
This commit is contained in:
Tom Lane 2024-11-04 14:36:04 -05:00
parent 32d07a000f
commit b1008c1f01
3 changed files with 24 additions and 14 deletions

View File

@ -807,14 +807,18 @@ PostgreSQL documentation
will override any conflicting command line options. will override any conflicting command line options.
</para> </para>
<para> <para>
The option is called <literal>--dbname</literal> for consistency with other This option is called <literal>--dbname</literal> for consistency with other
client applications, but because <application>pg_basebackup</application> client applications, but because <application>pg_basebackup</application>
doesn't connect to any particular database in the cluster, any database doesn't connect to any particular database in the cluster, any database
name in the connection string will be ignored name included in the connection string will be ignored by the server.
by <productname>PostgreSQL</productname>. Middleware, or proxies, used in However, a database name supplied that way overrides the default
connecting to <productname>PostgreSQL</productname> might however database name (<literal>replication</literal>) for purposes of
utilize the value. The database name specified in connection string can looking up the replication connection's password
also be used by <link linkend="logicaldecoding-replication-slots-synchronization"> in <filename>~/.pgpass</filename>. Similarly, middleware or proxies
used in connecting to <productname>PostgreSQL</productname> might
utilize the name for purposes such as connection routing. The
database name can also be used
by <link linkend="logicaldecoding-replication-slots-synchronization">
logical replication slot synchronization</link>. logical replication slot synchronization</link>.
</para> </para>
</listitem> </listitem>

View File

@ -315,13 +315,16 @@ PostgreSQL documentation
will override any conflicting command line options. will override any conflicting command line options.
</para> </para>
<para> <para>
The option is called <literal>--dbname</literal> for consistency with other This option is called <literal>--dbname</literal> for consistency with other
client applications, but because <application>pg_receivewal</application> client applications, but because <application>pg_receivewal</application>
doesn't connect to any particular database in the cluster, any database doesn't connect to any particular database in the cluster, any database
name in the connection string will be ignored by name included in the connection string will be ignored by the server.
<productname>PostgreSQL</productname>. Middleware, or proxies, used in However, a database name supplied that way overrides the default
connecting to <productname>PostgreSQL</productname> might however database name (<literal>replication</literal>) for purposes of
utilize the value. looking up the replication connection's password
in <filename>~/.pgpass</filename>. Similarly, middleware or proxies
used in connecting to <productname>PostgreSQL</productname> might
utilize the name for purposes such as connection routing.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@ -74,7 +74,10 @@ GetConnection(void)
PQconninfoOption *conn_opt; PQconninfoOption *conn_opt;
char *err_msg = NULL; char *err_msg = NULL;
/* pg_recvlogical uses dbname only; others use connection_string only. */ /*
* pg_recvlogical uses dbname only; others use connection_string only.
* (Note: both variables will be NULL if there's no command line options.)
*/
Assert(dbname == NULL || connection_string == NULL); Assert(dbname == NULL || connection_string == NULL);
/* /*
@ -120,12 +123,12 @@ GetConnection(void)
keywords = pg_malloc0((argcount + 1) * sizeof(*keywords)); keywords = pg_malloc0((argcount + 1) * sizeof(*keywords));
values = pg_malloc0((argcount + 1) * sizeof(*values)); values = pg_malloc0((argcount + 1) * sizeof(*values));
keywords[i] = "dbname"; keywords[i] = "dbname";
values[i] = dbname; values[i] = (dbname == NULL) ? "replication" : dbname;
i++; i++;
} }
keywords[i] = "replication"; keywords[i] = "replication";
values[i] = dbname == NULL ? "true" : "database"; values[i] = (dbname == NULL) ? "true" : "database";
i++; i++;
keywords[i] = "fallback_application_name"; keywords[i] = "fallback_application_name";
values[i] = progname; values[i] = progname;