A comprehensive SQL parser library for MoonBit that supports multiple SQL dialects and all major SQL language categories.
// Parse a simple SELECT statement
let sql = "SELECT name, age FROM users WHERE age > 18"
let statements = parse_sql(sql)
let pretty_output = statements.stmts[0] |> pretty_print
println(pretty_output)
// Parse complex queries with CTEs
let complex_sql = """
WITH sales AS (
SELECT user_id, SUM(amount) as total
FROM orders
WHERE date > '2023-01-01'
GROUP BY user_id
)
SELECT u.name, s.total
FROM users u
JOIN sales s ON u.id = s.user_id
ORDER BY s.total DESC
LIMIT 10
"""
let result = parse_sql(complex_sql)
// Parse transaction control statements
let tcl_sql = "BEGIN TRANSACTION; INSERT INTO users VALUES ('Alice'); COMMIT;"
let tcl_statements = parse_sql(tcl_sql)
// Parse data control statements
let dcl_sql = "GRANT SELECT, INSERT ON users TO alice WITH GRANT OPTION"
let dcl_result = parse_sql(dcl_sql)
// Dialect-specific parsing
let mysql_sql = "SHOW TABLES LIKE 'user%'"
let mysql_result = parse_sql(dialect=MySQL::{}, mysql_sql)The parser follows a modular design:
- Lexer (
lexer.mbt): Tokenizes SQL input with dialect-aware keyword recognition - Parser (
parser.mbt): Main parsing logic with statement dispatching - AST (
ast.mbt): Complete Abstract Syntax Tree definitions with pretty printing - Dialect Modules: Separate modules for each SQL dialect (
mysql.mbt,postgres.mbt, etc.) - Language Modules:
dml.mbt: Data Manipulation Language parsingddl.mbt: Data Definition Language parsingtcl.mbt: Transaction Control Language parsingdcl.mbt: Data Control Language parsing
The library includes comprehensive test coverage with 284+ tests covering:
- All SQL statement types across all language categories
- Dialect-specific features and syntax variations
- Complex expressions and nested queries
- Edge cases and error handling
- Pretty printing accuracy
Run tests with:
moon testThe parser is designed for extensibility. To add new SQL features:
- Add keywords to
keyword.mbtandlexer.mbt - Define AST structures in
ast.mbt - Implement parsing logic in appropriate language module
- Add statement cases to
parser.mbt
The parser is designed for extensibility. To add new SQL features:
- Add keywords to
keyword.mbtandlexer.mbt - Define AST structures in
ast.mbt - Implement parsing logic in appropriate language module
- Add statement cases to
parser.mbt - Write comprehensive tests
See ROADMAP.md for planned features and implementation priorities.
This project is licensed under the Apache 2.0 License.