Fix sqlparser crashes related to unknown tables

This commit is contained in:
Simon Binder 2020-06-19 13:43:16 +02:00
parent 5c9c175c85
commit c342b29b33
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
4 changed files with 19 additions and 9 deletions

View File

@ -44,7 +44,7 @@ class ReferenceScope {
if (_availableColumns != null) return _availableColumns; if (_availableColumns != null) return _availableColumns;
if (inheritAvailableColumns) return parent.availableColumns; if (inheritAvailableColumns) return parent.availableColumns;
return null; return const [];
} }
set availableColumns(List<Column> value) { set availableColumns(List<Column> value) {

View File

@ -63,25 +63,28 @@ class ColumnResolver extends RecursiveVisitor<void, void> {
visitChildren(e, arg); visitChildren(e, arg);
} }
void _addIfResolved(AstNode node, TableReference ref) {
final table = _resolveTableReference(ref);
if (table != null) {
node.scope.availableColumns = table.resolvedColumns;
}
}
@override @override
void visitUpdateStatement(UpdateStatement e, void arg) { void visitUpdateStatement(UpdateStatement e, void arg) {
final table = _resolveTableReference(e.table); _addIfResolved(e, e.table);
e.scope.availableColumns = table.resolvedColumns;
visitChildren(e, arg); visitChildren(e, arg);
} }
@override @override
void visitInsertStatement(InsertStatement e, void arg) { void visitInsertStatement(InsertStatement e, void arg) {
final table = _resolveTableReference(e.table); _addIfResolved(e, e.table);
visitChildren(e, arg);
e.scope.availableColumns = table.resolvedColumns;
visitChildren(e, arg); visitChildren(e, arg);
} }
@override @override
void visitDeleteStatement(DeleteStatement e, void arg) { void visitDeleteStatement(DeleteStatement e, void arg) {
final table = _resolveTableReference(e.from); _addIfResolved(e, e.from);
e.scope.availableColumns = table.resolvedColumns;
visitChildren(e, arg); visitChildren(e, arg);
} }

View File

@ -30,7 +30,7 @@ class ReferencedTablesVisitor extends RecursiveVisitor<void, void> {
} }
NamedResultSet /*?*/ _toResultSetOrNull(ResolvesToResultSet resultSet) { NamedResultSet /*?*/ _toResultSetOrNull(ResolvesToResultSet resultSet) {
var resolved = resultSet.resultSet; var resolved = resultSet?.resultSet;
while (resolved != null && resolved is TableAlias) { while (resolved != null && resolved is TableAlias) {
resolved = (resolved as TableAlias).delegate; resolved = (resolved as TableAlias).delegate;

View File

@ -57,4 +57,11 @@ void main() {
expect( expect(
findWrittenTables(ctx.root), {TableWrite(logins, UpdateKind.insert)}); findWrittenTables(ctx.root), {TableWrite(logins, UpdateKind.insert)});
}); });
test('ignores unresolved references', () {
final ctx = engine.analyze('UPDATE xzy SET foo = bar');
expect(findWrittenTables(ctx.root), isEmpty);
expect(ctx.errors, hasLength(3)); // unknown table, two unknown references
});
} }