|
@@ -584,8 +584,8 @@ func (mc *mysqlConn) handleOkPacket(data []byte) error {
|
|
|
|
|
|
|
|
// server_status [2 bytes]
|
|
// server_status [2 bytes]
|
|
|
mc.status = readStatus(data[1+n+m : 1+n+m+2])
|
|
mc.status = readStatus(data[1+n+m : 1+n+m+2])
|
|
|
- if err := mc.discardResults(); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
|
|
+ if mc.status&statusMoreResultsExists != 0 {
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// warning count [2 bytes]
|
|
// warning count [2 bytes]
|
|
@@ -698,6 +698,10 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
|
|
|
func (rows *textRows) readRow(dest []driver.Value) error {
|
|
func (rows *textRows) readRow(dest []driver.Value) error {
|
|
|
mc := rows.mc
|
|
mc := rows.mc
|
|
|
|
|
|
|
|
|
|
+ if rows.rs.done {
|
|
|
|
|
+ return io.EOF
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
data, err := mc.readPacket()
|
|
data, err := mc.readPacket()
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|
|
@@ -707,15 +711,11 @@ func (rows *textRows) readRow(dest []driver.Value) error {
|
|
|
if data[0] == iEOF && len(data) == 5 {
|
|
if data[0] == iEOF && len(data) == 5 {
|
|
|
// server_status [2 bytes]
|
|
// server_status [2 bytes]
|
|
|
rows.mc.status = readStatus(data[3:])
|
|
rows.mc.status = readStatus(data[3:])
|
|
|
- err = rows.mc.discardResults()
|
|
|
|
|
- if err == nil {
|
|
|
|
|
- err = io.EOF
|
|
|
|
|
- } else {
|
|
|
|
|
- // connection unusable
|
|
|
|
|
- rows.mc.Close()
|
|
|
|
|
|
|
+ rows.rs.done = true
|
|
|
|
|
+ if !rows.HasNextResultSet() {
|
|
|
|
|
+ rows.mc = nil
|
|
|
}
|
|
}
|
|
|
- rows.mc = nil
|
|
|
|
|
- return err
|
|
|
|
|
|
|
+ return io.EOF
|
|
|
}
|
|
}
|
|
|
if data[0] == iERR {
|
|
if data[0] == iERR {
|
|
|
rows.mc = nil
|
|
rows.mc = nil
|
|
@@ -736,7 +736,7 @@ func (rows *textRows) readRow(dest []driver.Value) error {
|
|
|
if !mc.parseTime {
|
|
if !mc.parseTime {
|
|
|
continue
|
|
continue
|
|
|
} else {
|
|
} else {
|
|
|
- switch rows.columns[i].fieldType {
|
|
|
|
|
|
|
+ switch rows.rs.columns[i].fieldType {
|
|
|
case fieldTypeTimestamp, fieldTypeDateTime,
|
|
case fieldTypeTimestamp, fieldTypeDateTime,
|
|
|
fieldTypeDate, fieldTypeNewDate:
|
|
fieldTypeDate, fieldTypeNewDate:
|
|
|
dest[i], err = parseDateTime(
|
|
dest[i], err = parseDateTime(
|
|
@@ -1097,8 +1097,6 @@ func (mc *mysqlConn) discardResults() error {
|
|
|
if err := mc.readUntilEOF(); err != nil {
|
|
if err := mc.readUntilEOF(); err != nil {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
- } else {
|
|
|
|
|
- mc.status &^= statusMoreResultsExists
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
return nil
|
|
return nil
|
|
@@ -1116,15 +1114,11 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
|
|
|
// EOF Packet
|
|
// EOF Packet
|
|
|
if data[0] == iEOF && len(data) == 5 {
|
|
if data[0] == iEOF && len(data) == 5 {
|
|
|
rows.mc.status = readStatus(data[3:])
|
|
rows.mc.status = readStatus(data[3:])
|
|
|
- err = rows.mc.discardResults()
|
|
|
|
|
- if err == nil {
|
|
|
|
|
- err = io.EOF
|
|
|
|
|
- } else {
|
|
|
|
|
- // connection unusable
|
|
|
|
|
- rows.mc.Close()
|
|
|
|
|
|
|
+ rows.rs.done = true
|
|
|
|
|
+ if !rows.HasNextResultSet() {
|
|
|
|
|
+ rows.mc = nil
|
|
|
}
|
|
}
|
|
|
- rows.mc = nil
|
|
|
|
|
- return err
|
|
|
|
|
|
|
+ return io.EOF
|
|
|
}
|
|
}
|
|
|
rows.mc = nil
|
|
rows.mc = nil
|
|
|
|
|
|
|
@@ -1145,14 +1139,14 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Convert to byte-coded string
|
|
// Convert to byte-coded string
|
|
|
- switch rows.columns[i].fieldType {
|
|
|
|
|
|
|
+ switch rows.rs.columns[i].fieldType {
|
|
|
case fieldTypeNULL:
|
|
case fieldTypeNULL:
|
|
|
dest[i] = nil
|
|
dest[i] = nil
|
|
|
continue
|
|
continue
|
|
|
|
|
|
|
|
// Numeric Types
|
|
// Numeric Types
|
|
|
case fieldTypeTiny:
|
|
case fieldTypeTiny:
|
|
|
- if rows.columns[i].flags&flagUnsigned != 0 {
|
|
|
|
|
|
|
+ if rows.rs.columns[i].flags&flagUnsigned != 0 {
|
|
|
dest[i] = int64(data[pos])
|
|
dest[i] = int64(data[pos])
|
|
|
} else {
|
|
} else {
|
|
|
dest[i] = int64(int8(data[pos]))
|
|
dest[i] = int64(int8(data[pos]))
|
|
@@ -1161,7 +1155,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
|
|
|
continue
|
|
continue
|
|
|
|
|
|
|
|
case fieldTypeShort, fieldTypeYear:
|
|
case fieldTypeShort, fieldTypeYear:
|
|
|
- if rows.columns[i].flags&flagUnsigned != 0 {
|
|
|
|
|
|
|
+ if rows.rs.columns[i].flags&flagUnsigned != 0 {
|
|
|
dest[i] = int64(binary.LittleEndian.Uint16(data[pos : pos+2]))
|
|
dest[i] = int64(binary.LittleEndian.Uint16(data[pos : pos+2]))
|
|
|
} else {
|
|
} else {
|
|
|
dest[i] = int64(int16(binary.LittleEndian.Uint16(data[pos : pos+2])))
|
|
dest[i] = int64(int16(binary.LittleEndian.Uint16(data[pos : pos+2])))
|
|
@@ -1170,7 +1164,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
|
|
|
continue
|
|
continue
|
|
|
|
|
|
|
|
case fieldTypeInt24, fieldTypeLong:
|
|
case fieldTypeInt24, fieldTypeLong:
|
|
|
- if rows.columns[i].flags&flagUnsigned != 0 {
|
|
|
|
|
|
|
+ if rows.rs.columns[i].flags&flagUnsigned != 0 {
|
|
|
dest[i] = int64(binary.LittleEndian.Uint32(data[pos : pos+4]))
|
|
dest[i] = int64(binary.LittleEndian.Uint32(data[pos : pos+4]))
|
|
|
} else {
|
|
} else {
|
|
|
dest[i] = int64(int32(binary.LittleEndian.Uint32(data[pos : pos+4])))
|
|
dest[i] = int64(int32(binary.LittleEndian.Uint32(data[pos : pos+4])))
|
|
@@ -1179,7 +1173,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
|
|
|
continue
|
|
continue
|
|
|
|
|
|
|
|
case fieldTypeLongLong:
|
|
case fieldTypeLongLong:
|
|
|
- if rows.columns[i].flags&flagUnsigned != 0 {
|
|
|
|
|
|
|
+ if rows.rs.columns[i].flags&flagUnsigned != 0 {
|
|
|
val := binary.LittleEndian.Uint64(data[pos : pos+8])
|
|
val := binary.LittleEndian.Uint64(data[pos : pos+8])
|
|
|
if val > math.MaxInt64 {
|
|
if val > math.MaxInt64 {
|
|
|
dest[i] = uint64ToString(val)
|
|
dest[i] = uint64ToString(val)
|
|
@@ -1233,10 +1227,10 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
|
|
|
case isNull:
|
|
case isNull:
|
|
|
dest[i] = nil
|
|
dest[i] = nil
|
|
|
continue
|
|
continue
|
|
|
- case rows.columns[i].fieldType == fieldTypeTime:
|
|
|
|
|
|
|
+ case rows.rs.columns[i].fieldType == fieldTypeTime:
|
|
|
// database/sql does not support an equivalent to TIME, return a string
|
|
// database/sql does not support an equivalent to TIME, return a string
|
|
|
var dstlen uint8
|
|
var dstlen uint8
|
|
|
- switch decimals := rows.columns[i].decimals; decimals {
|
|
|
|
|
|
|
+ switch decimals := rows.rs.columns[i].decimals; decimals {
|
|
|
case 0x00, 0x1f:
|
|
case 0x00, 0x1f:
|
|
|
dstlen = 8
|
|
dstlen = 8
|
|
|
case 1, 2, 3, 4, 5, 6:
|
|
case 1, 2, 3, 4, 5, 6:
|
|
@@ -1244,7 +1238,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
|
|
|
default:
|
|
default:
|
|
|
return fmt.Errorf(
|
|
return fmt.Errorf(
|
|
|
"protocol error, illegal decimals value %d",
|
|
"protocol error, illegal decimals value %d",
|
|
|
- rows.columns[i].decimals,
|
|
|
|
|
|
|
+ rows.rs.columns[i].decimals,
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], dstlen, true)
|
|
dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], dstlen, true)
|
|
@@ -1252,10 +1246,10 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
|
|
|
dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.Loc)
|
|
dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.Loc)
|
|
|
default:
|
|
default:
|
|
|
var dstlen uint8
|
|
var dstlen uint8
|
|
|
- if rows.columns[i].fieldType == fieldTypeDate {
|
|
|
|
|
|
|
+ if rows.rs.columns[i].fieldType == fieldTypeDate {
|
|
|
dstlen = 10
|
|
dstlen = 10
|
|
|
} else {
|
|
} else {
|
|
|
- switch decimals := rows.columns[i].decimals; decimals {
|
|
|
|
|
|
|
+ switch decimals := rows.rs.columns[i].decimals; decimals {
|
|
|
case 0x00, 0x1f:
|
|
case 0x00, 0x1f:
|
|
|
dstlen = 19
|
|
dstlen = 19
|
|
|
case 1, 2, 3, 4, 5, 6:
|
|
case 1, 2, 3, 4, 5, 6:
|
|
@@ -1263,7 +1257,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
|
|
|
default:
|
|
default:
|
|
|
return fmt.Errorf(
|
|
return fmt.Errorf(
|
|
|
"protocol error, illegal decimals value %d",
|
|
"protocol error, illegal decimals value %d",
|
|
|
- rows.columns[i].decimals,
|
|
|
|
|
|
|
+ rows.rs.columns[i].decimals,
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1279,7 +1273,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error {
|
|
|
|
|
|
|
|
// Please report if this happens!
|
|
// Please report if this happens!
|
|
|
default:
|
|
default:
|
|
|
- return fmt.Errorf("unknown field type %d", rows.columns[i].fieldType)
|
|
|
|
|
|
|
+ return fmt.Errorf("unknown field type %d", rows.rs.columns[i].fieldType)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|