summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Gustafsson2023-09-21 11:53:07 +0000
committerDaniel Gustafsson2023-09-21 11:53:07 +0000
commitcca97ce6a6653df7f4ec71ecd54944cc9a6c4c16 (patch)
tree319b047b066b90da93e6db12deadc3cf1ae28d7d
parentc621467d2bc6435d07db4471998ca9c9f0c57777 (diff)
Allow dbname in pg_basebackup/pg_receivewal connstring
As physical replication work at the cluster level and not database level, any dbname in the connection string is ignored. Proxies and middleware used in connecting to the cluster might however need to know the dbname in order to make the correct routing decision for the connection. With this the startup packet will include the dbname parameter. Author: Jelte Fennema-Nio <[email protected]> Reviewed-by: Tristen Raab <[email protected]> Reviewed-by: Jim Jones <[email protected]> Discussion: https://postgr.es/m/CAGECzQTw-dZkVT_RELRzfWRzY714-VaTjoBATYfZq93R8C-auA@mail.gmail.com
-rw-r--r--doc/src/sgml/ref/pg_basebackup.sgml5
-rw-r--r--doc/src/sgml/ref/pg_receivewal.sgml7
-rw-r--r--src/bin/pg_basebackup/streamutil.c29
3 files changed, 27 insertions, 14 deletions
diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml
index d2b8ddd200c..344de921e4b 100644
--- a/doc/src/sgml/ref/pg_basebackup.sgml
+++ b/doc/src/sgml/ref/pg_basebackup.sgml
@@ -778,7 +778,10 @@ PostgreSQL documentation
The option is called <literal>--dbname</literal> for consistency with other
client applications, but because <application>pg_basebackup</application>
doesn't connect to any particular database in the cluster, any database
- name in the connection string will be ignored.
+ name in the connection string will be ignored
+ by <productname>PostgreSQL</productname>. Middleware, or proxies, used in
+ connecting to <productname>PostgreSQL</productname> might however
+ utilize the value.
</para>
</listitem>
</varlistentry>
diff --git a/doc/src/sgml/ref/pg_receivewal.sgml b/doc/src/sgml/ref/pg_receivewal.sgml
index cecc7daec97..798b972d3cc 100644
--- a/doc/src/sgml/ref/pg_receivewal.sgml
+++ b/doc/src/sgml/ref/pg_receivewal.sgml
@@ -316,8 +316,11 @@ PostgreSQL documentation
<para>
The option is called <literal>--dbname</literal> for consistency with other
client applications, but because <application>pg_receivewal</application>
- doesn't connect to any particular database in the cluster, database
- name in the connection string will be ignored.
+ doesn't connect to any particular database in the cluster, any database
+ name in the connection string will be ignored by
+ <productname>PostgreSQL</productname>. Middleware, or proxies, used in
+ connecting to <productname>PostgreSQL</productname> might however
+ utilize the value.
</para>
</listitem>
</varlistentry>
diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c
index 75ab9e56f3e..dbd08ab1722 100644
--- a/src/bin/pg_basebackup/streamutil.c
+++ b/src/bin/pg_basebackup/streamutil.c
@@ -79,9 +79,6 @@ GetConnection(void)
/*
* Merge the connection info inputs given in form of connection string,
* options and default values (dbname=replication, replication=true, etc.)
- * Explicitly discard any dbname value in the connection string;
- * otherwise, PQconnectdbParams() would interpret that value as being
- * itself a connection string.
*/
i = 0;
if (connection_string)
@@ -92,18 +89,24 @@ GetConnection(void)
for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++)
{
- if (conn_opt->val != NULL && conn_opt->val[0] != '\0' &&
- strcmp(conn_opt->keyword, "dbname") != 0)
+ if (conn_opt->val != NULL && conn_opt->val[0] != '\0')
argcount++;
}
keywords = pg_malloc0((argcount + 1) * sizeof(*keywords));
values = pg_malloc0((argcount + 1) * sizeof(*values));
+ /*
+ * Set dbname here already, so it can be overridden by a dbname in the
+ * connection string.
+ */
+ keywords[i] = "dbname";
+ values[i] = "replication";
+ i++;
+
for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++)
{
- if (conn_opt->val != NULL && conn_opt->val[0] != '\0' &&
- strcmp(conn_opt->keyword, "dbname") != 0)
+ if (conn_opt->val != NULL && conn_opt->val[0] != '\0')
{
keywords[i] = conn_opt->keyword;
values[i] = conn_opt->val;
@@ -115,11 +118,11 @@ GetConnection(void)
{
keywords = pg_malloc0((argcount + 1) * sizeof(*keywords));
values = pg_malloc0((argcount + 1) * sizeof(*values));
+ keywords[i] = "dbname";
+ values[i] = dbname;
+ i++;
}
- keywords[i] = "dbname";
- values[i] = dbname == NULL ? "replication" : dbname;
- i++;
keywords[i] = "replication";
values[i] = dbname == NULL ? "true" : "database";
i++;
@@ -171,7 +174,11 @@ GetConnection(void)
values[i] = NULL;
}
- tmpconn = PQconnectdbParams(keywords, values, true);
+ /*
+ * Only expand dbname when we did not already parse the argument as a
+ * connection string ourselves.
+ */
+ tmpconn = PQconnectdbParams(keywords, values, !connection_string);
/*
* If there is too little memory even to allocate the PGconn object