@@ -221,6 +221,11 @@ impl Dialect for SnowflakeDialect {
221221 return Some ( parse_alter_dynamic_table ( parser) ) ;
222222 }
223223
224+ if parser. parse_keywords ( & [ Keyword :: ALTER , Keyword :: EXTERNAL , Keyword :: TABLE ] ) {
225+ // ALTER EXTERNAL TABLE
226+ return Some ( parse_alter_external_table ( parser) ) ;
227+ }
228+
224229 if parser. parse_keywords ( & [ Keyword :: ALTER , Keyword :: SESSION ] ) {
225230 // ALTER SESSION
226231 let set = match parser. parse_one_of_keywords ( & [ Keyword :: SET , Keyword :: UNSET ] ) {
@@ -619,7 +624,7 @@ fn parse_alter_dynamic_table(parser: &mut Parser) -> Result<Statement, ParserErr
619624
620625 // Parse the operation (REFRESH, SUSPEND, or RESUME)
621626 let operation = if parser. parse_keyword ( Keyword :: REFRESH ) {
622- AlterTableOperation :: Refresh
627+ AlterTableOperation :: Refresh { subpath : None }
623628 } else if parser. parse_keyword ( Keyword :: SUSPEND ) {
624629 AlterTableOperation :: Suspend
625630 } else if parser. parse_keyword ( Keyword :: RESUME ) {
@@ -649,6 +654,45 @@ fn parse_alter_dynamic_table(parser: &mut Parser) -> Result<Statement, ParserErr
649654 } ) )
650655}
651656
657+ /// Parse snowflake alter external table.
658+ /// <https://docs.snowflake.com/en/sql-reference/sql/alter-external-table>
659+ fn parse_alter_external_table ( parser : & mut Parser ) -> Result < Statement , ParserError > {
660+ let if_exists = parser. parse_keywords ( & [ Keyword :: IF , Keyword :: EXISTS ] ) ;
661+ let table_name = parser. parse_object_name ( true ) ?;
662+
663+ // Parse the operation (REFRESH for now)
664+ let operation = if parser. parse_keyword ( Keyword :: REFRESH ) {
665+ // Optional subpath for refreshing specific partitions
666+ let subpath = match parser. peek_token ( ) . token {
667+ Token :: SingleQuotedString ( s) => {
668+ parser. next_token ( ) ;
669+ Some ( s)
670+ }
671+ _ => None ,
672+ } ;
673+ AlterTableOperation :: Refresh { subpath }
674+ } else {
675+ return parser. expected ( "REFRESH after ALTER EXTERNAL TABLE" , parser. peek_token ( ) ) ;
676+ } ;
677+
678+ let end_token = if parser. peek_token_ref ( ) . token == Token :: SemiColon {
679+ parser. peek_token_ref ( ) . clone ( )
680+ } else {
681+ parser. get_current_token ( ) . clone ( )
682+ } ;
683+
684+ Ok ( Statement :: AlterTable ( AlterTable {
685+ name : table_name,
686+ if_exists,
687+ only : false ,
688+ operations : vec ! [ operation] ,
689+ location : None ,
690+ on_cluster : None ,
691+ table_type : Some ( AlterTableType :: External ) ,
692+ end_token : AttachedToken ( end_token) ,
693+ } ) )
694+ }
695+
652696/// Parse snowflake alter session.
653697/// <https://docs.snowflake.com/en/sql-reference/sql/alter-session>
654698fn parse_alter_session ( parser : & mut Parser , set : bool ) -> Result < Statement , ParserError > {
0 commit comments