Skip to content

Commit c8c9bb1

Browse files
committed
Query() uses client-side placeholder substitution.
1 parent e35fa00 commit c8c9bb1

File tree

1 file changed

+31
-23
lines changed

1 file changed

+31
-23
lines changed

connection.go

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) {
164164
}
165165

166166
func (mc *mysqlConn) escapeBytes(v []byte) string {
167-
buf := make([]byte, len(v)*2)
167+
buf := make([]byte, len(v)*2+2)
168168
buf[0] = '\''
169169
pos := 1
170170
if mc.status&statusNoBackslashEscapes == 0 {
@@ -254,7 +254,11 @@ func (mc *mysqlConn) buildQuery(query string, args []driver.Value) (string, erro
254254
parts[pos] = v.In(mc.cfg.loc).Format(fmt)
255255
}
256256
case []byte:
257-
parts[pos] = mc.escapeBytes(v)
257+
if v == nil {
258+
parts[pos] = "NULL"
259+
} else {
260+
parts[pos] = mc.escapeBytes(v)
261+
}
258262
case string:
259263
parts[pos] = mc.escapeBytes([]byte(v))
260264
default:
@@ -317,31 +321,35 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro
317321
errLog.Print(ErrInvalidConn)
318322
return nil, driver.ErrBadConn
319323
}
320-
if len(args) == 0 { // no args, fastpath
321-
// Send command
322-
err := mc.writeCommandPacketStr(comQuery, query)
324+
if len(args) != 0 {
325+
// try client-side prepare to reduce roundtrip
326+
prepared, err := mc.buildQuery(query, args)
327+
if err != nil {
328+
return nil, err
329+
}
330+
query = prepared
331+
args = nil
332+
}
333+
// Send command
334+
err := mc.writeCommandPacketStr(comQuery, query)
335+
if err == nil {
336+
// Read Result
337+
var resLen int
338+
resLen, err = mc.readResultSetHeaderPacket()
323339
if err == nil {
324-
// Read Result
325-
var resLen int
326-
resLen, err = mc.readResultSetHeaderPacket()
327-
if err == nil {
328-
rows := new(textRows)
329-
rows.mc = mc
330-
331-
if resLen == 0 {
332-
// no columns, no more data
333-
return emptyRows{}, nil
334-
}
335-
// Columns
336-
rows.columns, err = mc.readColumns(resLen)
337-
return rows, err
340+
rows := new(textRows)
341+
rows.mc = mc
342+
343+
if resLen == 0 {
344+
// no columns, no more data
345+
return emptyRows{}, nil
338346
}
347+
// Columns
348+
rows.columns, err = mc.readColumns(resLen)
349+
return rows, err
339350
}
340-
return nil, err
341351
}
342-
343-
// with args, must use prepared stmt
344-
return nil, driver.ErrSkip
352+
return nil, err
345353
}
346354

347355
// Gets the value of the given MySQL System Variable

0 commit comments

Comments
 (0)