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

Snowflake: AlterShareStatementSegment and CreateDatabaseFromShareStatementSegment #3858

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
71 changes: 71 additions & 0 deletions src/sqlfluff/dialects/dialect_snowflake.py
Expand Up @@ -964,6 +964,7 @@ class StatementSegment(ansi.StatementSegment):
Ref("MergeStatementSegment"),
Ref("CopyIntoTableStatementSegment"),
Ref("AlterWarehouseStatementSegment"),
Ref("AlterShareStatementSegment"),
Ref("CreateExternalTableSegment"),
Ref("AlterExternalTableStatementSegment"),
Ref("CreateSchemaStatementSegment"),
Expand Down Expand Up @@ -992,6 +993,7 @@ class StatementSegment(ansi.StatementSegment):
Ref("GetStatementSegment"),
Ref("PutStatementSegment"),
Ref("RemoveStatementSegment"),
Ref("CreateDatabaseFromShareStatementSegment"),
],
remove=[
Ref("CreateIndexStatementSegment"),
Expand Down Expand Up @@ -1787,6 +1789,59 @@ class AlterWarehouseStatementSegment(BaseSegment):
)


class AlterShareStatementSegment(BaseSegment):
"""An `ALTER SHARE` statement.

https://docs.snowflake.com/en/sql-reference/sql/alter-share.html

"""

type = "alter_share_statement"
match_grammar = Sequence(
"ALTER",
"SHARE",
Sequence("IF", "EXISTS", optional=True),
Ref("NakedIdentifierSegment"),
OneOf(
Sequence(
OneOf(
"ADD",
"REMOVE",
),
"ACCOUNTS",
Ref("EqualsSegment"),
Delimited(Ref("NakedIdentifierSegment")),
Sequence(
"SHARE_RESTRICTIONS",
Ref("EqualsSegment"),
Ref("BooleanLiteralGrammar"),
optional=True,
),
),
Sequence(
"SET",
"ACCOUNTS",
Ref("EqualsSegment"),
Delimited(Ref("NakedIdentifierSegment")),
Ref("CommentEqualsClauseSegment", optional=True),
),
Sequence(
"SET",
Ref("TagEqualsSegment"),
),
Sequence(
"UNSET",
"TAG",
Ref("NakedIdentifierSegment"),
AnyNumberOf(
Ref("CommaSegment"), Ref("NakedIdentifierSegment"), optional=True
),
),
Sequence("UNSET", "COMMENT"),
),
)


class AlterExternalTableStatementSegment(BaseSegment):
"""An `ALTER EXTERNAL TABLE` statement.

Expand Down Expand Up @@ -2161,6 +2216,22 @@ class CreateCloneStatementSegment(BaseSegment):
)


class CreateDatabaseFromShareStatementSegment(BaseSegment):
"""A snowflake `CREATE ... DATABASE FROM SHARE` statement.

https://docs.snowflake.com/en/sql-reference/sql/create-database.html
"""

type = "create_database_from_share_statement"
match_grammar = Sequence(
"CREATE",
"DATABASE",
Ref("ObjectReferenceSegment"),
Sequence("FROM", "SHARE"),
Ref("ObjectReferenceSegment"),
)


class CreateProcedureStatementSegment(BaseSegment):
"""A snowflake `CREATE ... PROCEDURE` statement.

Expand Down
1 change: 1 addition & 0 deletions src/sqlfluff/dialects/dialect_snowflake_keywords.py
Expand Up @@ -450,6 +450,7 @@
SETS
SHARE
SHARES
SHARE_RESTRICTIONS
SHOW
SHOW_INITIAL_ROWS
SIZE_LIMIT
Expand Down
14 changes: 14 additions & 0 deletions test/fixtures/dialects/snowflake/snowflake_alter_share.sql
@@ -0,0 +1,14 @@
ALTER SHARE MY_SHARE ADD ACCOUNTS = my_account_1;
ALTER SHARE IF EXISTS MY_SHARE ADD ACCOUNTS = my_account_1;
ALTER SHARE MY_SHARE REMOVE ACCOUNTS = my_account_1;
ALTER SHARE MY_SHARE ADD ACCOUNTS = my_account_1, my_account_2;
ALTER SHARE MY_SHARE ADD ACCOUNTS = my_account_1, my_account_2, my_account_3;
ALTER SHARE MY_SHARE SET TAG tag1 = 'value1';
ALTER SHARE IF EXISTS MY_SHARE SET TAG tag1 = 'value1', tag2 = 'value2';
ALTER SHARE MY_SHARE UNSET TAG tag1;
ALTER SHARE MY_SHARE UNSET TAG tag1, tag2;
ALTER SHARE MY_SHARE UNSET COMMENT;
ALTER SHARE MY_SHARE ADD ACCOUNTS = my_account_1 SHARE_RESTRICTIONS = TRUE;
ALTER SHARE MY_SHARE ADD ACCOUNTS = my_account_1, my_account_2 SHARE_RESTRICTIONS = FALSE;
ALTER SHARE MY_SHARE SET ACCOUNTS = my_account_1 COMMENT = 'my_comment';
ALTER SHARE IF EXISTS MY_SHARE SET ACCOUNTS = my_account_1, my_account_2 COMMENT = 'my_comment';
199 changes: 199 additions & 0 deletions test/fixtures/dialects/snowflake/snowflake_alter_share.yml
@@ -0,0 +1,199 @@
# YML test files are auto-generated from SQL files and should not be edited by
# hand. To help enforce this, the "hash" field in the file must match a hash
# 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: e6cb4cd5a2b0952e5df8c90d7238b651d5e742a1cec07f71afcff89f2713583a
file:
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- naked_identifier: MY_SHARE
- keyword: ADD
- keyword: ACCOUNTS
- comparison_operator:
raw_comparison_operator: '='
- naked_identifier: my_account_1
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- keyword: IF
- keyword: EXISTS
- naked_identifier: MY_SHARE
- keyword: ADD
- keyword: ACCOUNTS
- comparison_operator:
raw_comparison_operator: '='
- naked_identifier: my_account_1
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- naked_identifier: MY_SHARE
- keyword: REMOVE
- keyword: ACCOUNTS
- comparison_operator:
raw_comparison_operator: '='
- naked_identifier: my_account_1
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- naked_identifier: MY_SHARE
- keyword: ADD
- keyword: ACCOUNTS
- comparison_operator:
raw_comparison_operator: '='
- naked_identifier: my_account_1
- comma: ','
- naked_identifier: my_account_2
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- naked_identifier: MY_SHARE
- keyword: ADD
- keyword: ACCOUNTS
- comparison_operator:
raw_comparison_operator: '='
- naked_identifier: my_account_1
- comma: ','
- naked_identifier: my_account_2
- comma: ','
- naked_identifier: my_account_3
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- naked_identifier: MY_SHARE
- keyword: SET
- tag_equals:
keyword: TAG
naked_identifier: tag1
comparison_operator:
raw_comparison_operator: '='
quoted_literal: "'value1'"
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- keyword: IF
- keyword: EXISTS
- naked_identifier: MY_SHARE
- keyword: SET
- tag_equals:
- keyword: TAG
- naked_identifier: tag1
- comparison_operator:
raw_comparison_operator: '='
- quoted_literal: "'value1'"
- comma: ','
- naked_identifier: tag2
- comparison_operator:
raw_comparison_operator: '='
- quoted_literal: "'value2'"
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- naked_identifier: MY_SHARE
- keyword: UNSET
- keyword: TAG
- naked_identifier: tag1
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- naked_identifier: MY_SHARE
- keyword: UNSET
- keyword: TAG
- naked_identifier: tag1
- comma: ','
- naked_identifier: tag2
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- naked_identifier: MY_SHARE
- keyword: UNSET
- keyword: COMMENT
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- naked_identifier: MY_SHARE
- keyword: ADD
- keyword: ACCOUNTS
- comparison_operator:
raw_comparison_operator: '='
- naked_identifier: my_account_1
- keyword: SHARE_RESTRICTIONS
- comparison_operator:
raw_comparison_operator: '='
- boolean_literal: 'TRUE'
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- naked_identifier: MY_SHARE
- keyword: ADD
- keyword: ACCOUNTS
- comparison_operator:
raw_comparison_operator: '='
- naked_identifier: my_account_1
- comma: ','
- naked_identifier: my_account_2
- keyword: SHARE_RESTRICTIONS
- comparison_operator:
raw_comparison_operator: '='
- boolean_literal: 'FALSE'
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- naked_identifier: MY_SHARE
- keyword: SET
- keyword: ACCOUNTS
- comparison_operator:
raw_comparison_operator: '='
- naked_identifier: my_account_1
- comment_equals_clause:
keyword: COMMENT
comparison_operator:
raw_comparison_operator: '='
quoted_literal: "'my_comment'"
- statement_terminator: ;
- statement:
alter_share_statement:
- keyword: ALTER
- keyword: SHARE
- keyword: IF
- keyword: EXISTS
- naked_identifier: MY_SHARE
- keyword: SET
- keyword: ACCOUNTS
- comparison_operator:
raw_comparison_operator: '='
- naked_identifier: my_account_1
- comma: ','
- naked_identifier: my_account_2
- comment_equals_clause:
keyword: COMMENT
comparison_operator:
raw_comparison_operator: '='
quoted_literal: "'my_comment'"
- statement_terminator: ;
@@ -1,2 +1,3 @@
CREATE DATABASE MY_DATABASE;
CREATE DATABASE IF NOT EXISTS MY_DATABASE;
CREATE DATABASE IF NOT EXISTS MY_DATABASE;
CREATE DATABASE MY_DATABASE FROM SHARE MY_ACCOUNT.MY_SHARE;
15 changes: 14 additions & 1 deletion test/fixtures/dialects/snowflake/snowflake_create_database.yml
Expand Up @@ -3,7 +3,7 @@
# 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: 15126b3499d3fbf65de8d9cc75ea7287bc4237b17e6954271cf5f4cb1fbef96a
_hash: 58ff3d3126b72210e4fdb67622ebebae1a87031847cfe9384b76d74645447bf6
file:
- statement:
create_database_statement:
Expand All @@ -22,3 +22,16 @@ file:
- database_reference:
naked_identifier: MY_DATABASE
- statement_terminator: ;
- statement:
create_database_from_share_statement:
- keyword: CREATE
- keyword: DATABASE
- object_reference:
naked_identifier: MY_DATABASE
- keyword: FROM
- keyword: SHARE
- object_reference:
- naked_identifier: MY_ACCOUNT
- dot: .
- naked_identifier: MY_SHARE
- statement_terminator: ;