mirror of https://github.com/AMT-Cheif/drift.git
Fix sqlparser crashes related to unknown tables
This commit is contained in:
parent
5c9c175c85
commit
c342b29b33
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue