diff --git a/crates/lib-dialects/src/snowflake.rs b/crates/lib-dialects/src/snowflake.rs index 7c4014844..fdcfd0524 100644 --- a/crates/lib-dialects/src/snowflake.rs +++ b/crates/lib-dialects/src/snowflake.rs @@ -1370,10 +1370,12 @@ pub fn dialect() -> Dialect { Ref::new("CreateUserSegment"), Ref::new("CreateCloneStatementSegment"), Ref::new("CreateProcedureStatementSegment"), + Ref::new("AlterProcedureStatementSegment"), Ref::new("ScriptingBlockStatementSegment"), Ref::new("ScriptingLetStatementSegment"), Ref::new("ReturnStatementSegment"), Ref::new("ShowStatementSegment"), + Ref::new("AlterAccountStatementSegment"), Ref::new("AlterUserStatementSegment"), Ref::new("AlterSessionStatementSegment"), Ref::new("AlterTaskStatementSegment"), @@ -1420,6 +1422,10 @@ pub fn dialect() -> Dialect { Ref::new("ExecuteTaskClauseSegment"), Ref::new("CreateSequenceStatementSegment"), Ref::new("AlterSequenceStatementSegment"), + Ref::new("CreateResourceMonitorStatementSegment"), + Ref::new("AlterResourceMonitorStatementSegment"), + Ref::new("DropResourceMonitorStatementSegment"), + Ref::new("AlterDatabaseSegment"), ]), None, None, @@ -3245,6 +3251,55 @@ pub fn dialect() -> Dialect { .to_matchable() .into(), ), + ( + "AlterProcedureStatementSegment".into(), + NodeMatcher::new(SyntaxKind::AlterProcedureStatement, |_| { + Sequence::new(vec_of_erased![ + Ref::keyword("ALTER"), + Ref::keyword("PROCEDURE"), + Ref::new("IfExistsGrammar").optional(), + Ref::new("FunctionNameSegment"), + Ref::new("FunctionParameterListGrammar"), + one_of(vec_of_erased![ + Sequence::new(vec_of_erased![ + Ref::keyword("RENAME"), + Ref::keyword("TO"), + Ref::new("FunctionNameSegment"), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("EXECUTE"), + Ref::keyword("AS"), + one_of(vec_of_erased![ + Ref::keyword("CALLER"), + Ref::keyword("OWNER"), + ]), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("SET"), + one_of(vec_of_erased![ + Ref::new("TagEqualsSegment"), + Ref::new("CommentEqualsClauseSegment"), + ]), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("UNSET"), + one_of(vec_of_erased![ + Sequence::new(vec_of_erased![ + Ref::keyword("TAG"), + Delimited::new( + vec_of_erased![Ref::new("TagReferenceSegment"),] + ), + ]), + Ref::keyword("COMMENT"), + ]), + ]), + ]), + ]) + .to_matchable() + }) + .to_matchable() + .into(), + ), ( "ReturnStatementSegment".into(), NodeMatcher::new(SyntaxKind::ReturnStatement, |_| { @@ -3787,20 +3842,7 @@ pub fn dialect() -> Dialect { ]), Sequence::new(vec_of_erased![ Ref::keyword("DEFAULT"), - one_of(vec_of_erased![ - Ref::new("QuotedLiteralSegment"), - Sequence::new(vec_of_erased![ - Ref::keyword("CURRENT_TIMESTAMP"), - Bracketed::new(vec_of_erased![ - Ref::new("NumericLiteralSegment").optional(), - ]) - .config(|this| this.optional()), - ]), - Sequence::new(vec_of_erased![ - Ref::keyword("SYSDATE"), - Bracketed::new(vec_of_erased![]), - ]), - ]), + Ref::new("ExpressionSegment"), ]), Sequence::new(vec_of_erased![ one_of(vec_of_erased![ @@ -3842,21 +3884,10 @@ pub fn dialect() -> Dialect { ]), Ref::new("TagBracketedEqualsSegment").optional(), Ref::new("ConstraintPropertiesSegment"), - Sequence::new(vec_of_erased![ - Ref::keyword("DEFAULT"), - Ref::new("QuotedLiteralSegment"), - ]), Sequence::new(vec_of_erased![ Ref::keyword("CHECK"), Bracketed::new(vec_of_erased![Ref::new("ExpressionSegment"),]), ]), - Sequence::new(vec_of_erased![ - Ref::keyword("DEFAULT"), - one_of(vec_of_erased![ - Ref::new("LiteralGrammar"), - Ref::new("FunctionSegment"), - ]), - ]), Sequence::new(vec_of_erased![ Ref::keyword("REFERENCES"), Ref::new("ColumnReferenceSegment"), @@ -6351,6 +6382,69 @@ pub fn dialect() -> Dialect { .to_matchable() .into(), ), + ( + // `ALTER ACCOUNT` statement. + // https://docs.snowflake.com/en/sql-reference/sql/alter-account + "AlterAccountStatementSegment".into(), + Sequence::new(vec_of_erased![ + Ref::keyword("ALTER"), + Ref::keyword("ACCOUNT"), + one_of(vec_of_erased![ + Sequence::new(vec_of_erased![ + Ref::keyword("SET"), + Ref::keyword("RESOURCE_MONITOR"), + Ref::new("EqualsSegment"), + Ref::new("NakedIdentifierSegment"), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("SET"), + one_of(vec_of_erased![ + Ref::keyword("PASSWORD"), + Ref::keyword("SESSION"), + ]), + Ref::keyword("POLICY"), + Ref::new("TableReferenceSegment"), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("SET"), + Ref::new("TagEqualsSegment"), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("SET"), + Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![ + Ref::new("ParameterNameSegment"), + Ref::new("EqualsSegment"), + one_of(vec_of_erased![ + Ref::new("BooleanLiteralGrammar"), + Ref::new("QuotedLiteralSegment"), + Ref::new("NumericLiteralSegment"), + Ref::new("NakedIdentifierSegment"), + ]), + ]),]), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("UNSET"), + one_of(vec_of_erased![ + Ref::keyword("PASSWORD"), + Ref::keyword("SESSION"), + ]), + Ref::keyword("POLICY"), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("UNSET"), + one_of(vec_of_erased![ + Sequence::new(vec_of_erased![ + Ref::keyword("TAG"), + Delimited::new(vec_of_erased![Ref::new("TagReferenceSegment")]), + ]), + Delimited::new(vec_of_erased![Ref::new("NakedIdentifierSegment")]), + ]), + ]), + ]), + ]) + .to_matchable() + .into(), + ), ( "ShowStatementSegment".into(), NodeMatcher::new(SyntaxKind::ShowStatement, |_| { @@ -7760,6 +7854,180 @@ pub fn dialect() -> Dialect { .into(), )]); + // Resource Monitor statements + snowflake_dialect.add([ + ( + // A `RESOURCE MONITOR` options statement. + // https://docs.snowflake.com/en/sql-reference/sql/create-resource-monitor + // https://docs.snowflake.com/en/sql-reference/sql/alter-resource-monitor + "ResourceMonitorOptionsSegment".into(), + AnyNumberOf::new(vec_of_erased![ + Sequence::new(vec_of_erased![ + Ref::keyword("CREDIT_QUOTA"), + Ref::new("EqualsSegment"), + Ref::new("NumericLiteralSegment"), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("FREQUENCY"), + Ref::new("EqualsSegment"), + one_of(vec_of_erased![ + Ref::keyword("DAILY"), + Ref::keyword("WEEKLY"), + Ref::keyword("MONTHLY"), + Ref::keyword("YEARLY"), + Ref::keyword("NEVER"), + ]), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("START_TIMESTAMP"), + Ref::new("EqualsSegment"), + one_of(vec_of_erased![ + Ref::new("QuotedLiteralSegment"), + Ref::keyword("IMMEDIATELY"), + ]), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("END_TIMESTAMP"), + Ref::new("EqualsSegment"), + Ref::new("QuotedLiteralSegment"), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("NOTIFY_USERS"), + Ref::new("EqualsSegment"), + Bracketed::new(vec_of_erased![Delimited::new(vec_of_erased![Ref::new( + "SingleIdentifierGrammar" + ),])]), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("TRIGGERS"), + AnyNumberOf::new(vec_of_erased![Sequence::new(vec_of_erased![ + Ref::keyword("ON"), + Ref::new("NumericLiteralSegment"), + Ref::keyword("PERCENT"), + Ref::keyword("DO"), + one_of(vec_of_erased![ + Ref::keyword("NOTIFY"), + Ref::keyword("SUSPEND"), + Ref::keyword("SUSPEND_IMMEDIATE"), + ]), + ]),]) + ]), + ]) + .to_matchable() + .into(), + ), + ( + // A `CREATE RESOURCE MONITOR` statement. + // https://docs.snowflake.com/en/sql-reference/sql/create-resource-monitor + "CreateResourceMonitorStatementSegment".into(), + Sequence::new(vec_of_erased![ + Ref::keyword("CREATE"), + Ref::new("OrReplaceGrammar").optional(), + Ref::new("IfNotExistsGrammar").optional(), + Sequence::new(vec_of_erased![ + Ref::keyword("RESOURCE"), + Ref::keyword("MONITOR"), + ]), + Ref::new("ObjectReferenceSegment"), + Ref::keyword("WITH"), + Ref::new("ResourceMonitorOptionsSegment"), + ]) + .to_matchable() + .into(), + ), + ( + // An `ALTER RESOURCE MONITOR` statement. + // https://docs.snowflake.com/en/sql-reference/sql/alter-resource-monitor + "AlterResourceMonitorStatementSegment".into(), + Sequence::new(vec_of_erased![ + Ref::keyword("ALTER"), + Sequence::new(vec_of_erased![ + Ref::keyword("RESOURCE"), + Ref::keyword("MONITOR"), + ]), + Ref::new("IfExistsGrammar").optional(), + Ref::new("ObjectReferenceSegment"), + Ref::keyword("SET"), + Ref::new("ResourceMonitorOptionsSegment"), + ]) + .to_matchable() + .into(), + ), + ( + // A `DROP RESOURCE MONITOR` statement. + // https://docs.snowflake.com/en/sql-reference/sql/drop-resource-monitor + "DropResourceMonitorStatementSegment".into(), + Sequence::new(vec_of_erased![ + Ref::keyword("DROP"), + Sequence::new(vec_of_erased![ + Ref::keyword("RESOURCE"), + Ref::keyword("MONITOR"), + ]), + Ref::new("IfExistsGrammar").optional(), + Ref::new("ObjectReferenceSegment"), + ]) + .to_matchable() + .into(), + ), + ( + // An `ALTER DATABASE` statement. + // https://docs.snowflake.com/en/sql-reference/sql/alter-database + "AlterDatabaseSegment".into(), + NodeMatcher::new(SyntaxKind::AlterDatabaseStatement, |_| { + Sequence::new(vec_of_erased![ + Ref::keyword("ALTER"), + Ref::keyword("DATABASE"), + Ref::new("IfExistsGrammar").optional(), + Ref::new("ObjectReferenceSegment"), + one_of(vec_of_erased![ + Sequence::new(vec_of_erased![ + Ref::keyword("RENAME"), + Ref::keyword("TO"), + Ref::new("ObjectReferenceSegment"), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("SWAP"), + Ref::keyword("WITH"), + Ref::new("ObjectReferenceSegment"), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("SET"), + one_of(vec_of_erased![ + Ref::new("TagEqualsSegment"), + Delimited::new(vec_of_erased![Sequence::new(vec_of_erased![ + Ref::new("ParameterNameSegment"), + Ref::new("EqualsSegment"), + one_of(vec_of_erased![ + Ref::new("BooleanLiteralGrammar"), + Ref::new("QuotedLiteralSegment"), + Ref::new("NumericLiteralSegment"), + ]), + ]),]), + ]), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("UNSET"), + Ref::keyword("TAG"), + Delimited::new(vec_of_erased![Ref::new("TagReferenceSegment")]), + ]), + Sequence::new(vec_of_erased![ + Ref::keyword("UNSET"), + Delimited::new(vec_of_erased![one_of(vec_of_erased![ + Ref::keyword("DATA_RETENTION_TIME_IN_DAYS"), + Ref::keyword("MAX_DATA_EXTENSION_TIME_IN_DAYS"), + Ref::keyword("DEFAULT_DDL_COLLATION"), + Ref::keyword("COMMENT"), + ]),]), + ]), + ]), + ]) + .to_matchable() + }) + .to_matchable() + .into(), + ), + ]); + snowflake_dialect.expand(); snowflake_dialect } diff --git a/crates/lib-dialects/src/snowflake_keywords.rs b/crates/lib-dialects/src/snowflake_keywords.rs index 1d8158f5e..c608f4687 100644 --- a/crates/lib-dialects/src/snowflake_keywords.rs +++ b/crates/lib-dialects/src/snowflake_keywords.rs @@ -18,6 +18,7 @@ CURRENT_TIMESTAMP CURRENT_USER DELETE DISTINCT +DO DROP ELSE EXISTS @@ -50,6 +51,7 @@ MATCH_CONDITION MINUS NATURAL NOT +NOTIFY NULL NULL_IF OF @@ -74,6 +76,7 @@ TABLESAMPLE THEN TO TRIGGER +TRIGGERS TRY_CAST UNION UNIQUE @@ -173,6 +176,7 @@ CONTINUE COPY COPY_OPTIONS CREDENTIALS +CREDIT_QUOTA CROSS CSV CUBE @@ -198,6 +202,7 @@ DATA_FORMAT DATA_RETENTION_TIME_IN_DAYS DATE DATE_FORMAT +DAILY DAYS_TO_EXPIRY DEFAULT DEFAULT_DDL_COLLATION @@ -232,6 +237,7 @@ ENABLE_OCTAL ENCODING ENCRYPTION END +END_TIMESTAMP ENFORCED ENFORCE_LENGTH ENUM @@ -265,6 +271,7 @@ FOREIGN FORMAT FORMATS FORMAT_NAME +FREQUENCY FUNCTION FUNCTIONS FUTURE @@ -289,6 +296,7 @@ IF IGNORE IGNORE_UTF8_ERRORS IMMEDIATE +IMMEDIATELY IMMUTABLE IMPORT IMPORTS @@ -353,12 +361,14 @@ MODEL MODIFIED_AFTER MODIFY MONITOR +MONTHLY MUST_CHANGE_PASSWORD NAME NAN NETWORK NEXT NEXTVAL +NEVER NO NOCACHE NOCYCLE @@ -367,6 +377,7 @@ NOORDER NOTIFICATION NOTIFICATION_INTEGRATION NOTIFICATION_PROVIDER +NOTIFY_USERS NULLS NULL_IF OBJECT @@ -400,6 +411,7 @@ PAST PATTERN FIELD_OPTIONALITY_ENCLOSED_BY PER +PERCENT PERMUTE PIPE PIPES @@ -509,6 +521,7 @@ STAGE_COPY_OPTIONS STAGE_FILE_FORMAT STANDARD STARTS +START_TIMESTAMP STATEMENT STATEMENT_QUEUED_TIMEOUT_IN_SECONDS STATEMENT_TIMEOUT_IN_SECONDS @@ -528,6 +541,7 @@ SUBPATH SUPPORT SUSPEND SUSPENDED +SUSPEND_IMMEDIATE SWAP SYSDATE SYSTEM @@ -585,6 +599,7 @@ WAREHOUSE WAREHOUSES WAREHOUSE_SIZE WAREHOUSE_TYPE +WEEKLY WINDOW WITH WITHIN @@ -594,5 +609,6 @@ WOY WRAPPER WRITE XML +YEARLY ZONE ZSTD"; diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_account.sql b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_account.sql new file mode 100644 index 000000000..207bb14a8 --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_account.sql @@ -0,0 +1,26 @@ +ALTER ACCOUNT SET TIMEZONE = 'UTC'; + +ALTER ACCOUNT SET + ALLOW_ID_TOKEN = TRUE, + DEFAULT_DDL_COLLATION = 'en-ci', + CLIENT_ENCRYPTION_KEY_SIZE = 128, + NETWORK_POLICY = mypolicy +; + +ALTER ACCOUNT UNSET TIMEZONE; +ALTER ACCOUNT UNSET DATA_RETENTION_TIME_IN_DAYS, JSON_INDENT; + +ALTER ACCOUNT SET RESOURCE_MONITOR = VERY_RESTRICTIVE_MONITOR; + +ALTER ACCOUNT SET PASSWORD POLICY mydb.security.at_least_twelve_characters; +ALTER ACCOUNT SET SESSION POLICY mydb.policies.only_one_hour; + +ALTER ACCOUNT UNSET PASSWORD POLICY; +ALTER ACCOUNT UNSET SESSION POLICY; + +ALTER ACCOUNT SET TAG + env = 'prod', + domain = 'sales' +; + +ALTER ACCOUNT UNSET TAG env, domain; diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_account.yml b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_account.yml new file mode 100644 index 000000000..d42834bc0 --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_account.yml @@ -0,0 +1,126 @@ +file: +- statement: + - keyword: ALTER + - keyword: ACCOUNT + - keyword: SET + - parameter: TIMEZONE + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''UTC''' +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: ACCOUNT + - keyword: SET + - parameter: ALLOW_ID_TOKEN + - comparison_operator: + - raw_comparison_operator: = + - boolean_literal: 'TRUE' + - comma: ',' + - parameter: DEFAULT_DDL_COLLATION + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''en-ci''' + - comma: ',' + - parameter: CLIENT_ENCRYPTION_KEY_SIZE + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '128' + - comma: ',' + - parameter: NETWORK_POLICY + - comparison_operator: + - raw_comparison_operator: = + - naked_identifier: mypolicy +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: ACCOUNT + - keyword: UNSET + - naked_identifier: TIMEZONE +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: ACCOUNT + - keyword: UNSET + - naked_identifier: DATA_RETENTION_TIME_IN_DAYS + - comma: ',' + - naked_identifier: JSON_INDENT +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: ACCOUNT + - keyword: SET + - keyword: RESOURCE_MONITOR + - comparison_operator: + - raw_comparison_operator: = + - naked_identifier: VERY_RESTRICTIVE_MONITOR +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: ACCOUNT + - keyword: SET + - keyword: PASSWORD + - keyword: POLICY + - table_reference: + - naked_identifier: mydb + - dot: . + - naked_identifier: security + - dot: . + - naked_identifier: at_least_twelve_characters +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: ACCOUNT + - keyword: SET + - keyword: SESSION + - keyword: POLICY + - table_reference: + - naked_identifier: mydb + - dot: . + - naked_identifier: policies + - dot: . + - naked_identifier: only_one_hour +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: ACCOUNT + - keyword: UNSET + - keyword: PASSWORD + - keyword: POLICY +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: ACCOUNT + - keyword: UNSET + - keyword: SESSION + - keyword: POLICY +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: ACCOUNT + - keyword: SET + - tag_equals: + - keyword: TAG + - tag_reference: + - naked_identifier: env + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''prod''' + - comma: ',' + - tag_reference: + - naked_identifier: domain + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''sales''' +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: ACCOUNT + - keyword: UNSET + - keyword: TAG + - tag_reference: + - naked_identifier: env + - comma: ',' + - tag_reference: + - naked_identifier: domain +- statement_terminator: ; diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_database.sql b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_database.sql new file mode 100644 index 000000000..f6f39d4b8 --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_database.sql @@ -0,0 +1,18 @@ +ALTER DATABASE mydb RENAME TO mydb2; +ALTER DATABASE IF EXISTS mydb RENAME TO mydb2; + +ALTER DATABASE mydb SWAP WITH yourdb; +ALTER DATABASE IF EXISTS mydb SWAP WITH yourdb; + +ALTER DATABASE mydb SET + DATA_RETENTION_TIME_IN_DAYS = 7, + MAX_DATA_EXTENSION_TIME_IN_DAYS = 14, + DEFAULT_DDL_COLLATION = 'en_ci', + COMMENT = 'My most excellent database' +; + +ALTER DATABASE mydb SET TAG environment = 'test', billed_to = 'sales'; + +ALTER DATABASE mydb UNSET TAG environment, billed_to; + +ALTER DATABASE mydb UNSET DATA_RETENTION_TIME_IN_DAYS, DEFAULT_DDL_COLLATION; diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_database.yml b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_database.yml new file mode 100644 index 000000000..d70c51bb0 --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_database.yml @@ -0,0 +1,122 @@ +file: +- statement: + - alter_database_statement: + - keyword: ALTER + - keyword: DATABASE + - object_reference: + - naked_identifier: mydb + - keyword: RENAME + - keyword: TO + - object_reference: + - naked_identifier: mydb2 +- statement_terminator: ; +- statement: + - alter_database_statement: + - keyword: ALTER + - keyword: DATABASE + - keyword: IF + - keyword: EXISTS + - object_reference: + - naked_identifier: mydb + - keyword: RENAME + - keyword: TO + - object_reference: + - naked_identifier: mydb2 +- statement_terminator: ; +- statement: + - alter_database_statement: + - keyword: ALTER + - keyword: DATABASE + - object_reference: + - naked_identifier: mydb + - keyword: SWAP + - keyword: WITH + - object_reference: + - naked_identifier: yourdb +- statement_terminator: ; +- statement: + - alter_database_statement: + - keyword: ALTER + - keyword: DATABASE + - keyword: IF + - keyword: EXISTS + - object_reference: + - naked_identifier: mydb + - keyword: SWAP + - keyword: WITH + - object_reference: + - naked_identifier: yourdb +- statement_terminator: ; +- statement: + - alter_database_statement: + - keyword: ALTER + - keyword: DATABASE + - object_reference: + - naked_identifier: mydb + - keyword: SET + - parameter: DATA_RETENTION_TIME_IN_DAYS + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '7' + - comma: ',' + - parameter: MAX_DATA_EXTENSION_TIME_IN_DAYS + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '14' + - comma: ',' + - parameter: DEFAULT_DDL_COLLATION + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''en_ci''' + - comma: ',' + - parameter: COMMENT + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''My most excellent database''' +- statement_terminator: ; +- statement: + - alter_database_statement: + - keyword: ALTER + - keyword: DATABASE + - object_reference: + - naked_identifier: mydb + - keyword: SET + - tag_equals: + - keyword: TAG + - tag_reference: + - naked_identifier: environment + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''test''' + - comma: ',' + - tag_reference: + - naked_identifier: billed_to + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''sales''' +- statement_terminator: ; +- statement: + - alter_database_statement: + - keyword: ALTER + - keyword: DATABASE + - object_reference: + - naked_identifier: mydb + - keyword: UNSET + - keyword: TAG + - tag_reference: + - naked_identifier: environment + - comma: ',' + - tag_reference: + - naked_identifier: billed_to +- statement_terminator: ; +- statement: + - alter_database_statement: + - keyword: ALTER + - keyword: DATABASE + - object_reference: + - naked_identifier: mydb + - keyword: UNSET + - keyword: DATA_RETENTION_TIME_IN_DAYS + - comma: ',' + - keyword: DEFAULT_DDL_COLLATION +- statement_terminator: ; diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_procedure.sql b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_procedure.sql new file mode 100644 index 000000000..4f1860668 --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_procedure.sql @@ -0,0 +1,17 @@ +ALTER PROCEDURE IF EXISTS procedure1(FLOAT) RENAME TO procedure2; + +ALTER PROCEDURE IF EXISTS procedure1(FLOAT) EXECUTE AS CALLER; +ALTER PROCEDURE IF EXISTS procedure1(FLOAT) EXECUTE AS OWNER; + +ALTER PROCEDURE procedure1(FLOAT_PARAM1 FLOAT) +SET +COMMENT = 'a_comment'; + +ALTER PROCEDURE procedure1(FLOAT_PARAM1 FLOAT) +SET TAG TAG1 = 'value1', TAG2 = 'value2', TAG3 = 'value3'; + +ALTER PROCEDURE procedure1() +UNSET COMMENT; + +ALTER PROCEDURE procedure1() +UNSET TAG TAG1, TAG2, TAG3; diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_procedure.yml b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_procedure.yml new file mode 100644 index 000000000..61d854e00 --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_procedure.yml @@ -0,0 +1,144 @@ +file: +- statement: + - alter_procedure_statement: + - keyword: ALTER + - keyword: PROCEDURE + - keyword: IF + - keyword: EXISTS + - function_name: + - function_name_identifier: procedure1 + - function_parameter_list: + - bracketed: + - start_bracket: ( + - data_type: + - data_type_identifier: FLOAT + - end_bracket: ) + - keyword: RENAME + - keyword: TO + - function_name: + - function_name_identifier: procedure2 +- statement_terminator: ; +- statement: + - alter_procedure_statement: + - keyword: ALTER + - keyword: PROCEDURE + - keyword: IF + - keyword: EXISTS + - function_name: + - function_name_identifier: procedure1 + - function_parameter_list: + - bracketed: + - start_bracket: ( + - data_type: + - data_type_identifier: FLOAT + - end_bracket: ) + - keyword: EXECUTE + - keyword: AS + - keyword: CALLER +- statement_terminator: ; +- statement: + - alter_procedure_statement: + - keyword: ALTER + - keyword: PROCEDURE + - keyword: IF + - keyword: EXISTS + - function_name: + - function_name_identifier: procedure1 + - function_parameter_list: + - bracketed: + - start_bracket: ( + - data_type: + - data_type_identifier: FLOAT + - end_bracket: ) + - keyword: EXECUTE + - keyword: AS + - keyword: OWNER +- statement_terminator: ; +- statement: + - alter_procedure_statement: + - keyword: ALTER + - keyword: PROCEDURE + - function_name: + - function_name_identifier: procedure1 + - function_parameter_list: + - bracketed: + - start_bracket: ( + - parameter: FLOAT_PARAM1 + - data_type: + - data_type_identifier: FLOAT + - end_bracket: ) + - keyword: SET + - comment_equals_clause: + - keyword: COMMENT + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''a_comment''' +- statement_terminator: ; +- statement: + - alter_procedure_statement: + - keyword: ALTER + - keyword: PROCEDURE + - function_name: + - function_name_identifier: procedure1 + - function_parameter_list: + - bracketed: + - start_bracket: ( + - parameter: FLOAT_PARAM1 + - data_type: + - data_type_identifier: FLOAT + - end_bracket: ) + - keyword: SET + - tag_equals: + - keyword: TAG + - tag_reference: + - naked_identifier: TAG1 + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''value1''' + - comma: ',' + - tag_reference: + - naked_identifier: TAG2 + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''value2''' + - comma: ',' + - tag_reference: + - naked_identifier: TAG3 + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''value3''' +- statement_terminator: ; +- statement: + - alter_procedure_statement: + - keyword: ALTER + - keyword: PROCEDURE + - function_name: + - function_name_identifier: procedure1 + - function_parameter_list: + - bracketed: + - start_bracket: ( + - end_bracket: ) + - keyword: UNSET + - keyword: COMMENT +- statement_terminator: ; +- statement: + - alter_procedure_statement: + - keyword: ALTER + - keyword: PROCEDURE + - function_name: + - function_name_identifier: procedure1 + - function_parameter_list: + - bracketed: + - start_bracket: ( + - end_bracket: ) + - keyword: UNSET + - keyword: TAG + - tag_reference: + - naked_identifier: TAG1 + - comma: ',' + - tag_reference: + - naked_identifier: TAG2 + - comma: ',' + - tag_reference: + - naked_identifier: TAG3 +- statement_terminator: ; diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_resource_monitor.sql b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_resource_monitor.sql new file mode 100644 index 000000000..7d6470da6 --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_resource_monitor.sql @@ -0,0 +1,55 @@ +-- Test cases for ALTER RESOURCE MONITOR statement +-- From SQLFluff PR #5272 + +-- Simple alter with credit quota +ALTER RESOURCE MONITOR my_monitor SET CREDIT_QUOTA=200; + +-- Alter with frequency +ALTER RESOURCE MONITOR budget_monitor SET FREQUENCY=WEEKLY; + +-- Alter with multiple options +ALTER RESOURCE MONITOR my_monitor SET + CREDIT_QUOTA=300 + FREQUENCY=MONTHLY; + +-- Alter with start timestamp +ALTER RESOURCE MONITOR timed_monitor SET START_TIMESTAMP='2024-06-01 00:00:00'; +ALTER RESOURCE MONITOR immediate_monitor SET START_TIMESTAMP=IMMEDIATELY; + +-- Alter with end timestamp +ALTER RESOURCE MONITOR limited_monitor SET END_TIMESTAMP='2025-12-31 23:59:59'; + +-- Alter with notify users +ALTER RESOURCE MONITOR notify_monitor SET NOTIFY_USERS=(user1, user2, admin); + +-- Alter with triggers +ALTER RESOURCE MONITOR trigger_monitor SET + TRIGGERS ON 85 PERCENT DO NOTIFY + ON 95 PERCENT DO SUSPEND; + +-- Alter with all options +ALTER RESOURCE MONITOR full_monitor SET + CREDIT_QUOTA=3000 + FREQUENCY=YEARLY + START_TIMESTAMP='2024-02-01 00:00:00' + END_TIMESTAMP='2025-01-31 23:59:59' + NOTIFY_USERS=(superadmin, billing_team) + TRIGGERS ON 70 PERCENT DO NOTIFY + ON 85 PERCENT DO SUSPEND + ON 98 PERCENT DO SUSPEND_IMMEDIATE; + +-- Alter with IF EXISTS +ALTER RESOURCE MONITOR IF EXISTS my_monitor SET CREDIT_QUOTA=150; + +-- Alter with schema qualified name +ALTER RESOURCE MONITOR my_schema.my_monitor SET CREDIT_QUOTA=250; + +-- Alter with database and schema qualified name +ALTER RESOURCE MONITOR my_db.my_schema.my_monitor SET CREDIT_QUOTA=350; + +-- Alter with different frequency options +ALTER RESOURCE MONITOR monitor1 SET FREQUENCY=DAILY; +ALTER RESOURCE MONITOR monitor2 SET FREQUENCY=WEEKLY; +ALTER RESOURCE MONITOR monitor3 SET FREQUENCY=MONTHLY; +ALTER RESOURCE MONITOR monitor4 SET FREQUENCY=YEARLY; +ALTER RESOURCE MONITOR monitor5 SET FREQUENCY=NEVER; \ No newline at end of file diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_resource_monitor.yml b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_resource_monitor.yml new file mode 100644 index 000000000..cc1781fae --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/alter_resource_monitor.yml @@ -0,0 +1,268 @@ +file: +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: my_monitor + - keyword: SET + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '200' +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: budget_monitor + - keyword: SET + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: WEEKLY +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: my_monitor + - keyword: SET + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '300' + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: MONTHLY +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: timed_monitor + - keyword: SET + - keyword: START_TIMESTAMP + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''2024-06-01 00:00:00''' +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: immediate_monitor + - keyword: SET + - keyword: START_TIMESTAMP + - comparison_operator: + - raw_comparison_operator: = + - keyword: IMMEDIATELY +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: limited_monitor + - keyword: SET + - keyword: END_TIMESTAMP + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''2025-12-31 23:59:59''' +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: notify_monitor + - keyword: SET + - keyword: NOTIFY_USERS + - comparison_operator: + - raw_comparison_operator: = + - bracketed: + - start_bracket: ( + - naked_identifier: user1 + - comma: ',' + - naked_identifier: user2 + - comma: ',' + - naked_identifier: admin + - end_bracket: ) +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: trigger_monitor + - keyword: SET + - keyword: TRIGGERS + - keyword: ON + - numeric_literal: '85' + - keyword: PERCENT + - keyword: DO + - keyword: NOTIFY + - keyword: ON + - numeric_literal: '95' + - keyword: PERCENT + - keyword: DO + - keyword: SUSPEND +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: full_monitor + - keyword: SET + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '3000' + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: YEARLY + - keyword: START_TIMESTAMP + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''2024-02-01 00:00:00''' + - keyword: END_TIMESTAMP + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''2025-01-31 23:59:59''' + - keyword: NOTIFY_USERS + - comparison_operator: + - raw_comparison_operator: = + - bracketed: + - start_bracket: ( + - naked_identifier: superadmin + - comma: ',' + - naked_identifier: billing_team + - end_bracket: ) + - keyword: TRIGGERS + - keyword: ON + - numeric_literal: '70' + - keyword: PERCENT + - keyword: DO + - keyword: NOTIFY + - keyword: ON + - numeric_literal: '85' + - keyword: PERCENT + - keyword: DO + - keyword: SUSPEND + - keyword: ON + - numeric_literal: '98' + - keyword: PERCENT + - keyword: DO + - keyword: SUSPEND_IMMEDIATE +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - keyword: IF + - keyword: EXISTS + - object_reference: + - naked_identifier: my_monitor + - keyword: SET + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '150' +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: my_schema + - dot: . + - naked_identifier: my_monitor + - keyword: SET + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '250' +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: my_db + - dot: . + - naked_identifier: my_schema + - dot: . + - naked_identifier: my_monitor + - keyword: SET + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '350' +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: monitor1 + - keyword: SET + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: DAILY +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: monitor2 + - keyword: SET + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: WEEKLY +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: monitor3 + - keyword: SET + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: MONTHLY +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: monitor4 + - keyword: SET + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: YEARLY +- statement_terminator: ; +- statement: + - keyword: ALTER + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: monitor5 + - keyword: SET + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: NEVER +- statement_terminator: ; diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_resource_monitor.sql b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_resource_monitor.sql new file mode 100644 index 000000000..83bbe428e --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_resource_monitor.sql @@ -0,0 +1,55 @@ +-- Test cases for CREATE RESOURCE MONITOR statement +-- From SQLFluff PR #5272 + +-- Simple resource monitor with credit quota +CREATE RESOURCE MONITOR my_monitor WITH CREDIT_QUOTA=100; + +-- Resource monitor with frequency +CREATE RESOURCE MONITOR budget_monitor WITH CREDIT_QUOTA=500 FREQUENCY=MONTHLY; + +-- Resource monitor with all frequency options +CREATE RESOURCE MONITOR daily_monitor WITH CREDIT_QUOTA=10 FREQUENCY=DAILY; +CREATE RESOURCE MONITOR weekly_monitor WITH CREDIT_QUOTA=70 FREQUENCY=WEEKLY; +CREATE RESOURCE MONITOR yearly_monitor WITH CREDIT_QUOTA=5000 FREQUENCY=YEARLY; +CREATE RESOURCE MONITOR never_monitor WITH CREDIT_QUOTA=1000 FREQUENCY=NEVER; + +-- Resource monitor with start timestamp +CREATE RESOURCE MONITOR timed_monitor WITH CREDIT_QUOTA=100 START_TIMESTAMP='2024-01-01 00:00:00'; +CREATE RESOURCE MONITOR immediate_monitor WITH CREDIT_QUOTA=100 START_TIMESTAMP=IMMEDIATELY; + +-- Resource monitor with end timestamp +CREATE RESOURCE MONITOR limited_monitor WITH CREDIT_QUOTA=100 END_TIMESTAMP='2024-12-31 23:59:59'; + +-- Resource monitor with notify users +CREATE RESOURCE MONITOR notify_monitor WITH CREDIT_QUOTA=100 NOTIFY_USERS=(user1, user2, user3); + +-- Resource monitor with single trigger +CREATE RESOURCE MONITOR trigger_monitor WITH CREDIT_QUOTA=100 + TRIGGERS ON 90 PERCENT DO SUSPEND; + +-- Resource monitor with multiple triggers +CREATE RESOURCE MONITOR multi_trigger_monitor WITH CREDIT_QUOTA=1000 + TRIGGERS ON 50 PERCENT DO NOTIFY + ON 75 PERCENT DO NOTIFY + ON 90 PERCENT DO SUSPEND + ON 100 PERCENT DO SUSPEND_IMMEDIATE; + +-- Resource monitor with all options +CREATE OR REPLACE RESOURCE MONITOR full_monitor WITH + CREDIT_QUOTA=2000 + FREQUENCY=MONTHLY + START_TIMESTAMP='2024-01-01 00:00:00' + END_TIMESTAMP='2024-12-31 23:59:59' + NOTIFY_USERS=(admin, finance_team) + TRIGGERS ON 60 PERCENT DO NOTIFY + ON 80 PERCENT DO SUSPEND + ON 95 PERCENT DO SUSPEND_IMMEDIATE; + +-- Resource monitor with OR REPLACE +CREATE OR REPLACE RESOURCE MONITOR replaced_monitor WITH CREDIT_QUOTA=300; + +-- Resource monitor with schema qualified name +CREATE RESOURCE MONITOR my_schema.my_monitor WITH CREDIT_QUOTA=100; + +-- Resource monitor with database and schema qualified name +CREATE RESOURCE MONITOR my_db.my_schema.my_monitor WITH CREDIT_QUOTA=100; \ No newline at end of file diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_resource_monitor.yml b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_resource_monitor.yml new file mode 100644 index 000000000..30f26b286 --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_resource_monitor.yml @@ -0,0 +1,310 @@ +file: +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: my_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '100' +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: budget_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '500' + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: MONTHLY +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: daily_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '10' + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: DAILY +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: weekly_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '70' + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: WEEKLY +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: yearly_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '5000' + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: YEARLY +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: never_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '1000' + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: NEVER +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: timed_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '100' + - keyword: START_TIMESTAMP + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''2024-01-01 00:00:00''' +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: immediate_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '100' + - keyword: START_TIMESTAMP + - comparison_operator: + - raw_comparison_operator: = + - keyword: IMMEDIATELY +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: limited_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '100' + - keyword: END_TIMESTAMP + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''2024-12-31 23:59:59''' +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: notify_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '100' + - keyword: NOTIFY_USERS + - comparison_operator: + - raw_comparison_operator: = + - bracketed: + - start_bracket: ( + - naked_identifier: user1 + - comma: ',' + - naked_identifier: user2 + - comma: ',' + - naked_identifier: user3 + - end_bracket: ) +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: trigger_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '100' + - keyword: TRIGGERS + - keyword: ON + - numeric_literal: '90' + - keyword: PERCENT + - keyword: DO + - keyword: SUSPEND +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: multi_trigger_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '1000' + - keyword: TRIGGERS + - keyword: ON + - numeric_literal: '50' + - keyword: PERCENT + - keyword: DO + - keyword: NOTIFY + - keyword: ON + - numeric_literal: '75' + - keyword: PERCENT + - keyword: DO + - keyword: NOTIFY + - keyword: ON + - numeric_literal: '90' + - keyword: PERCENT + - keyword: DO + - keyword: SUSPEND + - keyword: ON + - numeric_literal: '100' + - keyword: PERCENT + - keyword: DO + - keyword: SUSPEND_IMMEDIATE +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: OR + - keyword: REPLACE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: full_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '2000' + - keyword: FREQUENCY + - comparison_operator: + - raw_comparison_operator: = + - keyword: MONTHLY + - keyword: START_TIMESTAMP + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''2024-01-01 00:00:00''' + - keyword: END_TIMESTAMP + - comparison_operator: + - raw_comparison_operator: = + - quoted_literal: '''2024-12-31 23:59:59''' + - keyword: NOTIFY_USERS + - comparison_operator: + - raw_comparison_operator: = + - bracketed: + - start_bracket: ( + - naked_identifier: admin + - comma: ',' + - naked_identifier: finance_team + - end_bracket: ) + - keyword: TRIGGERS + - keyword: ON + - numeric_literal: '60' + - keyword: PERCENT + - keyword: DO + - keyword: NOTIFY + - keyword: ON + - numeric_literal: '80' + - keyword: PERCENT + - keyword: DO + - keyword: SUSPEND + - keyword: ON + - numeric_literal: '95' + - keyword: PERCENT + - keyword: DO + - keyword: SUSPEND_IMMEDIATE +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: OR + - keyword: REPLACE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: replaced_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '300' +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: my_schema + - dot: . + - naked_identifier: my_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '100' +- statement_terminator: ; +- statement: + - keyword: CREATE + - keyword: RESOURCE + - keyword: MONITOR + - object_reference: + - naked_identifier: my_db + - dot: . + - naked_identifier: my_schema + - dot: . + - naked_identifier: my_monitor + - keyword: WITH + - keyword: CREDIT_QUOTA + - comparison_operator: + - raw_comparison_operator: = + - numeric_literal: '100' +- statement_terminator: ; diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_table.sql b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_table.sql index 3b335d237..f3a22262a 100644 --- a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_table.sql +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_table.sql @@ -94,3 +94,8 @@ CREATE OR REPLACE TABLE SCHEMA1.TABLE1 ) CHANGE_TRACKING = TRUE WITH TAG ( account_objects.tags.IRM = '{"IRM":[{"Primary":"ABC123"}]}' ); + +CREATE TABLE my_table ( + foo TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP::TIMESTAMP_NTZ +) +; diff --git a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_table.yml b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_table.yml index 8dfdea584..66280cbba 100644 --- a/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_table.yml +++ b/crates/lib-dialects/test/fixtures/dialects/snowflake/sqlfluff/create_table.yml @@ -444,7 +444,8 @@ file: - data_type_identifier: number - column_constraint_segment: - keyword: default - - null_literal: 'null' + - expression: + - null_literal: 'null' - comma: ',' - column_definition: - naked_identifier: orderdate @@ -452,7 +453,8 @@ file: - data_type_identifier: date - column_constraint_segment: - keyword: default - - null_literal: 'null' + - expression: + - null_literal: 'null' - comma: ',' - column_definition: - naked_identifier: orderstatus @@ -465,7 +467,8 @@ file: - end_bracket: ) - column_constraint_segment: - keyword: default - - null_literal: 'null' + - expression: + - null_literal: 'null' - comma: ',' - column_definition: - naked_identifier: price @@ -684,7 +687,8 @@ file: - keyword: NOT - keyword: 'NULL' - keyword: DEFAULT - - keyword: CURRENT_TIMESTAMP + - expression: + - bare_function: CURRENT_TIMESTAMP - comma: ',' - column_definition: - naked_identifier: timestamp_col2 @@ -692,10 +696,14 @@ file: - data_type_identifier: TIMESTAMP_TZ - column_constraint_segment: - keyword: DEFAULT - - keyword: CURRENT_TIMESTAMP - - bracketed: - - start_bracket: ( - - end_bracket: ) + - expression: + - function: + - function_name: + - function_name_identifier: CURRENT_TIMESTAMP + - function_contents: + - bracketed: + - start_bracket: ( + - end_bracket: ) - comma: ',' - column_definition: - naked_identifier: timestamp_col3 @@ -703,11 +711,16 @@ file: - data_type_identifier: TIMESTAMP_TZ - column_constraint_segment: - keyword: DEFAULT - - keyword: CURRENT_TIMESTAMP - - bracketed: - - start_bracket: ( - - numeric_literal: '2' - - end_bracket: ) + - expression: + - function: + - function_name: + - function_name_identifier: CURRENT_TIMESTAMP + - function_contents: + - bracketed: + - start_bracket: ( + - expression: + - numeric_literal: '2' + - end_bracket: ) - comma: ',' - column_definition: - naked_identifier: sysdate_col4 @@ -715,10 +728,14 @@ file: - data_type_identifier: TIMESTAMP_TZ - column_constraint_segment: - keyword: DEFAULT - - keyword: SYSDATE - - bracketed: - - start_bracket: ( - - end_bracket: ) + - expression: + - function: + - function_name: + - function_name_identifier: SYSDATE + - function_contents: + - bracketed: + - start_bracket: ( + - end_bracket: ) - end_bracket: ) - statement_terminator: ; - statement: @@ -902,3 +919,25 @@ file: - quoted_literal: '''{"IRM":[{"Primary":"ABC123"}]}''' - end_bracket: ) - statement_terminator: ; +- statement: + - create_table_statement: + - keyword: CREATE + - keyword: TABLE + - table_reference: + - naked_identifier: my_table + - bracketed: + - start_bracket: ( + - column_definition: + - naked_identifier: foo + - data_type: + - data_type_identifier: TIMESTAMP_NTZ + - column_constraint_segment: + - keyword: DEFAULT + - expression: + - cast_expression: + - bare_function: CURRENT_TIMESTAMP + - casting_operator: '::' + - data_type: + - data_type_identifier: TIMESTAMP_NTZ + - end_bracket: ) +- statement_terminator: ;