Ad
 
Learn More
Favicon of SQLFluff Releases

SQLFluff Releases

Active

SQLFluff • Last updated 19 days ago

Activity Score

80/100
Recency:25/30
Cadence:15/30
Completeness:30/30
Health:10/10
  • Updated in the last month
  • 1 update in last 30 days
  • Complete entries with dates, titles, URLs, and summaries

Recent Updates

[4.3.0] - 2026-08-07

Highlights 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. BigQuery pipe syntax ( |> ) 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. ClickHouse gains support for 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. A new rule, RF07 , flags window-clause references that shadow a SELECT alias. lint , fix , and format all gain a consistent --quiet output mode. This release introduces the first Rust-native lint rule detection ( 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. 🏆 What’s Changed fix(rust): avoid double allocation in pyo3 getters for collection fields (trim/type/escape) ( #8247 ) @rubytobi fix(rust): match Rust parser bracket matching to Python's behaviour on crossed, unclosed, and dialect-specific brackets ( #8243 ) @rubytobi fix: pass sync=True to GhApi in release script ( #8281 ) @alanmcruickshank feat(clickhouse): add support for TRUNCATE TABLES statement ( #8279 ) @AndrewKurg Allows %TYPE column type references in TABLE returns for functions in Postgres ( #8269 ) @KuttKatrea test(ST06): pin reordering of a qualified reference with a parameterised cast ( #8276 ) @adhavan18 fix: auto-detect cached_property names and invalidate on pos_marker change ( #8274 ) @JoeJoeflyn Db2: parse COMMENT ON, multi-grantee GRANT and view WITH [NO] ROW MOVEMENT ( #8262 ) @davidpavlovschi CV12: don't fix join conditions when the join clause is templated ( #8255 ) @devanshranjan10 Support quiet output across lint, fix, and format ( #8258 ) @TrapsterDK Fix Oracle SELECT INTO record field parsing ( #8252 ) @subotac fix(ST02): preserve indexed expressions in NULL simplification ( #8202 ) @dev-willbird1936 fix(sparksql): allow expression values in SET statements ( #8187 ) @Otto-Deviant1904 Parse round-bracketed MAP types in Athena ( #8246 ) @davidpavlovschi Fix AL01 loop on bracketed column aliases ( #8245 ) @davidpavlovschi Snowflake: parse ADAPTIVE refresh mode, INITIALIZATION_WAREHOUSE, and streams on dynamic tables ( #8241 ) @adhavan18 test(ST11): pin the UNNEST + deeply nested struct case from #6997 ( #8240 ) @adhavan18 fix(rust): lexer/parser divergences in trim_chars inheritance and escape_replacements handling ( #8224 ) @rubytobi fix(rust): match Python's parse-error message text (Sequence wording, token class/repr, grammar repr truncation) ( #8225 ) @rubytobi duckdb: parse USING SAMPLE / TABLESAMPLE ( #8229 ) @hdimer ST07: don't fix when a USING column is referenced unqualified ( #8175 ) @vidigoat feat(clickhouse): add support for REGEXP operator ( #8235 ) @AndrewKurg BigQuery: parse EXCEPT/REPLACE after a wildcard on an array element ( #8194 ) @adhavan18 CV10: don't corrupt string literals that use quote-doubling escapes (fixes #8179 ) ( #8193 ) @rahul188 perf(rust): frame-free terminal evaluation ( #8168 ) @rubytobi fix(dialects/oracle): support positional substitution variables (&1, &&1) ( #8233 ) @felipeatom rust(fix): Resolve two codegen-determinism hazards (id-cache collisions and unsorted currency-symbol regex) ( #8226 ) @rubytobi Databricks: config to stop ST12 flagging command cell delimiters as consecutive terminators ( #8197 ) @tsedeus feat(clickhouse): add support for EXCHANGE statement ( #8221 ) @AndrewKurg Impala: add support for VALUES aliases ( #8185 ) @strang3nt feat(clickhouse): add support for TRUNCATE DATABASE ( #8228 ) @AndrewKurg fix(dialects/postgres): parse MERGE ... WHEN NOT MATCHED BY SOURCE/TARGET ( #8216 ) @hdimer Postgres: stop LT01 spacing array types like int [] ( #8222 ) @apoorva-01 feat(postgres): support MERGE ... THEN DO NOTHING ( #8223 ) @mbsdeepak fix(ci): collapse agent-scan into one pull_request_target workflow ( #8217 ) @keraion Teradata: parse data type attributes ((NOT) CASESPECIFIC/CS, UPPERCASE) on expressions ( #8124 ) @adhavan18 Add a Python-vs-Rust parser/lexer parity test harness ( #8198 ) @rubytobi Add GitHub Actions workflows for agent scan analysis and moderation ( #8208 ) @peterbud Fix Databricks materialized view expectation constraints ( #8212 ) @vetrovk feat(clickhouse): add clickhouse specific truncate table grammar ( #8210 ) @AndrewKurg Fix CI lint instability caused by upgrading to Ruff 0.16.0 in scheduled runs. ( #8211 ) @peterbud BigQuery: model pipe syntax as a postfix on selectables ( #8195 ) @ricardoalencar-pr perf(templater): skip Jinja machinery for template-free files ( #8161 ) @rubytobi AM04: resolve each UNION branch's wildcard against its own branch ( #8183 ) @chuenchen309 BigQuery: allow a pipe query after a WITH clause ( #8191 ) @ricardoalencar-pr Indent BigQuery pipe AGGREGATE and EXTEND clause lists ( #8190 ) @ricardoalencar-pr Fix ST07 pairing the wrong tables when a comma-join precedes USING ( #8180 ) @chuenchen309 Guard BigQuery and ClickHouse explicit view column lists in ST06 ( #8178 ) @chuenchen309 RF01: resolve UPDATE target alias nested in from_expression (MySQL) ( #8176 ) @vidigoat Snowflake: parse scripting bind variables (:var) in expressions ( #8163 ) @adhavan18 Teradata: lex scientific-notation and leading-dot numeric literals ( #8181 ) @chuenchen309 fix(oracle): allow trailing-dot numeric literals like 1. ( #8155 ) @Otto-Deviant1904 fix(dialects/postgres): parse ORDER BY ... USING operator ( #8182 ) @chuenchen309 MySQL: parse CONVERT(expr, type) and CONVERT(expr USING charset) ( #8177 ) @chuenchen309 MariaDB: support IF [NOT] EXISTS on ALTER TABLE index and constraint clauses ( #8174 ) @mrsinham Leave the jinja context out of config path resolution ( #8173 ) @chuenchen309 Fix IndexError on a two-character inline config value ending in a colon ( #8170 ) @chuenchen309 fix(config): validate render_variant_limit and runaway_limit ( #8152 ) @anxkhn fix(rust): match Python's repr()-quoted, truncated unlexable-error text in the Rust lexer ( #8147 ) @rubytobi fix(convention): make CV07's fix order deterministic ( #8144 ) @keraion Don't hoist a subquery correlated in a later set expression branch ( #8169 ) @chuenchen309 Leave a schema-qualified NVL/IFNULL alone ( #8172 ) @chuenchen309 fix(docs): read stable_version as a nested pyproject key ( #8150 ) @anxkhn docs: update dialect contributing guide to current grammar API ( #8151 ) @anxkhn fix(parser): stop genexpr/comprehension recursion from halving safe parse-tree depth ( #8148 ) @rubytobi Fix CV12 false positive on NATURAL JOIN ( #8165 ) @chuenchen309 Added support for * EXCEPT (col1, col2) in MERGE statement for SparkSQL ( #8154 ) @timothyvries Add rule RF07 to flag window-clause references that shadow a select alias ( #8153 ) @Booyaka101 Fix clippy failures blocking main CI ( #8160 ) @rubytobi Enforce clean clippy in CI and remove dead code across the Rust workspace ( #8098 ) @rubytobi fix(rust): key the TemplatedFile conversion cache by object identity ( #8143 ) @keraion fix(convention): build CV11 replacements parse-shaped ( #8142 ) @keraion perf: lazy SegmentCloneMap in ST05 — clone only when a subquery is rewritten ( #8141 ) @keraion refactor(rules): façade-safe segment checks — is_type over isinstance, uuid over id() ( #8140 ) @keraion fix(rust): bare-class grammars consume matching tokens unchanged ( #8138 ) @keraion Rename Rust skip-backward-to-code helpers to match Python ( #8149 ) @apoorva-01 feat(rust): port CP03 and CP04 to Rust-native detection ( #8069 ) @WittierDinosaur Add opt-in T-SQL rule to prefer AS aliasing over alias = expression ( #8085 ) @ copilot-swe-agent[bot] fix(core): re-parent provided children in BaseSegment.copy ( #8109 ) @keraion fix(config): coerce quoted allow_implicit_indents deprecation value ( #8135 ) @anxkhn Oracle: parse XMLATTRIBUTES alias list in XMLELEMENT ( #8113 ) @apoorva-01 MySQL: don't flag index prefix length with LT01 ( #8128 ) @apoorva-01 docs: fix developing-rules guide to document crawl_behaviour, not removed fields ( #8137 ) @anxkhn Fix nested bracket-type mismatch recovering instead of raising, matching Python's resolve_bracket ( #8120 ) @rubytobi docs(reflow): fix ReflowSequence.respace filter value in docstring ( #8136 ) @anxkhn fix(rust): drop Indent/Dedent that are direct children of Bracketed ( #8108 ) @keraion fix(core): remove orphaned temp file when safe file replace fails ( #8134 ) @anxkhn Teradata: make OVERLAPS an infix comparison operator ( #8123 ) @apoorva-01 feat(mysql): support GROUP BY ... WITH ROLLUP (supersedes #8066 , indent-safe) ( #8130 ) @Synvoya Fix unclosed GREEDY-mode bracket recovering instead of raising ( #8121 ) @rubytobi Fix isinstance-preserved token type dropped by RustParser.parse() ( #8122 ) @rubytobi fix: RF02 should not flag BigQuery whole-row table references ( #8133 ) @mvanhorn Postgres: stop LT01 splitting psql variables like :status ( #8131 ) @Rishi943 RF03: treat Athena as a struct dialect ( #8132 ) @Rishi943 Athena: accept ARRAY(type) as well as ARRAY ( #8127 ) @apoorva-01 Fix mismatched bracket type giving generic error only ( #8119 ) @rubytobi Fix Bracketed GREEDY mode absorbing trailing trivia into unparsable segment ( #8118 ) @rubytobi Fix/greedy match stray closing bracket ( #8117 ) @rubytobi Read Jinja macro files with the configured encoding ( #6633 ) ( #8103 ) @apoorvdarshan fix GREEDY sequence partial-match failure dropping matched children ( #8116 ) @rubytobi fix(sqlite): parse CTE materialization hints ( #8126 ) @karimudev ClickHouse: parse GROUP BY WITH ROLLUP / CUBE / TOTALS ( #8037 ) ( #8101 ) @apoorvdarshan fix(rust): honor RegexParser ignore_case ( #8107 ) @keraion ClickHouse: parse multi-column LIMIT n BY a, b ( #8030 ) ( #8105 ) @apoorvdarshan ClickHouse: parse ORDER BY / LIMIT / SETTINGS on non-final union members ( #8031 ) ( #8100 ) @apoorvdarshan Don't strip newlines that sit directly before a comment ( #8057 ) @CodeBlackwell perf(linter): dedupe source patches with a set, not a list ( #8084 ) @anxkhn [databricks]: support bare Databricks notebook magic cells ( #8011 ) @peterbud Add regression tests for Lexer and Parser divergences ( #8106 ) @rubytobi Oracle: parse FOR UPDATE ... NOWAIT / WAIT n / SKIP LOCKED ( #8097 ) ( #8099 ) @apoorvdarshan Parse Oracle function RETURN with %type and %rowtype ( #8090 ) @apoorva-01 fix(clickhouse): parse tuple element access on any expression ( #8062 ) @Sanjays2402 Stop LT01 spacing Oracle %type/%rowtype like modulo ( #8096 ) @apoorva-01 TSQL: restore normalization kwargs on the patched single_quote lexer (RF05 false positive on quoted aliases) ( #8088 ) @Pawansingh3889 clickhouse: parse ORDER BY ... WITH FILL ... INTERPOLATE ( #8029 ) ( #8065 ) @apoorvdarshan perf: bypass setattr in RawSegment. init via direct dict writes ( #8093 ) @rubytobi perf: remove duplicate cache invalidation in BaseSegment.__init__ ( #8091 ) @rubytobi perf: avoid quadratic tuple concatenation when applying match results ( #8089 ) @rubytobi fix: raise SQLFluffUserError for invalid rule config option values ( #8095 ) @anxkhn docs: fix BaseGrammar.copy terminators arg reference ( #8094 ) @anxkhn docs(cli): correct fix --quiet help note about --force ( #8083 ) @anxkhn docs(parser): correct min_delimiters type and default in Delimited docstring ( #8082 ) @anxkhn fix(sparksql): treat LEFT/RIGHT as non-reserved so they can be lambda variables ( #8050 ) @anxkhn Fix Oracle SQLPlus SET SCAN parsing ( #8081 ) @vetrovk perf(python): avoid deep-copying dialect_obj/templater_obj in FluffConfig.copy ( #8079 ) @rubytobi perf(rust): compare Arc by pointer instead of by value in PositionMarker merge ( #8078 ) @rubytobi Parse Oracle ALTER TABLE ADD with bracketed constraints ( #8076 ) @apoorva-01 Parse Oracle FOR loop ranges with function-call bounds ( #8077 ) @apoorva-01 Parse Oracle SQL*Plus ACCEPT and REMARK commands ( #8067 ) @vetrovk [codex] Parse SparkSQL SET literal lists ( #8052 ) @EltonChang1 Fix LT07 non-idempotent fix for CTE brackets that become multi-line ( #8068 ) @gaoflow fix(postgres): parse COPY ... FROM STDIN inline data blocks ( #8059 ) @truffle-dev Parse ClickHouse parametrized JSON type arguments ( #8053 ) @billykern spike(rust): Rust-native lint rule detection (CP01 proof-of-concept) ( #7984 ) @WittierDinosaur Support WITH TAG clause in Snowflake CREATE TASK ( #8061 ) @apoorvdarshan Fix ClickHouse double equals parsing ( #8045 ) @ishaanlabs-gg fix(postgres): parse psql variable placeholders as COPY targets ( #8027 ) @truffle-dev docs(dbt): recommend explicit utf-8 encoding ( #8041 ) @ishaanlabs-gg Split PG01 foreign key NOT VALID check ( #7967 ) @cyphercodes fix(snowflake): parse SYSTEM function expressions ( #8040 ) @ishaanlabs-gg Dialect/Snowflake: support dbt projects and dcm projects ( #8039 ) @evgf fix(rust): correct subquery/SELECT parse via GREEDY-family cache skip ( #8026 ) @keraion fix(mysql): parse JSON_VALUE RETURNING type with CHARACTER SET ( #8028 ) @anxkhn fix(mysql): parse JSON_TABLE COLUMNS as identifiers not references ( #8025 ) @truffle-dev perf(rust): share class_types as a per-kind Arc instead of per-token HashSet ( #8022 ) @keraion fix(teradata): parse BTEQ FILE= command arguments ( #8023 ) @anxkhn perf(rust): memoize Ref child-grammar resolution (~22% faster parsing) ( #8024 ) @keraion perf(rust): borrow static Token strings as Cow<'static, str> ( #8021 ) @keraion Fix RF02 false positive on table alias inside a query hint ( #8018 ) @truffle-dev perf(rust): borrow static segment type/class strings into the Node + arena tree ( #8020 ) @keraion perf(rust): compute raw_normalized lazily with cached regex compilation ( #8019 ) @keraion perf(rust): replace HashMap results store with single Option slot in parse frame stack ( #8017 ) @rubytobi Parse ClickHouse C-style ternary conditional operator ( #8016 ) @truffle-dev refactor(rust): encapsulate raw/raw_upper in RawString to enforce invariant ( #8009 ) @rubytobi fix: preserve Oracle execute file at-sign spacing ( #8015 ) @ekkoitac fix(oracle): parse INTERVAL data types in CAST expressions ( #8014 ) @ copilot-swe-agent[bot] [Oracle] Parse TIMESTAMP WITH LOCAL TIME ZONE in CAST(...) ( #8012 ) @ copilot-swe-agent[bot] fix(rust): match Python's bracket-nesting depth in Anything grammars ( #8013 ) @keraion perf(rust): fused RsMatchResult->BaseSegment builder (native AST, gated) ( #7983 ) @WittierDinosaur Fix RF03 false positive on whole-row references (e.g. postgres ->> ) ( #7921 ) @Labib-Bin-Salam Fix RF02 false positive on SELECT * EXCEPT (...) columns ( #7999 ) @arpitjain099 fix(rust): Make Parser metrics accessible again ( #8006 ) @keraion perf(rust): replace Vec/String frame fields with SmallVec and static str ( #8002 ) @rubytobi feat(rust): id-addressable arena tree (RsTree/RsHandle) substrate ( #7986 ) @keraion perf(rust): remove RefCell wrappers from parser caches ( #8004 ) @rubytobi perf(rust): precompute raw_upper on token construction ( #7991 ) @rubytobi perf: replace per-token uuid4 with a tagged monotonic counter (Python + Rust) ( #7997 ) @keraion fix(rust): match Python leaf segment types for TypedParser and Anything brackets ( #8001 ) @keraion fix(rust): flatten only raw-segment wrappers in Node::to_tuple ( #8000 ) @keraion fix(rust): correct aux_end so node class_types aren't truncated ( #7985 ) @WittierDinosaur fix(oracle): parse PIVOT/UNPIVOT with WHERE or num label ( #7973 ) ( #7974 ) @GHRF perf(rust): defer RawSegment.representation to cached_property and replace uuid4 with os.urandom ( #7988 ) @rubytobi perf(rust): fix O(n²) validation in map_template_slices ( #7995 ) @rubytobi perf(rust): eliminate dummy Arc<MatchResult> sentinel in RefState ( #7996 ) @rubytobi Parse Databricks view comments as comment clauses ( #7993 ) @vetrovk perf(python): guard linter stringify calls behind isEnabledFor ( #7989 ) @rubytobi perf(rust): wrap cached RegexMode entries in Arc to avoid cloning on cache hit ( #7990 ) @rubytobi fix: don't crash when a directory named .sqlfluff exists ( #6617 ) ( #7975 ) @Shevilll Support T-SQL ALTER CREDENTIAL and ALTER/DROP DATABASE SCOPED CREDENTIAL ( #7970 ) @Pawansingh3889 perf(rust): add per-stage profiling to the Rust parse path ( #7982 ) @WittierDinosaur fix: allow EXTENDED as identifier in Athena SELECT/CTE ( #7977 ) @Jyriu rust: move parser metrics into its own struct ( #7981 ) @keraion rust: Fix Bracketed allow_gaps=false STRICT to match Python ( #7979 ) @keraion docs: refresh sqlfluffrs AGENTS.md for the multi-crate workspace ( #7980 ) @WittierDinosaur refactor/docs: FrameContext/phase + Engine docs ( #7978 ) @keraion perf: cache terminator match results in greedy_match_table_driven ( #7925 ) @rubytobi reflow: Support strict fixes; LT03 add pipe operator ( #7966 ) @keraion sparksql: Add iceberg merge support ( #7968 ) @keraion fix(oracle): support DEFAULT keyword in pragma restrict_references (fixes #7957 ) ( #7965 ) @gaoflow refactor: extract reference/alias segment methods into dialect-dispatched free functions ( #7962 ) @keraion perf: replace inline OneOf terminator check with is_terminated_table_driven ( #7924 ) @rubytobi perf: setup TPC benchmarks and collect initial numbers ( #7923 ) @rubytobi Don't flag required alias on T-SQL table-valued XML methods (AL05) ( #7955 ) @gaoflow chore: bump dependency click<8.5.0 ( #7961 ) @keraion rust: Don't strip debuginfo on bench for flamegraph ( #7963 ) @keraion Added support for INSERT ... BY NAME for SparkSQL ( #7959 ) @timothyvries [oracle] Parse legacy (+) joins against literals without LT02 false positives ( #7953 ) @ copilot-swe-agent[bot] fix: AL05 false positive on whole-row alias references (postgres) ( #7906 ) @Bortlesboat ci: Add Rust fmt/clippy/unit-test job for sqlfluffrs ( #7942 ) @keraion Support Oracle slash batch delimiter after views ( #7945 ) @koriyoshi2041 Support Oracle KEEP (DENSE_RANK ... FIRST/LAST ... ) syntax ( #7950 ) @GHRF Allow Snowflake UNPIVOT as an identifier ( #7946 ) @koriyoshi2041 chore(rust): bump pyo3 to 0.29.0 ( #7954 ) @keraion databricks: Fix foreign key ON DELETE/ON UPDATE action ordering ( #7952 ) @ copilot-swe-agent[bot] Support Databricks infix collation ( #7943 ) @koriyoshi2041 Support Databricks TEMP VIEW ( #7951 ) @koriyoshi2041 Support Oracle LANGUAGE JAVA NAME function clauses ( #7944 ) @vetrovk Support Databricks ?:: try_cast operator ( #7927 ) @Booyaka101 refactor(rust): Drop unused transparent_positions frame field ( #7936 ) @keraion codegen: Error on missing grammar handlers at build time ( #7935 ) @keraion fix(rust): Update stale GrammarTables::new test calls ( #7934 ) @keraion fix(LT02): indent oscillation for loop-conditional trailing commas ( #7928 ) @keraion Support for DBT_ENGINE_ configs and additional DBT_ENGINE_PROFILE ( #7907 ) @yann1cks parser: Increase default max_parse_depth to 600 ( #7922 ) @keraion Support T-SQL CREATE CREDENTIAL ( #7920 ) @Booyaka101 Fix LT13 autofix before empty-rendering dbt config blocks ( #7901 ) @ copilot-swe-agent[bot] Fix Teradata date cast parsing ( #7919 ) @henyanagar fix: ST10 false positive when RHS operand is part of a binary expression ( #7918 ) @Booyaka101 Update so that sqlfluff can parse backquoted databricks function argu… ( #7917 ) @VictorAtIfInsurance fix(rust): Bracket optimization shouldn't match non-code. ( #7916 ) @keraion New Contributors @henyanagar made their first contribution in #7919 @yann1cks made their first contribution in #7907 @vetrovk made their first contribution in #7944 @GHRF made their first contribution in #7950 @Bortlesboat made their first contribution in #7906 @timothyvries made their first contribution in #7959 @gaoflow made their first contribution in #7955 @Jyriu made their first contribution in #7977 @Pawansingh3889 made their first contribution in #7970 @Shevilll made their first contribution in #7975 @arpitjain099 made their first contribution in #7999 @Labib-Bin-Salam made their first contribution in #7921 @ekkoitac made their first contribution in #8015 @truffle-dev made their first contribution in #8016 @anxkhn made their first contribution in #8023 @evgf made their first contribution in #8039 @ishaanlabs-gg made their first contribution in #8040 @apoorvdarshan made their first contribution in #8061 @billykern made their first contribution in #8053 @EltonChang1 made their first contribution in #8052 @apoorva-01 made their first contribution in #8077 @Sanjays2402 made their first contribution in #8062 @CodeBlackwell made their first contribution in #8057 @karimudev made their first contribution in #8126 @Rishi943 made their first contribution in #8132 @mvanhorn made their first contribution in #8133 @Synvoya made their first contribution in #8130 @chuenchen309 made their first contribution in #8165 @mrsinham made their first contribution in #8174 @Otto-Deviant1904 made their first contribution in #8155 @adhavan18 made their first contribution in #8163 @vidigoat made their first contribution in #8176 @ricardoalencar-pr made their first contribution in #8190 @AndrewKurg made their first contribution in #8210 @mbsdeepak made their first contribution in #8223 @hdimer made their first contribution in #8216 @strang3nt made their first contribution in #8185 @tsedeus made their first contribution in #8197 @felipeatom made their first contribution in #8233 @rahul188 made their first contribution in #8193 @davidpavlovschi made their first contribution in #8245 @dev-willbird1936 made their first contribution in #8202 @subotac made their first contribution in #8252 @TrapsterDK made their first contribution in #8258 @devanshranjan10 made their first contribution in #8255 @JoeJoeflyn made their first contribution in #8274 @KuttKatrea made their first contribution in #8269

Read more →

[4.2.2] - 2026-06-04

Highlights 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. 🏆 What’s Changed Add beta docs deployment and versioned publishing ( #7912 ) @alanmcruickshank perf: defer parse-tree serialisation in logging calls ( #7911 ) @rubytobi Fix typo: 'the the' -> 'the' in test comment ( #7908 ) @drori12 Support T-SQL DROP CREDENTIAL ( #7904 ) @koriyoshi2041 fix(dbt-templater): honor DBT_TARGET / DBT_TARGET_PATH env vars ( #7900 ) @dtaniwaki fix(mariadb): support CREATE OR REPLACE TRIGGER syntax ( #7897 ) @IdanGonen fix(postgres): parse \crosstabview after WITH compound statement (CTE) ( #7895 ) @IdanGonen Add support for various T-SQL privileges ( #7894 ) @grv87 fix(tsql): parse label following SELECT without semicolon ( #7867 ) @IdanGonen Add Rule CV13: CREATE INDEX should use CONCURRENTLY (Postgres) ( #7832 ) @OmerDital Fix more duplicate-word typos in documentation ( #7889 ) @RonGamzu Fix Athena property name capitalisation ( #7875 ) @puneetdixit200 feat(mysql): add support for CURRENT_TIMESTAMP in ALTER TABLE statements ( #7885 ) @peterbud Fix duplicate-word typos in docstrings and documentation ( #7888 ) @RonGamzu fix(RF01): ignore T-SQL CONTAINSTABLE argument references ( #7860 ) @peterbud Fix ST11 false positives for LEFT SEMI and LEFT ANTI joins ( #7887 ) @cyphercodes Support MariaDB ALTER TABLE ... ADD|DROP SYSTEM VERSIONING ( #7883 ) @ copilot-swe-agent[bot] mysql/mariadb: Support ALTER/CREATE TABLE CHARSET/COLLATE DEFAULT ( #7882 ) @keraion tsql: parse DROP SEQUENCE IF EXISTS ( #7858 ) @ copilot-swe-agent[bot] Allow PostgreSQL BEGIN ATOMIC function bodies to parse UNION ALL ( #7861 ) @ copilot-swe-agent[bot] ci: build multiple docker images ( #7872 ) @keraion build(docs): Deploy Docs CI with pnpm build approvals ( #7874 ) @peterbud Force color output when --color is requested ( #7873 ) @puneetdixit200 LT03: add :attached modifier for leading/trailing line_position ( #7704 ) @saulotoledo chore(docs): Update dependencies ( #7865 ) @peterbud fix(postgres): support bracketed arguments on user-defined types in casts ( #7824 ) @jonasboos fix(mysql,mariadb): support VALUES IN with literals in PARTITION BY LIST ( #7826 ) @jonasboos fix(materialize): support LIST type modifier in shorthand casts ( #7829 ) @jonasboos fix: parse table.* in expressions as a wildcard identifier ( #7845 ) @mokashang fix(snowflake): support SELECT * ILIKE '' syntax ( #7866 ) @pif Fix MySQL ALTER TABLE parsing with ALGORITHM and LOCK options ( #7864 ) @Vreyesm New Contributors @Vreyesm made their first contribution in #7864 @pif made their first contribution in #7866 @mokashang made their first contribution in #7845 @puneetdixit200 made their first contribution in #7873 @cyphercodes made their first contribution in #7887 @RonGamzu made their first contribution in #7888 @OmerDital made their first contribution in #7832 @IdanGonen made their first contribution in #7867 @dtaniwaki made their first contribution in #7900 @koriyoshi2041 made their first contribution in #7904 @drori12 made their first contribution in #7908 @rubytobi made their first contribution in #7911

Read more →

[4.2.1] - 2026-05-14

Highlights 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! 🏆 What’s Changed build(deps): bump axios from 1.13.6 to 1.16.1 in /docsv ( #7846 ) @ dependabot[bot] TSQL: enable parameters in CONTAINSTABLE ( #7843 ) @peterbud Cut back the rust wheels distributed and use ABI3 ( #7844 ) @alanmcruickshank fix(tsql): RuntimeError parsing grant alter/create statements ( #7835 ) @simondennis9 New Contributors @simondennis9 made their first contribution in #7835

Read more →

[4.2.0] - 2026-05-13

Highlights This minor release contains four particular changes of note: The default 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 . This release drops support for Python 3.9, which reached end of life at the end of October 2025. Security improvements that protect against resource exhaustion through malicious queries by limiting total parsed nodes. Users can configure the new max_parse_nodes config setting to enable parsing of larger files in their project if necessary. A new 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. 🏆 What’s Changed fix(postgres): support CORRELATION in CREATE STATISTICS and IF EXISTS in ALTER STATISTICS ( #7831 ) @jonasboos TSQL: allow set expressions in DECLARE ... CURSOR FOR ( #7812 ) @ copilot-swe-agent[bot] fix: Ensure pool.join() is called in ParallelRunner ( #7686 ) @peterbud fix(clickhouse): allow WHERE/PREWHERE after ARRAY JOIN ( #7837 ) @Cayan fix(postgres): parse \crosstabview as query buffer terminator ( #7833 ) @SAY-5 Add max_parse_nodes parser limit ( #7816 ) @alanmcruickshank fix(athena): allow START as identifier (not reserved for SELECT) ( #7834 ) @SAY-5 TSQL: parse ALTER TABLE ... ENABLE|DISABLE TRIGGER ( #7811 ) @ copilot-swe-agent[bot] Support Teradata CAST character set phrases ( #7766 ) @ copilot-swe-agent[bot] Oracle: add support for MULTISET operators ( #7711 ) @saulotoledo TSQL: Parse issues DatatypeMethodSeg in TableRef and TableExp for Merge using ( #7802 ) @dpurfield Enable multi-branch linting by default ( #7808 ) @alanmcruickshank fix(tsql): parse SET DATEFORMAT canonical Microsoft syntax ( #7819 ) @Booyaka101 add regression test for issue 7543 ( #7797 ) @rotempasharel1 fix: prevent placeholder templater from suppressing lint violations ( #7818 ) @ben-duivenvoorden TSQL: Add CONTAINSTABLE support ( #7814 ) @peterbud fix(duckdb): tokenize != as a single token to avoid factorial collision ( #7742 ) @barry3406 fix(tsql): allow Unicode letters in @parameter names ( #7810 ) @Booyaka101 Drop support for python 3.9 ( #7341 ) @annebelleo Add DB2 support for trailing read-only and isolation clauses on SELECT ( #7768 ) @ copilot-swe-agent[bot] Handle shorthand-casted aggregates correctly in ST06 column ordering ( #7792 ) @ copilot-swe-agent[bot] Hive: parse SET configs and ${...} parameter references ( #7767 ) @ copilot-swe-agent[bot] Preserve mocked dbt var() placeholders under Jinja subscripting ( #7793 ) @ copilot-swe-agent[bot] fix: ST11 false positive on struct/nested field access ( #7795 ) @sebastien-irco Snowflake: support CREATE OR ALTER for FILE FORMAT, FUNCTION, PROCEDURE, EXTERNAL FUNCTION, AUTHENTICATION POLICY, TAG ( #7799 ) @stevebeck89 Reject trailing commas after the final CTE in WITH clauses ( #7761 ) @ copilot-swe-agent[bot] Support colon-delimited json_object() pairs in Trino and Athena ( #7764 ) @ copilot-swe-agent[bot] feat: Add BigLake syntax support for BigQuery dialect ( #7794 ) @sebastien-irco Fix typo: remove duplicate 'the' in documentation ( #7782 ) @Jah-yee test: add LT02 autofix fixtures for MERGE INSERT VALUES indentation (ansi, bigquery, sparksql) ( #7791 ) @Scolliq Rust: Fix sequence terminators ( #7787 ) @keraion fix: Support compound statements in BigQuery WHILE body ( #7789 ) @sebastien-irco feat: Support function calls in MERGE USING clause ( #7788 ) @sebastien-irco build(deps): bump rustls-webpki from 0.103.10 to 0.103.13 in /sqlfluffrs ( #7790 ) @ dependabot[bot] fix(7784): create table clone statement grammar for databricks dialect ( #7786 ) @pgrz Relax ignore spec typing in discovery module ( #7785 ) @peterbud BigQuery: parse OPTIONS in CREATE TABLE FUNCTION ( #7776 ) @ copilot-swe-agent[bot] Allow MariaDB/MySQL FROM DUAL to parse as a table reference ( #7763 ) @ copilot-swe-agent[bot] Support lateral column alias expressions in ClickHouse, Databricks, and Redshift ( #7760 ) @ copilot-swe-agent[bot] fix(tsql): keep required OPENROWSET BULK aliases ( #7781 ) @cloudyun888 feat: Add CREATE AGGREGATE FUNCTION support for BigQuery dialect ( #7780 ) @sebastien-irco fix(postgres): preserve begin atomic body indentation ( #7777 ) @cloudyun888 chore: make pytest as optional dependency ( #7275 ) @fatelei feat: Add option for non-zero exit on large_file_skip ( #7731 ) @zozo123 fix: support trailing GROUPING SETS in Hive GROUP BY ( #7651 ) @saschabuehrle Snowflake: parse WITH TAG on dynamic table columns without a data type ( #7754 ) @ copilot-swe-agent[bot] Support COLLATE in Databricks CREATE TABLE column properties ( #7749 ) @ copilot-swe-agent[bot] Fix unparseable Databricks/SparkSQL function parameters with function call DEFAULT values ( #7721 ) @ copilot-swe-agent[bot] Support CHECK/NOCHECK CONSTRAINT ALL in T-SQL ALTER TABLE ( #7748 ) @ copilot-swe-agent[bot] fix(databricks): RF03 should not flag STRUCT function aliases ( #7735 ) @zozo123 fix(LT09): Consistent single/multi target newline behavior ( #7729 ) @zozo123 Snowflake: Support UPDATE ALL BY NAME syntax for MERGE ( #7756 ) @ninazacharia-toast CI: add dhi.io login to workflow ( #7757 ) @keraion feat: move to dhi image ( #7752 ) @hoodadt fix: LT02 false positive when Jinja block contains same-line parentheses ( #7744 ) @galsakuri build(deps): bump rand from 0.9.2 to 0.9.4 in /sqlfluffrs ( #7750 ) @ dependabot[bot] Add aliasing.required rule AL10: derived tables must have an alias ( #7743 ) @cherylschaefer Snowflake: handle ADD SCORING PROFILE in CORTEX SEARCH + fix typo ( #7647 ) @jakadam2 refactor(oracle): Move keywords to separate file ( #7726 ) @zozo123 fix(databricks): Allow _metadata column references ( #7732 ) @zozo123 fix(LT02): Don't force FROM/VALUES separation when values are inline ( #7738 ) @zozo123 fix(sparksql): Add regression tests for struct field access alignment ( #6913 ) ( #7728 ) @zozo123 fix: Apply warning-level fixes even when no errors present ( #7727 ) @zozo123 MySQL: Add support for role GRANT and SET DEFAULT ROLE statements ( #7720 ) @ copilot-swe-agent[bot] fix(greenplum): Add support for CREATE/DROP EXTERNAL TABLE ( #7725 ) @zozo123 fix(snowflake): Exclude NEXTVAL/CURRVAL sequences from references.from checks ( #7724 ) @zozo123 feat(starrocks): Add support for ARRAY, MAP, and STRUCT types ( #7717 ) @zozo123 fix(snowflake): Support multiple statements in EXCEPTION WHEN handlers ( #7718 ) @zozo123 TSQL: Add support for ALTER DATABASE SCOPED CONFIGURATION statements ( #7688 ) @peterbud Support dotted option names in Postgres ALTER VIEW / ALTER MATERIALIZED VIEW ( #7680 ) @ copilot-swe-agent[bot] Snowflake: parse structured OBJECT types in CAST and datatype contexts ( #7681 ) @ copilot-swe-agent[bot] Allow SQLite FTS5 option assignments in CREATE VIRTUAL TABLE ( #7683 ) @ copilot-swe-agent[bot] TSQL: use aggregate_order_by in WITHIN GROUP ( #7687 ) @peterbud docs: Enhance rule generation ( #7707 ) @peterbud T-SQL: parse ALTER / DROP FULLTEXT INDEX and improve CREATE ( #7712 ) @dreik fix: align following line position handling ( #7702 ) @mauro-lanza Oracle: prevent incorrect fix for bind and substitution variables ( #7709 ) @saulotoledo Oracle: add support for DROP USER CASCADE / DROP PROFILE / DROP CLUSTER ( #7706 ) @saulotoledo Oracle: add support for no-argument procedure calls ( #7701 ) @saulotoledo Support macros-calling-macros in jinja templater ( #7685 ) @mrichards42 fix: add --no-warn-unused-configs flag to mypyc commands in tox.ini ( #7698 ) @peterbud StarRocks: add LOAD LABEL and INSERT OVERWRITE WITH LABEL support ( #7682 ) @andystenhe [codex] Fix DuckDB double-quoted struct keys ( #7694 ) @zozo123 fix(ST05): don't descend into subqueries when checking for value table functions ( #7692 ) @nadjichalal fix: ST10 RHS constant expression redundancy check ( #7690 ) @aayushr7 Add dbt 1.11 function() builtin to Jinja apply_dbt_builtins ( #7637 ) @ReinerBRO Add table_options to ALTER TABLE in mysql & mariadb ( #7411 ) @WittierDinosaur New Contributors @nadjichalal made their first contribution in #7692 @zozo123 made their first contribution in #7694 @mauro-lanza made their first contribution in #7702 @jakadam2 made their first contribution in #7647 @cherylschaefer made their first contribution in #7743 @galsakuri made their first contribution in #7744 @hoodadt made their first contribution in #7752 @saschabuehrle made their first contribution in #7651 @cloudyun888 made their first contribution in #7777 @pgrz made their first contribution in #7786 @Scolliq made their first contribution in #7791 @Jah-yee made their first contribution in #7782 @stevebeck89 made their first contribution in #7799 @Booyaka101 made their first contribution in #7810 @barry3406 made their first contribution in #7742 @ben-duivenvoorden made their first contribution in #7818 @rotempasharel1 made their first contribution in #7797 @SAY-5 made their first contribution in #7834 @Cayan made their first contribution in #7837 @jonasboos made their first contribution in #7831

Read more →

[4.1.0] - 2026-03-26

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_depth config 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 vdebug behind verbose-debug feature ( #7674 ) @keraion chore: Update deprecated gitwildmatch to gitignore ( #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 noqa and 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 EXCEPT set 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 = templating disabling 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 FROM comparison statement ( #7556 ) @peterbud Oracle: add JSON_TABLE support with FOR ORDINALITY column parsing ( #7560 ) @ copilot-swe-agent[bot] Add return dbt 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 noqa directives in sqlfluff parse for PRS/TMP violations ( #7604 ) @peterbud MySQL/MariaDB: Fix parsing of VALUES() function nested in expressions for ON 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 ... FROM to 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 STOPLIST statement 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_array with NULL ON NULL and RETURNING clauses ( #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_position and keyword_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 .pkb to default sql_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 DEFINE keyword ( #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 ColonDelimiterSegment in 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 platformdirs to <4.6.0 ( #7488 ) @peterbud rust: strip debug info ( #7477 ) @keraion Adds support for %ROWTYPE parameters 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

Read more →

[4.0.4] - 2026-02-08

Highlights This is a re-release of 4.0.1 which had issues in initial deployment. What’s Changed Fix rust package publish workflow ( #7464 ) @alanmcruickshank

Read more →

[4.0.4a1] - 2026-02-08

Highlights Testing release to confirm functionality of rust publish script. What’s Changed Fix rust package publish workflow ( #7464 ) @alanmcruickshank

Read more →

[4.0.3] - 2026-02-08

Highlights 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.

Read more →

[4.0.2] - 2026-02-08

Highlights 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.

Read more →

[4.0.1] - 2026-02-08

Highlights This is a bugfix and dialect enhancement release following the 4.0.0 major release. Python 3.14 is now officially supported. Rule fixes for ST02, ST06, CP02, RF03, and indentation handling. New SARIF output format for better CI/CD integration. Dialect improvements across T-SQL, Snowflake, PostgreSQL, BigQuery, DuckDB, ClickHouse, Oracle, Databricks, and SQLite. This release also includes the first contributions from fourteen new contributors! Welcome to the project and thank you for your contributions. What’s Changed Add correct indentation for exception blocks in Oracle PL/SQL ( #7424 ) @ copilot-swe-agent[bot] Improve the AST for Grant/ Revoke statements ( #7457 ) @WittierDinosaur Support Python 3.14 ( #7454 ) @WittierDinosaur Fix ST02/L043 corruption of Simple CASE statements ( #7432 ) @Tanishq3031881 chore: Add Triage Agent for issue reproduction process (experimental) ( #7433 ) @peterbud docs: dbt templater: remove sections about old unsupported dbt versions ( #7382 ) @MatthijsKok Duckdb: Trailing commas in values clause ( #7453 ) @WittierDinosaur build: Optimize pre-commit workflow ( #7452 ) @peterbud Add ALTER SYSTEM statement support for PostgreSQL dialect ( #7448 ) @ copilot-swe-agent[bot] T-SQL Parser issues with OPENJSON, ordered set select, and cursor keyword order ( #7449 ) @dpurfield Support globs in COMMA_SEPARATED_PATH_KEYS ( #7414 ) @WittierDinosaur Add error messages for templating/parsing errors on sqlfluff fix ( #7381 ) @annebelleo Snowflake: Enhance create dynamic table statement parsing ( #7436 ) @gmkr0 build: Further workflow optimizations ( #7438 ) @peterbud Bump time from 0.3.44 to 0.3.47 in /sqlfluffrs ( #7439 ) @ dependabot[bot] Add Snowflake Workspaces support ( #7437 ) @kokorin T-SQL: fix parse of convert, updatable cursor syntax and TOP in UPDATE/INSERT statements ( #7431 ) @dpurfield Allow align columns when using leading comma ( #6720 ) @vinceyyy ClickHouse: Add settings clause to ALTER TABLE statement ( #7429 ) @ttanay Bump bytes from 1.11.0 to 1.11.1 in /sqlfluffrs ( #7430 ) @ dependabot[bot] Support SARIF output format ( #7413 ) @WittierDinosaur build: Updating CI/CD Infrastructure ( #7420 ) @peterbud docs: Update base path in VitePress configuration ( #7423 ) @peterbud Adds custom Python recursion limit value as an option ( #7401 ) @samgusick docs: Add a new VitePress based documentation site ( #7358 ) @peterbud Snowflake: Support dynamic table grants ( #7408 ) @WittierDinosaur Duckdb: Allow CTEs in Insert statements ( #7418 ) @WittierDinosaur Make CP02 ignore templated slices ( #7419 ) @WittierDinosaur Bigquery: Correct order of operations for select statement ( #7421 ) @WittierDinosaur [tsql] parse issues related to security ALTER USER/ROLE/AUTHORIZATION & some GRANTS ( #7406 ) @dpurfield Fix double print of highlights in changelog ( #7417 ) @WittierDinosaur Disable CV01 for teradata ( #7409 ) @WittierDinosaur TSQL: fix JSON function grammar semantic ( #7416 ) @peterbud Support underscores in numeric literals in Postgres and DuckDB ( #7407 ) @WittierDinosaur Bigquery: Support Hexadecimal Integer Literals ( #7412 ) @WittierDinosaur TSQL: Add support for all missing T-SQL JSON functions ( #7410 ) @peterbud Databricks: Separate CREATE VIEW from CREATE MATERIALIZED VIEW parsing ( #7405 ) @nathanthorell feat(snowflake): Add support for DIRECTED joins ( #7402 ) @Daniel-Wiszowaty Add ANSI quantified comparison operators (ANY/ALL/SOME) ( #7398 ) @ copilot-swe-agent[bot] DuckDB: Add support for SET ( #7404 ) @aammett fix(ST06): prevent corruption of CREATE VIEW with explicit columns list ( #7263 ) @oulmoukenza DuckDB: parse simplified UNPIVOT ON expressions and INTO optional ( #7394 ) @hamza-dri tsql alter table rebuild and drop without constraint keyword ( #7393 ) @dpurfield Adds support for INSERT ALL and error logging in INSERT in Oracle. ( #7347 ) @joaostorrer Fix: handles dotted notation in INI config files for Jinja context ( #7373 ) @shuting-zhang-gh SQLite: Add support for blob and hexadecimal literals ( #7332 ) @franloza Rust parser: Add AnyNumberOf context helper functions ( #7390 ) @keraion Add plural interval datetime units support for DuckDB ( #7387 ) @ copilot-swe-agent[bot] DuckDB: Add support for parenthesized expressions in INTERVAL ( #7388 ) @franloza TSQL: Add support for OPENROWSET(BULK) multiple file paths ( #7329 ) @lynndb0 Improves the parsing of GRANT and REVOKE statements in Oracle. ( #7338 ) @joaostorrer Rust: Migrate pyo3 items out of sqlfluffrs_types ( #7386 ) @keraion T-SQL: Support INDEX = hint syntax without brackets ( #7344 ) @ copilot-swe-agent[bot] docs: replace aliases in rule table with core rule specification ( #7337 ) @annebelleo fix(alignment): use indent_unit tab when configured ( #7289 ) @peterbud feat(parse): export position info in JSON/YAML output ( #7294 ) @peterbud Reserve "DEFAULT" in snowflake dialect ( #7274 ) @alanmcruickshank fix(RF03): don't treat COLLATE clauses as unqualified references ( #7334 ) @peterbud TSQL: add support for NEXT VALUE FOR with OVER clause ( #7335 ) @peterbud BigQuery: Add support for limit clause in aggregate functions ( #7370 ) @annebelleo CI: Update black to v26 ( #7376 ) @keraion Rust: remove generated files from source control ( #7371 ) @keraion New Contributors @shuting-zhang-gh made their first contribution in #7373 @dpurfield made their first contribution in #7393 @hamza-dri made their first contribution in #7394 @oulmoukenza made their first contribution in #7263 @aammett made their first contribution in #7404 @Daniel-Wiszowaty made their first contribution in #7402 @samgusick made their first contribution in #7401 [@ dependabot[bot] ]( https://github.com/[dependabot[bot]](https://github.com/apps/dependabot) ) made their first contribution in #7430 @ttanay made their first contribution in #7429 @vinceyyy made their first contribution in #6720 @kokorin made their first contribution in #7437 @gmkr0 made their first contribution in #7436 @MatthijsKok made their first contribution in #7382 @Tanishq3031881 made their first contribution in #7432

Read more →

Uniform Changelog API

Access SQLFluff changelog updates through our uniform API. Same JSON structure across all sources — no adapter-specific parsing needed.

API Endpoint
GET https://watchchangelog.com/api/v1/entries?source=sqlfluff.releases
Response Sample
{
  "source": "sqlfluff.releases",
  "vendor": "SQLFluff",
  "id": "tag:github.com,2008:Repository/155790228/4.3.0",
  "published_at": "2026-08-07T09:00:31.000Z",
  "title": "[4.3.0] - 2026-08-07",
  "url": "https://github.com/sqlfluff/sqlfluff/releases/tag/4.3.0",
  "summary": "Highlights 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. BigQuery pipe syntax ( |> ) 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. ClickHouse gains support for 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. A new rule, RF07 , flags window-clause references that shadow a SELECT alias. lint , fix , and format all gain a consistent --quiet output mode. This release introduces the first Rust-native lint rule detection ( 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. 🏆 What’s Changed fix(rust): avoid double allocation in pyo3 getters for collection fields (trim/type/escape) ( #8247 ) @rubytobi fix(rust): match Rust parser bracket matching to Python's behaviour on crossed, unclosed, and dialect-specific brackets ( #8243 ) @rubytobi fix: pass sync=True to GhApi in release script ( #8281 ) @alanmcruickshank feat(clickhouse): add support for TRUNCATE TABLES statement ( #8279 ) @AndrewKurg Allows %TYPE column type references in TABLE returns for functions in Postgres ( #8269 ) @KuttKatrea test(ST06): pin reordering of a qualified reference with a parameterised cast ( #8276 ) @adhavan18 fix: auto-detect cached_property names and invalidate on pos_marker change ( #8274 ) @JoeJoeflyn Db2: parse COMMENT ON, multi-grantee GRANT and view WITH [NO] ROW MOVEMENT ( #8262 ) @davidpavlovschi CV12: don't fix join conditions when the join clause is templated ( #8255 ) @devanshranjan10 Support quiet output across lint, fix, and format ( #8258 ) @TrapsterDK Fix Oracle SELECT INTO record field parsing ( #8252 ) @subotac fix(ST02): preserve indexed expressions in NULL simplification ( #8202 ) @dev-willbird1936 fix(sparksql): allow expression values in SET statements ( #8187 ) @Otto-Deviant1904 Parse round-bracketed MAP types in Athena ( #8246 ) @davidpavlovschi Fix AL01 loop on bracketed column aliases ( #8245 ) @davidpavlovschi Snowflake: parse ADAPTIVE refresh mode, INITIALIZATION_WAREHOUSE, and streams on dynamic tables ( #8241 ) @adhavan18 test(ST11): pin the UNNEST + deeply nested struct case from #6997 ( #8240 ) @adhavan18 fix(rust): lexer/parser divergences in trim_chars inheritance and escape_replacements handling ( #8224 ) @rubytobi fix(rust): match Python's parse-error message text (Sequence wording, token class/repr, grammar repr truncation) ( #8225 ) @rubytobi duckdb: parse USING SAMPLE / TABLESAMPLE ( #8229 ) @hdimer ST07: don't fix when a USING column is referenced unqualified ( #8175 ) @vidigoat feat(clickhouse): add support for REGEXP operator ( #8235 ) @AndrewKurg BigQuery: parse EXCEPT/REPLACE after a wildcard on an array element ( #8194 ) @adhavan18 CV10: don't corrupt string literals that use quote-doubling escapes (fixes #8179 ) ( #8193 ) @rahul188 perf(rust): frame-free terminal evaluation ( #8168 ) @rubytobi fix(dialects/oracle): support positional substitution variables (&1, &&1) ( #8233 ) @felipeatom rust(fix): Resolve two codegen-determinism hazards (id-cache collisions and unsorted currency-symbol regex) ( #8226 ) @rubytobi Databricks: config to stop ST12 flagging command cell delimiters as consecutive terminators ( #8197 ) @tsedeus feat(clickhouse): add support for EXCHANGE statement ( #8221 ) @AndrewKurg Impala: add support for VALUES aliases ( #8185 ) @strang3nt feat(clickhouse): add support for TRUNCATE DATABASE ( #8228 ) @AndrewKurg fix(dialects/postgres): parse MERGE ... WHEN NOT MATCHED BY SOURCE/TARGET ( #8216 ) @hdimer Postgres: stop LT01 spacing array types like int [] ( #8222 ) @apoorva-01 feat(postgres): support MERGE ... THEN DO NOTHING ( #8223 ) @mbsdeepak fix(ci): collapse agent-scan into one pull_request_target workflow ( #8217 ) @keraion Teradata: parse data type attributes ((NOT) CASESPECIFIC/CS, UPPERCASE) on expressions ( #8124 ) @adhavan18 Add a Python-vs-Rust parser/lexer parity test harness ( #8198 ) @rubytobi Add GitHub Actions workflows for agent scan analysis and moderation ( #8208 ) @peterbud Fix Databricks materialized view expectation constraints ( #8212 ) @vetrovk feat(clickhouse): add clickhouse specific truncate table grammar ( #8210 ) @AndrewKurg Fix CI lint instability caused by upgrading to Ruff 0.16.0 in scheduled runs. ( #8211 ) @peterbud BigQuery: model pipe syntax as a postfix on selectables ( #8195 ) @ricardoalencar-pr perf(templater): skip Jinja machinery for template-free files ( #8161 ) @rubytobi AM04: resolve each UNION branch's wildcard against its own branch ( #8183 ) @chuenchen309 BigQuery: allow a pipe query after a WITH clause ( #8191 ) @ricardoalencar-pr Indent BigQuery pipe AGGREGATE and EXTEND clause lists ( #8190 ) @ricardoalencar-pr Fix ST07 pairing the wrong tables when a comma-join precedes USING ( #8180 ) @chuenchen309 Guard BigQuery and ClickHouse explicit view column lists in ST06 ( #8178 ) @chuenchen309 RF01: resolve UPDATE target alias nested in from_expression (MySQL) ( #8176 ) @vidigoat Snowflake: parse scripting bind variables (:var) in expressions ( #8163 ) @adhavan18 Teradata: lex scientific-notation and leading-dot numeric literals ( #8181 ) @chuenchen309 fix(oracle): allow trailing-dot numeric literals like 1. ( #8155 ) @Otto-Deviant1904 fix(dialects/postgres): parse ORDER BY ... USING operator ( #8182 ) @chuenchen309 MySQL: parse CONVERT(expr, type) and CONVERT(expr USING charset) ( #8177 ) @chuenchen309 MariaDB: support IF [NOT] EXISTS on ALTER TABLE index and constraint clauses ( #8174 ) @mrsinham Leave the jinja context out of config path resolution ( #8173 ) @chuenchen309 Fix IndexError on a two-character inline config value ending in a colon ( #8170 ) @chuenchen309 fix(config): validate render_variant_limit and runaway_limit ( #8152 ) @anxkhn fix(rust): match Python's repr()-quoted, truncated unlexable-error text in the Rust lexer ( #8147 ) @rubytobi fix(convention): make CV07's fix order deterministic ( #8144 ) @keraion Don't hoist a subquery correlated in a later set expression branch ( #8169 ) @chuenchen309 Leave a schema-qualified NVL/IFNULL alone ( #8172 ) @chuenchen309 fix(docs): read stable_version as a nested pyproject key ( #8150 ) @anxkhn docs: update dialect contributing guide to current grammar API ( #8151 ) @anxkhn fix(parser): stop genexpr/comprehension recursion from halving safe parse-tree depth ( #8148 ) @rubytobi Fix CV12 false positive on NATURAL JOIN ( #8165 ) @chuenchen309 Added support for * EXCEPT (col1, col2) in MERGE statement for SparkSQL ( #8154 ) @timothyvries Add rule RF07 to flag window-clause references that shadow a select alias ( #8153 ) @Booyaka101 Fix clippy failures blocking main CI ( #8160 ) @rubytobi Enforce clean clippy in CI and remove dead code across the Rust workspace ( #8098 ) @rubytobi fix(rust): key the TemplatedFile conversion cache by object identity ( #8143 ) @keraion fix(convention): build CV11 replacements parse-shaped ( #8142 ) @keraion perf: lazy SegmentCloneMap in ST05 — clone only when a subquery is rewritten ( #8141 ) @keraion refactor(rules): façade-safe segment checks — is_type over isinstance, uuid over id() ( #8140 ) @keraion fix(rust): bare-class grammars consume matching tokens unchanged ( #8138 ) @keraion Rename Rust skip-backward-to-code helpers to match Python ( #8149 ) @apoorva-01 feat(rust): port CP03 and CP04 to Rust-native detection ( #8069 ) @WittierDinosaur Add opt-in T-SQL rule to prefer AS aliasing over alias = expression ( #8085 ) @ copilot-swe-agent[bot] fix(core): re-parent provided children in BaseSegment.copy ( #8109 ) @keraion fix(config): coerce quoted allow_implicit_indents deprecation value ( #8135 ) @anxkhn Oracle: parse XMLATTRIBUTES alias list in XMLELEMENT ( #8113 ) @apoorva-01 MySQL: don't flag index prefix length with LT01 ( #8128 ) @apoorva-01 docs: fix developing-rules guide to document crawl_behaviour, not removed fields ( #8137 ) @anxkhn Fix nested bracket-type mismatch recovering instead of raising, matching Python's resolve_bracket ( #8120 ) @rubytobi docs(reflow): fix ReflowSequence.respace filter value in docstring ( #8136 ) @anxkhn fix(rust): drop Indent/Dedent that are direct children of Bracketed ( #8108 ) @keraion fix(core): remove orphaned temp file when safe file replace fails ( #8134 ) @anxkhn Teradata: make OVERLAPS an infix comparison operator ( #8123 ) @apoorva-01 feat(mysql): support GROUP BY ... WITH ROLLUP (supersedes #8066 , indent-safe) ( #8130 ) @Synvoya Fix unclosed GREEDY-mode bracket recovering instead of raising ( #8121 ) @rubytobi Fix isinstance-preserved token type dropped by RustParser.parse() ( #8122 ) @rubytobi fix: RF02 should not flag BigQuery whole-row table references ( #8133 ) @mvanhorn Postgres: stop LT01 splitting psql variables like :status ( #8131 ) @Rishi943 RF03: treat Athena as a struct dialect ( #8132 ) @Rishi943 Athena: accept ARRAY(type) as well as ARRAY ( #8127 ) @apoorva-01 Fix mismatched bracket type giving generic error only ( #8119 ) @rubytobi Fix Bracketed GREEDY mode absorbing trailing trivia into unparsable segment ( #8118 ) @rubytobi Fix/greedy match stray closing bracket ( #8117 ) @rubytobi Read Jinja macro files with the configured encoding ( #6633 ) ( #8103 ) @apoorvdarshan fix GREEDY sequence partial-match failure dropping matched children ( #8116 ) @rubytobi fix(sqlite): parse CTE materialization hints ( #8126 ) @karimudev ClickHouse: parse GROUP BY WITH ROLLUP / CUBE / TOTALS ( #8037 ) ( #8101 ) @apoorvdarshan fix(rust): honor RegexParser ignore_case ( #8107 ) @keraion ClickHouse: parse multi-column LIMIT n BY a, b ( #8030 ) ( #8105 ) @apoorvdarshan ClickHouse: parse ORDER BY / LIMIT / SETTINGS on non-final union members ( #8031 ) ( #8100 ) @apoorvdarshan Don't strip newlines that sit directly before a comment ( #8057 ) @CodeBlackwell perf(linter): dedupe source patches with a set, not a list ( #8084 ) @anxkhn [databricks]: support bare Databricks notebook magic cells ( #8011 ) @peterbud Add regression tests for Lexer and Parser divergences ( #8106 ) @rubytobi Oracle: parse FOR UPDATE ... NOWAIT / WAIT n / SKIP LOCKED ( #8097 ) ( #8099 ) @apoorvdarshan Parse Oracle function RETURN with %type and %rowtype ( #8090 ) @apoorva-01 fix(clickhouse): parse tuple element access on any expression ( #8062 ) @Sanjays2402 Stop LT01 spacing Oracle %type/%rowtype like modulo ( #8096 ) @apoorva-01 TSQL: restore normalization kwargs on the patched single_quote lexer (RF05 false positive on quoted aliases) ( #8088 ) @Pawansingh3889 clickhouse: parse ORDER BY ... WITH FILL ... INTERPOLATE ( #8029 ) ( #8065 ) @apoorvdarshan perf: bypass setattr in RawSegment. init via direct dict writes ( #8093 ) @rubytobi perf: remove duplicate cache invalidation in BaseSegment.__init__ ( #8091 ) @rubytobi perf: avoid quadratic tuple concatenation when applying match results ( #8089 ) @rubytobi fix: raise SQLFluffUserError for invalid rule config option values ( #8095 ) @anxkhn docs: fix BaseGrammar.copy terminators arg reference ( #8094 ) @anxkhn docs(cli): correct fix --quiet help note about --force ( #8083 ) @anxkhn docs(parser): correct min_delimiters type and default in Delimited docstring ( #8082 ) @anxkhn fix(sparksql): treat LEFT/RIGHT as non-reserved so they can be lambda variables ( #8050 ) @anxkhn Fix Oracle SQLPlus SET SCAN parsing ( #8081 ) @vetrovk perf(python): avoid deep-copying dialect_obj/templater_obj in FluffConfig.copy ( #8079 ) @rubytobi perf(rust): compare Arc by pointer instead of by value in PositionMarker merge ( #8078 ) @rubytobi Parse Oracle ALTER TABLE ADD with bracketed constraints ( #8076 ) @apoorva-01 Parse Oracle FOR loop ranges with function-call bounds ( #8077 ) @apoorva-01 Parse Oracle SQL*Plus ACCEPT and REMARK commands ( #8067 ) @vetrovk [codex] Parse SparkSQL SET literal lists ( #8052 ) @EltonChang1 Fix LT07 non-idempotent fix for CTE brackets that become multi-line ( #8068 ) @gaoflow fix(postgres): parse COPY ... FROM STDIN inline data blocks ( #8059 ) @truffle-dev Parse ClickHouse parametrized JSON type arguments ( #8053 ) @billykern spike(rust): Rust-native lint rule detection (CP01 proof-of-concept) ( #7984 ) @WittierDinosaur Support WITH TAG clause in Snowflake CREATE TASK ( #8061 ) @apoorvdarshan Fix ClickHouse double equals parsing ( #8045 ) @ishaanlabs-gg fix(postgres): parse psql variable placeholders as COPY targets ( #8027 ) @truffle-dev docs(dbt): recommend explicit utf-8 encoding ( #8041 ) @ishaanlabs-gg Split PG01 foreign key NOT VALID check ( #7967 ) @cyphercodes fix(snowflake): parse SYSTEM function expressions ( #8040 ) @ishaanlabs-gg Dialect/Snowflake: support dbt projects and dcm projects ( #8039 ) @evgf fix(rust): correct subquery/SELECT parse via GREEDY-family cache skip ( #8026 ) @keraion fix(mysql): parse JSON_VALUE RETURNING type with CHARACTER SET ( #8028 ) @anxkhn fix(mysql): parse JSON_TABLE COLUMNS as identifiers not references ( #8025 ) @truffle-dev perf(rust): share class_types as a per-kind Arc instead of per-token HashSet ( #8022 ) @keraion fix(teradata): parse BTEQ FILE= command arguments ( #8023 ) @anxkhn perf(rust): memoize Ref child-grammar resolution (~22% faster parsing) ( #8024 ) @keraion perf(rust): borrow static Token strings as Cow<'static, str> ( #8021 ) @keraion Fix RF02 false positive on table alias inside a query hint ( #8018 ) @truffle-dev perf(rust): borrow static segment type/class strings into the Node + arena tree ( #8020 ) @keraion perf(rust): compute raw_normalized lazily with cached regex compilation ( #8019 ) @keraion perf(rust): replace HashMap results store with single Option slot in parse frame stack ( #8017 ) @rubytobi Parse ClickHouse C-style ternary conditional operator ( #8016 ) @truffle-dev refactor(rust): encapsulate raw/raw_upper in RawString to enforce invariant ( #8009 ) @rubytobi fix: preserve Oracle execute file at-sign spacing ( #8015 ) @ekkoitac fix(oracle): parse INTERVAL data types in CAST expressions ( #8014 ) @ copilot-swe-agent[bot] [Oracle] Parse TIMESTAMP WITH LOCAL TIME ZONE in CAST(...) ( #8012 ) @ copilot-swe-agent[bot] fix(rust): match Python's bracket-nesting depth in Anything grammars ( #8013 ) @keraion perf(rust): fused RsMatchResult->BaseSegment builder (native AST, gated) ( #7983 ) @WittierDinosaur Fix RF03 false positive on whole-row references (e.g. postgres ->> ) ( #7921 ) @Labib-Bin-Salam Fix RF02 false positive on SELECT * EXCEPT (...) columns ( #7999 ) @arpitjain099 fix(rust): Make Parser metrics accessible again ( #8006 ) @keraion perf(rust): replace Vec/String frame fields with SmallVec and static str ( #8002 ) @rubytobi feat(rust): id-addressable arena tree (RsTree/RsHandle) substrate ( #7986 ) @keraion perf(rust): remove RefCell wrappers from parser caches ( #8004 ) @rubytobi perf(rust): precompute raw_upper on token construction ( #7991 ) @rubytobi perf: replace per-token uuid4 with a tagged monotonic counter (Python + Rust) ( #7997 ) @keraion fix(rust): match Python leaf segment types for TypedParser and Anything brackets ( #8001 ) @keraion fix(rust): flatten only raw-segment wrappers in Node::to_tuple ( #8000 ) @keraion fix(rust): correct aux_end so node class_types aren't truncated ( #7985 ) @WittierDinosaur fix(oracle): parse PIVOT/UNPIVOT with WHERE or num label ( #7973 ) ( #7974 ) @GHRF perf(rust): defer RawSegment.representation to cached_property and replace uuid4 with os.urandom ( #7988 ) @rubytobi perf(rust): fix O(n²) validation in map_template_slices ( #7995 ) @rubytobi perf(rust): eliminate dummy Arc<MatchResult> sentinel in RefState ( #7996 ) @rubytobi Parse Databricks view comments as comment clauses ( #7993 ) @vetrovk perf(python): guard linter stringify calls behind isEnabledFor ( #7989 ) @rubytobi perf(rust): wrap cached RegexMode entries in Arc to avoid cloning on cache hit ( #7990 ) @rubytobi fix: don't crash when a directory named .sqlfluff exists ( #6617 ) ( #7975 ) @Shevilll Support T-SQL ALTER CREDENTIAL and ALTER/DROP DATABASE SCOPED CREDENTIAL ( #7970 ) @Pawansingh3889 perf(rust): add per-stage profiling to the Rust parse path ( #7982 ) @WittierDinosaur fix: allow EXTENDED as identifier in Athena SELECT/CTE ( #7977 ) @Jyriu rust: move parser metrics into its own struct ( #7981 ) @keraion rust: Fix Bracketed allow_gaps=false STRICT to match Python ( #7979 ) @keraion docs: refresh sqlfluffrs AGENTS.md for the multi-crate workspace ( #7980 ) @WittierDinosaur refactor/docs: FrameContext/phase + Engine docs ( #7978 ) @keraion perf: cache terminator match results in greedy_match_table_driven ( #7925 ) @rubytobi reflow: Support strict fixes; LT03 add pipe operator ( #7966 ) @keraion sparksql: Add iceberg merge support ( #7968 ) @keraion fix(oracle): support DEFAULT keyword in pragma restrict_references (fixes #7957 ) ( #7965 ) @gaoflow refactor: extract reference/alias segment methods into dialect-dispatched free functions ( #7962 ) @keraion perf: replace inline OneOf terminator check with is_terminated_table_driven ( #7924 ) @rubytobi perf: setup TPC benchmarks and collect initial numbers ( #7923 ) @rubytobi Don't flag required alias on T-SQL table-valued XML methods (AL05) ( #7955 ) @gaoflow chore: bump dependency click<8.5.0 ( #7961 ) @keraion rust: Don't strip debuginfo on bench for flamegraph ( #7963 ) @keraion Added support for INSERT ... BY NAME for SparkSQL ( #7959 ) @timothyvries [oracle] Parse legacy (+) joins against literals without LT02 false positives ( #7953 ) @ copilot-swe-agent[bot] fix: AL05 false positive on whole-row alias references (postgres) ( #7906 ) @Bortlesboat ci: Add Rust fmt/clippy/unit-test job for sqlfluffrs ( #7942 ) @keraion Support Oracle slash batch delimiter after views ( #7945 ) @koriyoshi2041 Support Oracle KEEP (DENSE_RANK ... FIRST/LAST ... ) syntax ( #7950 ) @GHRF Allow Snowflake UNPIVOT as an identifier ( #7946 ) @koriyoshi2041 chore(rust): bump pyo3 to 0.29.0 ( #7954 ) @keraion databricks: Fix foreign key ON DELETE/ON UPDATE action ordering ( #7952 ) @ copilot-swe-agent[bot] Support Databricks infix collation ( #7943 ) @koriyoshi2041 Support Databricks TEMP VIEW ( #7951 ) @koriyoshi2041 Support Oracle LANGUAGE JAVA NAME function clauses ( #7944 ) @vetrovk Support Databricks ?:: try_cast operator ( #7927 ) @Booyaka101 refactor(rust): Drop unused transparent_positions frame field ( #7936 ) @keraion codegen: Error on missing grammar handlers at build time ( #7935 ) @keraion fix(rust): Update stale GrammarTables::new test calls ( #7934 ) @keraion fix(LT02): indent oscillation for loop-conditional trailing commas ( #7928 ) @keraion Support for DBT_ENGINE_ configs and additional DBT_ENGINE_PROFILE ( #7907 ) @yann1cks parser: Increase default max_parse_depth to 600 ( #7922 ) @keraion Support T-SQL CREATE CREDENTIAL ( #7920 ) @Booyaka101 Fix LT13 autofix before empty-rendering dbt config blocks ( #7901 ) @ copilot-swe-agent[bot] Fix Teradata date cast parsing ( #7919 ) @henyanagar fix: ST10 false positive when RHS operand is part of a binary expression ( #7918 ) @Booyaka101 Update so that sqlfluff can parse backquoted databricks function argu… ( #7917 ) @VictorAtIfInsurance fix(rust): Bracket optimization shouldn't match non-code. ( #7916 ) @keraion New Contributors @henyanagar made their first contribution in #7919 @yann1cks made their first contribution in #7907 @vetrovk made their first contribution in #7944 @GHRF made their first contribution in #7950 @Bortlesboat made their first contribution in #7906 @timothyvries made their first contribution in #7959 @gaoflow made their first contribution in #7955 @Jyriu made their first contribution in #7977 @Pawansingh3889 made their first contribution in #7970 @Shevilll made their first contribution in #7975 @arpitjain099 made their first contribution in #7999 @Labib-Bin-Salam made their first contribution in #7921 @ekkoitac made their first contribution in #8015 @truffle-dev made their first contribution in #8016 @anxkhn made their first contribution in #8023 @evgf made their first contribution in #8039 @ishaanlabs-gg made their first contribution in #8040 @apoorvdarshan made their first contribution in #8061 @billykern made their first contribution in #8053 @EltonChang1 made their first contribution in #8052 @apoorva-01 made their first contribution in #8077 @Sanjays2402 made their first contribution in #8062 @CodeBlackwell made their first contribution in #8057 @karimudev made their first contribution in #8126 @Rishi943 made their first contribution in #8132 @mvanhorn made their first contribution in #8133 @Synvoya made their first contribution in #8130 @chuenchen309 made their first contribution in #8165 @mrsinham made their first contribution in #8174 @Otto-Deviant1904 made their first contribution in #8155 @adhavan18 made their first contribution in #8163 @vidigoat made their first contribution in #8176 @ricardoalencar-pr made their first contribution in #8190 @AndrewKurg made their first contribution in #8210 @mbsdeepak made their first contribution in #8223 @hdimer made their first contribution in #8216 @strang3nt made their first contribution in #8185 @tsedeus made their first contribution in #8197 @felipeatom made their first contribution in #8233 @rahul188 made their first contribution in #8193 @davidpavlovschi made their first contribution in #8245 @dev-willbird1936 made their first contribution in #8202 @subotac made their first contribution in #8252 @TrapsterDK made their first contribution in #8258 @devanshranjan10 made their first contribution in #8255 @JoeJoeflyn made their first contribution in #8274 @KuttKatrea made their first contribution in #8269",
  "tags": [
    "SQLFluff",
    "sqlfluff.releases",
    "linter",
    "sql",
    "formatter"
  ]
}

Get Your Free API Key

Sign up to access the full changelog API. All public sources are free — no credit card required.

Sign Up Free →

Tags:

lintersqlformatter

Related Sources

Favicon

 

  
  
Favicon

 

  
  
Favicon

 

  
  

Share: