@@ -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,26 @@ 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+ for i := 0 ; ; i ++ {
653657 data , err := mc .readPacket ()
654658 if err != nil {
655659 return nil , err
656660 }
657661
658- if mc .flags & clientDeprecateEOF == 0 && isEOFPacket (data ) {
662+ if mc .isEOFPacket (data ) {
659663 if i == count {
660664 return columns , nil
661665 }
@@ -741,7 +745,6 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
741745 // defaultVal, _, err = bytesToLengthCodedBinary(data[pos:])
742746 //}
743747 }
744- return columns , nil
745748}
746749
747750// Read Packets as Field Packets until EOF/OK-Packet or an Error appears
@@ -759,12 +762,13 @@ func (rows *textRows) readRow(dest []driver.Value) error {
759762 }
760763
761764 // EOF Packet
762- if isEOFPacket (data ) {
765+ if mc . isEOFPacket (data ) {
763766 if mc .flags & clientDeprecateEOF == 0 {
764767 // server_status [2 bytes]
765768 rows .mc .status = readStatus (data [3 :])
766769 } else {
767770 if err := mc .handleOkPacket (data ); err != nil {
771+ rows .mc = nil
768772 return err
769773 }
770774 }
@@ -830,39 +834,15 @@ func (mc *mysqlConn) readUntilEOF() error {
830834 switch {
831835 case data [0 ] == iERR :
832836 return mc .handleErrorPacket (data )
833- case isEOFPacket (data ):
837+ case mc . isEOFPacket (data ):
834838 if mc .flags & clientDeprecateEOF == 0 {
835839 mc .status = readStatus (data [3 :])
836- } else {
837- return mc .handleOkPacket (data )
840+ return nil
838841 }
839- return nil
840- }
841- }
842- }
843-
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- }
850842
851- for i := 0 ; i < num ; i ++ {
852- data , err := mc .readPacket ()
853- if err != nil {
854- return err
855- }
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
843+ return mc .handleOkPacket (data )
863844 }
864845 }
865- return nil
866846}
867847
868848/******************************************************************************
@@ -1223,11 +1203,12 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
12231203
12241204 // packet indicator [1 byte]
12251205 if data [0 ] != iOK {
1226- if isEOFPacket (data ) {
1206+ if rows . mc . isEOFPacket (data ) {
12271207 if rows .mc .flags & clientDeprecateEOF == 0 {
12281208 rows .mc .status = readStatus (data [3 :])
12291209 } else {
12301210 if err := rows .mc .handleOkPacket (data ); err != nil {
1211+ rows .mc = nil
12311212 return err
12321213 }
12331214 }
0 commit comments