aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Leske <thomas@leske.biz>2012-08-20 17:20:58 +0200
committerThomas Leske <thomas@leske.biz>2012-08-20 17:20:58 +0200
commita4e5e7a617347421764703979ebf8b78320ad3e4 (patch)
treec72ceaaa6303472c71b4fae25907abd7868de658
parentMerge pull request #18 from coolaj86/patch-1 (diff)
downloadgolite-a4e5e7a617347421764703979ebf8b78320ad3e4.tar.gz
golite-a4e5e7a617347421764703979ebf8b78320ad3e4.tar.xz
bug fix: Byte slices belong to the caller and so must be copies.
With the exeption of slices in the result type sql.RawBytes, new calls to Sqlite must not corrupt slices.
-rw-r--r--sqlite3.go9
1 files changed, 8 insertions, 1 deletions
diff --git a/sqlite3.go b/sqlite3.go
index 161da5e..d3afff5 100644
--- a/sqlite3.go
+++ b/sqlite3.go
@@ -297,7 +297,14 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
case C.SQLITE_BLOB:
n := int(C.sqlite3_column_bytes(rc.s.s, C.int(i)))
p := C.sqlite3_column_blob(rc.s.s, C.int(i))
- dest[i] = (*[1 << 30]byte)(unsafe.Pointer(p))[0:n]
+ switch dest[i].(type) {
+ case sql.RawBytes:
+ dest[i] = (*[1 << 30]byte)(unsafe.Pointer(p))[0:n]
+ default:
+ slice := make([]byte, n)
+ copy(slice[:], (*[1 << 30]byte)(unsafe.Pointer(p))[0:n])
+ dest[i] = slice
+ }
case C.SQLITE_NULL:
dest[i] = nil
case C.SQLITE_TEXT: