From 2edd75acbb1c8d92d6347bb03bcf0bcbd4220cbe Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Wed, 27 Sep 2023 14:46:50 +0200 Subject: [PATCH] Fix defining indices on expressions (#2643) --- drift_dev/CHANGELOG.md | 1 + drift_dev/lib/src/analysis/resolver/drift/index.dart | 12 +----------- drift_dev/lib/src/analysis/results/index.dart | 4 ++++ .../test/backends/build/build_integration_test.dart | 5 +++-- drift_dev/test/cli/schema/dump_test.dart | 2 +- drift_dev/test/services/schema/writer_test.dart | 6 +++--- 6 files changed, 13 insertions(+), 17 deletions(-) diff --git a/drift_dev/CHANGELOG.md b/drift_dev/CHANGELOG.md index 6cbb23eb0..b81b7c172 100644 --- a/drift_dev/CHANGELOG.md +++ b/drift_dev/CHANGELOG.md @@ -1,6 +1,7 @@ ## 2.12.1-dev - Fix invalid types listed in `views` crashing the generator. +- Fix indices in drift files crashing the generator when they index expressions. ## 2.12.0 diff --git a/drift_dev/lib/src/analysis/resolver/drift/index.dart b/drift_dev/lib/src/analysis/resolver/drift/index.dart index cde473a43..7762bf861 100644 --- a/drift_dev/lib/src/analysis/resolver/drift/index.dart +++ b/drift_dev/lib/src/analysis/resolver/drift/index.dart @@ -20,28 +20,18 @@ class DriftIndexResolver extends DriftElementResolver { final onTable = stmt.on.resolved; DriftTable? target; - List indexedColumns = []; if (onTable is Table) { target = references .whereType() .firstWhere((e) => e.schemaName == onTable.name); - - for (final indexedColumn in stmt.columns) { - final name = (indexedColumn.expression as Reference).columnName; - final tableColumn = target.columnBySqlName[name]; - - if (tableColumn != null) { - indexedColumns.add(tableColumn); - } - } } return DriftIndex( discovered.ownId, DriftDeclaration.driftFile(stmt, file.ownUri), table: target, - indexedColumns: indexedColumns, + indexedColumns: [], unique: stmt.unique, createStmt: source.substring(stmt.firstPosition, stmt.lastPosition), ); diff --git a/drift_dev/lib/src/analysis/results/index.dart b/drift_dev/lib/src/analysis/results/index.dart index 82bdbca01..2ec03fc1c 100644 --- a/drift_dev/lib/src/analysis/results/index.dart +++ b/drift_dev/lib/src/analysis/results/index.dart @@ -13,6 +13,10 @@ class DriftIndex extends DriftSchemaElement { DriftTable? table; /// Columns of [table] that have been indexed. + /// + /// This list is empty for indices created in SQL because it can't represent + /// all expressions being indexed. It is useful for Dart-defined indices to + /// implement [createStatementForDartDefinition]. List indexedColumns; /// Whethet the index has been declared to be unique. diff --git a/drift_dev/test/backends/build/build_integration_test.dart b/drift_dev/test/backends/build/build_integration_test.dart index 4a1062694..a7d28e3f0 100644 --- a/drift_dev/test/backends/build/build_integration_test.dart +++ b/drift_dev/test/backends/build/build_integration_test.dart @@ -22,14 +22,15 @@ class MyDatabase {} 'a|lib/a.drift': ''' import 'b.drift'; -CREATE INDEX b_idx /* comment should be stripped */ ON b (foo); +CREATE INDEX b_idx /* comment should be stripped */ ON b (foo, upper(foo)); ''', 'a|lib/b.drift': 'CREATE TABLE b (foo TEXT);', }); checkOutputs({ 'a|lib/main.drift.dart': decodedMatches(contains( - "late final Index bIdx = Index('b_idx', 'CREATE INDEX b_idx ON b (foo)')")), + 'late final Index bIdx =\n' + " Index('b_idx', 'CREATE INDEX b_idx ON b (foo, upper(foo))')")), }, result.dartOutputs, result.writer); }); diff --git a/drift_dev/test/cli/schema/dump_test.dart b/drift_dev/test/cli/schema/dump_test.dart index fdf371a4d..b22244842 100644 --- a/drift_dev/test/cli/schema/dump_test.dart +++ b/drift_dev/test/cli/schema/dump_test.dart @@ -127,7 +127,7 @@ void main() { "name": "idx", "sql": "CREATE INDEX idx ON users (name);", "unique": false, - "columns": ["name"] + "columns": [] } } ] diff --git a/drift_dev/test/services/schema/writer_test.dart b/drift_dev/test/services/schema/writer_test.dart index c8751d88c..eaba18856 100644 --- a/drift_dev/test/services/schema/writer_test.dart +++ b/drift_dev/test/services/schema/writer_test.dart @@ -40,7 +40,7 @@ CREATE TRIGGER delete_empty_groups AFTER DELETE ON group_members BEGIN WHERE NOT EXISTS (SELECT * FROM group_members WHERE "group" = "groups".id); END; -CREATE INDEX groups_name ON "groups"(name); +CREATE INDEX groups_name ON "groups"(name, upper(name)); CREATE VIEW my_view WITH MyViewRow AS SELECT id FROM "groups"; @@ -368,9 +368,9 @@ const expected = r''' "data": { "on": 0, "name": "groups_name", - "sql": "CREATE INDEX groups_name ON \"groups\"(name);", + "sql": "CREATE INDEX groups_name ON \"groups\"(name, upper(name));", "unique": false, - "columns": ["name"] + "columns": [] } }, {