diff --git a/connection.go b/connection.go index 04607296e..67d3dbee8 100644 --- a/connection.go +++ b/connection.go @@ -222,10 +222,12 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro rows := new(textRows) rows.mc = mc - if resLen > 0 { - // Columns - rows.columns, err = mc.readColumns(resLen) + if resLen == 0 { + // no columns, no more data + return emptyRows{}, nil } + // Columns + rows.columns, err = mc.readColumns(resLen) return rows, err } } diff --git a/driver_test.go b/driver_test.go index ef5b371cf..3e8e86797 100644 --- a/driver_test.go +++ b/driver_test.go @@ -117,6 +117,17 @@ func (dbt *DBTest) mustQuery(query string, args ...interface{}) (rows *sql.Rows) return rows } +func TestEmptyQuery(t *testing.T) { + runTests(t, dsn, func(dbt *DBTest) { + // just a comment, no query + rows := dbt.mustQuery("--") + // will hang before #255 + if rows.Next() { + dbt.Errorf("Next on rows must be false") + } + }) +} + func TestCRUD(t *testing.T) { runTests(t, dsn, func(dbt *DBTest) { // Create Table diff --git a/rows.go b/rows.go index df4ef06cb..a7cd27615 100644 --- a/rows.go +++ b/rows.go @@ -32,6 +32,8 @@ type textRows struct { mysqlRows } +type emptyRows struct{} + func (rows *mysqlRows) Columns() []string { columns := make([]string, len(rows.columns)) for i := range columns { @@ -84,3 +86,15 @@ func (rows *textRows) Next(dest []driver.Value) error { } return io.EOF } + +func (rows emptyRows) Columns() []string { + return nil +} + +func (rows emptyRows) Close() error { + return nil +} + +func (rows emptyRows) Next(dest []driver.Value) error { + return io.EOF +}