@@ -238,12 +238,12 @@ func (mc *mysqlConn) readHandshakePacket() (data []byte, plugin string, err erro
238238 pos += 1 + 2
239239
240240 // capability flags (upper 2 bytes) [2 bytes]
241- mc .flags + = clientFlag (binary .LittleEndian .Uint16 (data [pos :pos + 2 ])) << 16
241+ mc .flags | = clientFlag (binary .LittleEndian .Uint16 (data [pos :pos + 2 ])) << 16
242242 pos += 2
243243
244244 // length of auth-plugin-data [1 byte]
245245 // reserved (all [00]) [10 bytes]
246- pos += + 1 + 10
246+ pos += 1 + 10
247247
248248 // second part of the password cipher [mininum 13 bytes],
249249 // where len=MAX(13, length of auth-plugin-data - 8)
@@ -614,7 +614,7 @@ func readStatus(b []byte) statusFlag {
614614}
615615
616616// Ok Packet
617- // http ://dev.mysql.com/doc/internals/en/generic-response-packets.html# packet-OK_Packet
617+ // https ://dev.mysql.com/doc/internals/en/packet-OK_Packet.html
618618func (mc * mysqlConn ) handleOkPacket (data []byte ) error {
619619 // 0x00 or 0xFE [1 byte]
620620 n := 1
@@ -640,22 +640,34 @@ func (mc *mysqlConn) handleOkPacket(data []byte) error {
640640
641641// isEOFPacket will return true if the data is either a EOF-Packet or OK-Packet
642642// acting as an EOF.
643- func isEOFPacket (data []byte ) bool {
644- return data [0 ] == iEOF && len (data ) < 9
643+ func (mc * mysqlConn ) isEOFPacket (data []byte ) bool {
644+ // Legacy EOF packet
645+ if data [0 ] == iEOF && (len (data ) == 5 || len (data ) == 1 ) && mc .flags & clientDeprecateEOF == 0 {
646+ return true
647+ }
648+ return data [0 ] == iEOF && len (data ) < 9 && mc .flags & clientDeprecateEOF != 0
645649}
646650
647651// Read Packets as Field Packets until EOF-Packet or an Error appears
648652// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnDefinition41
649653func (mc * mysqlConn ) readColumns (count int ) ([]mysqlField , error ) {
650654 columns := make ([]mysqlField , count )
651655
652- for i := 0 ; i < count ; i ++ {
656+ // If we set clientDeprecateEOF capability flag,
657+ // the EOF will be no longer sent after all columns.
658+ packets := count
659+ if mc .flags & clientDeprecateEOF == 0 {
660+ // Legacy way, read one more EOF packet.
661+ packets += 1
662+ }
663+
664+ for i := 0 ; i < packets ; i ++ {
653665 data , err := mc .readPacket ()
654666 if err != nil {
655667 return nil , err
656668 }
657669
658- if mc .flags & clientDeprecateEOF == 0 && isEOFPacket (data ) {
670+ if mc .isEOFPacket (data ) {
659671 if i == count {
660672 return columns , nil
661673 }
@@ -759,12 +771,13 @@ func (rows *textRows) readRow(dest []driver.Value) error {
759771 }
760772
761773 // EOF Packet
762- if isEOFPacket (data ) {
774+ if mc . isEOFPacket (data ) {
763775 if mc .flags & clientDeprecateEOF == 0 {
764776 // server_status [2 bytes]
765777 rows .mc .status = readStatus (data [3 :])
766778 } else {
767779 if err := mc .handleOkPacket (data ); err != nil {
780+ rows .mc = nil
768781 return err
769782 }
770783 }
@@ -830,37 +843,22 @@ func (mc *mysqlConn) readUntilEOF() error {
830843 switch {
831844 case data [0 ] == iERR :
832845 return mc .handleErrorPacket (data )
833- case isEOFPacket (data ):
846+ case mc . isEOFPacket (data ):
834847 if mc .flags & clientDeprecateEOF == 0 {
835848 mc .status = readStatus (data [3 :])
836- } else {
837- return mc .handleOkPacket (data )
849+ return nil
838850 }
839- return nil
851+ return mc . handleOkPacket ( data )
840852 }
841853 }
842854}
843855
844- func (mc * mysqlConn ) readPackets (num int ) error {
845-
846- // we need to read EOF as well
847- if mc .flags & clientDeprecateEOF == 0 {
848- num ++
849- }
850-
856+ func (mc * mysqlConn ) readExactPackets (num int ) error {
851857 for i := 0 ; i < num ; i ++ {
852- data , err := mc .readPacket ()
858+ _ , err := mc .readPacket ()
853859 if err != nil {
854860 return err
855861 }
856-
857- switch {
858- case data [0 ] == iERR :
859- return mc .handleErrorPacket (data )
860- case mc .flags & clientDeprecateEOF == 0 && isEOFPacket (data ):
861- mc .status = readStatus (data [3 :])
862- return nil
863- }
864862 }
865863 return nil
866864}
@@ -1223,11 +1221,12 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
12231221
12241222 // packet indicator [1 byte]
12251223 if data [0 ] != iOK {
1226- if isEOFPacket (data ) {
1224+ if rows . mc . isEOFPacket (data ) {
12271225 if rows .mc .flags & clientDeprecateEOF == 0 {
12281226 rows .mc .status = readStatus (data [3 :])
12291227 } else {
12301228 if err := rows .mc .handleOkPacket (data ); err != nil {
1229+ rows .mc = nil
12311230 return err
12321231 }
12331232 }
0 commit comments