mirror of https://github.com/AMT-Cheif/drift.git
114 lines
2.7 KiB
Dart
114 lines
2.7 KiB
Dart
import 'package:sqlparser/sqlparser.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import 'utils.dart';
|
|
|
|
final _block = Block([
|
|
UpdateStatement(table: TableReference('tbl'), set: [
|
|
SetComponent(
|
|
column: Reference(columnName: 'foo'),
|
|
expression: Reference(columnName: 'bar'),
|
|
),
|
|
]),
|
|
SelectStatement(
|
|
columns: [StarResultColumn()],
|
|
from: TableReference('tbl'),
|
|
),
|
|
]);
|
|
|
|
void main() {
|
|
test('parses create trigger statements', () {
|
|
const sql = '''
|
|
CREATE TRIGGER IF NOT EXISTS my_trigger
|
|
AFTER DELETE ON tbl
|
|
FOR EACH ROW
|
|
BEGIN
|
|
UPDATE tbl SET foo = bar;
|
|
SELECT * FROM tbl;
|
|
END;
|
|
''';
|
|
|
|
testStatement(
|
|
sql,
|
|
CreateTriggerStatement(
|
|
ifNotExists: true,
|
|
triggerName: 'my_trigger',
|
|
mode: TriggerMode.after,
|
|
target: DeleteTarget(),
|
|
onTable: TableReference('tbl'),
|
|
action: _block,
|
|
),
|
|
);
|
|
});
|
|
|
|
test('with INSTEAD OF mode and UPDATE', () {
|
|
const sql = '''
|
|
CREATE TRIGGER my_trigger
|
|
INSTEAD OF UPDATE OF foo, bar ON tbl
|
|
BEGIN
|
|
UPDATE tbl SET foo = bar;
|
|
SELECT * FROM tbl;
|
|
END;
|
|
''';
|
|
|
|
testStatement(
|
|
sql,
|
|
CreateTriggerStatement(
|
|
triggerName: 'my_trigger',
|
|
mode: TriggerMode.insteadOf,
|
|
target: UpdateTarget([
|
|
Reference(columnName: 'foo'),
|
|
Reference(columnName: 'bar'),
|
|
]),
|
|
onTable: TableReference('tbl'),
|
|
action: _block,
|
|
),
|
|
);
|
|
});
|
|
|
|
test('with BEFORE, INSERT and WHEN clause', () {
|
|
const sql = '''
|
|
CREATE TRIGGER my_trigger
|
|
BEFORE INSERT ON tbl
|
|
WHEN new.foo IS NULL
|
|
BEGIN
|
|
UPDATE tbl SET foo = bar;
|
|
SELECT * FROM tbl;
|
|
END;
|
|
''';
|
|
|
|
testStatement(
|
|
sql,
|
|
CreateTriggerStatement(
|
|
triggerName: 'my_trigger',
|
|
mode: TriggerMode.before,
|
|
target: InsertTarget(),
|
|
onTable: TableReference('tbl'),
|
|
when: IsExpression(
|
|
false,
|
|
Reference(entityName: 'new', columnName: 'foo'),
|
|
NullLiteral(),
|
|
),
|
|
action: _block,
|
|
),
|
|
);
|
|
});
|
|
|
|
test('reports error for invalid statement in block', () {
|
|
expectParseError(
|
|
'''
|
|
CREATE TRIGGER "UserLogins_insert" AFTER INSERT ON "UserLogins" BEGIN
|
|
INSERT INTO
|
|
"SyncChanges"("table", "pk", "lastUpdateTime", "isDeleted")
|
|
VALUES ('UserLogins', '{"userId": "' || new."userId" || '", "deviceId": "' || new."deviceId" || '"}', strftime('%Y-%m-%dT%H:%M:%fZ', 'now'), 0);
|
|
ON CONFLICT("table", "pk") DO UPDATE SET
|
|
"lastUpdateTime" = excluded."lastUpdateTime",
|
|
"isDeleted" = excluded."isDeleted";
|
|
END;
|
|
''',
|
|
message: contains('Invalid statement'),
|
|
span: 'ON',
|
|
);
|
|
});
|
|
}
|