aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Mercl <0xjnml@gmail.com>2020-09-21 18:36:03 +0200
committerJan Mercl <0xjnml@gmail.com>2020-09-21 18:36:03 +0200
commita4318db8c7fc62f25e9f78c434d2a2a54fc1f433 (patch)
tree75ca9b87d1718048e6c3788f6d257c770efc7603
parenta6843eee0fb7784a88e1c4f8e386aba6551292ef (diff)
handle properly 0 rows query results, fixes #28v1.7.1
-rw-r--r--all_test.go27
-rw-r--r--sqlite.go12
2 files changed, 39 insertions, 0 deletions
diff --git a/all_test.go b/all_test.go
index 07aa1f2..08f565b 100644
--- a/all_test.go
+++ b/all_test.go
@@ -799,3 +799,30 @@ func TestNoRows(t *testing.T) {
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)
+ }
+}
diff --git a/sqlite.go b/sqlite.go
index 6b40b7a..0679018 100644
--- a/sqlite.go
+++ b/sqlite.go
@@ -29,6 +29,7 @@ var (
//lint:ignore SA1019 TODO implement QueryerContext
_ driver.Queryer = (*conn)(nil)
_ driver.Result = (*result)(nil)
+ _ driver.Rows = noRows{}
_ driver.Rows = (*rows)(nil)
_ driver.Stmt = (*stmt)(nil)
_ driver.Tx = (*tx)(nil)
@@ -496,6 +497,11 @@ func (s *stmt) query(ctx context.Context, args []driver.NamedValue) (r driver.Ro
pstmt = 0
return nil
case sqlite3.SQLITE_DONE:
+ if r == nil {
+ pstmt = 0
+ r = noRows{}
+ return nil
+ }
// nop
default:
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
}
+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 {
c *conn
}