diff --git a/sqlparser/lib/src/analysis/schema/references.dart b/sqlparser/lib/src/analysis/schema/references.dart index 2ba04aa4..3dc59e4b 100644 --- a/sqlparser/lib/src/analysis/schema/references.dart +++ b/sqlparser/lib/src/analysis/schema/references.dart @@ -44,7 +44,7 @@ class ReferenceScope { if (_availableColumns != null) return _availableColumns; if (inheritAvailableColumns) return parent.availableColumns; - return null; + return const []; } set availableColumns(List value) { diff --git a/sqlparser/lib/src/analysis/steps/column_resolver.dart b/sqlparser/lib/src/analysis/steps/column_resolver.dart index bcadaf09..073e0118 100644 --- a/sqlparser/lib/src/analysis/steps/column_resolver.dart +++ b/sqlparser/lib/src/analysis/steps/column_resolver.dart @@ -63,25 +63,28 @@ class ColumnResolver extends RecursiveVisitor { 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); } diff --git a/sqlparser/lib/utils/find_referenced_tables.dart b/sqlparser/lib/utils/find_referenced_tables.dart index ada55e40..33c1bffa 100644 --- a/sqlparser/lib/utils/find_referenced_tables.dart +++ b/sqlparser/lib/utils/find_referenced_tables.dart @@ -30,7 +30,7 @@ class ReferencedTablesVisitor extends RecursiveVisitor { } NamedResultSet /*?*/ _toResultSetOrNull(ResolvesToResultSet resultSet) { - var resolved = resultSet.resultSet; + var resolved = resultSet?.resultSet; while (resolved != null && resolved is TableAlias) { resolved = (resolved as TableAlias).delegate; diff --git a/sqlparser/test/utils/find_referenced_tables.dart b/sqlparser/test/utils/find_referenced_tables.dart index a954ec6e..e84868b4 100644 --- a/sqlparser/test/utils/find_referenced_tables.dart +++ b/sqlparser/test/utils/find_referenced_tables.dart @@ -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 + }); }