mirror of https://github.com/AMT-Cheif/drift.git
parent
1654193af4
commit
b0ca66bc06
|
@ -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) {
|
||||||
|
|
|
@ -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?
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue