From b3fc6727ce54a16ae9227bcccfebfa028ac5b16f Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Tue, 25 Nov 2014 18:24:07 +0200
Subject: [PATCH] Allow using connection URI in primary_conninfo.

The old method of appending options to the connection string didn't work if
the primary_conninfo was a postgres:// style URI, instead of a traditional
connection string. Use PQconnectdbParams instead.

Alex Shulgin
---
 .../libpqwalreceiver/libpqwalreceiver.c       | 28 +++++++++++++------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
index 65e95c59f02..96e73fb6a4d 100644
--- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
+++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
@@ -89,18 +89,28 @@ _PG_init(void)
 static void
 libpqrcv_connect(char *conninfo)
 {
-	char		conninfo_repl[MAXCONNINFO + 75];
+	const char	*keys[5];
+	const char	*vals[5];
 
 	/*
-	 * Connect using deliberately undocumented parameter: replication. The
-	 * database name is ignored by the server in replication mode, but specify
-	 * "replication" for .pgpass lookup.
+	 * We use the expand_dbname parameter to process the connection string
+	 * (or URI), and pass some extra options. The deliberately undocumented
+	 * parameter "replication=true" makes it a replication connection.
+	 * The database name is ignored by the server in replication mode, but
+	 * specify "replication" for .pgpass lookup.
 	 */
-	snprintf(conninfo_repl, sizeof(conninfo_repl),
-			 "%s dbname=replication replication=true fallback_application_name=walreceiver",
-			 conninfo);
-
-	streamConn = PQconnectdb(conninfo_repl);
+	keys[0] = "dbname";
+	vals[0] = conninfo;
+	keys[1] = "replication";
+	vals[1] = "true";
+	keys[2] = "dbname";
+	vals[2] = "replication";
+	keys[3] = "fallback_application_name";
+	vals[3] = "walreceiver";
+	keys[4] = NULL;
+	vals[4] = NULL;
+
+	streamConn = PQconnectdbParams(keys, vals, /* expand_dbname = */ true);
 	if (PQstatus(streamConn) != CONNECTION_OK)
 		ereport(ERROR,
 				(errmsg("could not connect to the primary server: %s",
-- 
GitLab