aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormattn <mattn.jp@gmail.com>2018-11-22 01:48:38 +0900
committerGitHub <noreply@github.com>2018-11-22 01:48:38 +0900
commit873ec5700501bf28c8e6afd40344776235403c03 (patch)
treeb421208f4ee885b0e5fb2c3fd57f8504525c5016
parentMerge pull request #644 from akalin/fix-pointer-conversion (diff)
parentFix bug (diff)
downloadgolite-873ec5700501bf28c8e6afd40344776235403c03.tar.gz
golite-873ec5700501bf28c8e6afd40344776235403c03.tar.xz
Merge pull request #643 from akalin/zero-length-blob
Distinguish between NULL and zero-length blobs on query
-rw-r--r--sqlite3.go2
-rw-r--r--sqlite3_test.go31
2 files changed, 32 insertions, 1 deletions
diff --git a/sqlite3.go b/sqlite3.go
index 838a5df..df3258a 100644
--- a/sqlite3.go
+++ b/sqlite3.go
@@ -2024,7 +2024,7 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
case C.SQLITE_BLOB:
p := C.sqlite3_column_blob(rc.s.s, C.int(i))
if p == nil {
- dest[i] = nil
+ dest[i] = []byte{}
continue
}
n := C.sqlite3_column_bytes(rc.s.s, C.int(i))
diff --git a/sqlite3_test.go b/sqlite3_test.go
index a67cf42..0667893 100644
--- a/sqlite3_test.go
+++ b/sqlite3_test.go
@@ -1770,6 +1770,7 @@ var tests = []testing.InternalTest{
{Name: "TestResult", F: testResult},
{Name: "TestBlobs", F: testBlobs},
{Name: "TestMultiBlobs", F: testMultiBlobs},
+ {Name: "TestNullZeroLengthBlobs", F: testNullZeroLengthBlobs},
{Name: "TestManyQueryRow", F: testManyQueryRow},
{Name: "TestTxQuery", F: testTxQuery},
{Name: "TestPreparedStmt", F: testPreparedStmt},
@@ -1975,6 +1976,36 @@ func testMultiBlobs(t *testing.T) {
}
}
+// testBlobs tests that we distinguish between null and zero-length blobs
+func testNullZeroLengthBlobs(t *testing.T) {
+ db.tearDown()
+ db.mustExec("create table foo (id integer primary key, bar " + db.blobType(16) + ")")
+ db.mustExec(db.q("insert into foo (id, bar) values(?,?)"), 0, nil)
+ db.mustExec(db.q("insert into foo (id, bar) values(?,?)"), 1, []byte{})
+
+ r0 := db.QueryRow(db.q("select bar from foo where id=0"))
+ var b0 []byte
+ err := r0.Scan(&b0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if b0 != nil {
+ t.Errorf("for id=0, got %x; want nil", b0)
+ }
+
+ r1 := db.QueryRow(db.q("select bar from foo where id=1"))
+ var b1 []byte
+ err = r1.Scan(&b1)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if b1 == nil {
+ t.Error("for id=1, got nil; want zero-length slice")
+ } else if len(b1) > 0 {
+ t.Errorf("for id=1, got %x; want zero-length slice", b1)
+ }
+}
+
// testManyQueryRow is test for many query row
func testManyQueryRow(t *testing.T) {
if testing.Short() {