Skip to content

Commit a4c260b

Browse files
fix hangup when error in multi resultsets (#1462)
Fix #1361 Co-authored-by: Inada Naoki <[email protected]>
1 parent b2e2ccb commit a4c260b

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed

Diff for: AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
Aaron Hopkins <go-sql-driver at die.net>
1515
Achille Roussel <achille.roussel at gmail.com>
16+
Aidan <aidan.liu at pingcap.com>
1617
Alex Snast <alexsn at fb.com>
1718
Alexey Palazhchenko <alexey.palazhchenko at gmail.com>
1819
Andrew Reid <andrew.reid at tixtrack.com>

Diff for: driver_test.go

+41
Original file line numberDiff line numberDiff line change
@@ -3430,3 +3430,44 @@ func TestConnectionAttributes(t *testing.T) {
34303430
}
34313431
rows.Close()
34323432
}
3433+
3434+
func TestErrorInMultiResult(t *testing.T) {
3435+
// https://github.com/go-sql-driver/mysql/issues/1361
3436+
var db *sql.DB
3437+
if _, err := ParseDSN(dsn); err != errInvalidDSNUnsafeCollation {
3438+
db, err = sql.Open("mysql", dsn)
3439+
if err != nil {
3440+
t.Fatalf("error connecting: %s", err.Error())
3441+
}
3442+
defer db.Close()
3443+
}
3444+
3445+
dbt := &DBTest{t, db}
3446+
query := `
3447+
CREATE PROCEDURE test_proc1()
3448+
BEGIN
3449+
SELECT 1,2;
3450+
SELECT 3,4;
3451+
SIGNAL SQLSTATE '10000' SET MESSAGE_TEXT = "some error", MYSQL_ERRNO = 10000;
3452+
END;
3453+
`
3454+
runCallCommand(dbt, query, "test_proc1")
3455+
}
3456+
3457+
func runCallCommand(dbt *DBTest, query, name string) {
3458+
dbt.mustExec(fmt.Sprintf("DROP PROCEDURE IF EXISTS %s", name))
3459+
dbt.mustExec(query)
3460+
defer dbt.mustExec("DROP PROCEDURE " + name)
3461+
rows, err := dbt.db.Query(fmt.Sprintf("CALL %s", name))
3462+
if err != nil {
3463+
return
3464+
}
3465+
defer rows.Close()
3466+
3467+
for rows.Next() {
3468+
}
3469+
for rows.NextResultSet() {
3470+
for rows.Next() {
3471+
}
3472+
}
3473+
}

Diff for: rows.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,13 @@ func (rows *mysqlRows) nextResultSet() (int, error) {
163163
rows.rs = resultSet{}
164164
// rows.mc.affectedRows and rows.mc.insertIds accumulate on each call to
165165
// nextResultSet.
166-
return rows.mc.resultUnchanged().readResultSetHeaderPacket()
166+
resLen, err := rows.mc.resultUnchanged().readResultSetHeaderPacket()
167+
if err != nil {
168+
// Clean up about multi-results flag
169+
rows.rs.done = true
170+
rows.mc.status = rows.mc.status & (^statusMoreResultsExists)
171+
}
172+
return resLen, err
167173
}
168174

169175
func (rows *mysqlRows) nextNotEmptyResultSet() (int, error) {

0 commit comments

Comments
 (0)