import 'package:test/test.dart'; import 'package:sqlparser/sqlparser.dart'; import 'package:sqlparser/src/utils/ast_equality.dart'; import '../utils.dart'; void _enforceFrom(SelectStatement stmt, List expected) { expect(stmt.from.length, expected.length); for (var i = 0; i < stmt.from.length; i++) { enforceEqual(stmt.from[i], expected[i]); } } void main() { group('from', () { test('a simple table', () { final stmt = SqlEngine().parse('SELECT * FROM table') as SelectStatement; enforceEqual(stmt.from.single, TableReference('table', null)); }); test('from more than one table', () { final stmt = SqlEngine().parse('SELECT * FROM table AS test, table2') as SelectStatement; _enforceFrom( stmt, [ TableReference('table', 'test'), TableReference('table2', null), ], ); }); test('from inner select statements', () { final stmt = SqlEngine().parse( 'SELECT * FROM table1, (SELECT * FROM table2 WHERE a) as "inner"') as SelectStatement; _enforceFrom( stmt, [ TableReference('table1', null), SelectStatementAsSource( statement: SelectStatement( columns: [StarResultColumn(null)], from: [TableReference('table2', null)], where: Reference(columnName: 'a'), ), as: 'inner', ), ], ); }); test('from a join', () { final stmt = SqlEngine().parse('SELECT * FROM table1 ' 'INNER JOIN table2 USING (test) ' 'LEFT OUTER JOIN table3 ON TRUE') as SelectStatement; _enforceFrom(stmt, [ JoinClause( primary: TableReference('table1', null), joins: [ Join( operator: JoinOperator.inner, query: TableReference('table2', null), constraint: UsingConstraint(columnNames: ['test']), ), Join( operator: JoinOperator.leftOuter, query: TableReference('table3', null), constraint: OnConstraint( expression: BooleanLiteral.withTrue(token(TokenType.$true)), ), ), ], ), ]); }); }); }