@@ -164,7 +164,7 @@ func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) {
164
164
}
165
165
166
166
func (mc * mysqlConn ) escapeBytes (v []byte ) string {
167
- buf := make ([]byte , len (v )* 2 )
167
+ buf := make ([]byte , len (v )* 2 + 2 )
168
168
buf [0 ] = '\''
169
169
pos := 1
170
170
if mc .status & statusNoBackslashEscapes == 0 {
@@ -254,7 +254,11 @@ func (mc *mysqlConn) buildQuery(query string, args []driver.Value) (string, erro
254
254
parts [pos ] = v .In (mc .cfg .loc ).Format (fmt )
255
255
}
256
256
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
+ }
258
262
case string :
259
263
parts [pos ] = mc .escapeBytes ([]byte (v ))
260
264
default :
@@ -317,31 +321,35 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro
317
321
errLog .Print (ErrInvalidConn )
318
322
return nil , driver .ErrBadConn
319
323
}
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 ()
323
339
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
338
346
}
347
+ // Columns
348
+ rows .columns , err = mc .readColumns (resLen )
349
+ return rows , err
339
350
}
340
- return nil , err
341
351
}
342
-
343
- // with args, must use prepared stmt
344
- return nil , driver .ErrSkip
352
+ return nil , err
345
353
}
346
354
347
355
// Gets the value of the given MySQL System Variable
0 commit comments