Parse empty tuples

Closes #54
This commit is contained in:
Simon Binder 2019-07-02 22:30:54 +02:00
parent 1654193af4
commit b0ca66bc06
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
3 changed files with 53 additions and 58 deletions

View File

@ -128,7 +128,9 @@ class Parentheses extends Expression {
final Expression expression; final Expression expression;
final Token closingRight; final Token closingRight;
Parentheses(this.openingLeft, this.expression, this.closingRight); Parentheses(this.openingLeft, this.expression, this.closingRight) {
setSpan(openingLeft, closingRight);
}
@override @override
T accept<T>(AstVisitor<T> visitor) { T accept<T>(AstVisitor<T> visitor) {

View File

@ -687,6 +687,12 @@ class Parser {
_consume(TokenType.rightParen, 'Expected a closing bracket'); _consume(TokenType.rightParen, 'Expected a closing bracket');
return SubQuery(select: stmt); return SubQuery(select: stmt);
} else { } else {
// alright, it's either a tuple or just parenthesis. A tuple can be
// empty, so if the next statement is the closing bracket we're done
if (_matchOne(TokenType.rightParen)) {
return TupleExpression(expressions: [])..setSpan(left, _previous);
}
final expr = expression(); final expr = expression();
// Are we witnessing a tuple? // Are we witnessing a tuple?

View File

@ -1,22 +1,8 @@
import 'package:sqlparser/src/ast/ast.dart'; import 'package:sqlparser/src/ast/ast.dart';
import 'package:sqlparser/src/reader/parser/parser.dart';
import 'package:sqlparser/src/reader/tokenizer/scanner.dart';
import 'package:sqlparser/src/reader/tokenizer/token.dart';
import 'package:sqlparser/src/utils/ast_equality.dart';
import 'package:test/test.dart';
import '../utils.dart'; import '../utils.dart';
void main() { final Map<String, AstNode> testCases = {
test('parses select statements', () { 'SELECT table.*, *, 1 as name WHERE 1 ORDER BY name LIMIT 3 OFFSET 5':
final scanner = Scanner(
'SELECT table.*, *, 1 as name WHERE 1 ORDER BY name LIMIT 3 OFFSET 5');
final tokens = scanner.scanTokens();
final parser = Parser(tokens);
final stmt = parser.select();
enforceEqual(
stmt,
SelectStatement( SelectStatement(
columns: [ columns: [
StarResultColumn('table'), StarResultColumn('table'),
@ -36,19 +22,8 @@ void main() {
offset: NumericLiteral(5, token(TokenType.numberLiteral)), offset: NumericLiteral(5, token(TokenType.numberLiteral)),
), ),
), ),
); 'SELECT table.*, (SELECT * FROM table2) FROM table': SelectStatement(
}); columns: [
test('supports subqueries', () {
final scanner =
Scanner('SELECT table.*, (SELECT * FROM table2) FROM table');
final tokens = scanner.scanTokens();
final parser = Parser(tokens);
final stmt = parser.select();
enforceEqual(
stmt,
SelectStatement(columns: [
StarResultColumn('table'), StarResultColumn('table'),
ExpressionResultColumn( ExpressionResultColumn(
expression: SubQuery( expression: SubQuery(
@ -58,9 +33,21 @@ void main() {
), ),
), ),
), ),
], from: [ ],
from: [
TableReference('table', null), TableReference('table', null),
]), ],
); ),
}); 'SELECT * FROM table WHERE id IN ()': SelectStatement(
columns: [StarResultColumn(null)],
from: [TableReference('table', null)],
where: InExpression(
left: Reference(columnName: 'id'),
inside: TupleExpression(expressions: []),
),
),
};
void main() {
testAll(testCases);
} }