Skip to content

Commit 9468226

Browse files
fix issue 1361
1 parent 0b18dac commit 9468226

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

driver_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3406,3 +3406,62 @@ func TestConnectionAttributes(t *testing.T) {
34063406
}
34073407
rows.Close()
34083408
}
3409+
3410+
func TestIssue1361(t *testing.T) {
3411+
var db *sql.DB
3412+
if _, err := ParseDSN(dsn); err != errInvalidDSNUnsafeCollation {
3413+
db, err = sql.Open("mysql", dsn)
3414+
if err != nil {
3415+
t.Fatalf("error connecting: %s", err.Error())
3416+
}
3417+
defer db.Close()
3418+
}
3419+
3420+
dbt := &DBTest{t, db}
3421+
// for _, test := range tests {
3422+
// test(dbt)
3423+
// dbt.db.Exec("DROP TABLE IF EXISTS test")
3424+
// }
3425+
queries := []string{
3426+
`
3427+
CREATE PROCEDURE test_proc1()
3428+
BEGIN
3429+
SIGNAL SQLSTATE '10000' SET MESSAGE_TEXT = "some error", MYSQL_ERRNO = 10000;
3430+
END;
3431+
`,
3432+
`
3433+
CREATE PROCEDURE test_proc2()
3434+
BEGIN
3435+
SELECT 1,2;
3436+
SELECT 3,4;
3437+
SIGNAL SQLSTATE '10000' SET MESSAGE_TEXT = "some error", MYSQL_ERRNO = 10000;
3438+
END;
3439+
`,
3440+
}
3441+
names := []string{
3442+
"test_proc1", "test_proc2",
3443+
}
3444+
for i, query := range queries {
3445+
runCallCommand(dbt, query, names[i])
3446+
}
3447+
3448+
}
3449+
3450+
func runCallCommand(dbt *DBTest, query, name string) {
3451+
3452+
dbt.mustExec(fmt.Sprintf("DROP PROCEDURE IF EXISTS %s;", name))
3453+
dbt.mustExec(query)
3454+
defer dbt.mustExec("drop procedure " + name)
3455+
rows, err := dbt.db.Query(fmt.Sprintf("call %s;", name))
3456+
if err != nil {
3457+
return
3458+
}
3459+
defer rows.Close()
3460+
3461+
for rows.Next() {
3462+
}
3463+
for rows.NextResultSet() { // thread will be blocked when exec rs.Close()
3464+
for rows.Next() {
3465+
}
3466+
}
3467+
}

rows.go

Lines changed: 7 additions & 1 deletion
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)