Highlights
This minor release expands SQLFluff in four meaningful ways: recursion protection, more complete Rust-backed execution, broader dialect support, and better performance on large templated projects.
- Security improvements that protect against resource exhaustion through malicious queries by limiting recursion within the parser. Users can configure the new
max_parse_depthconfig setting to enable deeper parsing in their project if necessary. - Rust support moves forward again, with Python now able to call Rust apply logic, full lazy evaluation in the Rust parser, and more parallel and streaming work in the lint/fix pipeline.
- Oracle and T-SQL both received major grammar expansions, alongside important new support across ClickHouse, DuckDB, Databricks, Trino, Hive/SparkSQL, BigQuery, Snowflake, PostgreSQL, and others.
- The dbt templater now includes support for the dbt return builtin, improved thread handling from profiles, and fixes for several Jinja edge cases.
- Users also gain more indentation configuration flexibility, plus a wide set of rule and parser correctness fixes. Specifically, the ability to skip enforcement of implicit indents for specific dialect elements.
Also, welcome to the nineteen new contributors! Thanks for your contributions! π
Whatβs Changed
- Oracle: add missing grant privileges CONNECT/RESOURCE/TRIGGER (#7677) @saulotoledo
- Add double precision type for T-SQL (#7620) @grv87
- Fix RF01/RF02 false positives for Redshift UNPIVOT output aliases (#7602) @copilot-swe-agent[bot]
- Fix crash on malformed inline config using = syntax (#7672) @shi-vy
- Recursion check (#7473) @alanmcruickshank
- chore(rust): bump cargo deps (#7675) @keraion
- fix(rust): place remaining
vdebugbehindverbose-debugfeature (#7674) @keraion - chore: Update deprecated
gitwildmatchtogitignore(#7673) @keraion - Oracle: implement CREATE PACKAGE BODY parsing (#7671) @saulotoledo
- Oracle: recognize pseudo-functions USER/UID/SESSION_USER/ORA_ROWSCN (#7663) @saulotoledo
- Oracle: support seq.CURRVAL in dotted sequence references (#7665) @saulotoledo
- dbt templater: respect threads config from profiles.yml (#7669) @shauneccles
- PR Acceptance guidelines (#7661) @alanmcruickshank
- Fix for empty iterator bug that can occur from Jinja loops (#7643) @shi-vy
- Oracle: support trigger predicate chains in IF/ELSIF/CASE (#7660) @saulotoledo
- ST05: fix dropping expression CTEs from WITH clause (#7536) @copilot-swe-agent[bot]
- Fix placeholder colon param incorrectly prefixed with table alias when followed by
::cast (#7615) @copilot-swe-agent[bot] - build: remove dangling
noqaand update docs (#7658) @mxr - Oracle: parse TABLESPACE/STORAGE and other table/index options (#7642) @saulotoledo
- Add Hive/SparkSQL support for
FROM ... INSERT ...multi-insert statements (#7633) @copilot-swe-agent[bot] - Add ClickHouse support for
SELECT * APPLY(...)(#7654) @copilot-swe-agent[bot] - Handle set expressions in Databricks SQL function RETURN bodies (#7655) @copilot-swe-agent[bot]
- fix: Remove platformdirs version pin, support both < 4.6 and >= 4.6 (#7656) @gboutry
- fix(bigquery): Parse table types in tvf parameters #7650 (#7652) @keraion
- Fix RF03 false positive for lambda params in Databricks (#7646) @shauneccles
- trino: Add OFFSET clause support (#7618) @copilot-swe-agent[bot]
- RF01: ignore Oracle sequence NEXTVAL/CURRVAL pseudocolumn references (#7638) @ReinerBRO
- Parse bracketed
EXCEPTset expressions in Greenplum (#7632) @copilot-swe-agent[bot] - Fix LT05 duplicating Jinja macro lines when breaking long lines (#7640) @shauneccles
- Add SQLite RF06 keyword autofix (#7622) @mxr
- Oracle: added missing ALTER SESSION statement (#7630) @saulotoledo
- Oracle: accept PROFILE DEFAULT in CREATE USER grammar (#7628) @saulotoledo
- chore(Rust): update Rust dependencies (#7625) @keraion
- Fix
ignore = templatingdisabling all lint rules with Python templater (#7617) @copilot-swe-agent[bot] - feat(rust): Call Rust's apply from Python (#7599) @keraion
- feat(runner): Allow streaming render in parallel pipeline (#7616) @keraion
- ANSI: handle
IS [NOT] DISTINCT FROMcomparison statement (#7556) @peterbud - Oracle: add JSON_TABLE support with FOR ORDINALITY column parsing (#7560) @copilot-swe-agent[bot]
- Add
returndbt builtin (#7584) @mrichards42 - DuckDB: Support trailing commas in PIVOT and UNPIVOT expressions (#7612) @copilot-swe-agent[bot]
- Add PERCENTILE_CONT / WITHIN GROUP support for Databricks dialect (#7614) @copilot-swe-agent[bot]
- Parallelize file rendering prior to linting/fixing (#7129) @axyjo
- Databricks: parse MERGE clauses with NOT MATCHED BY TARGET/SOURCE (fixes #7608) (#7610) @api2062
- feat(sqlfluffrs): auto-generate dialect sources during maturin/cargo (#7579) @keraion
- Fix dbt templater failing to resolve local packages via symlinks (#7537) @copilot-swe-agent[bot]
- Redshift: fix GRANT with multiple GROUP targets fails to parse (#7563) @copilot-swe-agent[bot]
- T-SQL: Support WITH termination clause for ALTER DATABASE SET (#7586) @copilot-swe-agent[bot]
- fix(tsql): allow PERIOD FOR SYSTEM_TIME in ALTER TABLE ADD (#7609) @api2062
- Handle invalid pyproject.toml parse errors (#7593) @alanmcruickshank
- fix(duckdb): Allow trailing commas in map literals (#7606) @keraion
- fix: Respect inline
noqadirectives insqlfluff parsefor PRS/TMP violations (#7604) @peterbud - MySQL/MariaDB: Fix parsing of
VALUES()function nested in expressions forON DUPLICATE KEY UPDATE(#7603) @copilot-swe-agent[bot] - StarRocks: add support for INSERT OVERWRITE (#7601) @andystenhe
- Fix: Jinja empty-rendering variable adjacent to quotes corrupts SQL during fix (#7582) @copilot-swe-agent[bot]
- build: migrate linting and formatting checks to Ruff (#7597) @alanmcruickshank
- Duckdb: Add parsing support for MAP literal syntax (#7564) @copilot-swe-agent[bot]
- Fix TSQL
CREATE TYPE ... FROMto support data types with precision/scale (#7596) @copilot-swe-agent[bot] - ClickHouse: Fix parsing of SETTINGS clause in UNION queries (#7600) @copilot-swe-agent[bot]
- T-SQL: add support for
CREATE EXTERNAL TABLE AS SELECT(CETAS) (#7595) @samgusick - docs: do not use pandoc for rule generation (#7573) @peterbud
- chore(docs): Update dev dependencies (#7591) @keraion
- build: set base_python for dbt and python tests (#7592) @peterbud
- T-SQL: add
CREATE FULLTEXT STOPLISTstatement support (#7574) @copilot-swe-agent[bot] - MySQL: fix CAST(... AS SIGNED/UNSIGNED INTEGER) parsing failure (#7559) @copilot-swe-agent[bot]
- T-SQL: Support PUBLIC principal in GRANT/DENY/REVOKE statements (#7581) @copilot-swe-agent[bot]
- BigQuery: support chained function calls like (x).UPPER() (#7577) @ko-ya346
- Trino: fix parsing of
json_arraywithNULL ON NULLandRETURNINGclauses (#7561) @copilot-swe-agent[bot] - TSQL: parsing support for XML SCHEMA COLLECTION statements, typed XML and datatype methods (#7578) @dpurfield
- Rust: configurable runaway parse limits (#7571) @keraion
- Rust Parser: full lazy evaluation, fix Rust's MatchResult.apply (#7566) @keraion
- Fix CV11 IndexError on shorthand cast with null/boolean literals (#7568) @copilot-swe-agent[bot]
- fix: make encoding autodetect deterministic (#7575) @peterbud
- Add SET COMPRESSION syntax in Postgres for ALTER TABLE statement. (#7565) @mvastarelli
- fix: Add deterministic cleanup in linter.py (#7557) @peterbud
- feat(Clickhouse): Add QUALIFY keyword and grammar to Clickhouse (#7558) @duvenagep
- Add QUALIFY clause support to StarRocks dialect (#7514) @vdozal
- Snowflake: Expand CREATE/ALTER DATABASE support (#7517) @xevgeny
- docs: Explain
line_positionandkeyword_line_position(#7555) @peterbud - CV06: properly detect statement terminator (#7552) @peterbud
- Fix CV06 false positive for BigQuery procedures with
require_final_semicolon(#7534) @copilot-swe-agent[bot] - BigQuery: Fix ARRAY_AGG, ARRAY_CONCAT_AGG, and STRING_AGG unparsable when used as window functions (#7539) @copilot-swe-agent[bot]
- Fix LT15 falsely removing CTE-separating blank lines required by LT08 (#7542) @copilot-swe-agent[bot]
- Add
.pkbto defaultsql_file_exts(#7541) @copilot-swe-agent[bot] - Add option to skip enforcing implicit indents for specific element types (#7540) @sebastien-irco
- Fix skip_indentation_in not stripping whitespace from comma-separated values (#7538) @sebastien-irco
- Oracle: Redesign slash as buffer executor (#7498) @saulotoledo
- Update broken Oracle PL/SQL link (#7482) @AbhishekASLK
- Fix ST09 incorrectly reordering directional operators (e.g. PostgreSQL
~) (#7520) @copilot-swe-agent[bot] - postgres: Add support for psql meta-commands \copy and \set (#7528) @copilot-swe-agent[bot]
- Add support for DuckDB numeric operators (**, !, @) (#7507) @peterbud
- tsql: Add RESTORE DATABASE statement grammar (#7525) @copilot-swe-agent[bot]
- Update slack invite and add bluesky link (#7532) @alanmcruickshank
- Fix mistaken word in README.md (#7530) @dekins-yousician
- build: Add Rust toolchain in "Create release pull request" workflow (#7523) @peterbud
- chore: update license date (#7480) @AbhishekASLK
- fix(clickhouse): add view and dictionary grammar options (#7513) @rkinwork
- Databricks: Fixes for Create MV Statement (#7522) @nathanthorell
- Add extra test coverage for jinja multi-path linting (#7518) @alanmcruickshank
- TSQL: Add support for DBCC statements (#7515) @nathanthorell
- TSQL native func, identity func, exec str with options (#7516) @dpurfield
- Add support for DuckDB column index syntax (#) (#7508) @copilot-swe-agent[bot]
- Add T-SQL PREDICT statement support for machine learning predictions (#7509) @copilot-swe-agent[bot]
- fix(clickhouse): tighten parametric type spacing tests and add Time64β¦ (#7501) @rkinwork
- Add CHANGE_TRACKING clause to Snowflake dialect (#7506) @davidfierro
- Support for Snowflake DCM Projects
DEFINEkeyword (#7505) @robert-norberg - TSQL parsing issues: table var w index, create login, neg identity seed, alter drop [column/constraint] (#7499) @dpurfield
- Add support for additional
OPENROWSET(BULK)options (#7491) @lynndb0 - Oracle: Add support for referencing correlation names as pseudorecords (#7496) @saulotoledo
- Docs: document pyproject.toml ignore_paths for ignored files (#7500) @minwoobyeon
- TSQL: use
ColonDelimiterSegmentin JSON key-value pairs grammar (#7494) @peterbud - [T-SQL] Parser supporting money literals and inline indexes (#7471) @dpurfield
- SparkSQL: Enforce mandatory length for VARCHAR/CHAR/CHARACTER (#7459) @copilot-swe-agent[bot]
- Add ClickHouse-specific GRANT privilege support (#7479) @copilot-swe-agent[bot]
- Fix/clickhouse tuple access 3816 (#7483) @rkinwork
- Fix AM07 crash on DuckDB FROM-first syntax (omitted SELECT) (#7463) @copilot-swe-agent[bot]
- Add ClickHouse ALTER TABLE UPDATE/DELETE mutation support (#7445) @copilot-swe-agent[bot]
- fix: pin
platformdirsto <4.6.0 (#7488) @peterbud - rust: strip debug info (#7477) @keraion
- Adds support for
%ROWTYPEparameters in Oracle. (#7476) @joaostorrer - feat(vertica): add support for lambda expressions (#7346) @rkinwork
- Fix SparkSQL DIV operator inheritance to support linting rules (#7470) @copilot-swe-agent[bot]
- fix(LT08): Skip blank line requirement for PostgreSQL CYCLE/SEARCH clauses (#7468) @oulmoukenza