Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

Aaron Hopkins <go-sql-driver at die.net>
Achille Roussel <achille.roussel at gmail.com>
Aidan <aidan.liu at pingcap.com>
Alex Snast <alexsn at fb.com>
Alexey Palazhchenko <alexey.palazhchenko at gmail.com>
Andrew Reid <andrew.reid at tixtrack.com>
Expand Down
55 changes: 55 additions & 0 deletions driver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3406,3 +3406,58 @@ func TestConnectionAttributes(t *testing.T) {
}
rows.Close()
}

func TestIssue1361(t *testing.T) {
var db *sql.DB
if _, err := ParseDSN(dsn); err != errInvalidDSNUnsafeCollation {
db, err = sql.Open("mysql", dsn)
if err != nil {
t.Fatalf("error connecting: %s", err.Error())
}
defer db.Close()
}

dbt := &DBTest{t, db}
queries := []string{
`
CREATE PROCEDURE test_proc1()
BEGIN
SIGNAL SQLSTATE '10000' SET MESSAGE_TEXT = "some error", MYSQL_ERRNO = 10000;
END;
`,
`
CREATE PROCEDURE test_proc2()
BEGIN
SELECT 1,2;
SELECT 3,4;
SIGNAL SQLSTATE '10000' SET MESSAGE_TEXT = "some error", MYSQL_ERRNO = 10000;
END;
`,
}
names := []string{
"test_proc1", "test_proc2",
}
for i, query := range queries {
runCallCommand(dbt, query, names[i])
}

}

func runCallCommand(dbt *DBTest, query, name string) {

dbt.mustExec(fmt.Sprintf("DROP PROCEDURE IF EXISTS %s;", name))
dbt.mustExec(query)
defer dbt.mustExec("drop procedure " + name)
rows, err := dbt.db.Query(fmt.Sprintf("call %s;", name))
if err != nil {
return
}
defer rows.Close()

for rows.Next() {
}
for rows.NextResultSet() { // original thread will be blocked when exec rs.Close()
for rows.Next() {
}
}
}
8 changes: 7 additions & 1 deletion rows.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,13 @@ func (rows *mysqlRows) nextResultSet() (int, error) {
rows.rs = resultSet{}
// rows.mc.affectedRows and rows.mc.insertIds accumulate on each call to
// nextResultSet.
return rows.mc.resultUnchanged().readResultSetHeaderPacket()
resLen, err := rows.mc.resultUnchanged().readResultSetHeaderPacket()
if err != nil {
// Clean up about multi-results flag
rows.rs.done = true
rows.mc.status = rows.mc.status & (^statusMoreResultsExists)
}
return resLen, err
}

func (rows *mysqlRows) nextNotEmptyResultSet() (int, error) {
Expand Down