mirror of https://github.com/AMT-Cheif/drift.git
67 lines
1.9 KiB
Dart
67 lines
1.9 KiB
Dart
import 'package:sqlparser/sqlparser.dart';
|
|
|
|
// Example that parses a select statement on some tables defined below and
|
|
// prints what columns would be returned by that statement.
|
|
void main() {
|
|
final engine = SqlEngine()
|
|
..registerTableFromSql(
|
|
'''
|
|
CREATE TABLE frameworks (
|
|
id INTEGER NOT NULL PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
popularity REAL NOT NULL
|
|
);
|
|
''',
|
|
)
|
|
..registerTableFromSql(
|
|
'''
|
|
CREATE TABLE languages (
|
|
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL
|
|
);
|
|
''',
|
|
)
|
|
..registerTableFromSql(
|
|
'''
|
|
CREATE TABLE uses_language (
|
|
framework INTEGER NOT NULL REFERENCES frameworks (id),
|
|
language INTEGER NOT NULL REFERENCES languages (id),
|
|
PRIMARY KEY (framework, language)
|
|
);
|
|
''',
|
|
);
|
|
|
|
// Use SqlEngine.analyze to parse a single sql statement and analyze it.
|
|
// Analysis can be used to find semantic errors, lints and inferred types of
|
|
// expressions or result columns.
|
|
final result = engine.analyze('''
|
|
SELECT f.* FROM frameworks f
|
|
INNER JOIN uses_language ul ON ul.framework = f.id
|
|
INNER JOIN languages l ON l.id = ul.language
|
|
WHERE l.name = 'Dart'
|
|
ORDER BY f.name ASC, f.popularity DESC
|
|
LIMIT 5 OFFSET 5 * 3
|
|
''');
|
|
|
|
result.errors.forEach(print);
|
|
|
|
final select = result.root as SelectStatement;
|
|
final columns = select.resolvedColumns!;
|
|
|
|
print('the query returns ${columns.length} columns');
|
|
|
|
for (final column in columns) {
|
|
final type = result.typeOf(column);
|
|
print('${column.name}, which will be a $type');
|
|
}
|
|
}
|
|
|
|
extension on SqlEngine {
|
|
/// Utility function that parses a `CREATE TABLE` statement and registers the
|
|
/// created table to the engine.
|
|
void registerTableFromSql(String createTable) {
|
|
final stmt = parse(createTable).rootNode as CreateTableStatement;
|
|
registerTable(schemaReader.read(stmt));
|
|
}
|
|
}
|