aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-11-25 17:12:07 +0200
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2014-11-25 17:39:44 +0200
commitadd1b052e2b2d5206474d58db25e48820242d15b (patch)
tree1cd92d7d156d90c66f3d3f8b7301a95c396e9b25
parent81d815dc3ed74a7d20f7b4c7d87c42816c7ee7af (diff)
downloadpostgresql-add1b052e2b2d5206474d58db25e48820242d15b.tar.gz
postgresql-add1b052e2b2d5206474d58db25e48820242d15b.zip
Allow "dbname" from connection string to be overridden in PQconnectDBParams
If the "dbname" attribute in PQconnectDBParams contained a connection string or URI (and expand_dbname = TRUE), the database name from the connection string could not be overridden by a subsequent "dbname" keyword in the array. That was not intentional; all other options can be overridden. Furthermore, any subsequent "dbname" caused the connection string from the first dbname value to be processed again, overriding any values for the same options that were given between the connection string and the second dbname option. In the passing, clarify in the docs that only the first dbname option in the array is parsed as a connection string. Alex Shulgin. Backpatch to all supported versions.
-rw-r--r--doc/src/sgml/libpq.sgml5
-rw-r--r--src/interfaces/libpq/fe-connect.c17
2 files changed, 16 insertions, 6 deletions
diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml
index ef45fbf1fc7..e23e91d9bb3 100644
--- a/doc/src/sgml/libpq.sgml
+++ b/doc/src/sgml/libpq.sgml
@@ -124,7 +124,10 @@ PGconn *PQconnectdbParams(const char * const *keywords,
<para>
When <literal>expand_dbname</literal> is non-zero, the
<parameter>dbname</parameter> key word value is allowed to be recognized
- as a connection string. More details on the possible formats appear in
+ as a connection string. Only the first occurrence of
+ <parameter>dbname</parameter> is expanded this way, any subsequent
+ <parameter>dbname</parameter> value is processed as plain database name. More
+ details on the possible connection string formats appear in
<xref linkend="libpq-connstring">.
</para>
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 6663c48352d..703cbac37ae 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -4379,10 +4379,11 @@ conninfo_parse(const char *conninfo, PQExpBuffer errorMessage,
* Defaults are supplied (from a service file, environment variables, etc)
* for unspecified options, but only if use_defaults is TRUE.
*
- * If expand_dbname is non-zero, and the value passed for keyword "dbname" is a
- * connection string (as indicated by recognized_connection_string) then parse
- * and process it, overriding any previously processed conflicting
- * keywords. Subsequent keywords will take precedence, however.
+ * If expand_dbname is non-zero, and the value passed for the first occurrence
+ * of "dbname" keyword is a connection string (as indicated by
+ * recognized_connection_string) then parse and process it, overriding any
+ * previously processed conflicting keywords. Subsequent keywords will take
+ * precedence, however.
*/
static PQconninfoOption *
conninfo_array_parse(const char *const * keywords, const char *const * values,
@@ -4458,7 +4459,7 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
}
/*
- * If we are on the dbname parameter, and we have a parsed
+ * If we are on the first dbname parameter, and we have a parsed
* connection string, copy those parameters across, overriding any
* existing previous settings.
*/
@@ -4492,6 +4493,12 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
}
}
}
+ /*
+ * Forget the parsed connection string, so that any subsequent
+ * dbname parameters will not be expanded.
+ */
+ PQconninfoFree(dbname_options);
+ dbname_options = NULL;
}
else
{