diff --git a/dsn.go b/dsn.go index c49827f5d..8c6b778e8 100644 --- a/dsn.go +++ b/dsn.go @@ -288,12 +288,17 @@ func ParseDSN(dsn string) (cfg *Config, err error) { if dsn[j] == '@' { // username[:password] // Find the first ':' in dsn[:j] - for k = 0; k < j; k++ { + for k = j - 1; k >= 0; k-- { if dsn[k] == ':' { cfg.Passwd = dsn[k+1 : j] break } } + + // no ':' in dsn[:j] + if k < 0 { + k = j + } cfg.User = dsn[:k] break diff --git a/dsn_test.go b/dsn_test.go index 4fd76b813..41e514b36 100644 --- a/dsn_test.go +++ b/dsn_test.go @@ -23,6 +23,9 @@ var testDSNs = []struct { }{{ "username:password@protocol(address)/dbname?param=value", &Config{User: "username", Passwd: "password", Net: "protocol", Addr: "address", DBName: "dbname", Params: map[string]string{"param": "value"}, Collation: "utf8_general_ci", Loc: time.UTC}, +}, { + "user:name:password@protocol(address)/dbname?param=value", + &Config{User: "user:name", Passwd: "password", Net: "protocol", Addr: "address", DBName: "dbname", Params: map[string]string{"param": "value"}, Collation: "utf8_general_ci", Loc: time.UTC}, }, { "username:password@protocol(address)/dbname?param=value&columnsWithAlias=true", &Config{User: "username", Passwd: "password", Net: "protocol", Addr: "address", DBName: "dbname", Params: map[string]string{"param": "value"}, Collation: "utf8_general_ci", Loc: time.UTC, ColumnsWithAlias: true},