mirror of https://github.com/AMT-Cheif/drift.git
Improve error handling for missing tables in query
This commit is contained in:
parent
6c9c3d0686
commit
5caa948243
|
@ -170,6 +170,7 @@ abstract class DriftElementResolver<T extends DiscoveredElement>
|
|||
final references =
|
||||
resolver.driver.newSqlEngine().findReferencedSchemaTables(stmt);
|
||||
final found = <DriftElement>[];
|
||||
final missingNames = <String, ResolveReferencedElementResult>{};
|
||||
|
||||
for (final table in references) {
|
||||
final result = await resolver.resolveReference(discovered.ownId, table);
|
||||
|
@ -177,11 +178,22 @@ abstract class DriftElementResolver<T extends DiscoveredElement>
|
|||
if (result is ResolvedReferenceFound) {
|
||||
found.add(result.element);
|
||||
} else {
|
||||
final referenceNode = stmt.allDescendants
|
||||
.firstWhere((e) => e is TableReference && e.tableName == table);
|
||||
missingNames[table.toLowerCase()] = result;
|
||||
}
|
||||
}
|
||||
|
||||
reportErrorForUnresolvedReference(result,
|
||||
(msg) => DriftAnalysisError.inDriftFile(referenceNode, msg));
|
||||
if (missingNames.isNotEmpty) {
|
||||
// Ok, there are unresolved table references
|
||||
for (final reference in stmt.allDescendants.whereType<TableReference>()) {
|
||||
if (reference.resolved == null) {
|
||||
final unresolvedBecause =
|
||||
missingNames[reference.tableName.toLowerCase()];
|
||||
|
||||
if (unresolvedBecause != null) {
|
||||
reportErrorForUnresolvedReference(unresolvedBecause,
|
||||
(msg) => DriftAnalysisError.inDriftFile(reference, msg));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -270,4 +270,24 @@ class OtherTable extends Table {
|
|||
final thisTable = file.analyzedElements.single;
|
||||
expect(thisTable.references, hasLength(1));
|
||||
});
|
||||
|
||||
test('reports sensible error for missing table', () async {
|
||||
final state = TestBackend.inTest({
|
||||
'a|lib/a.drift': '''
|
||||
getCompanyCustomersCount:
|
||||
SELECT COUNT(*) AS "count"
|
||||
FROM Customers AS c
|
||||
INNER JOIN Customer_Companies AS cc
|
||||
ON cc.customerId = c.id AND cc.companyId = :companyId;
|
||||
''',
|
||||
});
|
||||
|
||||
final file = await state.analyze('package:a/a.drift');
|
||||
final errors = file.analysis.values.single.errorsDuringAnalysis;
|
||||
expect(errors, [
|
||||
isDriftError(contains('`customers` could not be found in any import')),
|
||||
isDriftError(
|
||||
contains('`customer_companies` could not be found in any import')),
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue