Skip to main content

SQLite SQL tools — parser, formatter, validator, and MCP server

Project description

  syntaqlite

CI Crates.io VS Code

A parser, formatter, validator, and language server for SQLite SQL, built on SQLite's own grammar and tokenizer. If SQLite accepts it, syntaqlite parses it. If SQLite rejects it, so does syntaqlite.

Docs · Playground · VS Code Extension · MCP Server

Note: syntaqlite is at 0.x — APIs and CLI flags may change before 1.0.

Why syntaqlite

Developer tooling for SQLite treats it as a second-class language. Most tools build a generic SQL parser and bolt SQLite on as a "flavor" — hand-written grammars, regex-based tokenizers, or subsets of SQL that approximate SQLite rather than matching it. That falls apart because SQLite has a deep surface area of syntax that generic parsers don't handle.

syntaqlite uses SQLite's own Lemon-generated grammar and tokenizer, compiled from C. The parser doesn't approximate SQLite — it is SQLite's grammar compiled into a reusable library.

SQLite SQL is also not one fixed language. It has 22 compile-time flags that change what syntax the parser accepts, another 12 that gate built-in functions, and the language constantly evolves across versions. Because SQLite is embedded, you can't assume everyone is on the latest version — Android 15 ships SQLite 3.44.3, seven major versions behind latest. syntaqlite tracks all of this:

syntaqlite --sqlite-version 3.32.0 validate \
  -e "DELETE FROM users WHERE id = 1 RETURNING *;"
error: syntax error near 'RETURNING'
 --> <stdin>:1:32
  |
1 | DELETE FROM users WHERE id = 1 RETURNING *;
  |                                ^~~~~~~~~

RETURNING was added in SQLite 3.35.0 — Android 13 still ships SQLite 3.32.2.

We've tested against ~396K statements from SQLite's upstream test suite with ~99.7% agreement on parse acceptance. See the detailed comparison for how syntaqlite stacks up against other tools in parser accuracy, formatter correctness, validator quality, and performance.

What it does

Validate — catch errors without a database (docs)

Finds unknown tables, columns, and functions against your schema — the same errors sqlite3_prepare would catch, but without needing a database. Unlike sqlite3, syntaqlite finds all errors in one pass:

CREATE TABLE orders (id, status, total, created_at);

WITH
  monthly_stats(month, revenue, order_count) AS (
    SELECT strftime('%Y-%m', o.created_at), SUM(o.total)
    FROM orders o WHERE o.status = 'completed'
    GROUP BY strftime('%Y-%m', o.created_at)
  )
SELECT ms.month, ms.revenue, ms.order_count,
  ROUDN(ms.revenue / ms.order_count, 2) AS avg_order
FROM monthly_stats ms;

sqlite3 stops at the first error and misses the function typo entirely:

Error: in prepare, table monthly_stats has 2 values for 3 columns

syntaqlite finds both — CTE column count mismatch and the ROUDN typo — with source locations and suggestions:

error: table 'monthly_stats' has 2 values for 3 columns
  |
