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 (inheritAvailableColumns) return parent.availableColumns;
return null;
return const [];
}
set availableColumns(List<Column> value) {

View File

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

View File

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

View File

@ -57,4 +57,11 @@ void main() {
expect(
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
});
}