NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1209 most downloaded on PyPI
The SQL Linter for Humans
Last release 2 days ago
02 Oct 2026
Ships fairly regularly
a new release about every 2 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
158 releases · first in 2018
fix: map deprecated semicolon_newline onto CV06 multiline_newline ( #8295 ) @dgvj-work
This minor release introduces SQLMesh integration, new linting and formatting options, and a refreshed documentation site, alongside a broad set of dialect improvements and bug fixes.
sqlfluff-templater-sqlmesh plugin. The optional templater brings SQLFluff linting to SQLMesh models, with support for model definitions and macro rendering.CV13 encourages a pure SELECT * FROM <cte> passthrough as the final query in a CTE-based model, following the dbt convention. TQ04 prefers expression AS alias over T-SQL's alias = expression syntax. Both are currently disabled by default and can be enabled with force_enable = True.--format gitlab, allowing findings to appear directly in GitLab merge requests. This joins the existing SARIF and GitHub annotation formats for integrating SQLFluff into CI.<% ... %> syntax used by Snowflake CLI. LT15 also gains an optional minimum number of blank lines between statements.Beyond that, this release expands parsing support across Snowflake, MariaDB/MySQL, ClickHouse, PostgreSQL, Oracle, Databricks, Flink, Athena, SQLite, Trino, and other dialects. Rule and templater fixes improve reliability, reduce false positives, and prevent unsafe autofixes.
This release also includes first-time contributions from forty-three new contributors. Thank you all for your contributions. 🏆
<=> (#8575) @remilepriol, @clauderules value in pyproject.toml (#8493) @udsy19-> operator (#8399) @winklemadNote truncated.
One column per quarter.
fix(config): coerce quoted allow_implicit_indents deprecation value (#8135) @anxkhn
This minor release brings expanded BigQuery pipe-syntax support, a wave of ClickHouse grammar additions, a new rule, and continued progress on the Rust-backed parsing engine.
|>) is now modelled natively as a postfix operation on selectables, so pipe queries can follow a WITH clause, use EXCEPT/REPLACE after a wildcard, and get correct indentation for AGGREGATE/EXTEND clauses.TRUNCATE TABLES/TRUNCATE DATABASE, EXCHANGE, the REGEXP operator, GROUP BY WITH ROLLUP/CUBE/TOTALS, multi-column LIMIT BY, and ORDER BY ... WITH FILL ... INTERPOLATE, among other additions.RF07, flags window-clause references that shadow a SELECT alias.lint, fix, and format all gain a consistent --quiet output mode.CP01, CP03, CP04), extending the Rust engine beyond parsing and into linting for the first time — a major step toward our broader performance goals. Alongside this, numerous parity fixes (bracket matching, error messages, cache invalidation) keep the Rust and Python engines in sync.Beyond that, there are parser improvements across Oracle, PostgreSQL, Snowflake, Databricks, T-SQL, MySQL/MariaDB, Teradata, Athena, DuckDB, SQLite, Impala, and SparkSQL, plus rule fixes that remove false positives from RF01-RF03, AL05, AM04, CV10, CV12, ST06, ST07, and PG01.
This release also includes first-time contributions from forty-seven new contributors. Thank you all for your contributions. 🏆
TRUNCATE TABLES statement (#8279) @AndrewKurgTRUNCATE DATABASE (#8228) @AndrewKurgint [] (#8222) @apoorva-01AS aliasing over alias = expression (#8085) @copilot-swe-agent[bot]BaseSegment.copy (#8109) @keraionBaseSegment.__init__ (#8091) @rubytobiTIMESTAMP WITH LOCAL TIME ZONE in CAST(...) (#8012) @copilot-swe-agent[bot]->>) (#7921) @Labib-Bin-SalamNode::to_tuple (#8000) @keraionArc<MatchResult> sentinel in RefState (#7996) @rubytobiallow_gaps=false STRICT to match Python (#7979) @keraion(+) joins against literals without LT02 false positives (#7953) @copilot-swe-agent[bot]transparent_positions frame field (#7936) @keraionDBT_ENGINE_ configs and additional DBT_ENGINE_PROFILE (#7907) @yann1cks600 (#7922) @keraionThis patch release brings a broad set of parser fixes and dialect enhancements across T-SQL, PostgreSQL, MariaDB/MySQL, Snowflake, Athena, Materialize
This patch release brings a broad set of parser fixes and dialect enhancements across T-SQL, PostgreSQL, MariaDB/MySQL, Snowflake, Athena, Materialize, and other dialects. T-SQL receives several improvements around privileges, labels, DROP CREDENTIAL, DROP SEQUENCE IF EXISTS, and reference handling for CONTAINSTABLE, while MariaDB/MySQL support is expanded for trigger, partitioning, system versioning, charset/collation, and ALTER TABLE syntax.
There are also rule and templater fixes, including a new Postgres-specific CV13 rule to prefer CREATE INDEX CONCURRENTLY, fewer ST11 false positives for LEFT SEMI and LEFT ANTI joins, and dbt templater support for the DBT_TARGET and DBT_TARGET_PATH environment variables. Performance is also improved by deferring parse-tree serialisation in logging calls.
Alongside the user-facing fixes, this release adds beta docs deployment, versioned documentation publishing, and support for building multiple Docker images. It also includes first-time contributions from twelve new contributors. Thank you all for your contributions. 🏆
ALTER TABLE ... ADD|DROP SYSTEM VERSIONING (#7883) @copilot-swe-agent[bot]DROP SEQUENCE IF EXISTS (#7858) @copilot-swe-agent[bot]BEGIN ATOMIC function bodies to parse UNION ALL (#7861) @copilot-swe-agent[bot]table.* in expressions as a wildcard identifier (#7845) @mokashangThis is a bugfix release primarily to change the configuration of how rust wheels are distributed for sqlfluffrs. From this release onwards, rust whee
This is a bugfix release primarily to change the configuration of how rust wheels are distributed for sqlfluffrs. From this release onwards, rust wheels use ABI3 so that a single wheel can be reused across multiple python versions, and the number of platforms which we distribute pre-compiled wheels for has been reduced. This is to ensure we remain with the storage limits set by pypi.
In addition to this we see two TSQL fixes, including the first contribution by @simondennis9 to the project. Thanks for your contributions! 🏆
This minor release contains four particular changes of note:
This minor release contains four particular changes of note:
render_variant_limit is now 5 instead of 1, so SQLFluff may report new linting violations from templated branches that were previously not inspected in Jinja and dbt projects. Documentation for the feature is now also available in Template Variant Rendering.max_parse_nodes config setting to enable parsing of larger files in their project if necessary.AL10 rule requires aliases on FROM subqueries, because omitting them causes parse errors in most major dialects.Beyond that, there are parser improvements for T-SQL, PostgreSQL, Snowflake, BigQuery, DuckDB, ClickHouse, Oracle, Hive/SparkSQL, Databricks, DB2, Athena, Trino, MariaDB/MySQL, StarRocks, Teradata, and Greenplum. There are also rule fixes for ST06, ST11, LT02, and LT09, better handling for placeholder and dbt/Jinja rendering edge cases, and a new option to fail when files are skipped for size.
This release also includes first-time contributions from twenty new contributors. Thank you all for your contributions. 🏆
DECLARE ... CURSOR FOR (#7812) @copilot-swe-agent[bot]pool.join() is called in ParallelRunner (#7686) @peterbudALTER TABLE ... ENABLE|DISABLE TRIGGER (#7811) @copilot-swe-agent[bot]${...} parameter references (#7767) @copilot-swe-agent[bot]var() placeholders under Jinja subscripting (#7793) @copilot-swe-agent[bot]WITH clauses (#7761) @copilot-swe-agent[bot]json_object() pairs in Trino and Athena (#7764) @copilot-swe-agent[bot]OPTIONS in CREATE TABLE FUNCTION (#7776) @copilot-swe-agent[bot]FROM DUAL to parse as a table reference (#7763) @copilot-swe-agent[bot]WITH TAG on dynamic table columns without a data type (#7754) @copilot-swe-agent[bot]COLLATE in Databricks CREATE TABLE column properties (#7749) @copilot-swe-agent[bot]CHECK/NOCHECK CONSTRAINT ALL in T-SQL ALTER TABLE (#7748) @copilot-swe-agent[bot]UPDATE ALL BY NAME syntax for MERGE (#7756) @ninazacharia-toastchore: Update deprecated gitwildmatch to gitignore ( #7673 ) @keraion
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.
max_parse_depth config setting to enable deeper parsing in their project if necessary.Also, welcome to the nineteen new contributors! Thanks for your contributions! 🏆
vdebug behind verbose-debug feature (#7674) @keraiongitwildmatch to gitignore (#7673) @keraion:: cast (#7615) @copilot-swe-agent[bot]noqa and update docs (#7658) @mxrFROM ... INSERT ... multi-insert statements (#7633) @copilot-swe-agent[bot]SELECT * APPLY(...) (#7654) @copilot-swe-agent[bot]EXCEPT set expressions in Greenplum (#7632) @copilot-swe-agent[bot]ignore = templating disabling all lint rules with Python templater (#7617) @copilot-swe-agent[bot]IS [NOT] DISTINCT FROM comparison statement (#7556) @peterbudreturn dbt builtin (#7584) @mrichards42noqa directives in sqlfluff parse for PRS/TMP violations (#7604) @peterbudVALUES() function nested in expressions for ON DUPLICATE KEY UPDATE (#7603) @copilot-swe-agent[bot]CREATE TYPE ... FROM to support data types with precision/scale (#7596) @copilot-swe-agent[bot]CREATE EXTERNAL TABLE AS SELECT (CETAS) (#7595) @samgusickCREATE FULLTEXT STOPLIST statement support (#7574) @copilot-swe-agent[bot]json_array with NULL ON NULL and RETURNING clauses (#7561) @copilot-swe-agent[bot]line_position and keyword_line_position (#7555) @peterbudrequire_final_semicolon (#7534) @copilot-swe-agent[bot].pkb to default sql_file_exts (#7541) @copilot-swe-agent[bot]~) (#7520) @copilot-swe-agent[bot]DEFINE keyword (#7505) @robert-norbergOPENROWSET(BULK) options (#7491) @lynndb0ColonDelimiterSegment in JSON key-value pairs grammar (#7494) @peterbudplatformdirs to <4.6.0 (#7488) @peterbud%ROWTYPE parameters in Oracle. (#7476) @joaostorrerThis is a re-release of 4.0.1 which had issues in initial deployment.
This is a re-release of 4.0.1 which had issues in initial deployment.
Testing release to confirm functionality of rust publish script.
Testing release to confirm functionality of rust publish script.
[4.0.4a1] - 2026-02-08 Pre-release
Pre-release
Compare
This is a re-release of the planned 4.0.1 which failed to publish due to deploy pipeline issues.
This is a re-release of the planned 4.0.1 which failed to publish due to deploy pipeline issues.
Normally we would use a post-release but rust doesn't support that construct.
This is a post release of 4.0.1 to fix issues in the package publish pipeline.
This is a post release of 4.0.1 to fix issues in the package publish pipeline.
This major release brings support for internal rust optimisations. Rust support is still effectively in _beta_ and is available on an opt in basis. To
This major release brings support for internal rust optimisations. Rust support is still effectively in beta and is available on an opt in basis. To take advantage of these performance improvements, users can install sqlfluff[rs] to get the parser and lexer running in rust. The current implementation does yield noticeable gains on large files and projects - although for small individual files, the overhead of moving data into rust means that performance is a tiny bit slower. Functionality has proven fairly stable during pre release testing, and we anticipate that the rust implementations will become defaults from 5.0 onwards.
We advise testing the rust package in a development environment before going direct to production.
A massive shout out to @keraion, who's been leading the way on this effort.
Additionally in this release:
CREATE SYNONYM, DROP SYNONYM and ALTER SYNONYM statements in Oracle. (#7291) @joaostorrerCREATE TYPE and ALTER TYPE (#7314) @annebelleoNotImplementedError exception (#7285) @peterbudCREATE DATABASE LINK, DROP DATABASE LINK and ALTER DATABASE LINK statements in Oracle. (#7284) @joaostorrerENABLE/DISABLE clause after constraints in CREATE TABLE statements in Oracle. (#7250) @joaostorrerThis is an alpha release of SQLFluff 4.0 to continue verification of the rust portions of the codebase. In particular to verify the inclusion of a rus
This is an alpha release of SQLFluff 4.0 to continue verification of the rust portions of the codebase. In particular to verify the inclusion of a rust parser. Rust support is still in beta, but from this release, users can install sqlfluff[rs] to get the parser and lexer running in rust. Current implementation does yield noticeable gains on large files and projects - although for small individual files, the overhead of moving data into rust means that performance is a tiny bit slower.
We do not recommend that users install this release except for testing and evaluation.
Big thanks to @keraion, who's been leading the way on this effort.
Additionally in this release:
These will be added to the changelog properly in the full 4.0.0 release.
CREATE SYNONYM, DROP SYNONYM and ALTER SYNONYM statements in Oracle. (#7291) @joaostorrerCREATE TYPE and ALTER TYPE (#7314) @annebelleoNotImplementedError exception (#7285) @peterbudCREATE DATABASE LINK, DROP DATABASE LINK and ALTER DATABASE LINK statements in Oracle. (#7284) @joaostorrerENABLE/DISABLE clause after constraints in CREATE TABLE statements in Oracle. (#7250) @joaostorrerThis is an alpha release of SQLFluff 4.0 to continue verification of the rust portions of the codebase. In particular to verify version locking of pyp
This is an alpha release of SQLFluff 4.0 to continue verification of the rust portions of the codebase. In particular to verify version locking of pypi packages works, and testing users can verify that Rust is working easily. Rust support is still in beta, but from this release, users can install sqlfluff[rs] to get some of the parser running in rust. Current implementation is not expected to yield significant gains but we do expect that once mature that it will.
We do not recommend that users install this release except for testing and evaluation.
Big thanks to @keraion, who's been leading the way on this effort.
Additionally in this release:
These will be added to the changelog properly in the full 4.0.0 release.
This is an alpha release of SQLFluff 4.0 to begin verification of the rust portions of the codebase. In particular to verify that publishing to pypi w
This is an alpha release of SQLFluff 4.0 to begin verification of the rust portions of the codebase. In particular to verify that publishing to pypi works as expected, and that users can install the package. Rust support is still in beta, but from this release, users can install sqlfluff[rs] to get some of the parser running in rust. Current implementation is not expected to yield significant gains but we do expect that once mature that it will.
We do not recommend that users install this release except for testing and evaluation.
Big thanks to @keraion, who's been leading the way on this effort.
Additionally in this release:
These will be added to the changelog properly in the full 4.0.0 release.
Rule AM09: Handle ambiguous LIMIT/OFFSET without ORDER BY (non-deterministic results)
This release has 95 contributions in it!
Also, welcome to the twenty three new contributors! Thanks for your contributions!
ALTER DYNAMIC TABLE support (#7176) @keraionescape_replacements control character value (#7165) @keraion.sqlfluffignore when using stdin-filename (#7168) @keraionLIMIT or OFFSET without ORDER BY (non-deterministic results) (#6749) @d33bsDROP COLLATION statement (#7143) @keraionCOLUMN_VALUE as a bare function (#7144) @keraionpartitioned by and cluster by segments to SparkSQL Create view statement (#7137) @KikeSenpaiSTORING segment in BigQuery CREATE VECTOR INDEX (#7119) @agkphysicsDELTA to non-reserved keyword (#7031) @keraionALTER INDEX statements (#7046) @saulotoledoSELECT INTO (#7033) @keraionframe_clause to support all interval_expressions (#7034) @keraionCREATE NETWORK RULE statement (#7035) @keraionCREATE DATABASE syntax (#7055) @manmartgarcALTER TABLE ... RENAME CONSTRAINT (#7045) @saulotoledoCLUSTER BY clause (#7021) @keraionEXCEPTION WHEN clauses (#7018) @keraionSET tuple with a single expression (#7019) @keraionINVISIBLE/VISIBLE column constraints (#7020) @keraionENCODE for ALTER TABLE ADD COLUMN (#7022) @keraionALTER COLUMN clause (#7026) @keraioncolumn_properties (#7027) @keraionRELIES_ON and POLYMORPHIC keywords (#7015) @keraionLIMIT when not a limit clause (#7010) @keraionThis release adds support for two new dialects: _Apache Doris_ and _FlinkSQL_.
This release has 25 contributions in it!
Also, welcome to the five new contributors! Thanks for your contributions!
NO_COLOR environment variable (#6976) @keraionACTION a non-reserved keyword (#6970) @keraionjson_object syntax in Oracle. (#6973) @joaostorrerINSERT statements (#6955) @keraionThis is primarily a bugfix, rule enhancement, and dialect enhancement release.
This release has 80 contributions in it!
Also, welcome to the fourteen new contributors! Thanks for your contributions!
RETURNING INTO clause in INSERT, UPDATE, DELETE and MERGE statements in Oracle. (#6941) @joaostorrerUSER (bare function) unparsable (#6935) @keen85SECURITY POLICY (CREATE, ALTER, DROP) (#6937) @keen85IF statements and :NEW. variables in assignment statements in Oracle. (#6930) @joaostorrer<=> operator in MySQL. (#6929) @joaostorrer--stdin-filename (#6900) @keraion--disregard-sqlfluffignores for fix and format (#6885) @keraionSET statements in MySQL. (#6922) @joaostorrerLOAD_UNCERTAIN_FILES (#6879) @mxr/ operator. (#6853) @joaostorrerREMOVE DUPLICATES clause in merge statements in Redshift (#6841) @joaostorrerselect exclude syntax (#6838) @pierrandThis release brings a couple of breaking changes:
This release brings a couple of breaking changes:
LT15 (layout.newlines). This rule allows you to control the number of consecutive
blank lines both inside, and outside of queries.We also have a host of dialect improvements, bugfixes, and general code clean-up. This release has 79 contributions in it!
Also, welcome to the thirteen new contributors! Thanks for your contributions!
ZEROFILL columns in MySQL. (#6735) @joaostorrerCREATE TABLE statements in Redshift. (#6808) @joaostorrerCREATE USER statements in Oracle. (#6809) @joaostorrervarchar(max) in Redshift. (#6806) @joaostorrerAS not optional (#6780) @keraion+=, -=, *=, /= and %= operators in tsql. (#6756) @joaostorrerFixPatch ordering conflict (#6769) @keraionCREATE TABLE and ALTER TABLE statements in Oracle. (#6767) @joaostorrerPivotSegment to accept alias in FunctionSegment in Oracle. (#6766) @joaostorrerON CONFLICT indentation for Postgres (#6660) @WillMatthewsUNNEST (#6757) @keraioncreate user rsa_public_key=... / snowflake (#6731) @juli4nb4dilloALTER TABLE statements in MySQL. (#6742) @joaostorrerSTRUCT datatype (#6739) @NormallyGaussianUSER from reserved words in Postgres. (#6707) @joaostorrerkey: value syntax in functions in Postgres. (#6708) @joaostorrerDROP DYNAMIC TABLE (#6673) @LoganPrice344ALTER TABLE Parsing (#6654) @LoganPrice344CREATE AUTHENTICATION POLICY Parsing (#6685) @LoganPrice344JoinClauseSegment in DeleteStatementSegment in Postgres (#6692) @joaostorrerALTER TABLE statements in Oracle. (#6661) @joaostorrerDEFAULT keyword as function parameter in tsql. (#6663) @joaostorrerDECLARE Syntax (#6665) @LoganPrice344noqa (#6668) @keraionALTER TABLE Parsing (#6671) @LoganPrice344CREATE ROW ACCESS POLICY to Parse Quoted Policy Names (#6648) @LoganPrice344EVENT statements in MySQL. (#6646) @joaostorrerException Parsing (#6645) @LoganPrice344WithCompoundStatementSegment in procedures in Postgres (#6632) @joaostorrerSET NEW.<column> statements in MySQL. (#6634) @joaostorrerThis is a bugfix release resolving a several issues from 3.3.0 and previously.
This is a bugfix release resolving a several issues from 3.3.0 and previously.
This release also includes the first contributions from thirteen new contributors! Welcome to the project and thank you for your contributions. 🎉🎉🏆🏆🎉🎉
CREATE Syntax Parsing (#6514) @LoganPrice344geometry(point) datatype. (#6543) @joaostorrerSnowflake Target_lag (#6567) @LoganPrice344set_clause_list to UPDATE statement (#6605) @keraionNOMAXVALUE and NOMINVALUE (#6606) @keraionLOAD DATA statement (#6612) @VMois\gset and \gexec meta commands. (#6555) @joaostorrerALTER FOREIGN TABLE statement. (#6597) @joaostorrer&. (#6573) @joaostorrerWITH ROLLUP option for GROUP BY (#6579) @keraionlt_eq_gt operator (#6592) @keraionCREATE OPERATOR syntax. (#6540) @joaostorrerDROP FOREIGN TABLE statement. (#6548) @joaostorrer!!. (#6541) @joaostorrerALTER TAG Syntax (#6531) @LoganPrice344CREATE ROW ACCESS POLICY Syntax Parsing (#6550) @LoganPrice344ALTER_TABLE_COLUMN Syntax Parsing (#6526) @LoganPrice344ALTER ROW ACCESS POLICY Syntax Parsing (#6534) @LoganPrice344ALTER warehouse Syntax (#6516) @LoganPrice344GRANT syntax (#6520) @LoganPrice344GRANT command parsing (#6503) @korverdevCREATE OR ALTER syntax (#6497) @korverdevThis release brings a few more significant changes. Especially given the introduction of several new rules, we highly recommend testing this release o
This release brings a few more significant changes. Especially given the introduction of several new rules, we highly recommend testing this release on your project before upgrading to make sure they are configured appropriately for your project style guide. As always, we have tried to make sure that the defaults for all new rules are both widely applicable, and fairly light touch. While all have been tested on some existing larger codebases which the maintainers have access to - do still report any bugs you might find on GitHub in the usual manner.
appdirs package as a dependency (as an abandoned project) and instead added platformdirs instead. Users should not notice any functionality changes beyond the different dependency.AM08 (ambiguous.join_condition), which detects JOIN clauses without conditions (i.e. without an ON or USING clause). These are often typos and can result in significant row count increases if unintended.CV12 (convention.join_condition), which is related to AM08 and detects cases where users have used a WHERE clause instead of a JOIN ... ON ... clause to do their join conditions. The join condition is a form of metadata and should communicate to the end user how the table should be joined. By mixing this information into the WHERE clause it makes the SQL harder to understand.LT14 (layout.keyword_newline), which allows certain keywords to trigger line breaks in queries. Primarily this forces the main SELECT statement clauses like WHERE, GROUP BY etc. onto new lines. This rule has been designed to be highly configurable, but with sensible light-touch defaults. Check out the docs to adapt it to the conventions of your project.ST10 (structure.constant_expression), some SQL users include redundant expressions in their code (e.g. WHERE tbl.col = tbl.col). These conditions always evaluate to a constant outcome (i.e. always evaluate as TRUE or FALSE) as so add no functionality or meaning to the query. This rule catches them.ST11 (structure.unused_join), which detects unused joins in SQL statements, and is designed to catch tables that were once used, but where the column references have since been removed and now the table is unnecessary.Beyond these changes, we've seen a whole host of dialect improvements to almost all of the supported dialects and several bugfixes which are combined into this release.
We also welcome TWELVE new contributors to the project in this release. Thanks to all of them for their hard work 🚀🏆🚀.
appdirs to platformdirs (#6399) @alanmcruickshankNEXT VALUE FOR use as expression (#6431) @timz-stPARTITION_TYPE for CREATE EXTERNAL TABLE (#6422) @ninazacharia-toastfix command with --show-lint-violations (#6382) @joaopamaralTYPE property to Snowflake users (#6411) @mroy-seedboxCREATE VIRTUAL TABLE Statement (#6406) @R3gardlessThis release is mostly bugfixes and dialect improvements. Notably:
This release is mostly bugfixes and dialect improvements. Notably:
LT01 & LT02.AL09.AM02 for Trino and Snowflake.ST02 & LT01.There's also a bunch of documentation improvements in this release, including guides on how to troubleshoot SQLFluff and how to write custom rules. Check out https://docs.sqlfluff.com for more details.
We also saw five new contributors to the project this month. Welcome to the project, and thanks for taking the time to contribute! 🎉🏆🎉
IN functions (#6393) @keraionmatch_condition to touch (#6395) @keraionCONNECT BY expressions that may use PRIOR (#6396) @keraionALTER DATABASE SET (#6376) @keraionALTER AGGREGATE Statement (#6353) @R3gardlessRelationEmulator safely callable (#6358) @mroy-seedboxHandle deprecation warning of "fork" (#6332) @alanmcruickshank
This release is almost all dialect fixes and bugfixes. Notably also, this release brings official python 3.13 support too (although most users should not realise any differences).
We also see two new contributors to the project. Welcome @R3gardless & @brandonschabell! 🎉🎉🎉
DROP COLUMN support for multiple dialects (#6348) @keraionUPDATE to be a function name (#6349) @keraionreference_constraint (#6346) @keraiontox command in test/fixtures/dialects/README.md (#6342) @R3gardlessCREATE FOREIGN DATA WRAPPER statement (#6335) @keraionjson_query functions (#6336) @keraionThis is another release of dialect improvements and rule bugfixes. Notably:
This is another release of dialect improvements and rule bugfixes. Notably:
LT02.github-annotation-native format option now has groups for each filename.There's also a refactor of where we guides and howtos in the docs. Keep an eye on that section going forward for more information about best practice and troubleshooting for SQLFluff.
Even in this small PR, we've seen two new contributors. Welcome @nspcc-cm & @rogalski to the project!
UPDATE and RETURNING clauses (#6314) @keraiongrant monitor on user ... in Snowflake dialect (#6322) @mroy-seedboxgithub-annotation-native format option. (#6312) @alanmcruickshankThis is a hotfix release to resolve an issue with the JJ01 rule when running in parallel mode.
This is a hotfix release to resolve an issue with the JJ01 rule when running in parallel mode.
This release is primarily housekeeping, bugfixes and dialect improvements. More specifically:
This release is primarily housekeeping, bugfixes and dialect improvements. More specifically:
JJ01, filename extension handling and the treatment of unfixable/unparsable files, which have been noticed with recent releases.LT07 & LT12 which relate to jinja whitespace control.ref and source macros for the dbt templater.There's also dialect improvements for BigQuery, TSQL, MySQL, MariaDB, Snowflake, DuckDB, Databricks, Postgres, Teradata, Exasol & Vertica.
We also saw six new contributors merge their first pull request as part of this release. Welcome to the project! 🎉🏆🎉
DECLARE variables in BigQuery (#6295) @keraionThisEmulator (#6254) @mroy-seedboxtable_aliases option (#6273) @keraionEXECUTE IMMEDIATE (#6287) @keraionSET with system variables (#6288) @keraionpyproject.toml (#6286) @keraionGROUPING SETS clause (#6275) @keraionARRAY types (#6272) @keraionsqlfluff.core (#6246) @alanmcruickshankDROP MACRO (#6270) @keraionpyproject.toml nits (#6268) @alanmcruickshankutil up to strict typing (#6263) @alanmcruickshanksqlfluff.core.linter (#6240) @alanmcruickshankDatatypeSegment references (#6244) @keraionSET with double quoted identifiers (#6243) @keraionThis release brings a few minor breaking changes, both for the core project and for the dbt templater. For the main project:
This release brings a few minor breaking changes, both for the core project and for the dbt templater. For the main project:
Resolving an issue with the spacing of functions (LT01), which involved a change to how functions are parsed. If your project relies on the specific parsing of functions, the bracketed arguments are now wrapped in a function_contents object. We recommend that you examine the new parsing structure using this new release in testing first.
RF06 (references.quoting) is now case sensitive when removing quotes which are detected as unnecessary. This rule has also been re-enabled by default for Snowflake and Postgres where it had previously been disabled (for the reason that in the past it hadn't been appropriately case sensitive). Treatment for totally case-insensitive dialects like DuckDB and SparkSQL have also been included. Please check the new documentation for this rule (which is much more explicit now), for details related to your dialect.
Patterns equivalent to those from .sqlfluffignore can now be included in .sqlfluff and pyproject.toml files.
Using the python templater, users now have an option to include variables which include a dot in the path, like {{ foo.bar }} using a special sqlfluff context variable.
Significant changes under the hood to the handling of configuration files. Most of these should not be visible to end users, but for anyone integrating SQLFluff into a larger project and relying on native file loading may need to refactor their project for this release. Most notably here, for maintainers of plugins, the ConfigLoader class has been deprecated, and plugins should instead call the config loading functions directly. See the example plugin for details.
Documentation, especially for dialects, has been significantly improved. Documentation for CP02 (capitalisation.identifiers) has also been clarified to make it's implication for references and aliases more clear.
During testing, to isolate the effect of specific rules, there's a new CLI option --disable-noqa-except which allows all noqa options to be ignored except the ones provided in this option.
For the dbt templater:
Support for dbt 1.1-1.3 has been removed. All have been in End of Life (EOL) support by dbtlabs for almost two years. They are also poorly supported by other projects and tools.
The dbt templater has been migrated to use pyproject.toml.
Handling of errors and exceptions raised within dbt has had an overhaul. Users may see a slightly different presentation of errors, but the overall stability should be more robust.
In addition to those changes, there have been too many dialect contributions and bugfixes to mention specifically. We've also seen six people make their first contributions to the project as part of preparing for this release! 🎉🏆🎉.
config and helpers. (#6206) @alanmcruickshankSET statement (#6205) @keraionCREATE TYPE statement (#6204) @keraionCOMMENT ON statement (#6196) @keraionSTRUCT datatype (#6198) @keraionConfigLoader (#6177) @alanmcruickshankCREATE MACRO/CREATE FUNCTION (#6194) @keraionVARIANT type (#6167) @keraionINSERT OVERWRITE after a CTE (#6172) @keraionSET CONSTRAINTS statement (#6171) @keraionMERGE without a target alias (#6170) @keraionOFFSET and FETCH (#6169) @keraionSUBSCRIPTION statements (#6168) @keraionutil.py for dbt templater pyproject.toml (#6160) @keraionDISTINCTs with subqueries (#6146) @keraionENCRYPTED PASSWORD option in CREATE USER (#6143) @keraionINTERVALs to Frame Clause (#6105) @keraionIS UNKNOWN (#6094) @keraionThis release brings a bumper lot of bugfixes, dialect improvements and other minor improvements across the board. Most notably:
This release brings a bumper lot of bugfixes, dialect improvements and other minor improvements across the board. Most notably:
conf.py file in the docs folder for a full list of permalinks.markupsafe, ruamel.yaml, pydantic & rich.We've also seen fifteen new contributors to the project! Thanks to all of them for taking the time to contribute. 🎉🎉🏆🎉🎉
dbt deps test fixture timeout (#6088) @keraionWITH clauses (#6017) @keraionYour coding agent can read these notes before it upgrades. Set up the MCP server →