@@ -28,7 +28,7 @@ use crate::ast::helpers::stmt_data_loading::{
2828} ;
2929use crate :: ast:: {
3030 visit_expressions,
31- AlterAlertOperation , AlterBackupPolicyOperation , AlterColumnOperation ,
31+ AlterAlertOperation , AlterBackupPolicyOperation , AlterBackupSetOperation , AlterColumnOperation , BackupSetTargetKind ,
3232 AlterExternalVolumeOperation , AlterFileFormatOperation , AlterStreamlitOperation , AlterMaskingPolicyOperation ,
3333 AlterAuthenticationPolicyOperation , AlterDatabaseRoleOperation , AlterNetworkRuleOperation ,
3434 AlterPasswordPolicyOperation , AlterRoleOperation , AlterSemanticViewOperation ,
@@ -420,6 +420,11 @@ impl SnowflakeDialect {
420420 return Some ( parse_alter_authentication_policy ( parser) ) ;
421421 }
422422
423+ if parser. parse_keywords ( & [ Keyword :: ALTER , Keyword :: BACKUP , Keyword :: SET ] ) {
424+ // ALTER BACKUP SET
425+ return Some ( parse_alter_backup_set ( parser) ) ;
426+ }
427+
423428 if parser. parse_keywords ( & [ Keyword :: ALTER , Keyword :: BACKUP , Keyword :: POLICY ] ) {
424429 // ALTER BACKUP POLICY
425430 return Some ( parse_alter_backup_policy ( parser) ) ;
@@ -539,6 +544,11 @@ impl SnowflakeDialect {
539544 return Some ( parse_drop_authentication_policy ( parser) ) ;
540545 }
541546
547+ if parser. parse_keywords ( & [ Keyword :: DROP , Keyword :: BACKUP , Keyword :: SET ] ) {
548+ // DROP BACKUP SET
549+ return Some ( parse_drop_backup_set ( parser) ) ;
550+ }
551+
542552 if parser. parse_keywords ( & [ Keyword :: DROP , Keyword :: BACKUP , Keyword :: POLICY ] ) {
543553 // DROP BACKUP POLICY
544554 return Some ( parse_drop_backup_policy ( parser) ) ;
@@ -627,6 +637,10 @@ impl SnowflakeDialect {
627637 // DESC[RIBE] AUTHENTICATION POLICY
628638 return Some ( parse_describe_authentication_policy ( parser) ) ;
629639 }
640+ if parser. parse_keywords ( & [ Keyword :: BACKUP , Keyword :: SET ] ) {
641+ // DESC[RIBE] BACKUP SET
642+ return Some ( parse_describe_backup_set ( parser) ) ;
643+ }
630644 if parser. parse_keywords ( & [ Keyword :: BACKUP , Keyword :: POLICY ] ) {
631645 // DESC[RIBE] BACKUP POLICY
632646 return Some ( parse_describe_backup_policy ( parser) ) ;
@@ -743,6 +757,11 @@ impl SnowflakeDialect {
743757 return Some ( parse_create_authentication_policy ( or_replace, parser) ) ;
744758 }
745759
760+ // CREATE [OR REPLACE | OR ALTER] BACKUP SET
761+ if parser. parse_keywords ( & [ Keyword :: BACKUP , Keyword :: SET ] ) {
762+ return Some ( parse_create_backup_set ( or_replace, or_alter, parser) ) ;
763+ }
764+
746765 // CREATE [OR REPLACE | OR ALTER] BACKUP POLICY
747766 if parser. parse_keywords ( & [ Keyword :: BACKUP , Keyword :: POLICY ] ) {
748767 return Some ( parse_create_backup_policy ( or_replace, or_alter, parser) ) ;
@@ -1050,6 +1069,10 @@ impl SnowflakeDialect {
10501069 if parser. parse_keywords ( & [ Keyword :: AUTHENTICATION , Keyword :: POLICIES ] ) {
10511070 return Some ( parse_show_authentication_policies ( parser) ) ;
10521071 }
1072+ if parser. parse_keywords ( & [ Keyword :: BACKUP , Keyword :: SETS ] ) {
1073+ let show_options = parser. parse_show_stmt_options ( ) ;
1074+ return Some ( show_options. map ( |show_options| Statement :: ShowBackupSets { show_options } ) ) ;
1075+ }
10531076 if parser. parse_keywords ( & [ Keyword :: BACKUP , Keyword :: POLICIES ] ) {
10541077 return Some ( parse_show_backup_policies ( parser) ) ;
10551078 }
@@ -6124,6 +6147,99 @@ fn parse_show_authentication_policies(parser: &mut Parser) -> Result<Statement,
61246147 } )
61256148}
61266149
6150+ /// Parse `CREATE [ OR REPLACE | OR ALTER ] BACKUP SET [ IF NOT EXISTS ] <name>
6151+ /// FOR { [ DYNAMIC ] TABLE <t> | SCHEMA <s> | DATABASE <d> }` followed, in any
6152+ /// order, by `WITH BACKUP POLICY <p>`, `[ WITH ] TAG ( ... )` and `COMMENT = '<c>'`.
6153+ fn parse_create_backup_set (
6154+ or_replace : bool ,
6155+ or_alter : bool ,
6156+ parser : & mut Parser ,
6157+ ) -> Result < Statement , ParserError > {
6158+ let if_not_exists = parser. parse_keywords ( & [ Keyword :: IF , Keyword :: NOT , Keyword :: EXISTS ] ) ;
6159+ let name = parser. parse_object_name ( false ) ?;
6160+ parser. expect_keyword_is ( Keyword :: FOR ) ?;
6161+ let target_kind = if parser. parse_keywords ( & [ Keyword :: DYNAMIC , Keyword :: TABLE ] ) {
6162+ BackupSetTargetKind :: DynamicTable
6163+ } else if parser. parse_keyword ( Keyword :: TABLE ) {
6164+ BackupSetTargetKind :: Table
6165+ } else if parser. parse_keyword ( Keyword :: SCHEMA ) {
6166+ BackupSetTargetKind :: Schema
6167+ } else if parser. parse_keyword ( Keyword :: DATABASE ) {
6168+ BackupSetTargetKind :: Database
6169+ } else {
6170+ return parser. expected_ref (
6171+ "TABLE, DYNAMIC TABLE, SCHEMA or DATABASE" ,
6172+ parser. peek_token_ref ( ) ,
6173+ ) ;
6174+ } ;
6175+ let target = parser. parse_object_name ( false ) ?;
6176+ let mut backup_policy = None ;
6177+ let mut with_tags = None ;
6178+ let mut comment = None ;
6179+ loop {
6180+ if parser. parse_keywords ( & [ Keyword :: WITH , Keyword :: BACKUP , Keyword :: POLICY ] ) {
6181+ backup_policy = Some ( parser. parse_object_name ( false ) ?) ;
6182+ } else if parser. parse_keywords ( & [ Keyword :: WITH , Keyword :: TAG ] )
6183+ || parser. parse_keyword ( Keyword :: TAG )
6184+ {
6185+ parser. expect_token ( & Token :: LParen ) ?;
6186+ with_tags = Some ( parser. parse_comma_separated ( Parser :: parse_tag) ?) ;
6187+ parser. expect_token ( & Token :: RParen ) ?;
6188+ } else if parser. parse_keyword ( Keyword :: COMMENT ) {
6189+ parser. expect_token ( & Token :: Eq ) ?;
6190+ comment = Some ( parser. parse_comment_value ( ) ?) ;
6191+ } else {
6192+ break ;
6193+ }
6194+ }
6195+ Ok ( Statement :: CreateBackupSet {
6196+ or_replace,
6197+ or_alter,
6198+ if_not_exists,
6199+ name,
6200+ target_kind,
6201+ target,
6202+ backup_policy,
6203+ with_tags,
6204+ comment,
6205+ } )
6206+ }
6207+
6208+ /// Parse `ALTER BACKUP SET <name>
6209+ /// { RENAME TO <name> | SET COMMENT = '<c>' | UNSET COMMENT }`.
6210+ fn parse_alter_backup_set ( parser : & mut Parser ) -> Result < Statement , ParserError > {
6211+ let name = parser. parse_object_name ( false ) ?;
6212+ let operation = if parser. parse_keywords ( & [ Keyword :: RENAME , Keyword :: TO ] ) {
6213+ AlterBackupSetOperation :: RenameTo {
6214+ new_name : parser. parse_object_name ( false ) ?,
6215+ }
6216+ } else if parser. parse_keywords ( & [ Keyword :: SET , Keyword :: COMMENT ] ) {
6217+ parser. expect_token ( & Token :: Eq ) ?;
6218+ AlterBackupSetOperation :: SetComment ( parser. parse_comment_value ( ) ?)
6219+ } else if parser. parse_keywords ( & [ Keyword :: UNSET , Keyword :: COMMENT ] ) {
6220+ AlterBackupSetOperation :: UnsetComment
6221+ } else {
6222+ return parser. expected_ref (
6223+ "RENAME TO, SET COMMENT or UNSET COMMENT" ,
6224+ parser. peek_token_ref ( ) ,
6225+ ) ;
6226+ } ;
6227+ Ok ( Statement :: AlterBackupSet { name, operation } )
6228+ }
6229+
6230+ /// Parse `DROP BACKUP SET [IF EXISTS] <name>`
6231+ fn parse_drop_backup_set ( parser : & mut Parser ) -> Result < Statement , ParserError > {
6232+ let if_exists = parser. parse_keywords ( & [ Keyword :: IF , Keyword :: EXISTS ] ) ;
6233+ let name = parser. parse_object_name ( false ) ?;
6234+ Ok ( Statement :: DropBackupSet { if_exists, name } )
6235+ }
6236+
6237+ /// Parse `DESC[RIBE] BACKUP SET <name>`
6238+ fn parse_describe_backup_set ( parser : & mut Parser ) -> Result < Statement , ParserError > {
6239+ let name = parser. parse_object_name ( false ) ?;
6240+ Ok ( Statement :: DescribeBackupSet { name } )
6241+ }
6242+
61276243/// Parse `ALTER BACKUP POLICY <name>
61286244/// { SET <prop> = <v> [, ...] | UNSET <prop> [, ...] | RENAME TO <name> }`.
61296245fn parse_alter_backup_policy ( parser : & mut Parser ) -> Result < Statement , ParserError > {
0 commit comments