diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index ef45fbf1fc..e23e91d9bb 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -124,7 +124,10 @@ PGconn *PQconnectdbParams(const char * const *keywords, When expand_dbname is non-zero, the dbname 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 + dbname is expanded this way, any subsequent + dbname value is processed as plain database name. More + details on the possible connection string formats appear in . diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 6663c48352..703cbac37a 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 {