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.23", features = ["fmt"] }

JavaScript / WASM (API docs)

npm install syntaqlite

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.23-py3-none-win_arm64.whl (3.9 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

syntaqlite-0.0.23-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.23-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

syntaqlite-0.0.23-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.23-py3-none-win_arm64.whl.

File metadata

  • Download URL: syntaqlite-0.0.23-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.23-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 7beb2be5c32981988746e6ba9c00fc179d623b5dc84a1eb4cae2c7101aaa7c9a
MD5 1cab8b0acad85c473601e9d2249d2a53
BLAKE2b-256 0f7a38f99ce32328c5f7b96d90f5bbc2b56296a363a3e3d0d4512dca10df7232

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.23-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.23-py3-none-win_amd64.whl.

File metadata

  • Download URL: syntaqlite-0.0.23-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.23-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 b3a028eb1ea50d2e9c91f5f0aba70aebdc92cc5f4e44546d7d1888b3a602826b
MD5 0fa4faad0d39392f36bfe5ac58dcc9cd
BLAKE2b-256 5504d2d07b3fe6138dd4207e34932e9ea21fad4c4fa4fecba115e500b695d64d

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.23-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.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.0.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5b3f22722426adec227f01573efbe88e9c7d886fbe25ab580385e78888c7e465
MD5 9f915e5457c9ad8a2fb71510d7c49d20
BLAKE2b-256 d3fd960a471e0dbbf4552e97406d052a6ad426ec3f9550cb58e73ec1cbbd2bd4

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.23-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.23-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.0.23-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a44db0388fee998b7adac60a83e6879331c545752dfac7174927db9a08b435d4
MD5 e6106590754415e6d012cebed0468320
BLAKE2b-256 847cbe15087f0c8aa8022e808dbe130d724b62575470daa02cfa9211ee2f6e3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.23-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.23-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.0.23-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0467fe1439efe33490a122878725a9096992e1bff72016b8d48a8e544267dec3
MD5 767e9c83527ff885403d18ce44c72907
BLAKE2b-256 1e27c1e7001dbba7862698d56338c9f7609876edca5110f328fb00228e28eb4b

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.23-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.23-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.0.23-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3b67c32a24cff42336ac08f08e5dae6ee2b3885dc4359b430eb272c0dee91171
MD5 bf5ab8229524c358e58f14daf61e2045
BLAKE2b-256 d67576814e38e0eb10d528b93b26582fc2c0df75a9083bc6a23485c69bd7c8b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.0.23-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