Skip to content

Commit 3e879b1

Browse files
feat(snowflake): Snowflake Scripting IF statement support to dialect (sqlfluff#7050)
1 parent db9801b commit 3e879b1

4 files changed

Lines changed: 205 additions & 0 deletions

File tree

src/sqlfluff/dialects/dialect_snowflake.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,6 +1425,7 @@ class StatementSegment(ansi.StatementSegment):
14251425
Ref("DropIcebergTableStatementSegment"),
14261426
Ref("CreateAuthenticationPolicySegment"),
14271427
Ref("DropResourceMonitorStatementSegment"),
1428+
Ref("ScriptingIfStatementSegment"),
14281429
Ref("ScriptingRaiseStatementSegment"),
14291430
],
14301431
remove=[
@@ -9327,6 +9328,84 @@ class ScriptingDeclareStatementSegment(BaseSegment):
93279328
)
93289329

93299330

9331+
class ScriptingIfStatementSegment(BaseSegment):
9332+
"""A snowflake `If` statement for SQL scripting.
9333+
9334+
https://docs.snowflake.com/en/sql-reference/snowflake-scripting/if
9335+
"""
9336+
9337+
type = "scripting_if_statement"
9338+
match_grammar = Sequence(
9339+
Sequence(
9340+
"IF",
9341+
Bracketed(Ref("ExpressionSegment")),
9342+
"THEN",
9343+
Indent,
9344+
Ref("StatementSegment"),
9345+
AnyNumberOf(
9346+
Sequence(
9347+
Ref("DelimiterGrammar"),
9348+
Ref("StatementSegment"),
9349+
),
9350+
terminators=[
9351+
"ELSEIF",
9352+
"ELSE",
9353+
Sequence("END", "IF"),
9354+
],
9355+
),
9356+
Ref("DelimiterGrammar"),
9357+
Dedent,
9358+
),
9359+
AnyNumberOf(
9360+
Sequence(
9361+
"ELSEIF",
9362+
Bracketed(Ref("ExpressionSegment")),
9363+
"THEN",
9364+
Indent,
9365+
Ref("StatementSegment"),
9366+
AnyNumberOf(
9367+
Sequence(
9368+
Ref("DelimiterGrammar"),
9369+
Ref("StatementSegment"),
9370+
),
9371+
terminators=[
9372+
"ELSEIF",
9373+
"ELSE",
9374+
Sequence("END", "IF"),
9375+
],
9376+
),
9377+
Ref("DelimiterGrammar"),
9378+
Dedent,
9379+
),
9380+
terminators=[
9381+
"ELSE",
9382+
Sequence("END", "IF"),
9383+
],
9384+
),
9385+
Sequence(
9386+
Sequence(
9387+
"ELSE",
9388+
Indent,
9389+
Ref("StatementSegment"),
9390+
AnyNumberOf(
9391+
Sequence(
9392+
Ref("DelimiterGrammar"),
9393+
Ref("StatementSegment"),
9394+
),
9395+
terminators=[
9396+
Sequence("END", "IF"),
9397+
],
9398+
),
9399+
Ref("DelimiterGrammar"),
9400+
Dedent,
9401+
),
9402+
optional=True,
9403+
),
9404+
"END",
9405+
"IF",
9406+
)
9407+
9408+
93309409
class ScriptingRaiseStatementSegment(BaseSegment):
93319410
"""A snowflake `RAISE` statement for SQL scripting.
93329411

src/sqlfluff/dialects/dialect_snowflake_keywords.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
DISTINCT
2929
DROP
3030
ELSE
31+
ELSEIF
3132
EXISTS
3233
FOLLOWING
3334
FOR
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
BEGIN
2+
IF (1 + 1 = 2) THEN
3+
SELECT 1;
4+
SELECT 2;
5+
ELSEIF (2 + 2 = 4) THEN
6+
SELECT 3;
7+
SELECT 4;
8+
ELSEIF (3 + 3 = 6) THEN
9+
SELECT 5;
10+
SELECT 6;
11+
ELSE
12+
SELECT 7;
13+
SELECT 8;
14+
END IF;
15+
END;
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# YML test files are auto-generated from SQL files and should not be edited by
2+
# hand. To help enforce this, the "hash" field in the file must match a hash
3+
# computed by SQLFluff when running the tests. Please run
4+
# `python test/generate_parse_fixture_yml.py` to generate them after adding or
5+
# altering SQL files.
6+
_hash: 955d5672c932b98b0a94662cc9fce0579098c6e4e1cdae5f85b5f3a34458eaf0
7+
file:
8+
statement:
9+
scripting_block_statement:
10+
- keyword: BEGIN
11+
- statement:
12+
scripting_if_statement:
13+
- keyword: IF
14+
- bracketed:
15+
start_bracket: (
16+
expression:
17+
- numeric_literal: '1'
18+
- binary_operator: +
19+
- numeric_literal: '1'
20+
- comparison_operator:
21+
raw_comparison_operator: '='
22+
- numeric_literal: '2'
23+
end_bracket: )
24+
- keyword: THEN
25+
- statement:
26+
select_statement:
27+
select_clause:
28+
keyword: SELECT
29+
select_clause_element:
30+
numeric_literal: '1'
31+
- statement_terminator: ;
32+
- statement:
33+
select_statement:
34+
select_clause:
35+
keyword: SELECT
36+
select_clause_element:
37+
numeric_literal: '2'
38+
- statement_terminator: ;
39+
- keyword: ELSEIF
40+
- bracketed:
41+
start_bracket: (
42+
expression:
43+
- numeric_literal: '2'
44+
- binary_operator: +
45+
- numeric_literal: '2'
46+
- comparison_operator:
47+
raw_comparison_operator: '='
48+
- numeric_literal: '4'
49+
end_bracket: )
50+
- keyword: THEN
51+
- statement:
52+
select_statement:
53+
select_clause:
54+
keyword: SELECT
55+
select_clause_element:
56+
numeric_literal: '3'
57+
- statement_terminator: ;
58+
- statement:
59+
select_statement:
60+
select_clause:
61+
keyword: SELECT
62+
select_clause_element:
63+
numeric_literal: '4'
64+
- statement_terminator: ;
65+
- keyword: ELSEIF
66+
- bracketed:
67+
start_bracket: (
68+
expression:
69+
- numeric_literal: '3'
70+
- binary_operator: +
71+
- numeric_literal: '3'
72+
- comparison_operator:
73+
raw_comparison_operator: '='
74+
- numeric_literal: '6'
75+
end_bracket: )
76+
- keyword: THEN
77+
- statement:
78+
select_statement:
79+
select_clause:
80+
keyword: SELECT
81+
select_clause_element:
82+
numeric_literal: '5'
83+
- statement_terminator: ;
84+
- statement:
85+
select_statement:
86+
select_clause:
87+
keyword: SELECT
88+
select_clause_element:
89+
numeric_literal: '6'
90+
- statement_terminator: ;
91+
- keyword: ELSE
92+
- statement:
93+
select_statement:
94+
select_clause:
95+
keyword: SELECT
96+
select_clause_element:
97+
numeric_literal: '7'
98+
- statement_terminator: ;
99+
- statement:
100+
select_statement:
101+
select_clause:
102+
keyword: SELECT
103+
select_clause_element:
104+
numeric_literal: '8'
105+
- statement_terminator: ;
106+
- keyword: END
107+
- keyword: IF
108+
- statement_terminator: ;
109+
- keyword: END
110+
statement_terminator: ;

0 commit comments

Comments
 (0)