diff --git a/connection.go b/connection.go index 0c280443d..6a613a504 100644 --- a/connection.go +++ b/connection.go @@ -47,7 +47,7 @@ type mysqlConn struct { // Handles parameters set in DSN after the connection is established func (mc *mysqlConn) handleParams() (err error) { - var params []string + var cmdSet []byte for param, val := range mc.cfg.Params { switch param { // Charset: character_set_connection, character_set_client, character_set_results @@ -64,14 +64,23 @@ func (mc *mysqlConn) handleParams() (err error) { return } - // Other system vars + // Other system vars accumulated in a single SET command default: - params = append(params, param+"="+val) + if cmdSet == nil { + // Heuristic: 29 chars for each other key=value to reduce reallocations + cmdSet = make([]byte, 0, 4+len(param)+1+len(val)+30*(len(mc.cfg.Params)-1)) + cmdSet = append(cmdSet, "SET "...) + } else { + cmdSet = append(cmdSet, ',') + } + cmdSet = append(cmdSet, param...) + cmdSet = append(cmdSet, '=') + cmdSet = append(cmdSet, val...) } } - if len(params) > 0 { - err = mc.exec("SET " + strings.Join(params, ",")) + if cmdSet != nil { + err = mc.exec(string(cmdSet)) if err != nil { return }