diff --git a/drift/lib/src/runtime/query_builder/expressions/variables.dart b/drift/lib/src/runtime/query_builder/expressions/variables.dart index 57f803a8e..efb3fe419 100644 --- a/drift/lib/src/runtime/query_builder/expressions/variables.dart +++ b/drift/lib/src/runtime/query_builder/expressions/variables.dart @@ -84,11 +84,9 @@ class Variable extends Expression { ..write(mark) ..write(explicitStart + context.amountOfVariables); context.introduceVariable(this, mapToSimpleValue(context)); - } else if (value != null) { + } else { context.buffer.write(mark); context.introduceVariable(this, mapToSimpleValue(context)); - } else { - context.buffer.write('NULL'); } } diff --git a/drift/test/database/expressions/variable_test.dart b/drift/test/database/expressions/variable_test.dart index 90d205602..b58768d9b 100644 --- a/drift/test/database/expressions/variable_test.dart +++ b/drift/test/database/expressions/variable_test.dart @@ -16,6 +16,10 @@ void main() { expect(ctx.boundVariables, [1551297563]); }); + test('maps null to null', () { + expect(Variable(null), generates('?', [null])); + }); + group('can write variables with wrong type parameter', () { test('true', () { expect(const Variable(true), generates('?', [1])); @@ -52,16 +56,6 @@ void main() { }); }); - test('writes null directly for null values', () { - const variable = Variable(null); - final ctx = GenerationContext.fromDb(TodoDb()); - - variable.writeInto(ctx); - - expect(ctx.sql, 'NULL'); - expect(ctx.boundVariables, isEmpty); - }); - test('writes constants when variables are not supported', () { const variable = Variable("hello world'"); final ctx = GenerationContext.fromDb(TodoDb(), supportsVariables: false); diff --git a/drift/test/database/statements/insert_test.dart b/drift/test/database/statements/insert_test.dart index 0498b2bf0..e310c3f0b 100644 --- a/drift/test/database/statements/insert_test.dart +++ b/drift/test/database/statements/insert_test.dart @@ -1,4 +1,4 @@ -import 'package:drift/drift.dart'; +import 'package:drift/drift.dart' hide isNull; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; @@ -37,8 +37,8 @@ void main() { verify(executor.runInsert( 'INSERT INTO table_without_p_k ' '(not_really_an_id, some_float, web_safe_int, custom) ' - 'VALUES (?, ?, NULL, ?)', - [42, 3.1415, anything])); + 'VALUES (?, ?, ?, ?)', + [42, 3.1415, isNull, anything])); }); test('can insert BigInt values', () async { @@ -156,7 +156,8 @@ void main() { TodosTableCompanion.insert(content: 'content', title: Value(null))); verify(executor.runInsert( - 'INSERT INTO todos (title, content) VALUES (NULL, ?)', ['content'])); + 'INSERT INTO todos (title, content) VALUES (?, ?)', + [null, 'content'])); }); }); diff --git a/drift/test/database/statements/update_test.dart b/drift/test/database/statements/update_test.dart index 8699ca8d6..7a437ca2f 100644 --- a/drift/test/database/statements/update_test.dart +++ b/drift/test/database/statements/update_test.dart @@ -61,8 +61,8 @@ void main() { verify(executor.runUpdate( 'UPDATE todos SET title = ?, content = ?, ' - 'target_date = NULL, category = NULL WHERE id = ?;', - ['Title', 'Updated content', 3])); + 'target_date = ?, category = ? WHERE id = ?;', + ['Title', 'Updated content', null, null, 3])); }); test('applies default values', () async { diff --git a/drift_sqflite/CHANGELOG.md b/drift_sqflite/CHANGELOG.md index 14c1448e0..001c4be97 100644 --- a/drift_sqflite/CHANGELOG.md +++ b/drift_sqflite/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.1 + +- Fix batch implementation to not start a second transaction. + ## 2.0.0 - Support `drift` version `2.0.0`. diff --git a/drift_sqflite/lib/drift_sqflite.dart b/drift_sqflite/lib/drift_sqflite.dart index cb6154699..5465c1b9d 100644 --- a/drift_sqflite/lib/drift_sqflite.dart +++ b/drift_sqflite/lib/drift_sqflite.dart @@ -74,7 +74,7 @@ class _SqfliteDelegate extends DatabaseDelegate { batch.execute(statements.statements[arg.statementIndex], arg.arguments); } - await batch.commit(noResult: true); + await batch.apply(noResult: true); } @override diff --git a/drift_sqflite/pubspec.yaml b/drift_sqflite/pubspec.yaml index 10977b1ad..96303d4ae 100644 --- a/drift_sqflite/pubspec.yaml +++ b/drift_sqflite/pubspec.yaml @@ -1,6 +1,6 @@ name: drift_sqflite description: A Flutter-only implementation of a drift database, based on the `sqflite` package. -version: 2.0.0 +version: 2.0.1 repository: https://github.com/simolus3/drift homepage: https://drift.simonbinder.eu/ issue_tracker: https://github.com/simolus3/drift/issues @@ -10,7 +10,7 @@ environment: dependencies: drift: ^2.0.0 - sqflite: ^2.0.0+3 + sqflite: ^2.1.0 path: ^1.8.0 flutter: sdk: flutter diff --git a/extras/integration_tests/drift_testcases/lib/suite/crud_tests.dart b/extras/integration_tests/drift_testcases/lib/suite/crud_tests.dart index 23506c4b7..91632f476 100644 --- a/extras/integration_tests/drift_testcases/lib/suite/crud_tests.dart +++ b/extras/integration_tests/drift_testcases/lib/suite/crud_tests.dart @@ -111,4 +111,47 @@ void crudTests(TestExecutor executor) { expect(await db.friendsOf(1).get(), isNotEmpty); await executor.clearDatabaseAndClose(db); }); + + group('bind variable', () { + late Database database; + + setUp(() => database = Database(executor.createConnection())); + tearDown(() => executor.clearDatabaseAndClose(database)); + + Future evaluate(Expression expr) async { + final query = database.selectOnly(database.users) + ..addColumns([expr]) + ..limit(1); + final row = await query.getSingle(); + return row.read(expr); + } + + test('null', () { + expect(evaluate(Variable(null)), completion(isNull)); + }); + + test('string', () { + expect(evaluate(Variable('foo bar')), completion('foo bar')); + expect(evaluate(Variable('')), completion('')); + }); + + test('boolean', () { + expect(evaluate(Variable(true)), completion(isTrue)); + expect(evaluate(Variable(false)), completion(isFalse)); + }); + + test('int', () { + expect(evaluate(Variable(42)), completion(42)); + }); + + test('double', () { + expect(evaluate(Variable(3.14)), completion(3.14)); + }); + + test('Uint8List', () { + final list = Uint8List.fromList(List.generate(12, (index) => index)); + + expect(evaluate(Variable(list)), completion(list)); + }); + }); } diff --git a/extras/integration_tests/drift_testcases/lib/tests.dart b/extras/integration_tests/drift_testcases/lib/tests.dart index 34110c8c4..14f8fb7fa 100644 --- a/extras/integration_tests/drift_testcases/lib/tests.dart +++ b/extras/integration_tests/drift_testcases/lib/tests.dart @@ -1,6 +1,6 @@ library tests; -export 'package:drift/drift.dart'; +export 'package:drift/drift.dart' hide isNull, isNotNull; export 'data/sample_data.dart'; export 'database/database.dart';