Skip to content

Commit ea32d9f

Browse files
committed
Ensure backward compatibility with legacy EOF format
1 parent c34acf9 commit ea32d9f

File tree

3 files changed

+31
-47
lines changed

3 files changed

+31
-47
lines changed

connection.go

+14-11
Original file line numberDiff line numberDiff line change
@@ -180,16 +180,16 @@ func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) {
180180

181181
// Read Result
182182
columnCount, err := stmt.readPrepareResultPacket()
183-
if err != nil {
184-
return stmt, err
185-
}
186-
187-
if err := mc.readPackets(stmt.paramCount); err != nil {
188-
return nil, err
189-
}
183+
if err == nil {
184+
if stmt.paramCount > 0 {
185+
if err = mc.readUntilEOF(); err != nil {
186+
return nil, err
187+
}
188+
}
190189

191-
if err := mc.readPackets(int(columnCount)); err != nil {
192-
return nil, err
190+
if columnCount > 0 {
191+
err = mc.readUntilEOF()
192+
}
193193
}
194194

195195
return stmt, err
@@ -415,8 +415,11 @@ func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) {
415415
rows.mc = mc
416416
rows.rs.columns = []mysqlField{{fieldType: fieldTypeVarChar}}
417417

418-
if err := mc.readPackets(resLen); err != nil {
419-
return nil, err
418+
if resLen > 0 {
419+
// Columns
420+
if err := mc.readUntilEOF(); err != nil {
421+
return nil, err
422+
}
420423
}
421424

422425
dest := make([]driver.Value, resLen)

packets.go

+16-35
Original file line numberDiff line numberDiff line change
@@ -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
618618
func (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
649653
func (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
}

rows.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ func (rows *textRows) Next(dest []driver.Value) error {
215215
if err := mc.error(); err != nil {
216216
return err
217217
}
218-
218+
errLog.Print("perform next read")
219219
// Fetch next row from stream
220220
return rows.readRow(dest)
221221
}

0 commit comments

Comments
 (0)