| Crates.io | lialoonk-sql-query-parser |
| lib.rs | lialoonk-sql-query-parser |
| version | 0.1.0 |
| created_at | 2025-11-15 22:44:47.383334+00 |
| updated_at | 2025-11-15 22:44:47.383334+00 |
| description | A comprehensive SQL query parser and analyzer built with Rust, providing detailed metadata extraction and JSON serialization of parsed SQL statements. |
| homepage | https://github.com/Lialoonk/sql-query-parser |
| repository | https://github.com/Lialoonk/sql-query-parser |
| max_upload_size | |
| id | 1934890 |
| size | 54,931 |
A comprehensive SQL query parser and analyzer built with Rust, providing detailed metadata extraction and JSON serialization of parsed SQL statements.
This project implements a complete SQL parser that can analyze SELECT, INSERT, UPDATE, and DELETE statements. The parser extracts valuable metadata including table names, column references, function calls, aliases, and JOIN operations, making it useful for SQL analysis, optimization, and code generation tools.
The SQL parser uses the Pest parser generator to define a comprehensive grammar for SQL syntax. The parsing process follows these steps:
grammar/grammar.pestThe parser supports the following SQL constructs:
# Parse SQL from command line
lialoonk-sql-query-parser parse --query "SELECT * FROM users"
# Analyze query metadata
lialoonk-sql-query-parser parse --query "SELECT SUM(price) FROM orders" --format analyze
# Parse from file
lialoonk-sql-query-parser parse --file query.sql --format json
# Display help
lialoonk-sql-query-parser help
# Display project credits
lialoonk-sql-query-parser credits
use lialoonk_sql_query_parser::{parse_sql, analyze_sql, analyze_sql_json};
let sql = "SELECT id, name FROM users WHERE id = 1";
// Parse to AST
let ast = parse_sql(sql)?;
// Extract metadata
let metadata = analyze_sql(sql)?;
// Serialize to JSON
let json = analyze_sql_json(sql)?;
The parser uses a comprehensive grammar defined in grammar/grammar.pest with over 60 rules covering all major SQL constructs. Each rule is thoroughly documented and tested.
Here are some key grammar rules with examples:
select_stmt = { SELECT_KEY ~ projection ~ (FROM_KEY ~ from_item ~ join_clause?)? ~ where_clause? }
Parses queries like:
SELECT id, name FROM users WHERE id = 1
SELECT * FROM users u JOIN posts p ON u.id = p.user_id
expr = { or_expr }
or_expr = { and_expr ~ (OR_KEY ~ and_expr)* }
and_expr = { not_expr ~ (AND_KEY ~ not_expr)* }
comparison = { addition ~ comparison_suffix* }
Supports complex expressions:
WHERE (price > 100 AND category = 'electronics') OR status = 'active'
WHERE age BETWEEN 18 AND 65
function_call = { identifier ~ "(" ~ (expr ~ ("," ~ expr)*)? ~ ")" }
Handles both regular and aggregate functions:
SELECT COUNT(*), SUM(price), AVG(rating) FROM products
SELECT UPPER(name), CONCAT(first_name, ' ', last_name) FROM users
The parser follows a modular architecture:
grammar/grammar.pest): Defines SQL syntax rules using Pest's PEG grammarsrc/lib.rs): Core parsing logic with AST constructionsrc/lib.rs): Metadata extraction and semantic analysissrc/main.rs): Command-line interface using Claptests/parser_rules.rs): Comprehensive unit test coverageThe parser extracts comprehensive metadata from SQL queries. Here are examples of analysis output:
Input:
SELECT id, name FROM users WHERE active = true
Analysis Output:
{
"tables": ["users"],
"columns": ["id", "name", "active"],
"aliases": {},
"functions": [],
"aggregates": [],
"joins": []
}
Input:
SELECT u.name, COUNT(o.id) as order_count, SUM(o.total) as total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.created_at > '2023-01-01'
GROUP BY u.id, u.name
HAVING COUNT(o.id) > 0
Analysis Output:
{
"tables": ["users", "orders"],
"columns": ["u.name", "o.id", "o.total", "u.created_at", "u.id"],
"aliases": {
"u": "users",
"o": "orders"
},
"functions": ["COUNT", "SUM"],
"aggregates": ["COUNT", "SUM"],
"joins": [
{
"join_type": "LEFT",
"table": "orders",
"alias": "o",
"condition": "u.id = o.user_id"
}
]
}
Input:
INSERT INTO products (name, price, category) VALUES ('Laptop', 999.99, 'Electronics')
Analysis Output:
{
"tables": ["products"],
"columns": ["name", "price", "category"],
"aliases": {},
"functions": [],
"aggregates": [],
"joins": []
}