@@ -14,24 +14,11 @@ import (
1414 "github.com/go-mysql-org/go-mysql/utils"
1515)
1616
17- func (c * Conn ) readUntilEOF () (err error ) {
18- var data []byte
19-
20- for {
21- data , err = c .ReadPacket ()
22- if err != nil {
23- return err
24- }
25-
26- // EOF Packet
27- if c .isEOFPacket (data ) {
28- return err
29- }
30- }
31- }
32-
3317func (c * Conn ) isEOFPacket (data []byte ) bool {
34- return data [0 ] == mysql .EOF_HEADER && len (data ) <= 5
18+ // 0xffffff due to https://dev.mysql.com/worklog/task/?id=7766
19+ // "Server will never send OK packet longer than 16777216 bytes thus limiting
20+ // size of OK packet to be 16777215 bytes"
21+ return data [0 ] == mysql .EOF_HEADER && len (data ) <= 0xffffff
3522}
3623
3724func (c * Conn ) handleOKPacket (data []byte ) (* mysql.Result , error ) {
@@ -336,33 +323,16 @@ func (c *Conn) readResultsetStreaming(data []byte, binary bool, result *mysql.Re
336323}
337324
338325func (c * Conn ) readResultColumns (result * mysql.Result ) (err error ) {
339- i := 0
340326 var data []byte
341327
342- for {
328+ for i := range result . Fields {
343329 rawPkgLen := len (result .RawPkg )
344330 result .RawPkg , err = c .ReadPacketReuseMem (result .RawPkg )
345331 if err != nil {
346332 return err
347333 }
348334 data = result .RawPkg [rawPkgLen :]
349335
350- // EOF Packet
351- if c .isEOFPacket (data ) {
352- if c .capability & mysql .CLIENT_PROTOCOL_41 > 0 {
353- result .Warnings = binary .LittleEndian .Uint16 (data [1 :])
354- // todo add strict_mode, warning will be treat as error
355- result .Status = binary .LittleEndian .Uint16 (data [3 :])
356- c .status = result .Status
357- }
358-
359- if i != len (result .Fields ) {
360- err = mysql .ErrMalformPacket
361- }
362-
363- return err
364- }
365-
366336 if result .Fields [i ] == nil {
367337 result .Fields [i ] = & mysql.Field {}
368338 }
@@ -372,8 +342,30 @@ func (c *Conn) readResultColumns(result *mysql.Result) (err error) {
372342 }
373343
374344 result .FieldNames [utils .ByteSliceToString (result .Fields [i ].Name )] = i
345+ }
346+
347+ if c .capability & mysql .CLIENT_DEPRECATE_EOF == 0 {
348+ // EOF Packet
349+ rawPkgLen := len (result .RawPkg )
350+ result .RawPkg , err = c .ReadPacketReuseMem (result .RawPkg )
351+ if err != nil {
352+ return err
353+ }
354+ data = result .RawPkg [rawPkgLen :]
375355
376- i ++
356+ if c .isEOFPacket (data ) {
357+ if c .capability & mysql .CLIENT_PROTOCOL_41 > 0 {
358+ result .Warnings = binary .LittleEndian .Uint16 (data [1 :])
359+ // todo add strict_mode, warning will be treat as error
360+ result .Status = binary .LittleEndian .Uint16 (data [3 :])
361+ c .status = result .Status
362+ }
363+ return nil
364+ } else {
365+ return mysql .ErrMalformPacket
366+ }
367+ } else {
368+ return nil
377369 }
378370}
379371
@@ -388,15 +380,21 @@ func (c *Conn) readResultRows(result *mysql.Result, isBinary bool) (err error) {
388380 }
389381 data = result .RawPkg [rawPkgLen :]
390382
391- // EOF Packet
392383 if c .isEOFPacket (data ) {
393- if c .capability & mysql .CLIENT_PROTOCOL_41 > 0 {
384+ if c .capability & mysql .CLIENT_DEPRECATE_EOF != 0 {
385+ // Treat like OK
386+ affectedRows , _ , n := mysql .LengthEncodedInt (data [1 :])
387+ insertId , _ , m := mysql .LengthEncodedInt (data [1 + n :])
388+ result .Status = binary .LittleEndian .Uint16 (data [1 + n + m :])
389+ result .AffectedRows = affectedRows
390+ result .InsertId = insertId
391+ c .status = result .Status
392+ } else if c .capability & mysql .CLIENT_PROTOCOL_41 > 0 {
394393 result .Warnings = binary .LittleEndian .Uint16 (data [1 :])
395394 // todo add strict_mode, warning will be treat as error
396395 result .Status = binary .LittleEndian .Uint16 (data [3 :])
397396 c .status = result .Status
398397 }
399-
400398 break
401399 }
402400
@@ -435,9 +433,16 @@ func (c *Conn) readResultRowsStreaming(result *mysql.Result, isBinary bool, perR
435433 return err
436434 }
437435
438- // EOF Packet
439436 if c .isEOFPacket (data ) {
440- if c .capability & mysql .CLIENT_PROTOCOL_41 > 0 {
437+ if c .capability & mysql .CLIENT_DEPRECATE_EOF != 0 {
438+ // Treat like OK
439+ affectedRows , _ , n := mysql .LengthEncodedInt (data [1 :])
440+ insertId , _ , m := mysql .LengthEncodedInt (data [1 + n :])
441+ result .Status = binary .LittleEndian .Uint16 (data [1 + n + m :])
442+ result .AffectedRows = affectedRows
443+ result .InsertId = insertId
444+ c .status = result .Status
445+ } else if c .capability & mysql .CLIENT_PROTOCOL_41 > 0 {
441446 result .Warnings = binary .LittleEndian .Uint16 (data [1 :])
442447 // todo add strict_mode, warning will be treat as error
443448 result .Status = binary .LittleEndian .Uint16 (data [3 :])
0 commit comments