| Crates.io | vibesql-rs |
| lib.rs | vibesql-rs |
| version | 0.1.0 |
| created_at | 2025-12-05 22:21:32.519154+00 |
| updated_at | 2025-12-05 22:21:32.519154+00 |
| description | A SQL parser and semantic analyzer conforming to modern ISO SQL standards |
| homepage | https://github.com/bherbruck/vibesql |
| repository | https://github.com/bherbruck/vibesql |
| max_upload_size | |
| id | 1969322 |
| size | 1,961,121 |
A SQL parser and semantic analyzer written in Rust, conforming to modern ISO SQL standards.
vibesql provides a complete SQL parsing and analysis pipeline that can be used as a middleware layer between transport and storage layers in database systems. It parses SQL into a rich AST, performs semantic analysis with type checking, and provides a catalog system for schema management.
Queries:
DML:
DDL:
Expressions:
Types:
Add to your Cargo.toml:
[dependencies]
vibesql = "0.1"
use vibesql::Parser;
let sql = "SELECT id, name FROM users WHERE age > 21";
let mut parser = Parser::new(sql);
let statements = parser.parse().expect("Failed to parse SQL");
for stmt in statements {
println!("{:#?}", stmt);
}
use vibesql::{Parser, Analyzer, CatalogBuilder, SqlType};
// Build a catalog with tables and built-in functions
let catalog = CatalogBuilder::new()
.with_builtins()
.add_table("users", |t| {
t.primary_key("id", SqlType::Int64)
.column("name", SqlType::Varchar)
.column("age", SqlType::Int64)
})
.build();
// Parse and analyze
let sql = "SELECT id, name FROM users WHERE age > 21";
let mut parser = Parser::new(sql);
let statements = parser.parse().expect("Failed to parse");
let mut analyzer = Analyzer::with_catalog(catalog);
// Analyze queries for type information, column resolution, etc.
use vibesql::catalog::{CatalogBuilder, TypeRegistry};
use vibesql::types::SqlType;
// Add custom functions
let catalog = CatalogBuilder::new()
.with_builtins()
.add_scalar_function("MY_HASH", SqlType::Int64)
.add_aggregate_function("CUSTOM_SUM", SqlType::Float64)
.add_window_function("CUSTOM_RANK", SqlType::Int64)
.build();
// Add custom type aliases
let mut registry = TypeRegistry::new();
registry.add_alias("SERIAL", SqlType::Int32);
registry.add_alias("MONEY", SqlType::Numeric { precision: Some(19), scale: Some(4) });
use vibesql::{Parser, Error};
let sql = "SELECT * FORM users"; // Typo: FORM instead of FROM
let mut parser = Parser::new(sql);
match parser.parse() {
Ok(statements) => println!("Parsed {} statements", statements.len()),
Err(e) => {
eprintln!("Parse error: {}", e);
if let Some(span) = e.span() {
eprintln!("At position: {:?}", span);
}
}
}
The csv_database example demonstrates using vibesql as a SQL frontend for a simple CSV-backed database:
# Seed with sample relational data
cargo run --example csv_database seed
# Run queries
cargo run --example csv_database -c "SELECT * FROM employees LIMIT 5"
# Join tables
cargo run --example csv_database -c "SELECT e.name, d.name as department
FROM employees e
JOIN departments d ON e.department_id = d.id"
# Aggregations
cargo run --example csv_database -c "SELECT d.name, COUNT(*), AVG(e.salary)
FROM employees e
JOIN departments d ON e.department_id = d.id
GROUP BY d.name"
# Export to CSV
cargo run --example csv_database --csv -c "SELECT * FROM employees" -o employees.csv
vibesql
├── lexer/ # Tokenizer (keywords, operators, literals)
├── parser/ # SQL parser (expressions, queries, statements)
├── ast/ # Abstract syntax tree definitions
├── analyzer/ # Semantic analysis and type checking
├── catalog/ # Schema management (tables, functions, type registry)
├── types/ # SQL type system
└── error/ # Error types and reporting
MIT