Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TSQL: TRY/CATCH #2044

Merged
merged 5 commits into from Dec 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
69 changes: 51 additions & 18 deletions src/sqlfluff/dialects/dialect_tsql.py
Expand Up @@ -304,6 +304,8 @@ class StatementSegment(ansi_dialect.get_segment("StatementSegment")): # type: i
Ref("DropProcedureStatementSegment"),
Ref("UpdateStatisticsStatementSegment"),
Ref("DropFunctionStatementSegment"),
Ref("BeginEndSegment"),
Ref("TryCatchSegment"),
],
)

Expand Down Expand Up @@ -1054,23 +1056,17 @@ class IfExpressionStatement(BaseSegment):
Sequence("IF", Ref("ExpressionSegment")),
),
Indent,
OneOf(
Ref("BeginEndSegment"),
Sequence(
Ref("StatementSegment"),
Ref("DelimiterSegment", optional=True),
),
Sequence(
Ref("StatementSegment"),
Ref("DelimiterSegment", optional=True),
),
Dedent,
Sequence(
"ELSE",
Indent,
OneOf(
Ref("BeginEndSegment"),
Sequence(
Ref("StatementSegment"),
Ref("DelimiterSegment", optional=True),
),
Sequence(
Ref("StatementSegment"),
Ref("DelimiterSegment", optional=True),
),
Dedent,
optional=True,
Expand Down Expand Up @@ -1360,9 +1356,9 @@ class ProcedureDefinitionGrammar(BaseSegment):
name = "procedure_statement"

match_grammar = AnyNumberOf(
OneOf(
Ref("BeginEndSegment"),
Sequence(
Ref("StatementSegment"),
Ref("DelimiterSegment", optional=True),
),
min_times=1,
)
Expand Down Expand Up @@ -2104,15 +2100,52 @@ class BeginEndSegment(BaseSegment):
Ref("DelimiterSegment", optional=True),
Indent,
AnyNumberOf(
OneOf(
Ref("BeginEndSegment"),
Ref("StatementSegment"),
jpy-git marked this conversation as resolved.
Show resolved Hide resolved
Ref("DelimiterSegment", optional=True),
min_times=1,
),
Dedent,
"END",
)


@tsql_dialect.segment()
class TryCatchSegment(BaseSegment):
"""A `TRY/CATCH` block pair.

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-ver15
"""

type = "try_catch"
match_grammar = Sequence(
"BEGIN",
"TRY",
Ref("DelimiterSegment", optional=True),
Indent,
AnyNumberOf(
Sequence(
Ref("StatementSegment"),
Ref("DelimiterSegment", optional=True),
),
min_times=1,
),
Dedent,
"END",
"TRY",
"BEGIN",
"CATCH",
Ref("DelimiterSegment", optional=True),
Indent,
AnyNumberOf(
Sequence(
Ref("StatementSegment"),
Ref("DelimiterSegment", optional=True),
),
min_times=1,
),
Dedent,
"END",
"CATCH",
)


Expand All @@ -2124,9 +2157,9 @@ class BatchSegment(BaseSegment):
match_grammar = OneOf(
# Things that can be bundled
AnyNumberOf(
OneOf(
Ref("BeginEndSegment"),
Sequence(
Ref("StatementSegment"),
jpy-git marked this conversation as resolved.
Show resolved Hide resolved
Ref("DelimiterSegment", optional=True),
jpy-git marked this conversation as resolved.
Show resolved Hide resolved
),
min_times=1,
),
Expand Down
2 changes: 2 additions & 0 deletions src/sqlfluff/dialects/dialect_tsql_keywords.py
Expand Up @@ -240,6 +240,7 @@
"BERNOULLI",
"BLOCKERS",
"CAST",
"CATCH",
"COLUMN_ENCRYPTION_KEY",
"COLUMNSTORE",
"COLUMNSTORE_ARCHIVE",
Expand Down Expand Up @@ -354,6 +355,7 @@
"TEXTIMAGE_ON",
"TRANSACTION_ID",
"TRUNCATE_TARGET", # Azure Synapse Analytics specific
"TRY",
"UPDLOCK",
"USER_DB", # Azure Synapse Analytics specific, deprecated
"VIEW_METADATA",
Expand Down
94 changes: 49 additions & 45 deletions test/fixtures/dialects/tsql/begin_end.yml
Expand Up @@ -3,50 +3,54 @@
# computed by SQLFluff when running the tests. Please run
# `python test/generate_parse_fixture_yml.py` to generate them after adding or
# altering SQL files.
_hash: 603f188d82d1028d86cf80dd929e2c7d16e346ede63a4d16d0c4c758de421f49
_hash: 9216e0d0c1802a11a9a4405f3a3cc63232b52b0cc05db0111047f452615b0305
file:
batch:
- begin_end_block:
- keyword: BEGIN
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: "'Weekend'"
statement_terminator: ;
- keyword: END
- begin_end_block:
- keyword: BEGIN
- statement_terminator: ;
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: "'Weekend'"
statement_terminator: ;
- keyword: END
- statement_terminator: ;
- begin_end_block:
- keyword: BEGIN
- statement_terminator: ;
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: "'Weekend'"
statement_terminator: ;
- keyword: END
- begin_end_block:
- keyword: BEGIN
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: "'Weekend'"
statement_terminator: ;
- keyword: END
- statement_terminator: ;
- statement:
begin_end_block:
- keyword: BEGIN
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: "'Weekend'"
statement_terminator: ;
- keyword: END
- statement:
begin_end_block:
- keyword: BEGIN
- statement_terminator: ;
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: "'Weekend'"
statement_terminator: ;
- keyword: END
- statement_terminator: ;
- statement:
begin_end_block:
- keyword: BEGIN
- statement_terminator: ;
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: "'Weekend'"
statement_terminator: ;
- keyword: END
- statement:
begin_end_block:
- keyword: BEGIN
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: "'Weekend'"
statement_terminator: ;
- keyword: END
- statement_terminator: ;
26 changes: 14 additions & 12 deletions test/fixtures/dialects/tsql/begin_end_nested.yml
Expand Up @@ -3,20 +3,22 @@
# computed by SQLFluff when running the tests. Please run
# `python test/generate_parse_fixture_yml.py` to generate them after adding or
# altering SQL files.
_hash: 0748e253db12e68d0d511436fac2128db13dfcce37347fc820ceb0872fa32ffe
_hash: 0a7c7ea28aa5581572a412274650fa03a74a0446d57ef55c63fe2a4365569fbb
file:
batch:
begin_end_block:
- keyword: BEGIN
- begin_end_block:
statement:
begin_end_block:
- keyword: BEGIN
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: "'Weekend'"
statement_terminator: ;
begin_end_block:
- keyword: BEGIN
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: "'Weekend'"
statement_terminator: ;
- keyword: END
- keyword: END
- keyword: END
- statement_terminator: ;
statement_terminator: ;
21 changes: 11 additions & 10 deletions test/fixtures/dialects/tsql/begin_end_no_semicolon.yml
Expand Up @@ -3,15 +3,16 @@
# computed by SQLFluff when running the tests. Please run
# `python test/generate_parse_fixture_yml.py` to generate them after adding or
# altering SQL files.
_hash: a4a76de010b4b5b8a94ce85900bd8bf38f726745a68d60493848653f8f281769
_hash: 8b6886a493c253e852e4cfa3b8a786fd3bae9d4304b199931a4c4a898b9e63fd
file:
batch:
begin_end_block:
- keyword: BEGIN
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: '1'
- keyword: END
statement:
begin_end_block:
- keyword: BEGIN
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
literal: '1'
- keyword: END