2 | monthly_stats(month, revenue,
  | ^~~~~~~~~~~~~

warning: unknown function 'ROUDN'
   |
14 | ROUDN(ms.revenue / ms.order_count,
   | ^~~~~
   = help: did you mean 'round'?

Format (docs)

Deterministic formatting with configurable line width, keyword casing, and indentation:

echo "select u.id,u.name, p.title from users u join posts p on u.id=p.user_id
where u.active=1 and p.published=true order by p.created_at desc limit 10" \
  | syntaqlite fmt
SELECT u.id, u.name, p.title
FROM users u
  JOIN posts p ON u.id = p.user_id
WHERE u.active = 1
  AND p.published = true
ORDER BY p.created_at DESC
LIMIT 10;

Version and compile-flag aware (docs)

Pin the parser to a specific SQLite version or enable compile-time flags to match your exact build:

# Reject syntax your target SQLite version doesn't support
syntaqlite --sqlite-version 3.32.0 validate query.sql

# Enable optional syntax from compile-time flags
syntaqlite --sqlite-cflag SQLITE_ENABLE_MATH_FUNCTIONS validate query.sql

Validate SQL inside other languages (experimental)

SQL lives inside Python and TypeScript strings in most real codebases. syntaqlite extracts and validates it, handling interpolation holes:

# app.py
def get_user_stats(user_id: int):
    return conn.execute(
        f"SELECT nme, ROUDN(score, 2) FROM users WHERE id = {user_id}"
    )
syntaqlite validate --experimental-lang python app.py
warning: unknown function 'ROUDN'
 --> app.py:3:23
  |
3 |         f"SELECT nme, ROUDN(score, 2) FROM users WHERE id = {user_id}"
  |                       ^~~~~
  = help: did you mean 'round'?

Editor integration (docs)

Full language server — no database connection required. Diagnostics, format on save, completions, and semantic highlighting.

VS Code — install the syntaqlite extension from the marketplace.

Claude Codesyntaqlite plugin install · Claude Desktop / Cursorpip install syntaqlite[mcp] (docs)

Other editors — point your LSP client at:

syntaqlite lsp

Parse (docs)

Full abstract syntax tree with side tables for tokens, comments, and whitespace — for code generation, migration tooling, or static analysis.

syntaqlite parse -e "SELECT 1 + 2" --output text

Install (all methods)

Download and run (all platforms, no install)

curl -sSf https://raw.githubusercontent.com/LalitMaganti/syntaqlite/main/tools/syntaqlite | python3 - fmt -e "select 1"

Downloads the binary on first run, caches it, auto-updates weekly.

mise

mise use github:LalitMaganti/syntaqlite

pip (all platforms, bundled binary)

pip install syntaqlite

Homebrew (macOS)

brew install LalitMaganti/tap/syntaqlite

Cargo

cargo install syntaqlite-cli

Use as a library (docs)

Rust (API docs)

[dependencies]
syntaqlite = { version = "0.0.21", features = ["fmt"] }

JavaScript / WASM (API docs)

npm install @syntaqlite/js

C — the parser, tokenizer, formatter, and validator all have C APIs. See the C API docs for details.

Architecture (docs)

The parser and tokenizer are written in C, directly wrapping SQLite's own grammar. Everything else — formatter, validator, LSP — is written in Rust with C bindings available.

The split is intentional. The C parser is as portable as SQLite itself: it can run inside database engines, embedded systems, or anywhere SQLite runs. The Rust layer moves fast for developer tooling where the standard library and the crate ecosystem matter.

Building from source

tools/install-build-deps
tools/cargo build

Contributing

See the contributing guide for architecture overview and testing instructions.

License

Apache 2.0. SQLite components are public domain under the SQLite blessing. See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

syntaqlite-0.0.21-py3-none-win_arm64.whl (3.9 MB view details)

Uploaded Python 3Windows ARM64

syntaqlite-0.0.21-py3-none-win_amd64.whl (4.2 MB view details)

Uploaded Python 3Windows x86-64

syntaqlite-0.0.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

syntaqlite-0.0.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

syntaqlite-0.0.21-py3-none-macosx_11_0_arm64.whl (4.2 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

syntaqlite-0.0.21-py3-none-macosx_10_12_x86_64.whl (4.3 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file syntaqlite-0.0.21-py3-none-win_arm64.whl.

File metadata

  • Download URL: syntaqlite-0.0.21-py3-none-win_arm64.whl
  • Upload date:
  • Size: 3.9 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for syntaqlite-0.0.21-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 9d50d170072042a44268e2835b857aaf3e64620810f12a4ddef96d0506ee2249
MD5 5eb381e6697af49a0c532d903a4f3905
BLAKE2b-256 fff6021c626e276e6368ac3b02d827214c5978a92a51a0ba00f2a1f2c80e17e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.21-py3-none-win_arm64.whl:

Publisher: publish-pypi.yml on LalitMaganti/syntaqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file syntaqlite-0.0.21-py3-none-win_amd64.whl.

File metadata

  • Download URL: syntaqlite-0.0.21-py3-none-win_amd64.whl
  • Upload date:
  • Size: 4.2 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for syntaqlite-0.0.21-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 b8ec27522bdecab6ed010e534979084488b4a1212a5ba079e5e53ee8262fb043
MD5 35d626ff7cf0f481551b3d852b1feac7
BLAKE2b-256 fbf780477ec6c2d0715aac639d5721441e2b458bee283741756aec81dfe0111a

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.21-py3-none-win_amd64.whl:

Publisher: publish-pypi.yml on LalitMaganti/syntaqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file syntaqlite-0.0.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.0.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fe5a013cae6ea9efb1756a1d8e46a056c6b4d1949bb1c4eac3366072074e7be1
MD5 b8ad2f11dc9fc86d754090c167059bec
BLAKE2b-256 9b92a1250c4421873349a9df986bf76b275bdc283250d3d301196c811ee572c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-pypi.yml on LalitMaganti/syntaqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file syntaqlite-0.0.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.0.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a5e22612b98a0984494c78b4f7c216ae7889753b1745403a1d5d6ad6b3765d67
MD5 32884bc338c070c3dff64fa12ecf962e
BLAKE2b-256 9d76a216094c5bd249ef29707e6c445e9d1f706c661cb1882ef6b3b183aa8f68

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish-pypi.yml on LalitMaganti/syntaqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file syntaqlite-0.0.21-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.0.21-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 149907bac836fd51cfce1b4405d577e67d7192159b493098e46eec0cd21da902
MD5 34edbd689b38759e336b4a898ffbf825
BLAKE2b-256 444a6a51817274648771d04f8067ae2109cf6e3919f5625b7a4924d521863093

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.21-py3-none-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on LalitMaganti/syntaqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file syntaqlite-0.0.21-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.0.21-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ee58c42ee36ef5883569109e96ecdcda03aacd0b6f183cfc70e93f0f6300ee22
MD5 8ee867456dc55db2b29c083d5a0c1b40
BLAKE2b-256 9f435594a3b32cc45f5e4e20b1ed3d1e7f3294a6d77b67412b487cfe31f621b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.21-py3-none-macosx_10_12_x86_64.whl:

Publisher: publish-pypi.yml on LalitMaganti/syntaqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page