mirror of https://github.com/AMT-Cheif/drift.git
100 lines
2.7 KiB
Dart
100 lines
2.7 KiB
Dart
import 'package:sqlparser/sqlparser.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import 'utils.dart';
|
|
|
|
final Map<String, AstNode> testCases = {
|
|
'UPDATE OR ROLLBACK tbl SET a = NULL, b = c WHERE d': UpdateStatement(
|
|
or: FailureMode.rollback,
|
|
table: TableReference('tbl'),
|
|
set: [
|
|
SetComponent(
|
|
column: Reference(columnName: 'a'),
|
|
expression: NullLiteral(
|
|
token(TokenType.$null),
|
|
),
|
|
),
|
|
SetComponent(
|
|
column: Reference(columnName: 'b'),
|
|
expression: Reference(columnName: 'c'),
|
|
)
|
|
],
|
|
where: Reference(columnName: 'd'),
|
|
),
|
|
};
|
|
|
|
void main() {
|
|
group('update statements', () {
|
|
testAll(testCases);
|
|
});
|
|
|
|
test('parses updates with FROM clause', () {
|
|
testStatement(
|
|
'''
|
|
UPDATE inventory
|
|
SET quantity = quantity - daily.amt
|
|
FROM (SELECT sum(quantity) AS amt,
|
|
itemId FROM sales GROUP BY 2) AS daily
|
|
WHERE inventory.itemId = daily.itemId;
|
|
''',
|
|
UpdateStatement(
|
|
table: TableReference('inventory'),
|
|
set: [
|
|
SetComponent(
|
|
column: Reference(columnName: 'quantity'),
|
|
expression: BinaryExpression(
|
|
Reference(columnName: 'quantity'),
|
|
token(TokenType.minus),
|
|
Reference(entityName: 'daily', columnName: 'amt'),
|
|
),
|
|
),
|
|
],
|
|
from: SelectStatementAsSource(
|
|
statement: SelectStatement(
|
|
columns: [
|
|
ExpressionResultColumn(
|
|
expression: FunctionExpression(
|
|
name: 'sum',
|
|
parameters: ExprFunctionParameters(
|
|
parameters: [Reference(columnName: 'quantity')],
|
|
),
|
|
),
|
|
as: 'amt',
|
|
),
|
|
ExpressionResultColumn(
|
|
expression: Reference(columnName: 'itemId'),
|
|
),
|
|
],
|
|
from: TableReference('sales'),
|
|
groupBy: GroupBy(
|
|
by: [NumericLiteral(2, token(TokenType.numberLiteral))],
|
|
),
|
|
),
|
|
as: 'daily',
|
|
),
|
|
where: BinaryExpression(
|
|
Reference(entityName: 'inventory', columnName: 'itemId'),
|
|
token(TokenType.equal),
|
|
Reference(entityName: 'daily', columnName: 'itemId'),
|
|
),
|
|
),
|
|
);
|
|
});
|
|
|
|
test('parses updates with RETURNING clause', () {
|
|
testStatement(
|
|
'UPDATE tbl SET foo = bar RETURNING *',
|
|
UpdateStatement(
|
|
table: TableReference('tbl'),
|
|
set: [
|
|
SetComponent(
|
|
column: Reference(columnName: 'foo'),
|
|
expression: Reference(columnName: 'bar'),
|
|
),
|
|
],
|
|
returning: Returning([StarResultColumn()]),
|
|
),
|
|
);
|
|
});
|
|
}
|