trino-sql-validator
Fast Trino SQL syntax validator — a Python library whose core is written in Rust and compiled to a native extension via PyO3 + maturin.
Installable from PyPI:
pip install trino-sql-validator
Quickstart
from trino_sql_validator import validate, validate_file
# A string with one or many statements
result = validate("SELECT 1; SELECT * FROM t WHERE a > 0;")
assert result.valid
assert result.statement_count == 2
# Invalid SQL returns a value, never raises
result = validate("SELECT * FORM t")
assert not result.valid
print(result.error) # e.g. "Expected: end of statement, found: FORM at line 1, column 10"
print(result.error.line) # 1
# Validate a file
result = validate_file("queries.sql", dialect="trino")
Invalid SQL (and files containing it) is returned as a ValidationResult;
it is not raised as an exception. Only genuine misuse (unknown dialect,
unreadable file) raises.
Catalog warnings (functions and data types)
For dialect="trino", validate() also checks that every function called and
every data type used in the SQL exists in the documented Trino catalog. Unknown
names are reported as non-fatal warnings — valid stays True because syntax
is fine:
result = validate("SELECT marh(1.5)") # round() misspelled
assert result.valid
print(result.warnings) # (FunctionWarning(name='marh', line=1, column=8),)
print(result.unknown_functions) # ['marh']
result = validate("CREATE TABLE t (a bignum, b bigint)") # bigint vs bignum
print(result.warnings[0]) # TypeWarning(name='bignum', line=1, column=19)
print(result.unknown_types) # ['bignum']
The catalogs are auto-generated from the Trino docs and only check name
existence, not argument counts, precision/scale, or semantic correctness.
hive/generic dialects skip these checks. False positives are possible if a
deployed Trino adds plugin functions/types beyond the docs.
dbt and Jinja templates
Jinja/dbt SQL is supported by default. validate() and validate_file() use
jinja="auto" to mask Jinja expressions, statements, and comments before
parsing while preserving line numbers and file structure. This supports
constructs such as {{ ref("orders") }} and {{ var("catalog") }} without
requiring a dbt installation or project context. Use jinja="mask" as an
explicit spelling of the same mode.
Use jinja="reject" to pass the original template directly to the SQL parser.
Masking cannot determine SQL generated by control-flow blocks, macros, or
adapter semantics; render those cases with dbt and validate the rendered SQL
for complete coverage.
Dialects
"trino"(default) — Trino-flavored with a custom override tuned for Presto/Trino syntax (LIMIT ALL, backslash escapes, etc.)."hive"and"generic"— offered as permissive alternates.
Known limitations
sqlparser-rs (the parser we use) performs syntax validation, not semantic
analysis. It may accept SQL that Trino would reject at analysis time (unknown
columns/tables, duplicate columns), and it can reject exotic Trino-specific DDL.
The validator has targeted compatibility parsing for documented Trino syntax,
including nested ROW/ARRAY/MAP types, but it does not replace Trino's
semantic analyzer. For the overwhelming majority of SELECT/DDL statements the
results are accurate. See plan/roadmap.md for the path toward
stricter Trino fidelity.
Development
See AGENTS.md for setup, internal conventions, and release steps.
Key commands:
python3 -m venv .venv && source .venv/bin/activate
pip install -U pip maturin && pip install -e ".[dev]"
maturin develop # build + install native ext into the venv
cargo test # Rust tests
pytest -q # Python tests
cargo fmt --check # formatting
cargo clippy --all-targets -- -D warnings
License
MIT
Release files for trino-sql-validator 0.9.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| trino_sql_validator-0.9.0.tar.gz | 64.3 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| trino_sql_validator-0.9.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| trino_sql_validator-0.9.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| trino_sql_validator-0.9.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| trino_sql_validator-0.9.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| trino_sql_validator-0.9.0-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 10.0 MB
Release files / trino_sql_validator-0.9.0.tar.gz
| Download URL | trino_sql_validator-0.9.0.tar.gz |
|---|---|
| Size | 64.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ad0a212ada250715e08ca197ab1fac3b948fdbcaf23c8ffb249f0d57744dfb89
|
|
BLAKE2b-256 checksum How to use checksums |
c3eb7f6fab5c032b0c6e5cd71971b49979148a8b5710d32b586a9c988682cb3d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / trino_sql_validator-0.9.0-cp310-abi3-win_amd64.whl
| Download URL | trino_sql_validator-0.9.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
6d45983257af30e0c2c0d393a3ad6dd9dfc59dfe0d400d6fbe8ddcd98c56600e
|
|
BLAKE2b-256 checksum How to use checksums |
287020a9bd6549ee9237559e8cf79c8759782d749e0b73c458a52974c8306fe8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / trino_sql_validator-0.9.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | trino_sql_validator-0.9.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
223dc26cfaf8c045bd3def7b940aa7aa3da8a240b18b5e358abf6b7945c858fa
|
|
BLAKE2b-256 checksum How to use checksums |
8cbbf163f5707ee57967dd2b34274a65e88094aef1bce212d370a9d10dd85e2e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / trino_sql_validator-0.9.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | trino_sql_validator-0.9.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.9 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
d7f1ef350d97d38af7dd3808a6ef90c4392f05dbb51aa1dd1a143b1ff467b847
|
|
BLAKE2b-256 checksum How to use checksums |
cbe26f46cdce3b1b0bd04dd82dac11803f34e43545261ca1014445acec5ff567
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / trino_sql_validator-0.9.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | trino_sql_validator-0.9.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.8 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
9773ea1195c83565b7d7aba94542c6a76e33b4122f3c257b03af0f2046665631
|
|
BLAKE2b-256 checksum How to use checksums |
f31134568af6fa10d08464631a1eae30a107e6f5f84d2cdcbb0891932cd85f3f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / trino_sql_validator-0.9.0-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | trino_sql_validator-0.9.0-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
72f435fcc0c6da72e9eda6e241ee448e8dedb4ba50204405450aefd01bee5148
|
|
BLAKE2b-256 checksum How to use checksums |
51521fe6e4367967cb40949779995151778e88328e3ebe22b804a46026876fb5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|