]> granicus.if.org Git - postgresql/commitdiff
Allow "dbname" from connection string to be overridden in PQconnectDBParams
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 25 Nov 2014 15:12:07 +0000 (17:12 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 25 Nov 2014 15:39:07 +0000 (17:39 +0200)
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.

src/interfaces/libpq/fe-connect.c

index d522a9c12d1be06361948511b674b042863a6c41..6ac3774d8423c99f18f8019f58dbf1009031f9e2 100644 (file)
@@ -4460,9 +4460,9 @@ conninfo_array_parse(const char **keywords, const char **values,
                        }
 
                        /*
-                        * If we are on the dbname parameter, and we have a parsed
-                        * conninfo string, copy those parameters across, overriding any
-                        * existing previous settings
+                        * If we are on the first dbname parameter, and we have a parsed
+                        * connection string, copy those parameters across, overriding any
+                        * existing previous settings.
                         */
                        if (strcmp(pname, "dbname") == 0 && str_options)
                        {
@@ -4494,6 +4494,12 @@ conninfo_array_parse(const char **keywords, const char **values,
                                                }
                                        }
                                }
+                               /*
+                                * Forget the parsed connection string, so that any subsequent
+                                * dbname parameters will not be expanded.
+                                */
+                               PQconninfoFree(str_options);
+                               str_options = NULL;
                        }
                        else
                        {