@@ -281,7 +281,8 @@ func (mc *mysqlConn) initClientCapabilities(serverCapabilities capabilityFlag, c
281
281
clientLocalFiles |
282
282
clientPluginAuth |
283
283
clientMultiResults |
284
- clientConnectAttrs
284
+ clientConnectAttrs |
285
+ clientDeprecateEOF
285
286
286
287
if cfg .ClientFoundRows {
287
288
clientCapabilities |= clientFoundRows
@@ -709,20 +710,12 @@ func (mc *okHandler) handleOkPacket(data []byte) error {
709
710
func (mc * mysqlConn ) readColumns (count int ) ([]mysqlField , error ) {
710
711
columns := make ([]mysqlField , count )
711
712
712
- for i := 0 ; ; i ++ {
713
+ for i := 0 ; i < count ; i ++ {
713
714
data , err := mc .readPacket ()
714
715
if err != nil {
715
716
return nil , err
716
717
}
717
718
718
- // EOF Packet
719
- if data [0 ] == iEOF && (len (data ) == 5 || len (data ) == 1 ) {
720
- if i == count {
721
- return columns , nil
722
- }
723
- return nil , fmt .Errorf ("column count mismatch n:%d len:%d" , count , len (columns ))
724
- }
725
-
726
719
// Catalog
727
720
pos := int (data [0 ]) + 1
728
721
// Database [len coded string]
@@ -780,13 +773,13 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
780
773
781
774
// Decimals [uint8]
782
775
columns [i ].decimals = data [pos ]
783
- //pos++
776
+ }
784
777
785
- // Default value [len coded binary]
786
- //if pos < len(data) {
787
- // defaultVal, _, err = bytesToLengthCodedBinary(data[pos:])
788
- //}
778
+ // skip EOF packet if client does not support deprecateEOF
779
+ if err := mc .skipEof (); err != nil {
780
+ return nil , err
789
781
}
782
+ return columns , nil
790
783
}
791
784
792
785
// Read Packets as Field Packets until EOF-Packet or an Error appears
@@ -804,9 +797,16 @@ func (rows *textRows) readRow(dest []driver.Value) error {
804
797
}
805
798
806
799
// EOF Packet
807
- if data [0 ] == iEOF && len (data ) == 5 {
808
- // server_status [2 bytes]
809
- rows .mc .status = readStatus (data [3 :])
800
+ if data [0 ] == iEOF && len (data ) < 0xffffff {
801
+ if mc .clientCapabilities & clientDeprecateEOF == 0 {
802
+ // EOF packet
803
+ mc .status = readStatus (data [3 :])
804
+ } else {
805
+ // Ok Packet with an 0xFE header
806
+ _ , _ , n := readLengthEncodedInteger (data [1 :])
807
+ _ , _ , m := readLengthEncodedInteger (data [1 + n :])
808
+ mc .status = readStatus (data [1 + n + m :])
809
+ }
810
810
rows .rs .done = true
811
811
if ! rows .HasNextResultSet () {
812
812
rows .mc = nil
@@ -826,7 +826,7 @@ func (rows *textRows) readRow(dest []driver.Value) error {
826
826
)
827
827
828
828
for i := range dest {
829
- // Read bytes and convert to string
829
+ // Read field bytes
830
830
var buf []byte
831
831
buf , isNull , n , err = readLengthEncodedBytes (data [pos :])
832
832
pos += n
@@ -871,6 +871,7 @@ func (rows *textRows) readRow(dest []driver.Value) error {
871
871
872
872
default :
873
873
dest [i ] = buf
874
+ continue
874
875
}
875
876
if err != nil {
876
877
return err
@@ -880,8 +881,33 @@ func (rows *textRows) readRow(dest []driver.Value) error {
880
881
return nil
881
882
}
882
883
883
- // Reads Packets until EOF-Packet or an Error appears. Returns count of Packets read
884
- func (mc * mysqlConn ) readUntilEOF () error {
884
+ func (mc * mysqlConn ) skipPackets (number int ) error {
885
+ for i := 0 ; i < number ; i ++ {
886
+ if _ , err := mc .readPacket (); err != nil {
887
+ return err
888
+ }
889
+ }
890
+ return nil
891
+ }
892
+
893
+ func (mc * mysqlConn ) skipEof () error {
894
+ if mc .clientCapabilities & clientDeprecateEOF == 0 {
895
+ if _ , err := mc .readPacket (); err != nil {
896
+ return err
897
+ }
898
+ }
899
+ return nil
900
+ }
901
+
902
+ func (mc * mysqlConn ) skipColumns (resLen int ) error {
903
+ if err := mc .skipPackets (resLen ); err != nil {
904
+ return err
905
+ }
906
+ return mc .skipEof ()
907
+ }
908
+
909
+ // Reads Packets until EOF-Packet or an Error appears.
910
+ func (mc * mysqlConn ) skipResultSetRows () error {
885
911
for {
886
912
data , err := mc .readPacket ()
887
913
if err != nil {
@@ -892,10 +918,18 @@ func (mc *mysqlConn) readUntilEOF() error {
892
918
case iERR :
893
919
return mc .handleErrorPacket (data )
894
920
case iEOF :
895
- if len (data ) == 5 {
896
- mc .status = readStatus (data [3 :])
921
+ if len (data ) < 0xffffff {
922
+ if mc .clientCapabilities & clientDeprecateEOF == 0 {
923
+ // EOF packet
924
+ mc .status = readStatus (data [3 :])
925
+ } else {
926
+ // OK packet with an 0xFE header
927
+ _ , _ , n := readLengthEncodedInteger (data [1 :])
928
+ _ , _ , m := readLengthEncodedInteger (data [1 + n :])
929
+ mc .status = readStatus (data [1 + n + m :])
930
+ }
931
+ return nil
897
932
}
898
- return nil
899
933
}
900
934
}
901
935
}
@@ -1192,11 +1226,11 @@ func (mc *okHandler) discardResults() error {
1192
1226
}
1193
1227
if resLen > 0 {
1194
1228
// columns
1195
- if err := mc .conn ().readUntilEOF ( ); err != nil {
1229
+ if err := mc .conn ().skipColumns ( resLen ); err != nil {
1196
1230
return err
1197
1231
}
1198
1232
// rows
1199
- if err := mc .conn ().readUntilEOF (); err != nil {
1233
+ if err := mc .conn ().skipResultSetRows (); err != nil {
1200
1234
return err
1201
1235
}
1202
1236
}
@@ -1213,19 +1247,27 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
1213
1247
1214
1248
// packet indicator [1 byte]
1215
1249
if data [0 ] != iOK {
1216
- // EOF Packet
1217
- if data [0 ] == iEOF && len (data ) == 5 {
1218
- rows .mc .status = readStatus (data [3 :])
1250
+ // EOF/OK Packet
1251
+ if data [0 ] == iEOF {
1252
+ if rows .mc .clientCapabilities & clientDeprecateEOF == 0 {
1253
+ // EOF packet
1254
+ rows .mc .status = readStatus (data [3 :])
1255
+ } else {
1256
+ // OK Packet with an 0xFE header
1257
+ _ , _ , n := readLengthEncodedInteger (data [1 :])
1258
+ _ , _ , m := readLengthEncodedInteger (data [1 + n :])
1259
+ rows .mc .status = readStatus (data [1 + n + m :])
1260
+ }
1219
1261
rows .rs .done = true
1220
1262
if ! rows .HasNextResultSet () {
1221
1263
rows .mc = nil
1222
1264
}
1223
1265
return io .EOF
1224
1266
}
1225
- mc := rows .mc
1226
- rows .mc = nil
1227
1267
1228
1268
// Error otherwise
1269
+ mc := rows .mc
1270
+ rows .mc = nil
1229
1271
return mc .handleErrorPacket (data )
1230
1272
}
1231
1273
0 commit comments