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 analyze_statements, 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")
# Opt-in per-statement metadata; indexes are zero-based
analysis = analyze_statements("EXPLAIN SELECT 1; CALL system.custom_proc()")
assert analysis.validation.valid
assert analysis.statements[0].kind == "explain"
assert analysis.statements[0].inner_kind == "query"
assert analysis.statements[1].kind == "call"
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.
Inline WITH FUNCTION names are exempt only within their own query scope.
Qualified calls with the same final name are still checked. Procedure names in
CALL and ALTER TABLE ... EXECUTE are not scalar functions and therefore do
not produce FunctionWarning; their existence, parameters, arity, permissions,
and connector availability require a Trino coordinator and are out of scope.
Statement metadata
analyze_statements() is an opt-in API that returns the unchanged
ValidationResult together with a tuple of StatementInfo. Each entry contains
a zero-based index, source span, source-derived kind, and (for EXPLAIN or
PREPARE) an inner_kind when it can be identified. On invalid multi-statement
input, error_statement_index identifies the source statement when the parser
provided a location. Existing validate() and validate_file() return types
are unchanged.
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 current Trino syntax, including Iceberg branches/time travel, complex nested types, routines, table functions, SQL/JSON, and Trino-specific DDL."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. See plan/roadmap.md for the path toward
stricter Trino fidelity.
Parser fidelity is checked reproducibly against direct-string cases extracted from Apache Trino's parser tests. With ordinary Java strings and text blocks, the pinned Trino 483 audit currently accepts 476/484 statements, 231/238 expressions, 68/68 types, the extracted Functions/Routines subset, and rejects 23/23 direct negative statements. Known differences are pinned in a named allowlist; new mismatches or a reduced extracted denominator fail the audit. These figures and the 276 independently checked positive fixture statements describe measured corpora, not complete Trino grammar or connector behavior. SQL embedded inside ordinary string literals, JSON paths, WKT, dynamic SQL, and unrendered macro output is intentionally opaque rather than recursively parsed.
To keep invalid or adversarial input from exhausting the native parser stack,
validation rejects a statement after 4,096 significant SQL tokens, nesting
deeper than 256 groups or routine blocks, and an input after 65,536 significant
tokens. The failure is returned as an ordinary invalid ValidationResult; when
the limiting token has a source position, that position is included in the
error. Semicolon-separated statements have independent per-statement budgets.
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
python tools/extract_functions.py --ref 483 --check
python tools/extract_types.py --ref 483 --check
python tools/audit_upstream_parsers.py --baseline plan/trino_483_audit_baseline.json --fail-on-regression
License
MIT
Release files for trino-sql-validator 0.15.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.15.0.tar.gz | 173.3 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| trino_sql_validator-0.15.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| trino_sql_validator-0.15.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.15.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| trino_sql_validator-0.15.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| trino_sql_validator-0.15.0-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 11.8 MB
Release files / trino_sql_validator-0.15.0.tar.gz
| Download URL | trino_sql_validator-0.15.0.tar.gz |
|---|---|
| Size | 173.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
58a9509ca893150c29d4cb26088e47f47fe666a5b3705ee1f4d8e6d5756177a3
|
|
BLAKE2b-256 checksum How to use checksums |
a95a4af7ce062e37d81040e33674c676e7c6d5350aa390e8801bfc0511c33539
|
| 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.15.0-cp310-abi3-win_amd64.whl
| Download URL | trino_sql_validator-0.15.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
636abda1c6114d9ef7d0591744aaa3d4dd38068fc1de9efad2261bf4f9a5cc9b
|
|
BLAKE2b-256 checksum How to use checksums |
2a2572757b610c161db813a48289748326e55a8a041905830bec53dbb01501af
|
| 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.15.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | trino_sql_validator-0.15.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
4ca7385f057e3e34172bdb052b3c66bd0c8930e69cce085509a4b4a14ab98685
|
|
BLAKE2b-256 checksum How to use checksums |
fe11746bd9baef86773ac60707de3e8e7d9bede4d3063eb5ac10d474dfe3f593
|
| 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.15.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | trino_sql_validator-0.15.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
beba5769b2fb47eec24044dd8d7b3b3dd641c5a57e95222897fc86c7894e95cc
|
|
BLAKE2b-256 checksum How to use checksums |
825765baf7de6febe3271684bc6c7b11e22457f8b1e6da2e82d099e2102937f9
|
| 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.15.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | trino_sql_validator-0.15.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.2 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5d5b480573028756ecf0d40aa518276f226394c173828d9e0b929b9352502bc9
|
|
BLAKE2b-256 checksum How to use checksums |
57815a3aba284c9ed1d363d8177de26dd94d2fb6f3bb633e4723797fa7084811
|
| 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.15.0-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | trino_sql_validator-0.15.0-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
d398fdb1c83ef0c80aa5ca9cadd218265e18012e152141a6372a2bb52de9ed2b
|
|
BLAKE2b-256 checksum How to use checksums |
05c675bf359541009dc8690dffafe744f5f5405429d97f9ec3180d5aa13be7f7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|