Improve error handling for missing tables in query

This commit is contained in:
Simon Binder 2023-04-19 23:24:24 +02:00
parent 6c9c3d0686
commit 5caa948243
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
2 changed files with 36 additions and 4 deletions

View File

@ -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));
}
}
}
}

View File

@ -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')),
]);
});
}