diff --git a/pgconn/config.go b/pgconn/config.go index a4cee7675..42bc2e92b 100644 --- a/pgconn/config.go +++ b/pgconn/config.go @@ -491,7 +491,9 @@ func parseURLSettings(connString string) (map[string]string, error) { } if parsedURL.User != nil { - settings["user"] = parsedURL.User.Username() + if u := parsedURL.User.Username(); u != "" { + settings["user"] = u + } if password, present := parsedURL.User.Password(); present { settings["password"] = password } @@ -618,6 +620,9 @@ func parseKeywordValueSettings(s string) (map[string]string, error) { return nil, errors.New("invalid keyword/value") } + if key == "user" && val == "" { + continue + } settings[key] = val } diff --git a/pgconn/config_test.go b/pgconn/config_test.go index 6ac6bec15..9665a6e15 100644 --- a/pgconn/config_test.go +++ b/pgconn/config_test.go @@ -1145,3 +1145,56 @@ application_name = spaced string assertConfigsEqual(t, tt.config, config, fmt.Sprintf("Test %d (%s)", i, tt.name)) } } + +func TestParseConfigExplicitEmptyUserDefaultsToOSUser(t *testing.T) { + skipOnWindows(t) + clearPgEnvvars(t) + + currentUser, err := user.Current() + if err != nil { + t.Skip("cannot determine current OS user") + } + + tests := []struct { + name string + connString string + expected string + }{ + { + name: "keyword value explicit empty user", + connString: "host=localhost dbname=test user=", + expected: currentUser.Username, + }, + { + name: "keyword value quoted empty user", + connString: "host=localhost dbname=test user=''", + expected: currentUser.Username, + }, + { + name: "url explicit empty user without password", + connString: "postgres://@localhost/test", + expected: currentUser.Username, + }, + { + name: "url explicit empty user with password", + connString: "postgres://:secret@localhost/test", + expected: currentUser.Username, + }, + } + + for i, tt := range tests { + config, err := pgconn.ParseConfig(tt.connString) + if !assert.NoErrorf(t, err, "Test %d (%s)", i, tt.name) { + continue + } + + assert.Equalf( + t, + tt.expected, + config.User, + "Test %d (%s): unexpected user", + i, + tt.name, + ) + } +}