Rust API reference

Feature flags

FeatureWhat it enables
fmtFormatter
validationSemantic analysis (unknown tables, columns, functions)
sqliteBuilt-in SQLite dialect (enabled by default)
lspLanguage server protocol implementation
serde-jsonJSON serialization for AST and diagnostics
dynloadLoad custom dialects from shared libraries at runtime

Formatter

Type / MethodDescription
Formatter::new()Create with SQLite dialect and default settings
Formatter::with_config(&FormatConfig)Create with custom config
fmt.format(sql) -> Result<String>Format SQL string
FormatConfigBuilder: with_line_width(), with_indent_width(), with_keyword_case(), with_semicolons()
KeywordCaseUpper or Lower

The formatter is reusable; call format() repeatedly. Internal allocations are reused across calls. Defaults: 80-char lines, 2-space indent, uppercase keywords, semicolons on.

Parser

Type / MethodDescription
Parser::new()Create a parser for the SQLite grammar
parser.parse(sql) -> ParseSessionStart a parse session
session.next() -> ParseOutcomeYield next statement
ParseOutcome::Ok(stmt)Successfully parsed statement
ParseOutcome::Err(err)Parse error (parser recovers and continues)
ParseOutcome::DoneNo more statements

The parser yields statements one at a time, reusing internal allocations. It recovers from errors and continues parsing subsequent statements.

Tokenizer

Type / MethodDescription
Tokenizer::new()Create a tokenizer for the SQLite grammar
tokenizer.tokenize(sql) -> Result<Vec<Token>>Tokenize SQL string
Tokentoken_type, text, byte offsets into source

Zero-copy: tokens reference byte offsets into the source string.

Validator

Type / MethodDescription
SemanticAnalyzer::new()Create an analyzer for the SQLite dialect
analyzer.analyze(sql, &catalog, &config) -> SemanticModelAnalyze SQL, returning diagnostics and lineage
Catalog::new(dialect)Create an empty catalog
catalog.layer_mut(CatalogLayer::Database).insert_table(name, cols, false)Register a table
ValidationConfig::default()Default config (warnings for unknowns)
ValidationConfig::default().with_strict_schema()Strict mode (errors for unknowns)
model.diagnostics()Parse and semantic diagnostics

The analyzer is reusable; call analyze() repeatedly. The catalog uses a layered resolution order; populate the Database layer with your schema.

Lineage

After analyze(), the returned SemanticModel provides column-level lineage for SELECT statements. Lineage traces each result column back to its source table and column.

Type / MethodDescription
model.lineage()Per-column lineage: Option<LineageResult<&[ColumnLineage]>>
model.relations_accessed()Relations in FROM: Option<LineageResult<&[RelationAccess]>>
model.tables_accessed()Physical tables after resolving CTEs/views: Option<LineageResult<&[TableAccess]>>
LineageResult<T>Complete(T) — fully resolved, or Partial(T) — some view bodies unavailable
ColumnLineagename: String, index: u32, origin: Option<ColumnOrigin>
ColumnOrigintable: String, column: String
RelationAccessname: String, kind: RelationKind
RelationKindTable or View
TableAccessname: String

Returns None for non-query statements (CREATE, INSERT, etc.). Returns Partial when a view is referenced but its body is unavailable for resolution.