diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index 95e04bd3..059b312e 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -371,10 +371,15 @@ pub enum AlterTableOperation { DropClusteringKey, SuspendRecluster, ResumeRecluster, - /// `REFRESH` + /// `REFRESH [ '' ]` /// - /// Note: this is Snowflake specific for dynamic tables - Refresh, + /// Note: this is Snowflake specific for dynamic/external tables + /// + /// + Refresh { + /// Optional subpath for external table refresh + subpath: Option, + }, /// `ADD PARTITION COLUMN ` /// /// Note: this is Snowflake specific for external tables @@ -870,8 +875,12 @@ impl fmt::Display for AlterTableOperation { write!(f, "RESUME RECLUSTER")?; Ok(()) } - AlterTableOperation::Refresh => { - write!(f, "REFRESH") + AlterTableOperation::Refresh { subpath } => { + write!(f, "REFRESH")?; + if let Some(path) = subpath { + write!(f, " '{path}'")?; + } + Ok(()) } AlterTableOperation::AddPartitionColumn { column_name, diff --git a/src/ast/spans.rs b/src/ast/spans.rs index 65cbb57b..d703e825 100644 --- a/src/ast/spans.rs +++ b/src/ast/spans.rs @@ -1145,7 +1145,7 @@ impl Spanned for AlterTableOperation { AlterTableOperation::DropClusteringKey => Span::empty(), AlterTableOperation::SuspendRecluster => Span::empty(), AlterTableOperation::ResumeRecluster => Span::empty(), - AlterTableOperation::Refresh => Span::empty(), + AlterTableOperation::Refresh { .. } => Span::empty(), AlterTableOperation::AddPartitionColumn { column_name, .. } => column_name.span, AlterTableOperation::Suspend => Span::empty(), AlterTableOperation::Resume => Span::empty(), diff --git a/src/dialect/snowflake.rs b/src/dialect/snowflake.rs index d4ab18c7..c866e213 100644 --- a/src/dialect/snowflake.rs +++ b/src/dialect/snowflake.rs @@ -624,7 +624,7 @@ fn parse_alter_dynamic_table(parser: &mut Parser) -> Result Result { + parser.next_token(); + Some(s) + } + _ => None, + }; + AlterTableOperation::Refresh { subpath } } else if parser.parse_keywords(&[Keyword::RENAME, Keyword::TO]) { let new_table_name = parser.parse_object_name(false)?; AlterTableOperation::RenameTable { diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs index 24425eba..755ed50c 100644 --- a/tests/sqlparser_snowflake.rs +++ b/tests/sqlparser_snowflake.rs @@ -4639,6 +4639,7 @@ fn test_alter_dynamic_table() { #[test] fn test_alter_external_table() { snowflake().verified_stmt("ALTER EXTERNAL TABLE some_table REFRESH"); + snowflake().verified_stmt("ALTER EXTERNAL TABLE some_table REFRESH 'year=2025/month=12/'"); snowflake().verified_stmt("ALTER EXTERNAL TABLE my_database.my_schema.my_external_table REFRESH"); snowflake().verified_stmt("ALTER EXTERNAL TABLE some_table RENAME TO new_table_name"); snowflake().verified_stmt("ALTER EXTERNAL TABLE some_table ADD PARTITION COLUMN column_name VARCHAR");