mirror of
https://github.com/glebarez/go-sqlite.git
synced 2025-10-05 15:56:52 +08:00
handle properly 0 rows query results, fixes #28
This commit is contained in:
27
all_test.go
27
all_test.go
@@ -799,3 +799,30 @@ func TestNoRows(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://gitlab.com/cznic/sqlite/-/issues/28
|
||||||
|
func TestIssue28(t *testing.T) {
|
||||||
|
tempDir, err := ioutil.TempDir("", "")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer os.RemoveAll(tempDir)
|
||||||
|
|
||||||
|
db, err := sql.Open("sqlite", filepath.Join(tempDir, "test.db"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("test.db open fail: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
if _, err := db.Exec(`CREATE TABLE test (foo TEXT)`); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
row := db.QueryRow(`SELECT foo FROM test`)
|
||||||
|
var foo string
|
||||||
|
if err = row.Scan(&foo); err != sql.ErrNoRows {
|
||||||
|
t.Fatalf("got %T(%[1]v), expected %T(%[2]v)", err, sql.ErrNoRows)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
12
sqlite.go
12
sqlite.go
@@ -29,6 +29,7 @@ var (
|
|||||||
//lint:ignore SA1019 TODO implement QueryerContext
|
//lint:ignore SA1019 TODO implement QueryerContext
|
||||||
_ driver.Queryer = (*conn)(nil)
|
_ driver.Queryer = (*conn)(nil)
|
||||||
_ driver.Result = (*result)(nil)
|
_ driver.Result = (*result)(nil)
|
||||||
|
_ driver.Rows = noRows{}
|
||||||
_ driver.Rows = (*rows)(nil)
|
_ driver.Rows = (*rows)(nil)
|
||||||
_ driver.Stmt = (*stmt)(nil)
|
_ driver.Stmt = (*stmt)(nil)
|
||||||
_ driver.Tx = (*tx)(nil)
|
_ driver.Tx = (*tx)(nil)
|
||||||
@@ -496,6 +497,11 @@ func (s *stmt) query(ctx context.Context, args []driver.NamedValue) (r driver.Ro
|
|||||||
pstmt = 0
|
pstmt = 0
|
||||||
return nil
|
return nil
|
||||||
case sqlite3.SQLITE_DONE:
|
case sqlite3.SQLITE_DONE:
|
||||||
|
if r == nil {
|
||||||
|
pstmt = 0
|
||||||
|
r = noRows{}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
// nop
|
// nop
|
||||||
default:
|
default:
|
||||||
return s.c.errstr(int32(rc))
|
return s.c.errstr(int32(rc))
|
||||||
@@ -516,6 +522,12 @@ func (s *stmt) query(ctx context.Context, args []driver.NamedValue) (r driver.Ro
|
|||||||
return r, err
|
return r, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type noRows struct{}
|
||||||
|
|
||||||
|
func (noRows) Columns() []string { return nil }
|
||||||
|
func (noRows) Close() error { return nil }
|
||||||
|
func (noRows) Next([]driver.Value) error { return sql.ErrNoRows }
|
||||||
|
|
||||||
type tx struct {
|
type tx struct {
|
||||||
c *conn
|
c *conn
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user