From 1974307961812635ca7de543f3f06c982261f761 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Thu, 14 Nov 2019 18:37:24 +0100 Subject: [PATCH] Try to not bind empty blobs to null, doesn't work though --- moor_ffi/lib/src/impl/prepared_statement.dart | 10 +++++++--- .../test/database/prepared_statements_test.dart | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/moor_ffi/lib/src/impl/prepared_statement.dart b/moor_ffi/lib/src/impl/prepared_statement.dart index 1f8d857f..fc18194c 100644 --- a/moor_ffi/lib/src/impl/prepared_statement.dart +++ b/moor_ffi/lib/src/impl/prepared_statement.dart @@ -115,9 +115,13 @@ class PreparedStatement { bindings.sqlite3_bind_text(_stmt, i, ptr, -1, nullptr); } else if (param is Uint8List) { - // todo we just have a null pointer param.isEmpty. I guess we have - // to use sqlite3_bind_zeroblob for that? - final ptr = CBlob.allocate(param); + // avoid binding a null-pointer, as sqlite would treat that as NULL + // in sql which is different from x'' + final ptr = param.isNotEmpty + ? CBlob.allocate(param) + : CBlob.allocateString(''); + + assert(!ptr.isNullPointer); _allocatedWhileBinding.add(ptr); bindings.sqlite3_bind_blob(_stmt, i, ptr, param.length, nullptr); diff --git a/moor_ffi/test/database/prepared_statements_test.dart b/moor_ffi/test/database/prepared_statements_test.dart index 02bd4106..e26cfb5d 100644 --- a/moor_ffi/test/database/prepared_statements_test.dart +++ b/moor_ffi/test/database/prepared_statements_test.dart @@ -1,3 +1,4 @@ +import 'package:moor/moor.dart'; import 'package:moor_ffi/database.dart'; import 'package:test/test.dart'; @@ -40,4 +41,20 @@ void main() { expect(stmt.select, throwsA(anything)); }); + + test('can bind empty blob in prepared statements', () { + final opened = Database.memory(); + opened.execute('CREATE TABLE tbl (x BLOB NOT NULL);'); + + final insert = opened.prepare('INSERT INTO tbl VALUES (?)'); + insert.execute([Uint8List(0)]); + insert.close(); + + final select = opened.prepare('SELECT * FROM tbl'); + final result = select.select().single; + + expect(result['x'], []); + + opened.close(); + }, skip: 'todo figure out why this still fails'); }