Report invalid statements in parseMultiple

This commit is contained in:
Simon Binder 2023-07-21 21:04:03 +02:00
parent ca67b8c4ed
commit cc83a58d89
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
2 changed files with 36 additions and 0 deletions

View File

@ -189,9 +189,14 @@ class Parser {
final first = _peek;
final statements = <Statement>[];
while (!_isAtEnd) {
final firstForStatement = _peek;
final statement = _parseAsStatement(_statementWithoutSemicolon);
if (statement != null) {
statements.add(statement);
} else {
statements
.add(InvalidStatement()..setSpan(firstForStatement, _previous));
}
}

View File

@ -143,4 +143,35 @@ void main() {
),
);
});
test('parseMultiple reports spans for invalid statements', () {
const sql = '''
UPDATE users SET foo = bar;
ALTER TABLE this syntax is not yet supported;
SELECT * FROM users;
''';
final engine = SqlEngine();
final ast = engine.parseMultiple(sql).rootNode;
enforceHasSpan(ast);
final statements = ast.childNodes.toList();
expect(statements, hasLength(3));
expect(
statements[0],
isA<UpdateStatement>()
.having((e) => e.span?.text, 'span', 'UPDATE users SET foo = bar;'),
);
expect(
statements[1],
isA<InvalidStatement>().having((e) => e.span?.text, 'span',
'ALTER TABLE this syntax is not yet supported;'),
);
expect(
statements[2],
isA<SelectStatement>()
.having((e) => e.span?.text, 'span', 'SELECT * FROM users;'),
);
});
}