mirror of https://github.com/AMT-Cheif/drift.git
Rename `moor` to `drift` in `sqlparser`
This commit is contained in:
parent
ce31515c07
commit
93d328f056
|
@ -21,7 +21,7 @@ class CreateTableReader {
|
||||||
final Step step;
|
final Step step;
|
||||||
final List<ImportStatement> imports;
|
final List<ImportStatement> imports;
|
||||||
|
|
||||||
static const _schemaReader = SchemaFromCreateTable(moorExtensions: true);
|
static const _schemaReader = SchemaFromCreateTable(driftExtensions: true);
|
||||||
static final RegExp _enumRegex =
|
static final RegExp _enumRegex =
|
||||||
RegExp(r'^enum\((\w+)\)$', caseSensitive: false);
|
RegExp(r'^enum\((\w+)\)$', caseSensitive: false);
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ class CreateTableReader {
|
||||||
// those are moor-specific as well, don't write them
|
// those are moor-specific as well, don't write them
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (constraint is MoorDartName) {
|
if (constraint is DriftDartName) {
|
||||||
overriddenDartName = constraint.dartName;
|
overriddenDartName = constraint.dartName;
|
||||||
// ditto
|
// ditto
|
||||||
continue;
|
continue;
|
||||||
|
@ -167,7 +167,7 @@ class CreateTableReader {
|
||||||
String? dartTableName, dataClassName;
|
String? dartTableName, dataClassName;
|
||||||
ExistingRowClass? existingRowClass;
|
ExistingRowClass? existingRowClass;
|
||||||
|
|
||||||
final moorTableInfo = stmt.moorTableName;
|
final moorTableInfo = stmt.driftTableName;
|
||||||
if (moorTableInfo != null) {
|
if (moorTableInfo != null) {
|
||||||
final overriddenNames = moorTableInfo.overriddenDataClassName;
|
final overriddenNames = moorTableInfo.overriddenDataClassName;
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,8 @@ class MoorParser {
|
||||||
|
|
||||||
Future<ParsedMoorFile> parseAndAnalyze() async {
|
Future<ParsedMoorFile> parseAndAnalyze() async {
|
||||||
final engine = step.task.session.spawnEngine();
|
final engine = step.task.session.spawnEngine();
|
||||||
final result = engine.parseMoorFile(step.content);
|
final result = engine.parseDriftFile(step.content);
|
||||||
final parsedFile = result.rootNode as MoorFile;
|
final parsedFile = result.rootNode as DriftFile;
|
||||||
|
|
||||||
final createdReaders = <CreateTableReader>[];
|
final createdReaders = <CreateTableReader>[];
|
||||||
final queryDeclarations = <DeclaredMoorQuery>[];
|
final queryDeclarations = <DeclaredMoorQuery>[];
|
||||||
|
|
|
@ -33,14 +33,14 @@ class ParsedDartFile extends FileResult {
|
||||||
|
|
||||||
class ParsedMoorFile extends FileResult {
|
class ParsedMoorFile extends FileResult {
|
||||||
final ParseResult parseResult;
|
final ParseResult parseResult;
|
||||||
MoorFile get parsedFile => parseResult.rootNode as MoorFile;
|
DriftFile get parsedFile => parseResult.rootNode as DriftFile;
|
||||||
|
|
||||||
final List<ImportStatement> imports;
|
final List<ImportStatement> imports;
|
||||||
final List<DeclaredQuery> queries;
|
final List<DeclaredQuery> queries;
|
||||||
|
|
||||||
/// Schema component that are neither tables nor queries. This can include
|
/// Schema component that are neither tables nor queries. This can include
|
||||||
/// triggers or indexes.
|
/// triggers or indexes.
|
||||||
final List<PartOfMoorFile> otherComponents;
|
final List<PartOfDriftFile> otherComponents;
|
||||||
|
|
||||||
List<SqlQuery>? resolvedQueries;
|
List<SqlQuery>? resolvedQueries;
|
||||||
Map<ImportStatement, FoundFile>? resolvedImports;
|
Map<ImportStatement, FoundFile>? resolvedImports;
|
||||||
|
|
|
@ -39,7 +39,7 @@ class MoorSession {
|
||||||
/// Creates a properly configured [SqlEngine].
|
/// Creates a properly configured [SqlEngine].
|
||||||
SqlEngine spawnEngine() {
|
SqlEngine spawnEngine() {
|
||||||
final sqlOptions = EngineOptions(
|
final sqlOptions = EngineOptions(
|
||||||
useMoorExtensions: true,
|
useDriftExtensions: true,
|
||||||
enabledExtensions: [
|
enabledExtensions: [
|
||||||
if (options.hasModule(SqlModule.fts5)) const Fts5Extension(),
|
if (options.hasModule(SqlModule.fts5)) const Fts5Extension(),
|
||||||
if (options.hasModule(SqlModule.json1)) const Json1Extension(),
|
if (options.hasModule(SqlModule.json1)) const Json1Extension(),
|
||||||
|
|
|
@ -78,7 +78,7 @@ class _LintingVisitor extends RecursiveVisitor<void, void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||||
if (e is DartPlaceholder) {
|
if (e is DartPlaceholder) {
|
||||||
return visitDartPlaceholder(e, arg);
|
return visitDartPlaceholder(e, arg);
|
||||||
} else if (e is NestedStarResultColumn) {
|
} else if (e is NestedStarResultColumn) {
|
||||||
|
|
|
@ -58,7 +58,7 @@ class NestedQueryAnalyzer extends RecursiveVisitor<_AnalyzerState, void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, _AnalyzerState arg) {
|
void visitDriftSpecificNode(DriftSpecificNode e, _AnalyzerState arg) {
|
||||||
if (e is NestedQueryColumn) {
|
if (e is NestedQueryColumn) {
|
||||||
final expectedParent = arg.container.select;
|
final expectedParent = arg.container.select;
|
||||||
if (e.parent != expectedParent || !expectedParent.columns.contains(e)) {
|
if (e.parent != expectedParent || !expectedParent.columns.contains(e)) {
|
||||||
|
@ -75,12 +75,12 @@ class NestedQueryAnalyzer extends RecursiveVisitor<_AnalyzerState, void> {
|
||||||
arg.container.nestedQueries[e] = nested;
|
arg.container.nestedQueries[e] = nested;
|
||||||
|
|
||||||
final childState = _AnalyzerState(nested);
|
final childState = _AnalyzerState(nested);
|
||||||
super.visitMoorSpecificNode(e, childState);
|
super.visitDriftSpecificNode(e, childState);
|
||||||
childState._process();
|
childState._process();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
super.visitMoorSpecificNode(e, arg);
|
super.visitDriftSpecificNode(e, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -154,8 +154,8 @@ class _NestedQueryTransformer extends Transformer<NestedQueriesContainer> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
AstNode? visitMoorSpecificNode(
|
AstNode? visitDriftSpecificNode(
|
||||||
MoorSpecificNode e, NestedQueriesContainer arg) {
|
DriftSpecificNode e, NestedQueriesContainer arg) {
|
||||||
if (e is NestedQueryColumn) {
|
if (e is NestedQueryColumn) {
|
||||||
final child = arg.nestedQueries[e];
|
final child = arg.nestedQueries[e];
|
||||||
if (child != null) {
|
if (child != null) {
|
||||||
|
@ -165,7 +165,7 @@ class _NestedQueryTransformer extends Transformer<NestedQueriesContainer> {
|
||||||
// Remove nested query colums from the parent query
|
// Remove nested query colums from the parent query
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return super.visitMoorSpecificNode(e, arg);
|
return super.visitDriftSpecificNode(e, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
|
@ -383,7 +383,8 @@ class _FindElements extends RecursiveVisitor<NestedQueriesContainer?, void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, NestedQueriesContainer? arg) {
|
void visitDriftSpecificNode(
|
||||||
|
DriftSpecificNode e, NestedQueriesContainer? arg) {
|
||||||
if (e is NestedQueryColumn) {
|
if (e is NestedQueryColumn) {
|
||||||
// If the node ist a nested query, return to avoid collecting elements
|
// If the node ist a nested query, return to avoid collecting elements
|
||||||
// inside of it
|
// inside of it
|
||||||
|
@ -394,7 +395,7 @@ class _FindElements extends RecursiveVisitor<NestedQueriesContainer?, void> {
|
||||||
dartPlaceholders.add(e);
|
dartPlaceholders.add(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
super.visitMoorSpecificNode(e, arg);
|
super.visitDriftSpecificNode(e, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
|
@ -28,7 +28,7 @@ class ViewAnalyzer extends BaseAnalyzer {
|
||||||
final declaration = viewDeclaration.creatingStatement;
|
final declaration = viewDeclaration.creatingStatement;
|
||||||
|
|
||||||
final parserView = view.parserView =
|
final parserView = view.parserView =
|
||||||
const SchemaFromCreateTable(moorExtensions: true)
|
const SchemaFromCreateTable(driftExtensions: true)
|
||||||
.readView(ctx, declaration);
|
.readView(ctx, declaration);
|
||||||
|
|
||||||
final columns = <MoorColumn>[];
|
final columns = <MoorColumn>[];
|
||||||
|
@ -51,7 +51,7 @@ class ViewAnalyzer extends BaseAnalyzer {
|
||||||
|
|
||||||
view.columns = columns;
|
view.columns = columns;
|
||||||
|
|
||||||
final desiredNames = declaration.moorTableName;
|
final desiredNames = declaration.driftTableName;
|
||||||
if (desiredNames != null) {
|
if (desiredNames != null) {
|
||||||
final dataClassName = desiredNames.overriddenDataClassName;
|
final dataClassName = desiredNames.overriddenDataClassName;
|
||||||
if (desiredNames.useExistingDartClass) {
|
if (desiredNames.useExistingDartClass) {
|
||||||
|
|
|
@ -40,13 +40,13 @@ class PreprocessBuilder extends Builder {
|
||||||
FutureOr<void> build(BuildStep buildStep) async {
|
FutureOr<void> build(BuildStep buildStep) async {
|
||||||
final input = buildStep.inputId;
|
final input = buildStep.inputId;
|
||||||
final moorFileContent = await buildStep.readAsString(input);
|
final moorFileContent = await buildStep.readAsString(input);
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||||
|
|
||||||
ParseResult parsedInput;
|
ParseResult parsedInput;
|
||||||
try {
|
try {
|
||||||
parsedInput = engine.parseMoorFile(moorFileContent);
|
parsedInput = engine.parseDriftFile(moorFileContent);
|
||||||
} on Exception {
|
} on Exception {
|
||||||
// Moor file couldn't be parsed, ignore... If it's imported, the main
|
// Drift file couldn't be parsed, ignore... If it's imported, the main
|
||||||
// builder will provide a better error message.
|
// builder will provide a better error message.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ class PreprocessBuilder extends Builder {
|
||||||
if (asset.extension == '.moor' || asset.extension == '.drift') {
|
if (asset.extension == '.moor' || asset.extension == '.drift') {
|
||||||
final parsed = asset == input
|
final parsed = asset == input
|
||||||
? parsedInput
|
? parsedInput
|
||||||
: engine.parseMoorFile(await buildStep.readAsString(asset));
|
: engine.parseDriftFile(await buildStep.readAsString(asset));
|
||||||
|
|
||||||
parsed.rootNode.allDescendants
|
parsed.rootNode.allDescendants
|
||||||
.whereType<ImportStatement>()
|
.whereType<ImportStatement>()
|
||||||
|
|
|
@ -25,15 +25,15 @@ class _FoldingVisitor extends RecursiveVisitor<void, void> {
|
||||||
_FoldingVisitor(this.collector);
|
_FoldingVisitor(this.collector);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||||
if (e is MoorFile) {
|
if (e is DriftFile) {
|
||||||
visitMoorFile(e, arg);
|
visitMoorFile(e, arg);
|
||||||
} else {
|
} else {
|
||||||
visitChildren(e, arg);
|
visitChildren(e, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void visitMoorFile(MoorFile e, void arg) {
|
void visitMoorFile(DriftFile e, void arg) {
|
||||||
// construct a folding region for import statements
|
// construct a folding region for import statements
|
||||||
final imports = e.imports.toList();
|
final imports = e.imports.toList();
|
||||||
if (imports.length > 1) {
|
if (imports.length > 1) {
|
||||||
|
|
|
@ -42,7 +42,7 @@ class _NavigationVisitor extends RecursiveVisitor<void, void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||||
if (e is ImportStatement) {
|
if (e is ImportStatement) {
|
||||||
return visitMoorImportStatement(e, arg);
|
return visitMoorImportStatement(e, arg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,15 +77,15 @@ class _OutlineVisitor extends RecursiveVisitor<void, void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||||
if (e is MoorFile) {
|
if (e is DriftFile) {
|
||||||
visitMoorFile(e, arg);
|
visitMoorFile(e, arg);
|
||||||
} else if (e is DeclaredStatement) {
|
} else if (e is DeclaredStatement) {
|
||||||
visitMoorDeclaredStatement(e, arg);
|
visitMoorDeclaredStatement(e, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void visitMoorFile(MoorFile e, void arg) {
|
void visitMoorFile(DriftFile e, void arg) {
|
||||||
_startElement(ElementKind.LIBRARY, request.file.shortName, e);
|
_startElement(ElementKind.LIBRARY, request.file.shortName, e);
|
||||||
visitChildren(e, arg);
|
visitChildren(e, arg);
|
||||||
collector.endElement();
|
collector.endElement();
|
||||||
|
|
|
@ -100,11 +100,11 @@ class MigrateCommand extends MoorCommand {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> _transformMoorFile(File file) async {
|
Future<String> _transformMoorFile(File file) async {
|
||||||
final engine = SqlEngine(
|
final engine = SqlEngine(EngineOptions(
|
||||||
EngineOptions(useMoorExtensions: true, version: SqliteVersion.current));
|
useDriftExtensions: true, version: SqliteVersion.current));
|
||||||
final originalContent = await file.readAsString();
|
final originalContent = await file.readAsString();
|
||||||
var output = originalContent;
|
var output = originalContent;
|
||||||
final result = engine.parseMoorFile(originalContent);
|
final result = engine.parseDriftFile(originalContent);
|
||||||
|
|
||||||
if (result.errors.isNotEmpty) {
|
if (result.errors.isNotEmpty) {
|
||||||
cli.logger.warning('Could not parse ${file.path}, skipping...');
|
cli.logger.warning('Could not parse ${file.path}, skipping...');
|
||||||
|
@ -112,7 +112,7 @@ class MigrateCommand extends MoorCommand {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change imports to point from .moor to .drift files
|
// Change imports to point from .moor to .drift files
|
||||||
final root = result.rootNode as MoorFile;
|
final root = result.rootNode as DriftFile;
|
||||||
for (final import in root.imports) {
|
for (final import in root.imports) {
|
||||||
final importedFile = import.importedFile;
|
final importedFile = import.importedFile;
|
||||||
if (p.url.extension(importedFile) == '.moor') {
|
if (p.url.extension(importedFile) == '.moor') {
|
||||||
|
|
|
@ -147,7 +147,7 @@ class _HighlightingVisitor extends RecursiveVisitor<void, void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||||
if (e is DeclaredStatement) {
|
if (e is DeclaredStatement) {
|
||||||
final identifier = e.identifier;
|
final identifier = e.identifier;
|
||||||
if (identifier is SimpleName && identifier.identifier != null) {
|
if (identifier is SimpleName && identifier.identifier != null) {
|
||||||
|
|
|
@ -118,11 +118,11 @@ class SqlWriter extends NodeSqlBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||||
if (e is NestedStarResultColumn) {
|
if (e is NestedStarResultColumn) {
|
||||||
final result = _starColumnToResolved[e];
|
final result = _starColumnToResolved[e];
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
return super.visitMoorSpecificNode(e, arg);
|
return super.visitDriftSpecificNode(e, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
final select = query as SqlSelectQuery;
|
final select = query as SqlSelectQuery;
|
||||||
|
@ -155,7 +155,7 @@ class SqlWriter extends NodeSqlBuilder {
|
||||||
'variables (or just removed if no variables are required)',
|
'variables (or just removed if no variables are required)',
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return super.visitMoorSpecificNode(e, arg);
|
return super.visitDriftSpecificNode(e, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import 'package:sqlparser/utils/node_to_text.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||||
final result = engine.parse('CREATE TABLE a (id INTEGER);');
|
final result = engine.parse('CREATE TABLE a (id INTEGER);');
|
||||||
engine.registerTable(const SchemaFromCreateTable()
|
engine.registerTable(const SchemaFromCreateTable()
|
||||||
.read(result.rootNode as CreateTableStatement));
|
.read(result.rootNode as CreateTableStatement));
|
||||||
|
|
|
@ -10,7 +10,7 @@ import '../utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
final engine = SqlEngine(EngineOptions(
|
final engine = SqlEngine(EngineOptions(
|
||||||
useMoorExtensions: true, enabledExtensions: const [Json1Extension()]));
|
useDriftExtensions: true, enabledExtensions: const [Json1Extension()]));
|
||||||
final mapper = TypeMapper();
|
final mapper = TypeMapper();
|
||||||
|
|
||||||
final fakeQuery = DeclaredDartQuery('query', 'sql');
|
final fakeQuery = DeclaredDartQuery('query', 'sql');
|
||||||
|
|
|
@ -28,7 +28,7 @@ CREATE TABLE bar (
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
final mapper = TypeMapper();
|
final mapper = TypeMapper();
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||||
final step = ParseMoorStep(Task(null, null, null),
|
final step = ParseMoorStep(Task(null, null, null),
|
||||||
FoundFile(Uri.parse('file://foo'), FileType.moor), '');
|
FoundFile(Uri.parse('file://foo'), FileType.moor), '');
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ final Table table =
|
||||||
Table(name: 'todos', resolvedColumns: [_idColumn, _titleColumn]);
|
Table(name: 'todos', resolvedColumns: [_idColumn, _titleColumn]);
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||||
final mapper = TypeMapper();
|
final mapper = TypeMapper();
|
||||||
|
|
||||||
test('extracts variables and sorts them by index', () {
|
test('extracts variables and sorts them by index', () {
|
||||||
|
|
|
@ -5,7 +5,7 @@ import 'package:intl/intl.dart';
|
||||||
|
|
||||||
import 'src/moor/key_value_insert.dart';
|
import 'src/moor/key_value_insert.dart';
|
||||||
import 'src/sqlite/bind_string.dart';
|
import 'src/sqlite/bind_string.dart';
|
||||||
import 'src/sqlparser/parse_moor_file.dart';
|
import 'src/sqlparser/parse_drift_file.dart';
|
||||||
import 'src/sqlparser/tokenizer.dart';
|
import 'src/sqlparser/tokenizer.dart';
|
||||||
|
|
||||||
export 'package:benchmark_harness/benchmark_harness.dart' show ScoreEmitter;
|
export 'package:benchmark_harness/benchmark_harness.dart' show ScoreEmitter;
|
||||||
|
@ -20,7 +20,7 @@ List<Reportable> allBenchmarks(ScoreEmitter emitter) {
|
||||||
KeyValueInsertBatch(emitter),
|
KeyValueInsertBatch(emitter),
|
||||||
KeyValueInsertSerial(emitter),
|
KeyValueInsertSerial(emitter),
|
||||||
// sql parser
|
// sql parser
|
||||||
ParseMoorFile(emitter),
|
ParseDriftFile(emitter),
|
||||||
TokenizerBenchmark(emitter),
|
TokenizerBenchmark(emitter),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,20 +30,21 @@ manyColumns:
|
||||||
SELECT a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z FROM test;
|
SELECT a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z FROM test;
|
||||||
''';
|
''';
|
||||||
|
|
||||||
class ParseMoorFile extends BenchmarkBase {
|
class ParseDriftFile extends BenchmarkBase {
|
||||||
ParseMoorFile(ScoreEmitter emitter) : super('Moor file: Parse only', emitter);
|
ParseDriftFile(ScoreEmitter emitter)
|
||||||
|
: super('Moor file: Parse only', emitter);
|
||||||
|
|
||||||
final _engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
final _engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void exercise() {
|
void exercise() {
|
||||||
for (var i = 0; i < 10; i++) {
|
for (var i = 0; i < 10; i++) {
|
||||||
assert(_engine.parseMoorFile(file).errors.isEmpty);
|
assert(_engine.parseDriftFile(file).errors.isEmpty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void run() {
|
void run() {
|
||||||
_engine.parseMoorFile(file);
|
_engine.parseDriftFile(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
## 0.21.0
|
## 0.21.0
|
||||||
|
|
||||||
- Analysis support for new features in sqlite version 3.38.
|
- Analysis support for new features in sqlite version 3.38.
|
||||||
|
- Replace internal `moor` references with `drift` references.
|
||||||
|
|
||||||
## 0.20.1
|
## 0.20.1
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ resolvedColumns.map((c) => context.typeOf(c).type.type); // int, text, int, text
|
||||||
```
|
```
|
||||||
|
|
||||||
## But why?
|
## But why?
|
||||||
[Moor](https://pub.dev/packages/moor), a persistence library for Dart apps, uses this
|
[Drift](https://pub.dev/packages/drift), a persistence library for Dart apps, uses this
|
||||||
package to generate type-safe methods from sql.
|
package to generate type-safe methods from sql.
|
||||||
|
|
||||||
## Thanks
|
## Thanks
|
||||||
|
|
|
@ -12,4 +12,5 @@ export 'src/engine/options.dart';
|
||||||
export 'src/engine/sql_engine.dart';
|
export 'src/engine/sql_engine.dart';
|
||||||
export 'src/reader/parser.dart' show ParsingError;
|
export 'src/reader/parser.dart' show ParsingError;
|
||||||
export 'src/reader/syntactic_entity.dart';
|
export 'src/reader/syntactic_entity.dart';
|
||||||
export 'src/reader/tokenizer/token.dart' hide keywords, moorKeywords, isKeyword;
|
export 'src/reader/tokenizer/token.dart'
|
||||||
|
hide keywords, driftKeywords, isKeyword;
|
||||||
|
|
|
@ -6,7 +6,7 @@ class AnalyzeStatementOptions {
|
||||||
final Map<int, ResolvedType> indexedVariableTypes;
|
final Map<int, ResolvedType> indexedVariableTypes;
|
||||||
final Map<String, ResolvedType> namedVariableTypes;
|
final Map<String, ResolvedType> namedVariableTypes;
|
||||||
|
|
||||||
/// Moor specific. Maps from a Dart placeholder in a query to its default
|
/// Drift specific. Maps from a Dart placeholder in a query to its default
|
||||||
/// expression, if set.
|
/// expression, if set.
|
||||||
final Map<String, Expression> defaultValuesForPlaceholder;
|
final Map<String, Expression> defaultValuesForPlaceholder;
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,9 @@ part of '../analysis.dart';
|
||||||
class SchemaFromCreateTable {
|
class SchemaFromCreateTable {
|
||||||
/// Whether we should provide additional type hints for nonstandard `BOOL`
|
/// Whether we should provide additional type hints for nonstandard `BOOL`
|
||||||
/// and `DATETIME` columns.
|
/// and `DATETIME` columns.
|
||||||
final bool moorExtensions;
|
final bool driftExtensions;
|
||||||
|
|
||||||
const SchemaFromCreateTable({this.moorExtensions = false});
|
const SchemaFromCreateTable({this.driftExtensions = false});
|
||||||
|
|
||||||
/// Reads a [Table] schema from the [stmt] inducing a table (either a
|
/// Reads a [Table] schema from the [stmt] inducing a table (either a
|
||||||
/// [CreateTableStatement] or a [CreateVirtualTableStatement]).
|
/// [CreateTableStatement] or a [CreateVirtualTableStatement]).
|
||||||
|
@ -126,7 +126,7 @@ class SchemaFromCreateTable {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Resolves a column type via its typename, see the linked rules below.
|
/// Resolves a column type via its typename, see the linked rules below.
|
||||||
/// Additionally, if [moorExtensions] are enabled, we support [IsBoolean] and
|
/// Additionally, if [driftExtensions] are enabled, we support [IsBoolean] and
|
||||||
/// [IsDateTime] hints if the type name contains `BOOL` or `DATE`,
|
/// [IsDateTime] hints if the type name contains `BOOL` or `DATE`,
|
||||||
/// respectively.
|
/// respectively.
|
||||||
/// https://www.sqlite.org/datatype3.html#determination_of_column_affinity
|
/// https://www.sqlite.org/datatype3.html#determination_of_column_affinity
|
||||||
|
@ -149,7 +149,7 @@ class SchemaFromCreateTable {
|
||||||
return const ResolvedType(type: BasicType.blob);
|
return const ResolvedType(type: BasicType.blob);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (moorExtensions) {
|
if (driftExtensions) {
|
||||||
if (upper.contains('BOOL')) {
|
if (upper.contains('BOOL')) {
|
||||||
return const ResolvedType.bool();
|
return const ResolvedType.bool();
|
||||||
}
|
}
|
||||||
|
@ -166,7 +166,7 @@ class SchemaFromCreateTable {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValidTypeNameForStrictTable(String typeName) {
|
bool isValidTypeNameForStrictTable(String typeName) {
|
||||||
if (moorExtensions) {
|
if (driftExtensions) {
|
||||||
// Drift_dev will use resolveColumnType to analyze the actual type of the
|
// Drift_dev will use resolveColumnType to analyze the actual type of the
|
||||||
// column, and the generated code will always use a valid type name for
|
// column, and the generated code will always use a valid type name for
|
||||||
// that type. So, anything goes!
|
// that type. So, anything goes!
|
||||||
|
|
|
@ -43,7 +43,7 @@ class LintingVisitor extends RecursiveVisitor<void, void> {
|
||||||
@override
|
@override
|
||||||
void visitCreateTableStatement(CreateTableStatement e, void arg) {
|
void visitCreateTableStatement(CreateTableStatement e, void arg) {
|
||||||
final schemaReader =
|
final schemaReader =
|
||||||
SchemaFromCreateTable(moorExtensions: options.useMoorExtensions);
|
SchemaFromCreateTable(driftExtensions: options.useDriftExtensions);
|
||||||
var hasNonGeneratedColumn = false;
|
var hasNonGeneratedColumn = false;
|
||||||
var hasPrimaryKeyDeclaration = false;
|
var hasPrimaryKeyDeclaration = false;
|
||||||
var isStrict = false;
|
var isStrict = false;
|
||||||
|
|
|
@ -252,7 +252,7 @@ class AstPreparingVisitor extends RecursiveVisitor<void, void> {
|
||||||
|
|
||||||
/// If a nested query was found. Collect everything separately.
|
/// If a nested query was found. Collect everything separately.
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||||
if (e is NestedQueryColumn) {
|
if (e is NestedQueryColumn) {
|
||||||
// create a new scope for the nested query to differentiate between
|
// create a new scope for the nested query to differentiate between
|
||||||
// references that can be resolved in the nested query and references
|
// references that can be resolved in the nested query and references
|
||||||
|
@ -260,7 +260,7 @@ class AstPreparingVisitor extends RecursiveVisitor<void, void> {
|
||||||
e.select.scope = e.scope.createChild();
|
e.select.scope = e.scope.createChild();
|
||||||
AstPreparingVisitor(context: context).start(e.select);
|
AstPreparingVisitor(context: context).start(e.select);
|
||||||
} else {
|
} else {
|
||||||
super.visitMoorSpecificNode(e, arg);
|
super.visitDriftSpecificNode(e, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,11 +174,11 @@ class TypeResolver extends RecursiveVisitor<TypeExpectation, void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, TypeExpectation arg) {
|
void visitDriftSpecificNode(DriftSpecificNode e, TypeExpectation arg) {
|
||||||
if (e is DartExpressionPlaceholder) {
|
if (e is DartExpressionPlaceholder) {
|
||||||
_inferAsVariable(e, arg);
|
_inferAsVariable(e, arg);
|
||||||
} else {
|
} else {
|
||||||
super.visitMoorSpecificNode(e, arg);
|
super.visitDriftSpecificNode(e, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,8 @@ import 'package:meta/meta.dart';
|
||||||
import 'package:sqlparser/src/analysis/analysis.dart';
|
import 'package:sqlparser/src/analysis/analysis.dart';
|
||||||
import 'package:sqlparser/src/reader/tokenizer/token.dart';
|
import 'package:sqlparser/src/reader/tokenizer/token.dart';
|
||||||
|
|
||||||
// todo: Remove these imports after splitting up this library
|
import 'drift/inline_dart.dart';
|
||||||
import 'expressions/expressions.dart';
|
import 'expressions/expressions.dart';
|
||||||
import 'moor/inline_dart.dart';
|
|
||||||
import 'node.dart';
|
import 'node.dart';
|
||||||
import 'statements/create_index.dart';
|
import 'statements/create_index.dart';
|
||||||
import 'statements/select.dart';
|
import 'statements/select.dart';
|
||||||
|
@ -12,14 +11,14 @@ import 'visitor.dart';
|
||||||
|
|
||||||
export 'clauses/returning.dart';
|
export 'clauses/returning.dart';
|
||||||
export 'clauses/upsert.dart';
|
export 'clauses/upsert.dart';
|
||||||
|
export 'drift/declared_statement.dart';
|
||||||
|
export 'drift/drift_file.dart';
|
||||||
|
export 'drift/import_statement.dart';
|
||||||
|
export 'drift/inline_dart.dart';
|
||||||
|
export 'drift/nested_query_column.dart';
|
||||||
|
export 'drift/nested_star_result_column.dart';
|
||||||
export 'expressions/expressions.dart';
|
export 'expressions/expressions.dart';
|
||||||
export 'expressions/raise.dart';
|
export 'expressions/raise.dart';
|
||||||
export 'moor/declared_statement.dart';
|
|
||||||
export 'moor/import_statement.dart';
|
|
||||||
export 'moor/inline_dart.dart';
|
|
||||||
export 'moor/moor_file.dart';
|
|
||||||
export 'moor/nested_query_column.dart';
|
|
||||||
export 'moor/nested_star_result_column.dart';
|
|
||||||
export 'node.dart';
|
export 'node.dart';
|
||||||
export 'statements/block.dart';
|
export 'statements/block.dart';
|
||||||
export 'statements/create_index.dart';
|
export 'statements/create_index.dart';
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
part of '../ast.dart';
|
part of '../ast.dart';
|
||||||
|
|
||||||
/// Base for limit statements. Without moor extensions, only [Limit] will be
|
/// Base for `LIMIT` clauses. Without drift extensions, only [Limit] will be
|
||||||
/// parsed. With moor extensions, a [DartLimitPlaceholder] can be emitted as
|
/// parsed. With drift extensions, a [DartLimitPlaceholder] can be emitted as
|
||||||
/// well.
|
/// well.
|
||||||
abstract class LimitBase implements AstNode {}
|
abstract class LimitBase implements AstNode {}
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
part of '../ast.dart';
|
part of '../ast.dart';
|
||||||
|
|
||||||
/// Base for `ORDER BY` clauses. Without moor extensions, ony [OrderBy] will be
|
/// Base for `ORDER BY` clauses. Without drift extensions, ony [OrderBy] will be
|
||||||
/// parsed. Otherwise, [DartOrderByPlaceholder] can be parsed as well.
|
/// parsed. Otherwise, [DartOrderByPlaceholder] can be parsed as well.
|
||||||
abstract class OrderByBase extends AstNode {}
|
abstract class OrderByBase extends AstNode {}
|
||||||
|
|
||||||
/// Base for a single ordering term that is a part of a [OrderBy]. Without moor
|
/// Base for a single ordering term that is a part of a [OrderBy]. Without drift
|
||||||
/// extensions, only [OrderingTerm] will be parsed. With moor extensions, a
|
/// extensions, only [OrderingTerm] will be parsed. With drift extensions, a
|
||||||
/// [DartOrderingTermPlaceholder] can be parsed as well.
|
/// [DartOrderingTermPlaceholder] can be parsed as well.
|
||||||
abstract class OrderingTermBase extends AstNode {}
|
abstract class OrderingTermBase extends AstNode {}
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,11 @@ import '../node.dart';
|
||||||
import '../statements/statement.dart';
|
import '../statements/statement.dart';
|
||||||
import '../statements/transaction.dart';
|
import '../statements/transaction.dart';
|
||||||
import '../visitor.dart';
|
import '../visitor.dart';
|
||||||
import 'moor_file.dart';
|
import 'drift_file.dart';
|
||||||
|
|
||||||
/// A declared statement inside a `.moor` file. It consists of an identifier,
|
/// A declared statement inside a `.moor` file. It consists of an identifier,
|
||||||
/// followed by a colon and the query to run.
|
/// followed by a colon and the query to run.
|
||||||
class DeclaredStatement extends Statement implements PartOfMoorFile {
|
class DeclaredStatement extends Statement implements PartOfDriftFile {
|
||||||
final DeclaredStatementIdentifier identifier;
|
final DeclaredStatementIdentifier identifier;
|
||||||
AstNode statement;
|
AstNode statement;
|
||||||
List<StatementParameter> parameters;
|
List<StatementParameter> parameters;
|
||||||
|
@ -29,7 +29,7 @@ class DeclaredStatement extends Statement implements PartOfMoorFile {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||||
return visitor.visitMoorSpecificNode(this, arg);
|
return visitor.visitDriftSpecificNode(this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -96,10 +96,10 @@ class SpecialStatementIdentifier extends DeclaredStatementIdentifier {
|
||||||
/// identifier.
|
/// identifier.
|
||||||
/// In `selectString(:name AS TEXT): SELECT :name`, `:name AS TEXT` is a
|
/// In `selectString(:name AS TEXT): SELECT :name`, `:name AS TEXT` is a
|
||||||
/// statement parameter.
|
/// statement parameter.
|
||||||
abstract class StatementParameter extends AstNode implements MoorSpecificNode {
|
abstract class StatementParameter extends AstNode implements DriftSpecificNode {
|
||||||
@override
|
@override
|
||||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||||
return visitor.visitMoorSpecificNode(this, arg);
|
return visitor.visitDriftSpecificNode(this, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ class DartPlaceholderDefaultValue extends StatementParameter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class TransactionBlock extends AstNode implements MoorSpecificNode {
|
class TransactionBlock extends AstNode implements DriftSpecificNode {
|
||||||
BeginTransactionStatement begin;
|
BeginTransactionStatement begin;
|
||||||
List<CrudStatement> innerStatements;
|
List<CrudStatement> innerStatements;
|
||||||
CommitStatement commit;
|
CommitStatement commit;
|
||||||
|
@ -167,7 +167,7 @@ class TransactionBlock extends AstNode implements MoorSpecificNode {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||||
return visitor.visitMoorSpecificNode(this, arg);
|
return visitor.visitDriftSpecificNode(this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
|
@ -5,23 +5,23 @@ import 'declared_statement.dart';
|
||||||
import 'import_statement.dart';
|
import 'import_statement.dart';
|
||||||
|
|
||||||
/// Marker interface for AST nodes that are moor-specific.
|
/// Marker interface for AST nodes that are moor-specific.
|
||||||
abstract class MoorSpecificNode implements AstNode {}
|
abstract class DriftSpecificNode implements AstNode {}
|
||||||
|
|
||||||
/// Something that can appear as a top-level declaration inside a `.moor` file.
|
/// Something that can appear as a top-level declaration inside a `.moor` file.
|
||||||
abstract class PartOfMoorFile implements Statement, MoorSpecificNode {}
|
abstract class PartOfDriftFile implements Statement, DriftSpecificNode {}
|
||||||
|
|
||||||
/// A moor file.
|
/// A parsed `.drift` file.
|
||||||
///
|
///
|
||||||
/// A moor file consists of [ImportStatement], followed by ddl statements,
|
/// A drift file consists of [ImportStatement]s, followed by ddl statements,
|
||||||
/// followed by [DeclaredStatement]s.
|
/// followed by [DeclaredStatement]s.
|
||||||
class MoorFile extends AstNode implements MoorSpecificNode {
|
class DriftFile extends AstNode implements DriftSpecificNode {
|
||||||
List<PartOfMoorFile> statements;
|
List<PartOfDriftFile> statements;
|
||||||
|
|
||||||
MoorFile(this.statements);
|
DriftFile(this.statements);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||||
return visitor.visitMoorSpecificNode(this, arg);
|
return visitor.visitDriftSpecificNode(this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -37,15 +37,15 @@ class MoorFile extends AstNode implements MoorSpecificNode {
|
||||||
childNodes.whereType<ImportStatement>();
|
childNodes.whereType<ImportStatement>();
|
||||||
}
|
}
|
||||||
|
|
||||||
class MoorTableName extends AstNode implements MoorSpecificNode {
|
class DriftTableName extends AstNode implements DriftSpecificNode {
|
||||||
final String overriddenDataClassName;
|
final String overriddenDataClassName;
|
||||||
final bool useExistingDartClass;
|
final bool useExistingDartClass;
|
||||||
|
|
||||||
MoorTableName(this.overriddenDataClassName, this.useExistingDartClass);
|
DriftTableName(this.overriddenDataClassName, this.useExistingDartClass);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||||
return visitor.visitMoorSpecificNode(this, arg);
|
return visitor.visitDriftSpecificNode(this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
|
@ -2,10 +2,10 @@ import '../../reader/tokenizer/token.dart';
|
||||||
import '../node.dart';
|
import '../node.dart';
|
||||||
import '../statements/statement.dart';
|
import '../statements/statement.dart';
|
||||||
import '../visitor.dart';
|
import '../visitor.dart';
|
||||||
import 'moor_file.dart';
|
import 'drift_file.dart';
|
||||||
|
|
||||||
/// An `import "file.dart";` statement that can appear inside a moor file.
|
/// An `import "file.dart";` statement that can appear inside a moor file.
|
||||||
class ImportStatement extends Statement implements PartOfMoorFile {
|
class ImportStatement extends Statement implements PartOfDriftFile {
|
||||||
Token? importToken;
|
Token? importToken;
|
||||||
StringLiteralToken? importString;
|
StringLiteralToken? importString;
|
||||||
final String importedFile;
|
final String importedFile;
|
||||||
|
@ -14,7 +14,7 @@ class ImportStatement extends Statement implements PartOfMoorFile {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||||
return visitor.visitMoorSpecificNode(this, arg);
|
return visitor.visitDriftSpecificNode(this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
|
@ -14,7 +14,7 @@ import '../ast.dart';
|
||||||
/// moor.
|
/// moor.
|
||||||
/// 4. A list of order-by clauses, which will be exposed as a `OrderBy` from
|
/// 4. A list of order-by clauses, which will be exposed as a `OrderBy` from
|
||||||
/// moor.
|
/// moor.
|
||||||
abstract class DartPlaceholder extends AstNode implements MoorSpecificNode {
|
abstract class DartPlaceholder extends AstNode implements DriftSpecificNode {
|
||||||
final String name;
|
final String name;
|
||||||
|
|
||||||
DollarSignVariableToken? token;
|
DollarSignVariableToken? token;
|
||||||
|
@ -29,7 +29,7 @@ abstract class DartPlaceholder extends AstNode implements MoorSpecificNode {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||||
return visitor.visitMoorSpecificNode(this, arg);
|
return visitor.visitDriftSpecificNode(this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
T? when<T>({
|
T? when<T>({
|
|
@ -1,7 +1,7 @@
|
||||||
import '../ast.dart' show ResultColumn, Renamable, SelectStatement;
|
import '../ast.dart' show ResultColumn, Renamable, SelectStatement;
|
||||||
import '../node.dart';
|
import '../node.dart';
|
||||||
import '../visitor.dart';
|
import '../visitor.dart';
|
||||||
import 'moor_file.dart';
|
import 'drift_file.dart';
|
||||||
|
|
||||||
/// To wrap the query name into its own type, to avoid conflicts when using
|
/// To wrap the query name into its own type, to avoid conflicts when using
|
||||||
/// the [AstNode] metadata.
|
/// the [AstNode] metadata.
|
||||||
|
@ -18,7 +18,7 @@ class _NestedColumnNameMetadata {
|
||||||
/// top level select query, because the result of them can only be computed
|
/// top level select query, because the result of them can only be computed
|
||||||
/// in dart.
|
/// in dart.
|
||||||
class NestedQueryColumn extends ResultColumn
|
class NestedQueryColumn extends ResultColumn
|
||||||
implements MoorSpecificNode, Renamable {
|
implements DriftSpecificNode, Renamable {
|
||||||
@override
|
@override
|
||||||
final String? as;
|
final String? as;
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ class NestedQueryColumn extends ResultColumn
|
||||||
|
|
||||||
@override
|
@override
|
||||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||||
return visitor.visitMoorSpecificNode(this, arg);
|
return visitor.visitDriftSpecificNode(this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The unique name for this query. Used to identify it and it's variables in
|
/// The unique name for this query. Used to identify it and it's variables in
|
|
@ -2,7 +2,7 @@ import '../../analysis/analysis.dart';
|
||||||
import '../ast.dart' show StarResultColumn, ResultColumn, Renamable;
|
import '../ast.dart' show StarResultColumn, ResultColumn, Renamable;
|
||||||
import '../node.dart';
|
import '../node.dart';
|
||||||
import '../visitor.dart';
|
import '../visitor.dart';
|
||||||
import 'moor_file.dart';
|
import 'drift_file.dart';
|
||||||
|
|
||||||
/// A nested star result column, denoted by `**` in user queries.
|
/// A nested star result column, denoted by `**` in user queries.
|
||||||
///
|
///
|
||||||
|
@ -10,7 +10,7 @@ import 'moor_file.dart';
|
||||||
/// when the query is actually run. However, they will affect generated code
|
/// when the query is actually run. However, they will affect generated code
|
||||||
/// when using moor.
|
/// when using moor.
|
||||||
class NestedStarResultColumn extends ResultColumn
|
class NestedStarResultColumn extends ResultColumn
|
||||||
implements MoorSpecificNode, Renamable {
|
implements DriftSpecificNode, Renamable {
|
||||||
final String tableName;
|
final String tableName;
|
||||||
ResultSet? resultSet;
|
ResultSet? resultSet;
|
||||||
|
|
||||||
|
@ -27,6 +27,6 @@ class NestedStarResultColumn extends ResultColumn
|
||||||
|
|
||||||
@override
|
@override
|
||||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||||
return visitor.visitMoorSpecificNode(this, arg);
|
return visitor.visitDriftSpecificNode(this, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -217,7 +217,7 @@ class GeneratedAs extends ColumnConstraint {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A `MAPPED BY` constraint, which is only parsed for moor files. It can be
|
/// A `MAPPED BY` constraint, which is only parsed for drift files. It can be
|
||||||
/// used to declare a type converter for this column.
|
/// used to declare a type converter for this column.
|
||||||
class MappedBy extends ColumnConstraint {
|
class MappedBy extends ColumnConstraint {
|
||||||
/// The Dart expression creating the type converter we use to map this token.
|
/// The Dart expression creating the type converter we use to map this token.
|
||||||
|
@ -232,7 +232,7 @@ class MappedBy extends ColumnConstraint {
|
||||||
void transformChildren<A>(Transformer<A> transformer, A arg) {}
|
void transformChildren<A>(Transformer<A> transformer, A arg) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A `JSON KEY xyz` constraint, which is only parsed for moor files.
|
/// A `JSON KEY xyz` constraint, which is only parsed for drift files.
|
||||||
class JsonKey extends ColumnConstraint {
|
class JsonKey extends ColumnConstraint {
|
||||||
Token? json;
|
Token? json;
|
||||||
Token? key;
|
Token? key;
|
||||||
|
@ -249,8 +249,8 @@ class JsonKey extends ColumnConstraint {
|
||||||
void transformChildren<A>(Transformer<A> transformer, A arg) {}
|
void transformChildren<A>(Transformer<A> transformer, A arg) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A `AS xyz` constraint, which is only parsed for moor files.
|
/// A `AS xyz` constraint, which is only parsed for drift files.
|
||||||
class MoorDartName extends ColumnConstraint {
|
class DriftDartName extends ColumnConstraint {
|
||||||
Token? as;
|
Token? as;
|
||||||
IdentifierToken identifier;
|
IdentifierToken identifier;
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ class MoorDartName extends ColumnConstraint {
|
||||||
|
|
||||||
String get dartName => identifier.identifier;
|
String get dartName => identifier.identifier;
|
||||||
|
|
||||||
MoorDartName(String? name, this.identifier) : super(name);
|
DriftDartName(String? name, this.identifier) : super(name);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void transformChildren<A>(Transformer<A> transformer, A arg) {}
|
void transformChildren<A>(Transformer<A> transformer, A arg) {}
|
||||||
|
|
|
@ -8,15 +8,15 @@ abstract class TableInducingStatement extends Statement
|
||||||
final bool ifNotExists;
|
final bool ifNotExists;
|
||||||
final String tableName;
|
final String tableName;
|
||||||
|
|
||||||
/// Moor-specific information about the desired name of a Dart class for this
|
/// Drift-specific information about the desired name of a Dart class for this
|
||||||
/// table.
|
/// table.
|
||||||
///
|
///
|
||||||
/// This will always be `null` when moor extensions are not enabled.
|
/// This will always be `null` when drift extensions are not enabled.
|
||||||
MoorTableName? moorTableName;
|
DriftTableName? driftTableName;
|
||||||
Token? tableNameToken;
|
Token? tableNameToken;
|
||||||
|
|
||||||
TableInducingStatement._(this.ifNotExists, this.tableName,
|
TableInducingStatement._(this.ifNotExists, this.tableName,
|
||||||
[this.moorTableName]);
|
[this.driftTableName]);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get createdName => tableName;
|
String get createdName => tableName;
|
||||||
|
@ -48,8 +48,8 @@ class CreateTableStatement extends TableInducingStatement {
|
||||||
this.tableConstraints = const [],
|
this.tableConstraints = const [],
|
||||||
this.withoutRowId = false,
|
this.withoutRowId = false,
|
||||||
this.isStrict = false,
|
this.isStrict = false,
|
||||||
MoorTableName? moorTableName,
|
DriftTableName? driftTableName,
|
||||||
}) : super._(ifNotExists, tableName, moorTableName);
|
}) : super._(ifNotExists, tableName, driftTableName);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||||
|
@ -61,15 +61,15 @@ class CreateTableStatement extends TableInducingStatement {
|
||||||
columns = transformer.transformChildren(columns, this, arg);
|
columns = transformer.transformChildren(columns, this, arg);
|
||||||
tableConstraints =
|
tableConstraints =
|
||||||
transformer.transformChildren(tableConstraints, this, arg);
|
transformer.transformChildren(tableConstraints, this, arg);
|
||||||
moorTableName =
|
driftTableName =
|
||||||
transformer.transformNullableChild(moorTableName, this, arg);
|
transformer.transformNullableChild(driftTableName, this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Iterable<AstNode> get childNodes => [
|
Iterable<AstNode> get childNodes => [
|
||||||
...columns,
|
...columns,
|
||||||
...tableConstraints,
|
...tableConstraints,
|
||||||
if (moorTableName != null) moorTableName!,
|
if (driftTableName != null) driftTableName!,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,8 +93,8 @@ class CreateVirtualTableStatement extends TableInducingStatement {
|
||||||
required String tableName,
|
required String tableName,
|
||||||
required this.moduleName,
|
required this.moduleName,
|
||||||
this.arguments = const [],
|
this.arguments = const [],
|
||||||
MoorTableName? moorTableName,
|
DriftTableName? driftTableName,
|
||||||
}) : super._(ifNotExists, tableName, moorTableName);
|
}) : super._(ifNotExists, tableName, driftTableName);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
|
||||||
|
@ -103,11 +103,11 @@ class CreateVirtualTableStatement extends TableInducingStatement {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void transformChildren<A>(Transformer<A> transformer, A arg) {
|
void transformChildren<A>(Transformer<A> transformer, A arg) {
|
||||||
moorTableName =
|
driftTableName =
|
||||||
transformer.transformNullableChild(moorTableName, this, arg);
|
transformer.transformNullableChild(driftTableName, this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Iterable<AstNode> get childNodes =>
|
Iterable<AstNode> get childNodes =>
|
||||||
[if (moorTableName != null) moorTableName!];
|
[if (driftTableName != null) driftTableName!];
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,18 +12,18 @@ class CreateViewStatement extends Statement implements CreatingStatement {
|
||||||
|
|
||||||
final List<String>? columns;
|
final List<String>? columns;
|
||||||
|
|
||||||
/// Moor-specific information about the desired name of a Dart class for this
|
/// Drift-specific information about the desired name of a Dart class for this
|
||||||
/// table.
|
/// table.
|
||||||
///
|
///
|
||||||
/// This will always be `null` when moor extensions are not enabled.
|
/// This will always be `null` when drift extensions are not enabled.
|
||||||
MoorTableName? moorTableName;
|
DriftTableName? driftTableName;
|
||||||
|
|
||||||
CreateViewStatement({
|
CreateViewStatement({
|
||||||
this.ifNotExists = false,
|
this.ifNotExists = false,
|
||||||
required this.viewName,
|
required this.viewName,
|
||||||
this.columns,
|
this.columns,
|
||||||
required this.query,
|
required this.query,
|
||||||
this.moorTableName,
|
this.driftTableName,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -37,11 +37,11 @@ class CreateViewStatement extends Statement implements CreatingStatement {
|
||||||
@override
|
@override
|
||||||
void transformChildren<A>(Transformer<A> transformer, A arg) {
|
void transformChildren<A>(Transformer<A> transformer, A arg) {
|
||||||
query = transformer.transformChild(query, this, arg);
|
query = transformer.transformChild(query, this, arg);
|
||||||
moorTableName =
|
driftTableName =
|
||||||
transformer.transformNullableChild(moorTableName, this, arg);
|
transformer.transformNullableChild(driftTableName, this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Iterable<AstNode> get childNodes =>
|
Iterable<AstNode> get childNodes =>
|
||||||
[query, if (moorTableName != null) moorTableName!];
|
[query, if (driftTableName != null) driftTableName!];
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ abstract class StatementReturningColumns extends Statement {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Marker interface for statements that change the table structure.
|
/// Marker interface for statements that change the table structure.
|
||||||
abstract class SchemaStatement extends Statement implements PartOfMoorFile {}
|
abstract class SchemaStatement extends Statement implements PartOfDriftFile {}
|
||||||
|
|
||||||
/// Marker interface for schema statements that create a schematic entity.
|
/// Marker interface for schema statements that create a schematic entity.
|
||||||
abstract class CreatingStatement extends SchemaStatement {
|
abstract class CreatingStatement extends SchemaStatement {
|
||||||
|
|
|
@ -93,7 +93,7 @@ abstract class AstVisitor<A, R> {
|
||||||
R visitBeginTransaction(BeginTransactionStatement e, A arg);
|
R visitBeginTransaction(BeginTransactionStatement e, A arg);
|
||||||
R visitCommitStatement(CommitStatement e, A arg);
|
R visitCommitStatement(CommitStatement e, A arg);
|
||||||
|
|
||||||
R visitMoorSpecificNode(MoorSpecificNode e, A arg);
|
R visitDriftSpecificNode(DriftSpecificNode e, A arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Visitor that walks down the entire tree, visiting all children in order.
|
/// Visitor that walks down the entire tree, visiting all children in order.
|
||||||
|
@ -388,7 +388,7 @@ class RecursiveVisitor<A, R> implements AstVisitor<A, R?> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
R? visitMoorSpecificNode(MoorSpecificNode e, A arg) {
|
R? visitDriftSpecificNode(DriftSpecificNode e, A arg) {
|
||||||
return defaultNode(e, arg);
|
return defaultNode(e, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,10 @@ import 'package:meta/meta.dart';
|
||||||
import 'package:sqlparser/sqlparser.dart';
|
import 'package:sqlparser/sqlparser.dart';
|
||||||
|
|
||||||
class EngineOptions {
|
class EngineOptions {
|
||||||
/// Moor extends the sql grammar a bit to support type converters and other
|
/// Drift extends the sql grammar a bit to support type converters and other
|
||||||
/// features. Enabling this flag will make this engine parse sql with these
|
/// features. Enabling this flag will make this engine parse sql with these
|
||||||
/// extensions enabled.
|
/// extensions enabled.
|
||||||
final bool useMoorExtensions;
|
final bool useDriftExtensions;
|
||||||
|
|
||||||
/// The target sqlite version.
|
/// The target sqlite version.
|
||||||
///
|
///
|
||||||
|
@ -27,7 +27,7 @@ class EngineOptions {
|
||||||
final Map<String, TableValuedFunctionHandler> addedTableFunctions = {};
|
final Map<String, TableValuedFunctionHandler> addedTableFunctions = {};
|
||||||
|
|
||||||
EngineOptions({
|
EngineOptions({
|
||||||
this.useMoorExtensions = false,
|
this.useDriftExtensions = false,
|
||||||
List<Extension> enabledExtensions = const [],
|
List<Extension> enabledExtensions = const [],
|
||||||
this.version = SqliteVersion.minimum,
|
this.version = SqliteVersion.minimum,
|
||||||
}) : enabledExtensions = _allExtensions(enabledExtensions, version) {
|
}) : enabledExtensions = _allExtensions(enabledExtensions, version) {
|
||||||
|
|
|
@ -35,7 +35,7 @@ class SqlEngine {
|
||||||
/// [TableInducingStatement] by using [SchemaFromCreateTable.read].
|
/// [TableInducingStatement] by using [SchemaFromCreateTable.read].
|
||||||
SchemaFromCreateTable get schemaReader {
|
SchemaFromCreateTable get schemaReader {
|
||||||
return _schemaReader ??=
|
return _schemaReader ??=
|
||||||
SchemaFromCreateTable(moorExtensions: options.useMoorExtensions);
|
SchemaFromCreateTable(driftExtensions: options.useDriftExtensions);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Registers the [table], which means that it can later be used in sql
|
/// Registers the [table], which means that it can later be used in sql
|
||||||
|
@ -96,7 +96,8 @@ class SqlEngine {
|
||||||
/// you need to filter them. When using the methods in this class, this will
|
/// you need to filter them. When using the methods in this class, this will
|
||||||
/// be taken care of automatically.
|
/// be taken care of automatically.
|
||||||
List<Token> tokenize(String source) {
|
List<Token> tokenize(String source) {
|
||||||
final scanner = Scanner(source, scanMoorTokens: options.useMoorExtensions);
|
final scanner =
|
||||||
|
Scanner(source, scanDriftTokens: options.useDriftExtensions);
|
||||||
final tokens = scanner.scanTokens();
|
final tokens = scanner.scanTokens();
|
||||||
|
|
||||||
return tokens;
|
return tokens;
|
||||||
|
@ -106,29 +107,30 @@ class SqlEngine {
|
||||||
ParseResult parse(String sql) {
|
ParseResult parse(String sql) {
|
||||||
final tokens = tokenize(sql);
|
final tokens = tokenize(sql);
|
||||||
final tokensForParser = tokens.where((t) => !t.invisibleToParser).toList();
|
final tokensForParser = tokens.where((t) => !t.invisibleToParser).toList();
|
||||||
final parser = Parser(tokensForParser, useMoor: options.useMoorExtensions);
|
final parser =
|
||||||
|
Parser(tokensForParser, useDrift: options.useDriftExtensions);
|
||||||
|
|
||||||
final stmt = parser.safeStatement();
|
final stmt = parser.safeStatement();
|
||||||
return ParseResult._(stmt, tokens, parser.errors, sql, null);
|
return ParseResult._(stmt, tokens, parser.errors, sql, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses a `.moor` file, which can consist of multiple statements and
|
/// Parses a `.drift` file, which can consist of multiple statements and
|
||||||
/// additional components like import statements.
|
/// additional components like import statements.
|
||||||
ParseResult parseMoorFile(String content) {
|
ParseResult parseDriftFile(String content) {
|
||||||
assert(options.useMoorExtensions);
|
assert(options.useDriftExtensions);
|
||||||
|
|
||||||
final tokens = tokenize(content);
|
final tokens = tokenize(content);
|
||||||
final autoComplete = AutoCompleteEngine(tokens, this);
|
final autoComplete = AutoCompleteEngine(tokens, this);
|
||||||
|
|
||||||
final tokensForParser = tokens.where((t) => !t.invisibleToParser).toList();
|
final tokensForParser = tokens.where((t) => !t.invisibleToParser).toList();
|
||||||
final parser =
|
final parser =
|
||||||
Parser(tokensForParser, useMoor: true, autoComplete: autoComplete);
|
Parser(tokensForParser, useDrift: true, autoComplete: autoComplete);
|
||||||
|
|
||||||
final moorFile = parser.moorFile();
|
final driftFile = parser.driftFile();
|
||||||
_attachRootScope(moorFile);
|
_attachRootScope(driftFile);
|
||||||
|
|
||||||
return ParseResult._(
|
return ParseResult._(
|
||||||
moorFile, tokens, parser.errors, content, autoComplete);
|
driftFile, tokens, parser.errors, content, autoComplete);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses and analyzes the [sql] statement. The [AnalysisContext] returned
|
/// Parses and analyzes the [sql] statement. The [AnalysisContext] returned
|
||||||
|
|
|
@ -33,16 +33,16 @@ class Parser {
|
||||||
final List<ParsingError> errors = [];
|
final List<ParsingError> errors = [];
|
||||||
final AutoCompleteEngine? autoComplete;
|
final AutoCompleteEngine? autoComplete;
|
||||||
|
|
||||||
// todo remove this and don't be that lazy in moorFile()
|
// todo remove this and don't be that lazy in driftFile()
|
||||||
var _lastStmtHadParsingError = false;
|
var _lastStmtHadParsingError = false;
|
||||||
|
|
||||||
/// Whether to enable the extensions moor makes to the sql grammar.
|
/// Whether to enable the extensions drift makes to the sql grammar.
|
||||||
final bool enableMoorExtensions;
|
final bool enableDriftExtensions;
|
||||||
|
|
||||||
int _current = 0;
|
int _current = 0;
|
||||||
|
|
||||||
Parser(this.tokens, {bool useMoor = false, this.autoComplete})
|
Parser(this.tokens, {bool useDrift = false, this.autoComplete})
|
||||||
: enableMoorExtensions = useMoor;
|
: enableDriftExtensions = useDrift;
|
||||||
|
|
||||||
bool get _reportAutoComplete => autoComplete != null;
|
bool get _reportAutoComplete => autoComplete != null;
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ class Parser {
|
||||||
return _commit();
|
return _commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enableMoorExtensions) {
|
if (enableDriftExtensions) {
|
||||||
if (_check(TokenType.import)) {
|
if (_check(TokenType.import)) {
|
||||||
return _import()!;
|
return _import()!;
|
||||||
}
|
}
|
||||||
|
@ -232,9 +232,9 @@ class Parser {
|
||||||
return stmt..setSpan(first, _previous);
|
return stmt..setSpan(first, _previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
MoorFile moorFile() {
|
DriftFile driftFile() {
|
||||||
final first = _peek;
|
final first = _peek;
|
||||||
final foundComponents = <PartOfMoorFile?>[];
|
final foundComponents = <PartOfDriftFile?>[];
|
||||||
|
|
||||||
// (we try again if the last statement had a parsing error)
|
// (we try again if the last statement had a parsing error)
|
||||||
|
|
||||||
|
@ -265,7 +265,7 @@ class Parser {
|
||||||
|
|
||||||
foundComponents.removeWhere((c) => c == null);
|
foundComponents.removeWhere((c) => c == null);
|
||||||
|
|
||||||
final file = MoorFile(foundComponents.cast());
|
final file = DriftFile(foundComponents.cast());
|
||||||
if (foundComponents.isNotEmpty) {
|
if (foundComponents.isNotEmpty) {
|
||||||
file.setSpan(first, _previous);
|
file.setSpan(first, _previous);
|
||||||
} else {
|
} else {
|
||||||
|
@ -798,7 +798,7 @@ class Parser {
|
||||||
..setSpan(left, _previous);
|
..setSpan(left, _previous);
|
||||||
}
|
}
|
||||||
} else if (_matchOne(TokenType.dollarSignVariable)) {
|
} else if (_matchOne(TokenType.dollarSignVariable)) {
|
||||||
if (enableMoorExtensions) {
|
if (enableDriftExtensions) {
|
||||||
final typedToken = _previous as DollarSignVariableToken;
|
final typedToken = _previous as DollarSignVariableToken;
|
||||||
return DartExpressionPlaceholder(name: typedToken.name)
|
return DartExpressionPlaceholder(name: typedToken.name)
|
||||||
..token = typedToken
|
..token = typedToken
|
||||||
|
@ -1708,7 +1708,7 @@ class Parser {
|
||||||
final first = _previous;
|
final first = _previous;
|
||||||
_consume(TokenType.$values, 'Expected DEFAULT VALUES');
|
_consume(TokenType.$values, 'Expected DEFAULT VALUES');
|
||||||
return DefaultValues()..setSpan(first, _previous);
|
return DefaultValues()..setSpan(first, _previous);
|
||||||
} else if (enableMoorExtensions &&
|
} else if (enableDriftExtensions &&
|
||||||
_matchOne(TokenType.dollarSignVariable)) {
|
_matchOne(TokenType.dollarSignVariable)) {
|
||||||
final token = _previous as DollarSignVariableToken;
|
final token = _previous as DollarSignVariableToken;
|
||||||
return DartInsertablePlaceholder(name: token.name)
|
return DartInsertablePlaceholder(name: token.name)
|
||||||
|
@ -1921,7 +1921,7 @@ class Parser {
|
||||||
if (_matchOne(TokenType.star)) {
|
if (_matchOne(TokenType.star)) {
|
||||||
return StarResultColumn(identifier.identifier)
|
return StarResultColumn(identifier.identifier)
|
||||||
..setSpan(identifier, _previous);
|
..setSpan(identifier, _previous);
|
||||||
} else if (enableMoorExtensions && _matchOne(TokenType.doubleStar)) {
|
} else if (enableDriftExtensions && _matchOne(TokenType.doubleStar)) {
|
||||||
final as = _as();
|
final as = _as();
|
||||||
|
|
||||||
return NestedStarResultColumn(
|
return NestedStarResultColumn(
|
||||||
|
@ -1938,7 +1938,7 @@ class Parser {
|
||||||
}
|
}
|
||||||
|
|
||||||
// parsing for the nested query column
|
// parsing for the nested query column
|
||||||
if (enableMoorExtensions && _matchOne(TokenType.list)) {
|
if (enableDriftExtensions && _matchOne(TokenType.list)) {
|
||||||
final list = _previous;
|
final list = _previous;
|
||||||
|
|
||||||
_consume(
|
_consume(
|
||||||
|
@ -2080,7 +2080,7 @@ class Parser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final overriddenName = _moorTableName();
|
final overriddenName = _driftTableName();
|
||||||
|
|
||||||
return CreateTableStatement(
|
return CreateTableStatement(
|
||||||
ifNotExists: ifNotExists,
|
ifNotExists: ifNotExists,
|
||||||
|
@ -2089,7 +2089,7 @@ class Parser {
|
||||||
columns: columns,
|
columns: columns,
|
||||||
tableConstraints: tableConstraints,
|
tableConstraints: tableConstraints,
|
||||||
isStrict: isStrict,
|
isStrict: isStrict,
|
||||||
moorTableName: overriddenName,
|
driftTableName: overriddenName,
|
||||||
)
|
)
|
||||||
..setSpan(first, _previous)
|
..setSpan(first, _previous)
|
||||||
..openingBracket = leftParen
|
..openingBracket = leftParen
|
||||||
|
@ -2155,30 +2155,30 @@ class Parser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final moorDataClassName = _moorTableName();
|
final driftTableName = _driftTableName();
|
||||||
return CreateVirtualTableStatement(
|
return CreateVirtualTableStatement(
|
||||||
ifNotExists: ifNotExists,
|
ifNotExists: ifNotExists,
|
||||||
tableName: nameToken.identifier,
|
tableName: nameToken.identifier,
|
||||||
moduleName: moduleName.identifier,
|
moduleName: moduleName.identifier,
|
||||||
arguments: args,
|
arguments: args,
|
||||||
moorTableName: moorDataClassName,
|
driftTableName: driftTableName,
|
||||||
)
|
)
|
||||||
..setSpan(first, _previous)
|
..setSpan(first, _previous)
|
||||||
..tableNameToken = nameToken
|
..tableNameToken = nameToken
|
||||||
..moduleNameToken = moduleName;
|
..moduleNameToken = moduleName;
|
||||||
}
|
}
|
||||||
|
|
||||||
MoorTableName? _moorTableName([bool supportAs = true]) {
|
DriftTableName? _driftTableName({bool supportAs = true}) {
|
||||||
final types =
|
final types =
|
||||||
supportAs ? const [TokenType.as, TokenType.$with] : [TokenType.$with];
|
supportAs ? const [TokenType.as, TokenType.$with] : [TokenType.$with];
|
||||||
|
|
||||||
if (enableMoorExtensions && (_match(types))) {
|
if (enableDriftExtensions && (_match(types))) {
|
||||||
final first = _previous;
|
final first = _previous;
|
||||||
final useExisting = _previous.type == TokenType.$with;
|
final useExisting = _previous.type == TokenType.$with;
|
||||||
final name =
|
final name =
|
||||||
_consumeIdentifier('Expected the name for the data class').identifier;
|
_consumeIdentifier('Expected the name for the data class').identifier;
|
||||||
|
|
||||||
return MoorTableName(name, useExisting)..setSpan(first, _previous);
|
return DriftTableName(name, useExisting)..setSpan(first, _previous);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -2279,7 +2279,7 @@ class Parser {
|
||||||
|
|
||||||
// Don't allow the "AS ClassName" syntax for views since it causes an
|
// Don't allow the "AS ClassName" syntax for views since it causes an
|
||||||
// ambiguity with the regular view syntax.
|
// ambiguity with the regular view syntax.
|
||||||
final moorTableName = _moorTableName(false);
|
final driftTableName = _driftTableName(supportAs: false);
|
||||||
|
|
||||||
List<String>? columnNames;
|
List<String>? columnNames;
|
||||||
if (_matchOne(TokenType.leftParen)) {
|
if (_matchOne(TokenType.leftParen)) {
|
||||||
|
@ -2299,7 +2299,7 @@ class Parser {
|
||||||
viewName: name.identifier,
|
viewName: name.identifier,
|
||||||
columns: columnNames,
|
columns: columnNames,
|
||||||
query: query,
|
query: query,
|
||||||
moorTableName: moorTableName,
|
driftTableName: driftTableName,
|
||||||
)
|
)
|
||||||
..viewNameToken = name
|
..viewNameToken = name
|
||||||
..setSpan(create, _previous);
|
..setSpan(create, _previous);
|
||||||
|
@ -2525,7 +2525,7 @@ class Parser {
|
||||||
..setSpan(first, _previous);
|
..setSpan(first, _previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enableMoorExtensions && _matchOne(TokenType.mapped)) {
|
if (enableDriftExtensions && _matchOne(TokenType.mapped)) {
|
||||||
_consume(TokenType.by, 'Expected a MAPPED BY constraint');
|
_consume(TokenType.by, 'Expected a MAPPED BY constraint');
|
||||||
|
|
||||||
final dartExpr = _consume(
|
final dartExpr = _consume(
|
||||||
|
@ -2534,7 +2534,7 @@ class Parser {
|
||||||
return MappedBy(resolvedName, dartExpr as InlineDartToken)
|
return MappedBy(resolvedName, dartExpr as InlineDartToken)
|
||||||
..setSpan(first, _previous);
|
..setSpan(first, _previous);
|
||||||
}
|
}
|
||||||
if (enableMoorExtensions && _matchOne(TokenType.json)) {
|
if (enableDriftExtensions && _matchOne(TokenType.json)) {
|
||||||
final jsonToken = _previous;
|
final jsonToken = _previous;
|
||||||
final keyToken =
|
final keyToken =
|
||||||
_consume(TokenType.key, 'Expected a JSON KEY constraint');
|
_consume(TokenType.key, 'Expected a JSON KEY constraint');
|
||||||
|
@ -2545,11 +2545,11 @@ class Parser {
|
||||||
..json = jsonToken
|
..json = jsonToken
|
||||||
..key = keyToken;
|
..key = keyToken;
|
||||||
}
|
}
|
||||||
if (enableMoorExtensions && _matchOne(TokenType.as)) {
|
if (enableDriftExtensions && _matchOne(TokenType.as)) {
|
||||||
final asToken = _previous;
|
final asToken = _previous;
|
||||||
final nameToken = _consumeIdentifier('Expected Dart getter name');
|
final nameToken = _consumeIdentifier('Expected Dart getter name');
|
||||||
|
|
||||||
return MoorDartName(resolvedName, nameToken)
|
return DriftDartName(resolvedName, nameToken)
|
||||||
..setSpan(first, _previous)
|
..setSpan(first, _previous)
|
||||||
..as = asToken;
|
..as = asToken;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,8 +10,8 @@ class Scanner {
|
||||||
final String source;
|
final String source;
|
||||||
final Uint16List _charCodes;
|
final Uint16List _charCodes;
|
||||||
|
|
||||||
/// Whether to scan tokens that are only relevant for moor.
|
/// Whether to scan tokens that are only relevant for drift files.
|
||||||
final bool scanMoorTokens;
|
final bool scanDriftTokens;
|
||||||
final SourceFile _file;
|
final SourceFile _file;
|
||||||
|
|
||||||
final List<Token> tokens = [];
|
final List<Token> tokens = [];
|
||||||
|
@ -29,7 +29,7 @@ class Scanner {
|
||||||
return _file.location(_currentOffset);
|
return _file.location(_currentOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
Scanner(this.source, {this.scanMoorTokens = false})
|
Scanner(this.source, {this.scanDriftTokens = false})
|
||||||
: _file = SourceFile.fromString(source),
|
: _file = SourceFile.fromString(source),
|
||||||
_charCodes = Uint16List.fromList(source.codeUnits);
|
_charCodes = Uint16List.fromList(source.codeUnits);
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ class Scanner {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case $asterisk:
|
case $asterisk:
|
||||||
if (scanMoorTokens && _match($asterisk)) {
|
if (scanDriftTokens && _match($asterisk)) {
|
||||||
_addToken(TokenType.doubleStar);
|
_addToken(TokenType.doubleStar);
|
||||||
} else {
|
} else {
|
||||||
_addToken(TokenType.star);
|
_addToken(TokenType.star);
|
||||||
|
@ -190,7 +190,7 @@ class Scanner {
|
||||||
_identifier(escapeChar: $double_quote);
|
_identifier(escapeChar: $double_quote);
|
||||||
break;
|
break;
|
||||||
case $backquote:
|
case $backquote:
|
||||||
if (scanMoorTokens) {
|
if (scanDriftTokens) {
|
||||||
_inlineDart();
|
_inlineDart();
|
||||||
} else {
|
} else {
|
||||||
_identifier(escapeChar: $backquote);
|
_identifier(escapeChar: $backquote);
|
||||||
|
@ -412,8 +412,8 @@ class Scanner {
|
||||||
final text = _currentSpan.text.toUpperCase();
|
final text = _currentSpan.text.toUpperCase();
|
||||||
if (keywords.containsKey(text)) {
|
if (keywords.containsKey(text)) {
|
||||||
tokens.add(KeywordToken(keywords[text]!, _currentSpan));
|
tokens.add(KeywordToken(keywords[text]!, _currentSpan));
|
||||||
} else if (scanMoorTokens && moorKeywords.containsKey(text)) {
|
} else if (scanDriftTokens && driftKeywords.containsKey(text)) {
|
||||||
tokens.add(KeywordToken(moorKeywords[text]!, _currentSpan));
|
tokens.add(KeywordToken(driftKeywords[text]!, _currentSpan));
|
||||||
} else {
|
} else {
|
||||||
tokens.add(IdentifierToken(false, _currentSpan));
|
tokens.add(IdentifierToken(false, _currentSpan));
|
||||||
}
|
}
|
||||||
|
|
|
@ -218,7 +218,7 @@ enum TokenType {
|
||||||
window,
|
window,
|
||||||
without,
|
without,
|
||||||
|
|
||||||
/// Moor specific token, used to declare type converter
|
/// Drift specific token, used to declare type converter
|
||||||
mapped,
|
mapped,
|
||||||
inlineDart,
|
inlineDart,
|
||||||
import,
|
import,
|
||||||
|
@ -226,7 +226,7 @@ enum TokenType {
|
||||||
required,
|
required,
|
||||||
list,
|
list,
|
||||||
|
|
||||||
/// A `**` token. This is only scanned when scanning for moor tokens.
|
/// A `**` token. This is only scanned when scanning for drift tokens.
|
||||||
doubleStar,
|
doubleStar,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,10 +412,10 @@ const Map<String, TokenType> postgresKeywords = {
|
||||||
/// Maps [TokenType]s which are keywords to their lexeme.
|
/// Maps [TokenType]s which are keywords to their lexeme.
|
||||||
final Map<TokenType, String> reverseKeywords = {
|
final Map<TokenType, String> reverseKeywords = {
|
||||||
for (var entry in keywords.entries) entry.value: entry.key,
|
for (var entry in keywords.entries) entry.value: entry.key,
|
||||||
for (var entry in moorKeywords.entries) entry.value: entry.key,
|
for (var entry in driftKeywords.entries) entry.value: entry.key,
|
||||||
};
|
};
|
||||||
|
|
||||||
const Map<String, TokenType> moorKeywords = {
|
const Map<String, TokenType> driftKeywords = {
|
||||||
'IMPORT': TokenType.import,
|
'IMPORT': TokenType.import,
|
||||||
'JSON': TokenType.json,
|
'JSON': TokenType.json,
|
||||||
'MAPPED': TokenType.mapped,
|
'MAPPED': TokenType.mapped,
|
||||||
|
@ -539,8 +539,8 @@ class AtSignVariableToken extends Token {
|
||||||
: super(TokenType.atSignVariable, span);
|
: super(TokenType.atSignVariable, span);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Inline Dart appearing in a create table statement. Only parsed when the moor
|
/// Inline Dart appearing in a create table statement. Only parsed when the
|
||||||
/// extensions are enabled. Dart code is wrapped in backticks.
|
/// drift extensions are enabled. Dart code is wrapped in backticks.
|
||||||
class InlineDartToken extends Token {
|
class InlineDartToken extends Token {
|
||||||
InlineDartToken(FileSpan span) : super(TokenType.inlineDart, span);
|
InlineDartToken(FileSpan span) : super(TokenType.inlineDart, span);
|
||||||
|
|
||||||
|
@ -562,7 +562,7 @@ class KeywordToken extends Token {
|
||||||
bool canConvertToIdentifier() {
|
bool canConvertToIdentifier() {
|
||||||
// https://stackoverflow.com/a/45775719, but we don't parse indexed yet.
|
// https://stackoverflow.com/a/45775719, but we don't parse indexed yet.
|
||||||
return _identifierKeywords.contains(type) ||
|
return _identifierKeywords.contains(type) ||
|
||||||
moorKeywords.values.contains(type);
|
driftKeywords.values.contains(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
IdentifierToken convertToIdentifier() {
|
IdentifierToken convertToIdentifier() {
|
||||||
|
|
|
@ -419,58 +419,58 @@ class EqualityEnforcingVisitor implements AstVisitor<void, void> {
|
||||||
_checkChildren(e);
|
_checkChildren(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void visitMoorDeclaredStatement(DeclaredStatement e, void arg) {
|
void visitDriftDeclaredStatement(DeclaredStatement e, void arg) {
|
||||||
final current = _currentAs<DeclaredStatement>(e);
|
final current = _currentAs<DeclaredStatement>(e);
|
||||||
_assert(current.identifier == e.identifier && current.as == e.as, e);
|
_assert(current.identifier == e.identifier && current.as == e.as, e);
|
||||||
_checkChildren(e);
|
_checkChildren(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void visitMoorFile(MoorFile e, void arg) {
|
void visitDriftFile(DriftFile e, void arg) {
|
||||||
_currentAs<MoorFile>(e);
|
_currentAs<DriftFile>(e);
|
||||||
_checkChildren(e);
|
_checkChildren(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void visitMoorImportStatement(ImportStatement e, void arg) {
|
void visitDriftImportStatement(ImportStatement e, void arg) {
|
||||||
final current = _currentAs<ImportStatement>(e);
|
final current = _currentAs<ImportStatement>(e);
|
||||||
_assert(current.importedFile == e.importedFile, e);
|
_assert(current.importedFile == e.importedFile, e);
|
||||||
_checkChildren(e);
|
_checkChildren(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void visitMoorNestedStarResultColumn(NestedStarResultColumn e, void arg) {
|
void visitDriftNestedStarResultColumn(NestedStarResultColumn e, void arg) {
|
||||||
final current = _currentAs<NestedStarResultColumn>(e);
|
final current = _currentAs<NestedStarResultColumn>(e);
|
||||||
_assert(current.tableName == e.tableName, e);
|
_assert(current.tableName == e.tableName, e);
|
||||||
_assert(current.as == e.as, e);
|
_assert(current.as == e.as, e);
|
||||||
_checkChildren(e);
|
_checkChildren(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void visitMoorNestedQueryColumn(NestedQueryColumn e, void arg) {
|
void visitDriftNestedQueryColumn(NestedQueryColumn e, void arg) {
|
||||||
final current = _currentAs<NestedQueryColumn>(e);
|
final current = _currentAs<NestedQueryColumn>(e);
|
||||||
_assert(current.as == e.as, e);
|
_assert(current.as == e.as, e);
|
||||||
_checkChildren(e);
|
_checkChildren(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||||
if (e is DartPlaceholder) {
|
if (e is DartPlaceholder) {
|
||||||
return visitDartPlaceholder(e, arg);
|
return visitDartPlaceholder(e, arg);
|
||||||
} else if (e is DeclaredStatement) {
|
} else if (e is DeclaredStatement) {
|
||||||
return visitMoorDeclaredStatement(e, arg);
|
return visitDriftDeclaredStatement(e, arg);
|
||||||
} else if (e is MoorFile) {
|
} else if (e is DriftFile) {
|
||||||
return visitMoorFile(e, arg);
|
return visitDriftFile(e, arg);
|
||||||
} else if (e is ImportStatement) {
|
} else if (e is ImportStatement) {
|
||||||
return visitMoorImportStatement(e, arg);
|
return visitDriftImportStatement(e, arg);
|
||||||
} else if (e is NestedStarResultColumn) {
|
} else if (e is NestedStarResultColumn) {
|
||||||
return visitMoorNestedStarResultColumn(e, arg);
|
return visitDriftNestedStarResultColumn(e, arg);
|
||||||
} else if (e is StatementParameter) {
|
} else if (e is StatementParameter) {
|
||||||
return visitMoorStatementParameter(e, arg);
|
return visitDriftStatementParameter(e, arg);
|
||||||
} else if (e is MoorTableName) {
|
} else if (e is DriftTableName) {
|
||||||
return visitMoorTableName(e, arg);
|
return visitDriftTableName(e, arg);
|
||||||
} else if (e is NestedQueryColumn) {
|
} else if (e is NestedQueryColumn) {
|
||||||
return visitMoorNestedQueryColumn(e, arg);
|
return visitDriftNestedQueryColumn(e, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void visitMoorStatementParameter(StatementParameter e, void arg) {
|
void visitDriftStatementParameter(StatementParameter e, void arg) {
|
||||||
if (e is VariableTypeHint) {
|
if (e is VariableTypeHint) {
|
||||||
final current = _currentAs<VariableTypeHint>(e);
|
final current = _currentAs<VariableTypeHint>(e);
|
||||||
_assert(
|
_assert(
|
||||||
|
@ -486,8 +486,8 @@ class EqualityEnforcingVisitor implements AstVisitor<void, void> {
|
||||||
_checkChildren(e);
|
_checkChildren(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void visitMoorTableName(MoorTableName e, void arg) {
|
void visitDriftTableName(DriftTableName e, void arg) {
|
||||||
final current = _currentAs<MoorTableName>(e);
|
final current = _currentAs<DriftTableName>(e);
|
||||||
_assert(
|
_assert(
|
||||||
current.overriddenDataClassName == e.overriddenDataClassName &&
|
current.overriddenDataClassName == e.overriddenDataClassName &&
|
||||||
current.useExistingDartClass == e.useExistingDartClass,
|
current.useExistingDartClass == e.useExistingDartClass,
|
||||||
|
|
|
@ -408,7 +408,7 @@ class NodeSqlBuilder extends AstVisitor<void, void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitMoorSpecificNode(MoorSpecificNode e, void arg) {
|
void visitDriftSpecificNode(DriftSpecificNode e, void arg) {
|
||||||
if (e is DartPlaceholder) {
|
if (e is DartPlaceholder) {
|
||||||
symbol(r'$', spaceBefore: true);
|
symbol(r'$', spaceBefore: true);
|
||||||
symbol(e.name, spaceAfter: true);
|
symbol(e.name, spaceAfter: true);
|
||||||
|
@ -429,7 +429,7 @@ class NodeSqlBuilder extends AstVisitor<void, void> {
|
||||||
symbol(':', spaceAfter: true);
|
symbol(':', spaceAfter: true);
|
||||||
visit(e.statement, arg);
|
visit(e.statement, arg);
|
||||||
symbol(';');
|
symbol(';');
|
||||||
} else if (e is MoorFile) {
|
} else if (e is DriftFile) {
|
||||||
for (final stmt in e.statements) {
|
for (final stmt in e.statements) {
|
||||||
visit(stmt, arg);
|
visit(stmt, arg);
|
||||||
buffer.write('\n');
|
buffer.write('\n');
|
||||||
|
@ -461,7 +461,7 @@ class NodeSqlBuilder extends AstVisitor<void, void> {
|
||||||
} else {
|
} else {
|
||||||
throw AssertionError('Unknown StatementParameter: $e');
|
throw AssertionError('Unknown StatementParameter: $e');
|
||||||
}
|
}
|
||||||
} else if (e is MoorTableName) {
|
} else if (e is DriftTableName) {
|
||||||
_keyword(e.useExistingDartClass ? TokenType.$with : TokenType.as);
|
_keyword(e.useExistingDartClass ? TokenType.$with : TokenType.as);
|
||||||
identifier(e.overriddenDataClassName);
|
identifier(e.overriddenDataClassName);
|
||||||
} else if (e is NestedStarResultColumn) {
|
} else if (e is NestedStarResultColumn) {
|
||||||
|
|
|
@ -26,7 +26,7 @@ void main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('does not register the same result set multiple times', () {
|
test('does not register the same result set multiple times', () {
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
..registerTableFromSql('''
|
..registerTableFromSql('''
|
||||||
CREATE TABLE with_defaults (
|
CREATE TABLE with_defaults (
|
||||||
a TEXT DEFAULT 'something',
|
a TEXT DEFAULT 'something',
|
||||||
|
|
|
@ -7,7 +7,7 @@ void main() {
|
||||||
final oldEngine = SqlEngine(EngineOptions(version: SqliteVersion.v3_35));
|
final oldEngine = SqlEngine(EngineOptions(version: SqliteVersion.v3_35));
|
||||||
final engine = SqlEngine(EngineOptions(version: SqliteVersion.v3_37));
|
final engine = SqlEngine(EngineOptions(version: SqliteVersion.v3_37));
|
||||||
final engineInDriftMode = SqlEngine(
|
final engineInDriftMode = SqlEngine(
|
||||||
EngineOptions(version: SqliteVersion.v3_37, useMoorExtensions: true));
|
EngineOptions(version: SqliteVersion.v3_37, useDriftExtensions: true));
|
||||||
|
|
||||||
group('using STRICT', () {
|
group('using STRICT', () {
|
||||||
test('with an old sqlite3 version', () {
|
test('with an old sqlite3 version', () {
|
||||||
|
|
|
@ -61,8 +61,8 @@ void main() {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("resolved columns don't include moor nested results", () {
|
test("resolved columns don't include drift nested results", () {
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
..registerTable(demoTable);
|
..registerTable(demoTable);
|
||||||
|
|
||||||
final context = engine.analyze('SELECT demo.** FROM demo;');
|
final context = engine.analyze('SELECT demo.** FROM demo;');
|
||||||
|
@ -95,7 +95,7 @@ void main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('resolves columns from nested results', () {
|
test('resolves columns from nested results', () {
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
..registerTable(demoTable)
|
..registerTable(demoTable)
|
||||||
..registerTable(anotherTable);
|
..registerTable(anotherTable);
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ void main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('resolves columns in nested queries', () {
|
test('resolves columns in nested queries', () {
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
..registerTable(demoTable);
|
..registerTable(demoTable);
|
||||||
|
|
||||||
final context =
|
final context =
|
||||||
|
|
|
@ -35,7 +35,7 @@ void main() {
|
||||||
|
|
||||||
test('regression test for #1188', () {
|
test('regression test for #1188', () {
|
||||||
// Test for https://github.com/simolus3/moor/issues/1188
|
// Test for https://github.com/simolus3/moor/issues/1188
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
..registerTableFromSql('''
|
..registerTableFromSql('''
|
||||||
CREATE TABLE IF NOT EXISTS "employees" (
|
CREATE TABLE IF NOT EXISTS "employees" (
|
||||||
"id" INTEGER NOT NULL PRIMARY KEY,
|
"id" INTEGER NOT NULL PRIMARY KEY,
|
||||||
|
@ -85,7 +85,7 @@ void main() {
|
||||||
|
|
||||||
test('regression test for #1234', () {
|
test('regression test for #1234', () {
|
||||||
// https://github.com/simolus3/moor/issues/1234#issuecomment-853270925
|
// https://github.com/simolus3/moor/issues/1234#issuecomment-853270925
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
..registerTableFromSql('''
|
..registerTableFromSql('''
|
||||||
CREATE TABLE inboxes (
|
CREATE TABLE inboxes (
|
||||||
id TEXT PRIMARY KEY NOT NULL,
|
id TEXT PRIMARY KEY NOT NULL,
|
||||||
|
@ -117,7 +117,7 @@ void main() {
|
||||||
test('regression test for #1096', () {
|
test('regression test for #1096', () {
|
||||||
// https://github.com/simolus3/moor/issues/1096#issuecomment-931378474
|
// https://github.com/simolus3/moor/issues/1096#issuecomment-931378474
|
||||||
final engine = SqlEngine(
|
final engine = SqlEngine(
|
||||||
EngineOptions(useMoorExtensions: true, version: SqliteVersion.v3_35))
|
EngineOptions(useDriftExtensions: true, version: SqliteVersion.v3_35))
|
||||||
..registerTableFromSql('''
|
..registerTableFromSql('''
|
||||||
CREATE TABLE downloads (
|
CREATE TABLE downloads (
|
||||||
id INT NOT NULL PRIMARY KEY AUTOINCREMENT,
|
id INT NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||||
|
|
|
@ -86,15 +86,15 @@ void main() {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('supports booleans when moor extensions are enabled', () {
|
test('supports booleans when drift extensions are enabled', () {
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||||
final stmt = engine.parse('''
|
final stmt = engine.parse('''
|
||||||
CREATE TABLE foo (
|
CREATE TABLE foo (
|
||||||
a BOOL, b DATETIME, c DATE, d BOOLEAN NOT NULL
|
a BOOL, b DATETIME, c DATE, d BOOLEAN NOT NULL
|
||||||
)
|
)
|
||||||
''').rootNode;
|
''').rootNode;
|
||||||
|
|
||||||
final table = const SchemaFromCreateTable(moorExtensions: true)
|
final table = const SchemaFromCreateTable(driftExtensions: true)
|
||||||
.read(stmt as CreateTableStatement);
|
.read(stmt as CreateTableStatement);
|
||||||
expect(table.resolvedColumns.map((c) => c.type), const [
|
expect(table.resolvedColumns.map((c) => c.type), const [
|
||||||
ResolvedType(type: BasicType.int, hint: IsBoolean(), nullable: true),
|
ResolvedType(type: BasicType.int, hint: IsBoolean(), nullable: true),
|
||||||
|
|
|
@ -5,7 +5,7 @@ import 'package:test/test.dart';
|
||||||
import '../data.dart';
|
import '../data.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true))
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
..registerTable(demoTable)
|
..registerTable(demoTable)
|
||||||
..registerTable(anotherTable);
|
..registerTable(anotherTable);
|
||||||
|
|
||||||
|
|
|
@ -35,8 +35,8 @@ void main() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ComputedSuggestions _compute(String moorFile) {
|
ComputedSuggestions _compute(String driftFile) {
|
||||||
return completionsFor(moorFile, setup: _setupEngine);
|
return completionsFor(driftFile, setup: _setupEngine);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _setupEngine(SqlEngine engine) {
|
void _setupEngine(SqlEngine engine) {
|
||||||
|
|
|
@ -2,15 +2,15 @@ import 'package:sqlparser/sqlparser.dart';
|
||||||
import 'package:sqlparser/src/engine/autocomplete/engine.dart';
|
import 'package:sqlparser/src/engine/autocomplete/engine.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
/// Parses the [moorFile] and computes available autocomplete suggestions at
|
/// Parses the [driftFile] and computes available autocomplete suggestions at
|
||||||
/// the position of a `^` character in the source.
|
/// the position of a `^` character in the source.
|
||||||
ComputedSuggestions completionsFor(String moorFile,
|
ComputedSuggestions completionsFor(String driftFile,
|
||||||
{void Function(SqlEngine)? setup}) {
|
{void Function(SqlEngine)? setup}) {
|
||||||
final position = moorFile.indexOf('^');
|
final position = driftFile.indexOf('^');
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||||
setup?.call(engine);
|
setup?.call(engine);
|
||||||
|
|
||||||
final result = engine.parseMoorFile(moorFile.replaceFirst('^', ''));
|
final result = engine.parseDriftFile(driftFile.replaceFirst('^', ''));
|
||||||
return result.autoCompleteEngine!.suggestCompletions(position - 1);
|
return result.autoCompleteEngine!.suggestCompletions(position - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -181,7 +181,7 @@ void main() {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('parses MAPPED BY constraints when in moor mode', () {
|
test('parses MAPPED BY constraints when in drift mode', () {
|
||||||
testStatement(
|
testStatement(
|
||||||
'CREATE TABLE a (b NOT NULL MAPPED BY `Mapper()` PRIMARY KEY)',
|
'CREATE TABLE a (b NOT NULL MAPPED BY `Mapper()` PRIMARY KEY)',
|
||||||
CreateTableStatement(tableName: 'a', columns: [
|
CreateTableStatement(tableName: 'a', columns: [
|
||||||
|
@ -195,11 +195,11 @@ void main() {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]),
|
]),
|
||||||
moorMode: true,
|
driftMode: true,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('parses JSON KEY constraints in moor mode', () {
|
test('parses JSON KEY constraints in drift mode', () {
|
||||||
testStatement(
|
testStatement(
|
||||||
'CREATE TABLE a (b INTEGER JSON KEY "my_json_key")',
|
'CREATE TABLE a (b INTEGER JSON KEY "my_json_key")',
|
||||||
CreateTableStatement(
|
CreateTableStatement(
|
||||||
|
@ -217,11 +217,11 @@ void main() {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
moorMode: true,
|
driftMode: true,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('parses CREATE TABLE WITH in moor more', () {
|
test('parses CREATE TABLE WITH in drift more', () {
|
||||||
testStatement(
|
testStatement(
|
||||||
'CREATE TABLE a (b INTEGER) WITH MyExistingClass',
|
'CREATE TABLE a (b INTEGER) WITH MyExistingClass',
|
||||||
CreateTableStatement(
|
CreateTableStatement(
|
||||||
|
@ -232,15 +232,15 @@ void main() {
|
||||||
typeName: 'INTEGER',
|
typeName: 'INTEGER',
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
moorTableName: MoorTableName('MyExistingClass', true),
|
driftTableName: DriftTableName('MyExistingClass', true),
|
||||||
),
|
),
|
||||||
moorMode: true,
|
driftMode: true,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('parses CREATE VIRTUAL TABLE statement', () {
|
test('parses CREATE VIRTUAL TABLE statement', () {
|
||||||
testStatement(
|
testStatement(
|
||||||
'CREATE VIRTUAL TABLE IF NOT EXISTS foo USING bar(a, b(), c) AS moor',
|
'CREATE VIRTUAL TABLE IF NOT EXISTS foo USING bar(a, b(), c) AS drift',
|
||||||
CreateVirtualTableStatement(
|
CreateVirtualTableStatement(
|
||||||
ifNotExists: true,
|
ifNotExists: true,
|
||||||
tableName: 'foo',
|
tableName: 'foo',
|
||||||
|
@ -250,9 +250,9 @@ void main() {
|
||||||
fakeSpan('b()'),
|
fakeSpan('b()'),
|
||||||
fakeSpan('c'),
|
fakeSpan('c'),
|
||||||
],
|
],
|
||||||
moorTableName: MoorTableName('moor', false),
|
driftTableName: DriftTableName('drift', false),
|
||||||
),
|
),
|
||||||
moorMode: true,
|
driftMode: true,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,9 @@ void main() {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
moorTableName: MoorTableName('ExistingDartClass', true),
|
driftTableName: DriftTableName('ExistingDartClass', true),
|
||||||
),
|
),
|
||||||
moorMode: true,
|
driftMode: true,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ void main() {
|
||||||
from: TableReference('tbl'),
|
from: TableReference('tbl'),
|
||||||
limit: DartLimitPlaceholder(name: 'limit'),
|
limit: DartLimitPlaceholder(name: 'limit'),
|
||||||
),
|
),
|
||||||
moorMode: true,
|
driftMode: true,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ void main() {
|
||||||
offset: NumericLiteral(3, token(TokenType.numberLiteral)),
|
offset: NumericLiteral(3, token(TokenType.numberLiteral)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
moorMode: true,
|
driftMode: true,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ void main() {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
moorMode: true,
|
driftMode: true,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ void main() {
|
||||||
from: TableReference('tbl'),
|
from: TableReference('tbl'),
|
||||||
orderBy: DartOrderByPlaceholder(name: 'order'),
|
orderBy: DartOrderByPlaceholder(name: 'order'),
|
||||||
),
|
),
|
||||||
moorMode: true,
|
driftMode: true,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import 'utils.dart';
|
||||||
|
|
||||||
const content = r'''
|
const content = r'''
|
||||||
import 'other.dart';
|
import 'other.dart';
|
||||||
import 'another.moor';
|
import 'another.drift';
|
||||||
|
|
||||||
CREATE TABLE tbl (
|
CREATE TABLE tbl (
|
||||||
id INT NOT NULL PRIMARY KEY AUTOINCREMENT,
|
id INT NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||||
|
@ -22,12 +22,12 @@ add: INSERT INTO tbl $row RETURNING *;
|
||||||
''';
|
''';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
test('parses moor files', () {
|
test('parses drift files', () {
|
||||||
testMoorFile(
|
testDriftFile(
|
||||||
content,
|
content,
|
||||||
MoorFile([
|
DriftFile([
|
||||||
ImportStatement('other.dart'),
|
ImportStatement('other.dart'),
|
||||||
ImportStatement('another.moor'),
|
ImportStatement('another.drift'),
|
||||||
CreateTableStatement(
|
CreateTableStatement(
|
||||||
tableName: 'tbl',
|
tableName: 'tbl',
|
||||||
columns: [
|
columns: [
|
||||||
|
@ -52,11 +52,11 @@ void main() {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
MoorDartName(null, identifier('placeRef')),
|
DriftDartName(null, identifier('placeRef')),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
moorTableName: MoorTableName('RowName', false),
|
driftTableName: DriftTableName('RowName', false),
|
||||||
),
|
),
|
||||||
DeclaredStatement(
|
DeclaredStatement(
|
||||||
SimpleName('all'),
|
SimpleName('all'),
|
||||||
|
@ -129,14 +129,14 @@ void main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('parses transaction blocks', () {
|
test('parses transaction blocks', () {
|
||||||
testMoorFile(
|
testDriftFile(
|
||||||
'''
|
'''
|
||||||
test: BEGIN
|
test: BEGIN
|
||||||
UPDATE foo SET bar = baz;
|
UPDATE foo SET bar = baz;
|
||||||
DELETE FROM t;
|
DELETE FROM t;
|
||||||
END;
|
END;
|
||||||
''',
|
''',
|
||||||
MoorFile([
|
DriftFile([
|
||||||
DeclaredStatement(
|
DeclaredStatement(
|
||||||
SimpleName('test'),
|
SimpleName('test'),
|
||||||
TransactionBlock(
|
TransactionBlock(
|
||||||
|
@ -162,8 +162,8 @@ END;
|
||||||
|
|
||||||
test("reports error when the statement can't be parsed", () {
|
test("reports error when the statement can't be parsed", () {
|
||||||
// regression test for https://github.com/simolus3/moor/issues/280#issuecomment-570789454
|
// regression test for https://github.com/simolus3/moor/issues/280#issuecomment-570789454
|
||||||
final parsed = SqlEngine(EngineOptions(useMoorExtensions: true))
|
final parsed = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
.parseMoorFile('name: NSERT INTO foo DEFAULT VALUES;');
|
.parseDriftFile('name: NSERT INTO foo DEFAULT VALUES;');
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
parsed.errors,
|
parsed.errors,
|
||||||
|
@ -174,7 +174,7 @@ END;
|
||||||
)),
|
)),
|
||||||
);
|
);
|
||||||
|
|
||||||
final root = parsed.rootNode as MoorFile;
|
final root = parsed.rootNode as DriftFile;
|
||||||
expect(
|
expect(
|
||||||
root.allDescendants,
|
root.allDescendants,
|
||||||
isNot(contains(const TypeMatcher<DeclaredStatement>())),
|
isNot(contains(const TypeMatcher<DeclaredStatement>())),
|
||||||
|
@ -182,8 +182,8 @@ END;
|
||||||
});
|
});
|
||||||
|
|
||||||
test('syntax errors contain correct position', () {
|
test('syntax errors contain correct position', () {
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||||
final result = engine.parseMoorFile('''
|
final result = engine.parseDriftFile('''
|
||||||
worksByComposer:
|
worksByComposer:
|
||||||
SELECT DISTINCT A.* FROM works A, works B ON A.id =
|
SELECT DISTINCT A.* FROM works A, works B ON A.id =
|
||||||
WHERE A.composer = :id OR B.composer = :id;
|
WHERE A.composer = :id OR B.composer = :id;
|
||||||
|
@ -198,9 +198,9 @@ SELECT DISTINCT A.* FROM works A, works B ON A.id =
|
||||||
|
|
||||||
test('parses REQUIRED without type hint', () {
|
test('parses REQUIRED without type hint', () {
|
||||||
final variable = ColonVariableToken(fakeSpan(':category'), ':category');
|
final variable = ColonVariableToken(fakeSpan(':category'), ':category');
|
||||||
testMoorFile(
|
testDriftFile(
|
||||||
'test(REQUIRED :category): SELECT :category;',
|
'test(REQUIRED :category): SELECT :category;',
|
||||||
MoorFile([
|
DriftFile([
|
||||||
DeclaredStatement(
|
DeclaredStatement(
|
||||||
SimpleName('test'),
|
SimpleName('test'),
|
||||||
SelectStatement(columns: [
|
SelectStatement(columns: [
|
||||||
|
|
|
@ -10,9 +10,9 @@ void main() {
|
||||||
test('can parse multiple statements', () {
|
test('can parse multiple statements', () {
|
||||||
const sql = 'a: UPDATE tbl SET a = b; b: SELECT * FROM tbl;';
|
const sql = 'a: UPDATE tbl SET a = b; b: SELECT * FROM tbl;';
|
||||||
|
|
||||||
testMoorFile(
|
testDriftFile(
|
||||||
sql,
|
sql,
|
||||||
MoorFile([
|
DriftFile([
|
||||||
DeclaredStatement(
|
DeclaredStatement(
|
||||||
SimpleName('a'),
|
SimpleName('a'),
|
||||||
UpdateStatement(
|
UpdateStatement(
|
||||||
|
@ -39,7 +39,7 @@ void main() {
|
||||||
test('recovers from invalid statements', () {
|
test('recovers from invalid statements', () {
|
||||||
const sql = 'a: UPDATE tbl SET a = * d; b: SELECT * FROM tbl;';
|
const sql = 'a: UPDATE tbl SET a = * d; b: SELECT * FROM tbl;';
|
||||||
final tokens = Scanner(sql).scanTokens();
|
final tokens = Scanner(sql).scanTokens();
|
||||||
final statements = Parser(tokens).moorFile().statements;
|
final statements = Parser(tokens).driftFile().statements;
|
||||||
|
|
||||||
expect(statements, hasLength(1));
|
expect(statements, hasLength(1));
|
||||||
enforceEqual(
|
enforceEqual(
|
||||||
|
@ -54,14 +54,14 @@ void main() {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('parses imports and declared statements in moor mode', () {
|
test('parses imports and declared statements in drift mode', () {
|
||||||
const sql = r'''
|
const sql = r'''
|
||||||
import 'test.dart';
|
import 'test.dart';
|
||||||
query: SELECT * FROM tbl;
|
query: SELECT * FROM tbl;
|
||||||
''';
|
''';
|
||||||
|
|
||||||
final tokens = Scanner(sql, scanMoorTokens: true).scanTokens();
|
final tokens = Scanner(sql, scanDriftTokens: true).scanTokens();
|
||||||
final statements = Parser(tokens, useMoor: true).moorFile().statements;
|
final statements = Parser(tokens, useDrift: true).driftFile().statements;
|
||||||
|
|
||||||
expect(statements, hasLength(2));
|
expect(statements, hasLength(2));
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ import 'utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
test('parses create table statements with a previous malformed inport', () {
|
test('parses create table statements with a previous malformed inport', () {
|
||||||
final file = parseMoor('''
|
final file = parseDrift('''
|
||||||
import ;
|
import ;
|
||||||
CREATE TABLE foo (name TEXT);
|
CREATE TABLE foo (name TEXT);
|
||||||
''');
|
''');
|
||||||
|
@ -16,7 +16,7 @@ CREATE TABLE foo (name TEXT);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('recovers from parsing errors in column definition', () {
|
test('recovers from parsing errors in column definition', () {
|
||||||
final file = parseMoor('''
|
final file = parseDrift('''
|
||||||
CREATE TABLE foo (
|
CREATE TABLE foo (
|
||||||
id INTEGER PRIMARY,
|
id INTEGER PRIMARY,
|
||||||
name TEXT NOT NULL
|
name TEXT NOT NULL
|
||||||
|
@ -41,9 +41,9 @@ CREATE TABLE foo (
|
||||||
});
|
});
|
||||||
|
|
||||||
test('parses trailing comma with error', () {
|
test('parses trailing comma with error', () {
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||||
|
|
||||||
final result = engine.parseMoorFile('''
|
final result = engine.parseDriftFile('''
|
||||||
CREATE TABLE foo (
|
CREATE TABLE foo (
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY,
|
||||||
name TEXT NOT NULL,
|
name TEXT NOT NULL,
|
||||||
|
|
|
@ -28,7 +28,7 @@ void main() {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
moorMode: true,
|
driftMode: true,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import '../utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
test('parses nested query statements', () {
|
test('parses nested query statements', () {
|
||||||
final stmt = SqlEngine(EngineOptions(useMoorExtensions: true))
|
final stmt = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
.parse('SELECT LIST(SELECT * FROM test) FROM test')
|
.parse('SELECT LIST(SELECT * FROM test) FROM test')
|
||||||
.rootNode as SelectStatement;
|
.rootNode as SelectStatement;
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ void main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('parses nested query statements with as', () {
|
test('parses nested query statements with as', () {
|
||||||
final stmt = SqlEngine(EngineOptions(useMoorExtensions: true))
|
final stmt = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
.parse('SELECT LIST(SELECT * FROM test) AS newname FROM test')
|
.parse('SELECT LIST(SELECT * FROM test) AS newname FROM test')
|
||||||
.rootNode as SelectStatement;
|
.rootNode as SelectStatement;
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ void main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('parses clauses with NULLS FIRST or NULLS LAST', () {
|
test('parses clauses with NULLS FIRST or NULLS LAST', () {
|
||||||
final parsed = SqlEngine(EngineOptions(useMoorExtensions: true))
|
final parsed = SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
.parse(r'SELECT * FROM tbl ORDER BY $a NULLS LAST, b NULLS FIRST')
|
.parse(r'SELECT * FROM tbl ORDER BY $a NULLS LAST, b NULLS FIRST')
|
||||||
.rootNode as SelectStatement;
|
.rootNode as SelectStatement;
|
||||||
|
|
||||||
|
|
|
@ -24,21 +24,21 @@ IdentifierToken identifier(String content) {
|
||||||
return IdentifierToken(false, fakeSpan(content));
|
return IdentifierToken(false, fakeSpan(content));
|
||||||
}
|
}
|
||||||
|
|
||||||
MoorFile parseMoor(String content) {
|
DriftFile parseDrift(String content) {
|
||||||
return SqlEngine(EngineOptions(useMoorExtensions: true))
|
return SqlEngine(EngineOptions(useDriftExtensions: true))
|
||||||
.parseMoorFile(content)
|
.parseDriftFile(content)
|
||||||
.rootNode as MoorFile;
|
.rootNode as DriftFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
void testMoorFile(String moorFile, MoorFile expected) {
|
void testDriftFile(String driftFile, DriftFile expected) {
|
||||||
final parsed = parseMoor(moorFile);
|
final parsed = parseDrift(driftFile);
|
||||||
enforceHasSpan(parsed);
|
enforceHasSpan(parsed);
|
||||||
enforceEqual(parsed, expected);
|
enforceEqual(parsed, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testStatement(String sql, AstNode expected, {bool moorMode = false}) {
|
void testStatement(String sql, AstNode expected, {bool driftMode = false}) {
|
||||||
final result =
|
final result =
|
||||||
SqlEngine(EngineOptions(useMoorExtensions: moorMode)).parse(sql);
|
SqlEngine(EngineOptions(useDriftExtensions: driftMode)).parse(sql);
|
||||||
expect(result.errors, isEmpty);
|
expect(result.errors, isEmpty);
|
||||||
|
|
||||||
final parsed = result.rootNode;
|
final parsed = result.rootNode;
|
||||||
|
|
|
@ -3,9 +3,9 @@ import 'package:sqlparser/src/reader/tokenizer/token.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
test('parses moor specific tokens', () {
|
test('parses drift specific tokens', () {
|
||||||
const part = 'c INTEGER MAPPED BY `const Mapper()` NOT NULL **';
|
const part = 'c INTEGER MAPPED BY `const Mapper()` NOT NULL **';
|
||||||
final scanner = Scanner(part, scanMoorTokens: true);
|
final scanner = Scanner(part, scanDriftTokens: true);
|
||||||
final tokens = scanner.scanTokens();
|
final tokens = scanner.scanTokens();
|
||||||
|
|
||||||
expect(scanner.errors, isEmpty);
|
expect(scanner.errors, isEmpty);
|
||||||
|
|
|
@ -3,7 +3,7 @@ import 'package:sqlparser/src/reader/tokenizer/scanner.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
test('parses ** as two tokens when not using moor mode', () {
|
test('parses ** as two tokens when not using drift mode', () {
|
||||||
final tokens = Scanner('**').scanTokens();
|
final tokens = Scanner('**').scanTokens();
|
||||||
expect(tokens.map((e) => e.type),
|
expect(tokens.map((e) => e.type),
|
||||||
containsAllInOrder([TokenType.star, TokenType.star]));
|
containsAllInOrder([TokenType.star, TokenType.star]));
|
||||||
|
|
|
@ -3,10 +3,10 @@ import 'package:sqlparser/src/utils/ast_equality.dart';
|
||||||
import 'package:sqlparser/utils/node_to_text.dart';
|
import 'package:sqlparser/utils/node_to_text.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
enum _ParseKind { statement, moorFile }
|
enum _ParseKind { statement, driftFile }
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
final engine = SqlEngine(EngineOptions(useMoorExtensions: true));
|
final engine = SqlEngine(EngineOptions(useDriftExtensions: true));
|
||||||
|
|
||||||
void testFormat(String input, {_ParseKind kind = _ParseKind.statement}) {
|
void testFormat(String input, {_ParseKind kind = _ParseKind.statement}) {
|
||||||
AstNode parse(String input) {
|
AstNode parse(String input) {
|
||||||
|
@ -16,8 +16,8 @@ void main() {
|
||||||
case _ParseKind.statement:
|
case _ParseKind.statement:
|
||||||
result = engine.parse(input);
|
result = engine.parse(input);
|
||||||
break;
|
break;
|
||||||
case _ParseKind.moorFile:
|
case _ParseKind.driftFile:
|
||||||
result = engine.parseMoorFile(input);
|
result = engine.parseDriftFile(input);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -452,28 +452,28 @@ CREATE UNIQUE INDEX my_idx ON t1 (c1, c2, c3) WHERE c1 < c3;
|
||||||
testWith(r'a$b', r'"a$b"');
|
testWith(r'a$b', r'"a$b"');
|
||||||
});
|
});
|
||||||
|
|
||||||
group('moor', () {
|
group('drift', () {
|
||||||
test('dart placeholders', () {
|
test('dart placeholders', () {
|
||||||
testFormat(r'SELECT $placeholder FROM foo');
|
testFormat(r'SELECT $placeholder FROM foo');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('imports', () {
|
test('imports', () {
|
||||||
testFormat('import \'foo.bar\';', kind: _ParseKind.moorFile);
|
testFormat('import \'foo.bar\';', kind: _ParseKind.driftFile);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('declared statements', () {
|
test('declared statements', () {
|
||||||
testFormat('foo (?1 AS INT): SELECT * FROM bar WHERE ? < 10;',
|
testFormat('foo (?1 AS INT): SELECT * FROM bar WHERE ? < 10;',
|
||||||
kind: _ParseKind.moorFile);
|
kind: _ParseKind.driftFile);
|
||||||
testFormat('foo: SELECT * FROM bar WHERE :id < 10;',
|
testFormat('foo: SELECT * FROM bar WHERE :id < 10;',
|
||||||
kind: _ParseKind.moorFile);
|
kind: _ParseKind.driftFile);
|
||||||
testFormat('foo (REQUIRED :x AS TEXT OR NULL): SELECT :x;',
|
testFormat('foo (REQUIRED :x AS TEXT OR NULL): SELECT :x;',
|
||||||
kind: _ParseKind.moorFile);
|
kind: _ParseKind.driftFile);
|
||||||
testFormat(r'foo ($pred = FALSE): SELECT * FROM bar WHERE $pred;',
|
testFormat(r'foo ($pred = FALSE): SELECT * FROM bar WHERE $pred;',
|
||||||
kind: _ParseKind.moorFile);
|
kind: _ParseKind.driftFile);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('nested star', () {
|
test('nested star', () {
|
||||||
testFormat('q: SELECT foo.** FROM foo;', kind: _ParseKind.moorFile);
|
testFormat('q: SELECT foo.** FROM foo;', kind: _ParseKind.driftFile);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('transaction block', () {
|
test('transaction block', () {
|
||||||
|
@ -486,7 +486,7 @@ test: BEGIN TRANSACTION
|
||||||
INSERT INTO foo VALUES (x, y, z);
|
INSERT INTO foo VALUES (x, y, z);
|
||||||
COMMIT TRANSACTION;
|
COMMIT TRANSACTION;
|
||||||
''',
|
''',
|
||||||
kind: _ParseKind.moorFile,
|
kind: _ParseKind.driftFile,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue