NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2566 most downloaded on PyPI
Lint your dbt project SQL
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
5 years old
107 releases · first in 2021
One column per quarter.
More refactoring of parse structures in preparation for upcoming refactor of formatting/whitespace rules.
large_file_skip_byte_limit which applies prior to
loading the file.GRANT syntax #3807 @Gal40n04ekThis release brings several potentially breaking changes to the underlying parse tree. For users of the cli tool in a linting context you should notic…
This release brings several potentially breaking changes to the underlying parse tree. For users of the cli tool in a linting context you should notice no change. If however your application relies on the structure of the SQLFluff parse tree or the naming of certain elements within the yaml format, then this may not be a drop-in replacement. Specifically:
end_of_file meta segment at the end of the parse structure.template_loop meta segment to signify a jump backward in the source file within a loop structure (e.g. a jinja for loop).identifier and literal type segments will now appear in the parse tree with their more specific type (which used to be called name) e.g. naked_identifier, quoted_identifier, numeric_literal etc...If using the python api, the parent type (such as identifier) will still register if you call .is_type("identifier"), as this function checks all inherited types. However the eventual type returned by .get_type() will now be (in most cases) what used to be accessible at .name. The name attribute will be deprecated in a future release.
Other highlights:
--show-lint-violations to show details on unfixable errors when running sqlfluff fix.--ignore=templating is enabled, undefined Jinja variables now take on "reasonable" default values rather than blank string (""). This can streamline initial rollout of SQLFluff by reducing or eliminating the need to configure templater variables.There are also a ton of other features and bug fixes in this release, including first-time contributions from 11 new contributors! 🎉
ALTER TABLE #3727 @R7L208key from unreserved keywords list #3719 @sabrikaragonenDATEPART date type as date type instead of column name #3681 @borcheroCOLLATE clause in JOIN conditions #3680 @borcheroCALL Support #3659 @WittierDinosaurINTERSECT ALL and EXCEPT ALL #3657 @WittierDinosaurmerge_statement #3654 @barrywhartCONVERT function data type argument #3653 @pdebelak{% call ... %} blocks #3648 @barrywhartALTER TABLE #3643 @R7L208ALTER TABLE IF EXISTS and WHEN SYSTEM$STREAM_HAS_DATA() #3641 @chrisalexeevINTEGER to PrimitiveTypeSegment for Sparksql #3624 @ciwassanoignore_comment_clauses=True #3637 @barrywhartThis is primarily a bugfix release to resolve an issue with the 1.2.0 release where the new version of sqlfluff-templater-dbt relied on functionality
This is primarily a bugfix release to resolve an issue with the 1.2.0 release
where the new version of sqlfluff-templater-dbt relied on functionality
from the new version of sqlfluff but the package configuration had not
been updated. Versions of the two packages are now pinned together.
Adding AWS Athena as a dialect.
Major changes include:
ALTER TABLE #3596 @davidfuhrCREATE COLLATION support #3571 @greg-finleyTOP X to select clause modifiers #3582 @pdebelakCOMMENT ON #3566 @greg-finleyfix_string(). #3568 @alanmcruickshankignore_comment_clauses not working for postgres dialect #3549 @barrywhartL066 - New rule to allow you to set min/max length requirements for aliases to ensure they are meaningful
Major changes include:
blocked_regex as well as blocked_wordsFINAL modifier #3534 @ThomAubHAVING, WHERE, GROUP BY #3526 @R7L208VALUES clause #3533 @barrywhartCALL statement #3529 @greg-finleyMultiStringParser to match a collection of strings #3510 @judahrandPRIMARY KEY AUTOINCREMENT #3527 @greg-finleyLOAD DATA #3518 @greg-finleyGRANT EXECUTE ON PROCEDURES #3516 @greg-finleyDEFAULT expression in Redshift ALTER TABLE ADD COLUMN statements #3513 @menzenskiload_macros_from_path to actually support multiple paths #3488 @emancuRESTORE statement #3486 @R7L208SET clause #3483 @hgranthornerCONVERT TO DELTA command #3482 @R7L208GENERATE command #3478 @R7L208ON blocks #3471 @PeterBalsdonblocked_regex support #3467 @tunethewebDESCRIBE DETAIL command #3465 @R7L208This is the first _stable_ release of SQLFluff 🎉🎉🎉.
This is the first stable release of SQLFluff 🎉🎉🎉.
We've intentionally chosen to release 1.0.0 at a time of relative stability within SQLFluff and not at a time when new big structural changes are being made. This means that there's a good chance that this release is broadly usable. This also recognises that through the hard work of a huge number of contributors that we've built out this from a fringe tool, to something which gets over 500k downloads a month and over 4k stars on Github.
There's still a lot to do, and some more exciting things on the horizon. If you want to be part of this and join the team of contributors, come and hang out in our slack community or on our twitter account where people can help you get started. If you're a long time user, keep submitting bug reports and inputting on issues on Github.
If you've never used SQLFluff before, or are hesitant about starting to use it in your day to day work, now might be a good time to try it. We have guides on how to get started with the tool, and how to get started with rolling out to a team in our docs.
GENERATE_SERIES as a value table function (#3463) @tunethewebCONSTRAINTS in CREATE DOMAIN (#3460) @tunethewebANYELEMENT support (#3458) @tunethewebON CONFLICT support (#3452) @tunethewebALTER TYPE (#3451) @greg-finleyDESCRIBE HISTORY statement (#3447) @R7L208FROM clauses (#3446) @tunethewebdatabricks dialect as an alias for sparksql dialect (#3440) @R7L208{% block %} (#3436) @barrywhartVACUUM statement (#3439) @R7L208numeric_dollar templater to have curly braces, update dollar + numeric_dollar templater examples in docs (#3432) @menzenskiIDENTITY column (seed, step) to be optional (#3430) @menzenskiUPDATE statements with CTEs (#3397) @tunethewebignore_words (#3398) @dmohnsCREATE FUNCTION to use Expressions in default values (#3408) @tunethewebapply_fixes() with leading/trailing whitespace (#3407) @barrywhartALTER TABLE syntax (#3395) @tunethewebcolon_nospaces templating style (#3383) @benji-yorkFix bug causing L003 to report indentation errors for templated code - sorry we know that one's caused many of you some grief :-(
Major changes include:
FOR statements and CREATE PROCEDURE statements).RESPECT NULLS/IGNORE NULLS in window functions (#3376) @tunethewebRETURNS TABLE column type (#3379) @tunetheweb&&, ||, !) (#3359) @mdahlmanLOCK [TABLE] (#3350) @tunethewebcolon_nospaces, and cast to string (#3354) @tunethewebFOR..IN..DO...END FOR support (#3340) @tunethewebVALUES clauses (#3358) @tunethewebALTER SCHEMA (#3346) @mdahlmanSELECT..INTO support (#3351) @tunethewebCREATE TRIGGER (#3349) @tunethewebCASE keyword to Unreserved list (#3353) @tunethewebSET statement. (#3328) @cgkoutzigiannisdate_n_literal (#3344) @greg-finleySELECT statements (#3329) @greg-finleyCLUSTER, DISTRIBUTE, SORT BY (#3304) @barunpuriMERGE statements (#3292) @tunethewebREMOVE statement rework (#3308) @jmc-bbkPUT statement (#3307) @jmc-bbkGET statement (#3305) @jmc-bbkALTER EXTERNAL TABLE (#3302) @jmc-bbkPIVOT placement (#3298) @jpers36LIST statement enhancement (#3295) @jmc-bbkCreate User (#3289) @greg-finleyCREATE STAGE grammar enhancement for file formats (#3293) @jmc-bbkAddition of "rule groups" (currently core and all) to allow ease of turning on and off groups of rules.
Major changes include:
core and all) to allow ease of turning on and off groups of rules.db2 dialectAS in MERGE statements using SELECT #3276 @tunethewebEXPORT DATA statement #3267 @tunethewebCREATE TABLE support for COPY and LIKE #3266 @tunethewebFLUSH support #3269 @greg-finleyALTER TYPE support #3265 @greg-finleySELECT with comment on same line as SELECT keyword #3259 @barrywhartCREATE FILE FORMAT Support #3104 @jmc-bbkAnything() from match_grammars #3258 @tunethewebDOMAIN support #3257 @tunethewebEXECUTE #3255 @pguyotUNSIGNED support #3250 @tunethewebDROP TEMPORARY TABLE #3251 @tunethewebCREATE EXTERNAL TABLE statement #3241 @dmohnsCREATE INDEX columns #3240 @tunethewebcheck_still_complete and matching in StartsWith #3236 @tunethewebDROP Statements #3238 @chrisalexeevtox #3233 @tunethewebload_macros_from_path #3239 @barrywhartapply_fixes() to automatically fix violations of can_start_end_non_code #3232 @barrywhartfor xml path identifier #3230 @fdwSTRUCT support #3217 @tunethewebIF EXISTS work with UNION selects #3218 @fdwfix_even_unparsable setting was not being respected in .sqlfluff #3220 @barrywhartDELETE table support #3224 @tunethewebALTER MATERIALIZED VIEW statement #3215 @jmc-bbkDATE, DATETIME and TIME as a date parts for EXTRACT #3209 @tunethewebUPDATE statement support #3203 @tunethewebDROP EXTENSION syntax #3213 @tunethewebFLATTEN() table function aliases correctly in L025, L027, L028 #3194 @barrywhartLANGUAGE SQL #3202 @WittierDinosaurCREATE MATERIALIZED VIEW #3204 @tunethewebFOR XML statements #3193 @fdwREMOVE statement enhancement #3191 @jmc-bbkVIEW to unreserved keywords #3190 @WittierDinosaurEXPORT DATA #3177 @tunethewebFROM clause #3175 @tunethewebencoding setting in .sqlfluff file was not being respected #3170 @barrywhartPRS errors in red #3168 @OTooleMichaelStartsWith and make terminator mandatory when using it #3165 @tunethewebOUTPUT INTO #3162 @fdwCREATE TYPE statement #3154 @fdwTABLESAMPLE #3159 @barunpuriINSERT and DELETE #3155 @fdwNew Rule (L064) for preferred quotes for quoted literals
Major changes include:
ignore_words_regex configuration option for rulesGRANT/DENY/REVOKE #3149 @tunethewebVALUES in FROM clauses #3141 @tunethewebTRY_CONVERT #3143 @fdwNVARCHAR(MAX) #3130 @fdwINSERT INTO with bracketed SELECT in ANSI and BigQuery #3139 @tunethewebALTER TABLE - add support for WITH CHECK ADD CONSTRAINT and CHECK CONSTRAINT #3132 @nevadoStartsWith() in FromExpressionElementSegment caused performance issues for large queries #3128 @WittierDinosaurAT TIME ZONE parsing improvements #3115 @tunethewebCASE) triggers incorrectly (the ELSE contains additional code) #3113 @barrywhartignore_words_regex configuration option #3098 @dmohnsAT TIME ZONE support #3087 @tunethewebindented_using_on in MERGE statements ON #3096 @dmohnsCOLLATE in more clauses #3095 @tunethewebNORMALIZE function #3086 @tunethewebDROP FUNCTION support #3082 @tunethewebDROP EXTENSION #3083 @tunethewebEXEC = @Variable StoredProc Failed Parsing Bug (#3070) #3077 @MartynJones87UPDATE statement syntax #3073 @R7L208DELETE FROM syntax #3072 @R7L208LANGUAGE params #3068 @tunetheweb{% set a, b = 1, 2 %} #3066 @barrywhartsql_file_exts example #3059 @KulykDmytroSAFE functions #3048 @tunethewebUNNEST for L025 #3054 @tunethewebCREATE/DROP/ALTER USER/ROLE clean up for consistency #3045 @tunethewebALTER ROLE/ALTER USER support #3043 @mrfON CONFLICT Grammar #3027 @jmc-bbkDialect is now mandatory, either in command line, or in config BREAKING CHANGE
Major changes include:
spark3 dialect to sparksql BREAKING CHANGEJOINs in UPDATE expressions #3031 @zapionCREATE USER/CREATE ROLE support #3016 @mrfMERGE syntax #3025 @PhilippLangeexclude option for Ref grammar #3028 @tunethewebREMOVE statements #3026 @WittierDinosaurWEEK function with days of weeks #3021 @tunethewebSTRUCT #3023 @PhilippLangeCREATE TABLE with trailing comma #3018 @dmohnsIS (NOT) DISTINCT FROM test cases #3014 @kd2718OPTIONS in STRUCT definitions #3017 @dmohnsCREATE ROLE and DROP ROLE statements #3010 @dnimCLUSTER BY and other CREATE TABLE improvements #3008 @WittierDinosaurTRIM function parameters #3007 @tunethewebAT TIME ZONE in EXTRACT #3004 @tunethewebDECLARE #3006 @dmohnsAS keyword in parameters def #3001 @pguyotRETURNS @var TABLE syntax #3000 @pguyotDECLARE statements #2999 @pguyotGO #2997 @pguyotMERGE statement variants #2989 @dmohnsis_incremental() defaults consistent #2985 @dmohnsUPDATE Statements #2982 @WittierDinosaurCREATE EXTERNAL SCHEMA, bugfix in PARTITION BY #2983 @WittierDinosaurALTER INDEX and REINDEX to Postgres, Some Grammar Cleaning #2979 @WittierDinosaurSTRUCT params #2975 @tunetheweb-%}) #2976 @barrywhartOPTIONS #2973 @dmohnsOPTIONS clauses #2971 @dmohnsDatatypeIdentifierSegment #2959 @alanmcruickshankWAITFOR statement #2968 @pguyotWHILE statement support #2966 @pguyotINTO is optional within INSERT statement #2963 @pguyotIS (NOT) DISTINCT FROM support in most dialects #2962 @tunethewebCREATE/DROP/DISABLE TRIGGER #2957 @tunethewebOUTPUT Params and GOTO Statements #2949 @tunethewebspark3 to sparksql #2924 @R7L208ALTER STREAM support #2939 @HeyZikoCREATE STREAM support #2936 @HeyZikoUNPIVOT clauses #2925 @tunethewebMERGE statements #2926 @tunethewebAdded Support For Snowflake Inline Comments (#2919) @WittierDinosaur
get_identifier() on Postgres, Redshift dialects (#2899) @barrywhartcast rowtype definition (#2896) @KulykDmytrojson type support (#2894) @KulykDmytroARRAY support (#2891) @tunethewebPIVOT/UNPIVOT Redshift + Fixed Snowflake Bug + Standardized PIVOT/UNPIVOT Parsing (#2888) @PLBMRcast function (#2889) @KulykDmytroSTRUCT Array Support (#2881) @tunethewebBETWEEN statements (#2878) @MarcAntoineSchmidtQCA number of changes to fix code to make these more robust
Major changes include:
fix code to make these more robustgenerate_parse_fixture_yml options to allow quicker, partial regeneration of YML filesSHOW statements #2864 @R7L208_slice_template() function #2870 @barrywhart{% endif %} at end of file #2862 @barrywhartAT TIME ZONE #2863 @tunetheweb{% set %} blocks #2849 @barrywhartValueError: Position Not Found for lint/parse/fix in JinjaTracer #2846 @barrywhartSET and RESET spark runtime configurations #2839 @R7L208CONVERT function definition #2843 @tunethewebDESCRIBE statement #2837 @R7L208REFRESH statements into one class #2838 @R7L208NOW support #2825 @tunethewebDELETE FROM support #2823 @tunethewebIF #2824 @tunethewebfix on dialect fixtures #2818 @tunethewebCACHE AND UNCACHE auxiliary statements #2814 @R7L208CREATE VIEW AS SELECT #2816 @tunethewebMERGE syntax to most dialects #2807 @PhilippLangeChanges rule L030 to use extended_capitalisation_policy to support PascalCase BREAKING CHANGE
Major changes include:
extended_capitalisation_policy to support PascalCase BREAKING CHANGEimplicit aliasesLEFT/RIGHT/OUTER JOINsINTERVAL literals / expression #2804 @sti0IDLE_TIMEOUT and SNAPSHOT_MODE #2805 @sti0INSERT statements (7.1+) #2802 @sti0INSERT grammar #2798 @jpy-gitVALUES, make Spark3 VALUES consistent #2797 @jpy-gitINSERT DEFAULT value #2796 @jpy-gitAS optional in Postgres DELETE #2794 @jpy-gitUNEST aliases #2793 @tunethewebDELETE FROM grammar #2792 @jpy-gitDELETE FROM grammar #2791 @jpy-gitRETURNING grammar to INSERT INTO statement #2790 @jpy-gitPATTERN grammar #2788 @jpy-git[ALTER/CREATE/DROP] PROCEDURE segments #2774 @rpr-abletonANALYZE TABLE statement #2780 @R7L208MATCH_RECOGNIZE clause #2781 @jpy-gitLIMIT grammar #2784 @jpy-gitLIKE grammar #2779 @jpy-gitFILE and JAR statements #2778 @R7L208SET/UNSET MASKING POLICY grammar #2775 @jpy-git= --> IS #2760 @OTooleMichaelSELECT DISTINCT id query #2768 @barrywhartCHANGES clause #2764 @jpy-gitEXPLAIN statement #2767 @R7L208CONNECT BY clause #2763 @jpy-gitTRANSFORM clause #2762 @R7L208GROUP BY {CUBE|ROLLUP|GROUPING SETS} parsing #2759 @jpy-gitignore_words options to L057 and L059 #2753 @tunethewebPIVOT clause #2752 @R7L208inject_ctes_into_sql() #2748 @barrywhartCREATE USER #2744 @sti0load_macros_from_path #2743 @barrywhart=) #2745 @barrywhartBaseSegment.pos_marker is typed as non optional but sometimes set to None #2741 @barrywhartSIMILAR TO pattern matching expressions #2732 @PLBMR_eval() into individual functions to improve readability #2733 @barrywhartfix_str passes the rule #2624 @juhoautioLEFT/RIGHT/OUTER JOINs #2719 @rpr-ableton= #2727 @fdwCASE clause #2714 @R7L208WINDOW functions #2711 @R7L208RAISERROR parameters #2709 @jpers36OPTION clause to UPDATE #2707 @jpers36WHERE clause #2704 @R7L208PARTITION BY elements #2702 @jpers36SET TRANSACTION ISOLATION LEVEL parsing #2701 @jpers36LATERAL VIEW clause #2687 @R7L208CROSS joins #2680 @sti0CREATE INDEX/STATISTICS #2679 @jpers36TABLESAMPLE clause #2674 @R7L208RAISERROR functionality #2672 @jpers36MERGE INTO predicates #2670 @The-LoudImprovements to rules L023, L045, L048, L052, L059 to make them more accurate.
Major changes include:
sqlfluff fix cannot find a stable fix after runaway_limit iterations (default 10) then no fixes will be applied.--write-output config to command line so prevent errors corrupting output.SORT BY Clause (#2651) @R7L208CURRENT_TIMESTAMP() in CREATE TABLE (#2648) @tunethewebDELETE FROM syntax (#2643) @tunethewebQUALIFY clause (#2647) @barrywhartJOIN ON clause if join expression in parentheses (#2645) @barrywhartUNPIVOT and PIVOT fixes (#2619) @tunethewebORDER BY in SELECT (#2618) @R7L208LIMIT Clause (#2612) @R7L208LIKE clause (#2604) @R7L208Dropping support of DBT < 0.20 BREAKING CHANGE
Major changes include:
sqlfluff fix no will no longer fix SQL containing parsing or templating errors ** BREAKING CHANGE **click python packageJOIN clause enhancements (#2570) @R7L208COMMENT and WITH [NO] DATA clause usage. (#2583) @sti0LOCAL keywords in WHERE clause (#2582) @sti0LOCAL keyword within PREFERRING clause (#2579) @sti0SELECT REPLACE clauses. (#2550) @elyoboBetter datepart versus identifier parsing.
Major changes include:
click dependency error.HAVING clause in SELECT statement (#2517) @R7L208CUBE and ROLLUP in GROUP BY clause of SELECT statement (#2505) @R7L208DISTRIBUTE BY clause in SELECT statement (#2503) @R7L208CLUSTER BY clause in SELECT statement (#2491) @R7L208Full Changelog: https://github.com/sqlfluff/sqlfluff/compare/0.9.3...0.9.4
Add ignore_words option for rules L010, L014, L029, L030, L040
Major changes include:
ignore_words option for rules L010, L014, L029, L030, L040LOAD DATA statements (#2450) @R7L208We are pleased to include 110 improvements and fixes in this release, and welcome 7 new contributors to the code.
We are pleased to include 110 improvements and fixes in this release, and welcome 7 new contributors to the code.
Major changes include:
COALESCE instead of IFNULL or NVL!= over <>INSERT OVERWRITE DIRECTORY with Hive Format (#2389) @R7L208LOCAL.ALIAS Syntax (#2430) @sti0INSERT OVERWRITE DIRECTORY statements (#2385) @R7L208INSERT [TABLE] data manipulation statements (#2290) @R7L208AnySetOf grammar (#2326) @jpy-gitALTER TABLE's tableColumnAction grammar (#2332) @wong-codaioAlterTableStatement specific for Snowflake (#2267) @wong-codaioREFRESH auxiliary statements (#2282) @R7L208USE DATABASE statement. (#2276) @R7L208main (#2280) @barnettTRUNCATE statement in Spark3 dialect (#2272) @R7L208click version to 8.0+ to support click.shell_completion (#2271) @wong-codaioFix some SQL corruption issues with templated code
default definition of declare #2120 @KulykDmytrodbt_modules to dbt_packages #2143 @ciklistahive and redshift (L026, L028) #2154 @KulykDmytroObjectReferenceSegment #2190 @tdstarkCREATE TABLE LIKE syntax #2207 @R7L208CREATE VIEW into its own segment #2217 @wong-codaioDROP DDL statements for Spark3 #2215 @R7L208Refinement to Simple API to return parse output in JSON format rather than as an internal SQLFluff object (BREAKING CHANGE).
This release brings about several great new additions including:
There have also been many bug fixes and improvements to the CI and development processes.
on delete and on update clause for create table constraints #2076 @kayman-mkdeclare and set statements for bigquery dialect #2038 @KulykDmytronoqa enhancement: Enable glob rule matching for inline comments #2002 @jpy-git.sqlfluff enhancement: Rule globs #1972 @jpy-gitOne of the biggest new features in this release is the support for SQLAlchemy and other "placeholder" templating within SQL queries. Check out the doc
One of the biggest new features in this release is the support for SQLAlchemy and other "placeholder" templating within SQL queries. Check out the documentation on how to set it up.
This release also adds seven new rules. Get some help with your leading whitespace, semi-colon placement, inconsistent column references in GROUP BY/ORDER BY, and getting rid of RIGHT JOIN's among other useful lints with our new rules! See our rules documentation for more details.
On top of those, we have made loads of grammar improvements across many dialects, improvements to the dbt templater (including issues where sqlfluff fix would corrupt the code :scream:), more fix routines, and lots more improvements.
exclude_rules option for the Simple API #1850 @tunethewebskip_install to static analysis sections of tox.ini #1851 @jpy-gitrequirements_dev.txt to requirements.txt #1956 @jpy-gitFixes missing dependency issue with 0.8.0 for tqdm, plus add a test to ensure this does not happen again.
Fixes missing dependency issue with 0.8.0 for tqdm, plus add a test to ensure this does not happen again.
This release brings an improvement to the performance of the parser, a rebuild of the Jinja Templater, and a progress bar for the CLI. Lots of dialect
This release brings an improvement to the performance of the parser, a rebuild of the Jinja Templater, and a progress bar for the CLI. Lots of dialect improvements have also been done. Full list of changes below:
Highlights of this release contains a lot of T-SQL dialect improvements (shout out to @jpers36 for most of these!). We also added Spark3 as a new dial
Highlights of this release contains a lot of T-SQL dialect improvements (shout out to @jpers36 for most of these!). We also added Spark3 as a new dialect thanks to @R7L208. The complete list of changes are shown below.
This release extracts the dbt templater to a seperately installable plugin sqlfluff-templater-dbt. For users who take advantage of the dbt templater s
BREAKING CHANGE
This release extracts the dbt templater to a seperately installable plugin sqlfluff-templater-dbt. For users who take advantage of the dbt templater see the updated docs on how to migrate. It also adds the redshift dialect and removes the exasol_fs dialect which has been merged into the exasol dialect.
SET statement #1604 @wong-codaioFix the next github action (#1605) @alanmcruickshank
SET statement (#1604) @wong-codaioNothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →