Skip to content

chore: port TSQL CREATE EXTERNAL FILE FORMAT (#4647)#2674

Open
mikills wants to merge 5 commits into
mainfrom
port/sqlfluff-4647
Open

chore: port TSQL CREATE EXTERNAL FILE FORMAT (#4647)#2674
mikills wants to merge 5 commits into
mainfrom
port/sqlfluff-4647

Conversation

@mikills
Copy link
Copy Markdown
Collaborator

@mikills mikills commented Jun 6, 2026

Summary

  • SQLFluff #4647 added the T-SQL CREATE EXTERNAL FILE FORMAT statement. Ported it to sqruff's tsql.rs: the CreateExternalFileFormat statement plus per-format clauses (DELIMITEDTEXT/RCFILE/ORC/PARQUET/JSON/DELTA), delimited-text FORMAT_OPTIONS, and FileCompression/FileEncoding/SerdeMethod value parsers (reusing the existing SyntaxKinds), wired into the T-SQL statement list with the new option keywords registered as unreserved.
  • Added the create_external_file_format fixture (.sql + .yml); the dialect test parses all formats with no unparsable segments. Parser-only change.

Ported from SQLFluff a836a89c366adc52e5a0e15e08533532621ad700
sqlfluff/sqlfluff#4647
sqlfluff/sqlfluff@a836a89

Stacked on #2673 (#4661) → #2671 (#4653) → #2670 (#4654); base reverts to `main` as those merge.

mikills added 4 commits June 6, 2026 14:17
## Summary
  - SQLFluff #4654 added the T-SQL `PERIOD FOR SYSTEM_TIME (start_col, end_col)` clause for temporal tables. Ported it to sqruff's `tsql.rs`: new `PeriodSegment` (reusing the existing `SyntaxKind::PeriodSegment`), wired into the `CreateTableStatementSegment` column/constraint list, with `PERIOD` and `SYSTEM_TIME` registered as unreserved keywords.
  - Added a minimal `temporal_tables` fixture (.sql + .yml) scoped to the PERIOD clause; the dialect test parses it with no unparsable segments. Parser-only change.

  Ported from SQLFluff 68aa104eda611833ba5b17a76cb1b3f334bea7d0
  sqlfluff/sqlfluff#4654
  sqlfluff/sqlfluff@68aa104
## Summary
  - SQLFluff #4653 added T-SQL `sqlcmd` command support (`:r <file>` and `:setvar <name> <value>`). Ported it to sqruff's `tsql.rs`: a new `unquoted_relative_sql_file_path` lexer matcher, `SqlcmdOperatorSegment` (MultiStringParser over `r`/`setvar`), `SqlcmdFilePathSegment`, and `SqlcmdCommandSegment`, wired into the T-SQL statement list, with `R`/`SETVAR` registered as unreserved keywords.
  - Added the `sqlcmd_command` fixture (.sql + .yml); the dialect test parses all commands with no unparsable segments. Parser-only change.

  Ported from SQLFluff 964dcd18d158980e0321ab67131f07ced9f8440b
  sqlfluff/sqlfluff#4653
  sqlfluff/sqlfluff@964dcd1
## Summary
  - SQLFluff #4661 added the Greenplum dialect (a massively parallel Postgres). Ported it to sqruff: new `DialectKind::Greenplum`, `greenplum.rs` (derived from postgres) with the `DISTRIBUTED BY (...) | RANDOMLY | REPLICATED` clause on `CREATE TABLE` and `DISTRIBUTED`/`RANDOMLY`/`REPLICATED` reserved keywords, wired into the dialect registry, feature list, and test harness.
  - Greenplum storage option values accept literals, bare identifiers, reserved-word identifiers, and quoted identifiers (e.g. `compresstype = zstd`, `orientation = column`, `compresstype = "zstd"`).
  - Added the `greenplum/create_table` fixture (.sql + .yml); the dialect test parses it with no unparsable segments. Parser-only change.
  - Follow-up (not in this PR, and not supported by SQLFluff #4661 either): `CREATE TABLE ... AS SELECT ... DISTRIBUTED ...` (CTAS) — the trailing DISTRIBUTED clause needs deeper select parse-mode work.

  Ported from SQLFluff 32095f823ee6a8b597b3dc8cb688d55449f85b64
  sqlfluff/sqlfluff#4661
  sqlfluff/sqlfluff@32095f8
## Summary
  - SQLFluff #4647 added the T-SQL `CREATE EXTERNAL FILE FORMAT` statement. Ported it to sqruff's `tsql.rs`: the `CreateExternalFileFormat` statement plus per-format clauses (DELIMITEDTEXT/RCFILE/ORC/PARQUET/JSON/DELTA), delimited-text `FORMAT_OPTIONS`, and `FileCompression`/`FileEncoding`/`SerdeMethod` value parsers (reusing the existing SyntaxKinds), wired into the T-SQL statement list with the new option keywords registered as unreserved.
  - Added the `create_external_file_format` fixture (.sql + .yml); the dialect test parses all formats with no unparsable segments. Parser-only change.

  Ported from SQLFluff a836a89c366adc52e5a0e15e08533532621ad700
  sqlfluff/sqlfluff#4647
  sqlfluff/sqlfluff@a836a89
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 6, 2026

Benchmark for 9feaed2

Click to view benchmark
Test Base PR %
DepthMap::from_parent 58.1±1.10µs 58.0±1.44µs -0.17%
fix_complex_query 12.1±0.10ms 12.0±0.34ms -0.83%
fix_superlong 184.6±4.47ms 177.7±5.92ms -3.74%
parse_complex_query 4.1±0.12µs 4.1±0.11µs 0.00%
parse_expression_recursion 7.0±0.06µs 6.9±0.16µs -1.43%
parse_simple_query 1052.5±33.04ns 1044.1±11.46ns -0.80%

@benfdking benfdking force-pushed the port/sqlfluff-4661 branch 2 times, most recently from 750ccbf to cef49dd Compare June 6, 2026 22:55
Base automatically changed from port/sqlfluff-4661 to main June 6, 2026 22:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant