Skip to content

Commit

Permalink
TSQL: TRY/CATCH (#2044)
Browse files Browse the repository at this point in the history
* TSQL: TRY/CATCH

* TSQL: TRY/CATCH

Co-authored-by: jpersons <jpersons@iuhealth.org>
Co-authored-by: Joseph Young <80432516+jpy-git@users.noreply.github.com>
  • Loading branch information
3 people committed Dec 6, 2021
1 parent 42b142e commit 86b553d
Show file tree
Hide file tree
Showing 11 changed files with 471 additions and 354 deletions.
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"),
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"),
Ref("DelimiterSegment", optional=True),
),
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

0 comments on commit 86b553d

Please sign in to comment.