sql.ErrNoRows returned when using Query
When you use Query and there are no rows, rows.Err() will return sql.ErrNoRows, which it should not. See example code.
package main
import (
"database/sql"
"fmt"
_ "modernc.org/sqlite"
_ "github.com/mattn/go-sqlite3"
)
func main() {
test("sqlite3")
test("sqlite")
}
func test(driver string) {
db, err := sql.Open(driver, "file:test?mode=memory&cache=shared")
if err != nil {
panic(err)
}
_, err = db.Exec(`CREATE TABLE test (foo TEXT)`)
if err != nil {
panic(err)
}
// Test QueryRow
row := db.QueryRow(`SELECT foo FROM test`)
var foo string
err = row.Scan(&foo)
fmt.Println(driver, "QueryRow", err)
// Test Query
rows, err := db.Query(`SELECT foo FROM test`)
if err != nil {
panic(err)
}
defer rows.Close()
if rows.Next() {
panic("rows.Next returned true")
}
err = rows.Err()
fmt.Println(driver, "Query", err)
}
The problem is this line in sqlite.go:
func (noRows) Next([]driver.Value) error { return sql.ErrNoRows }
It should be changed into:
func (noRows) Next([]driver.Value) error { return io.EOF }