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:
parent
32d07a000f
commit
b1008c1f01
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user