diff --git a/src/ast/mod.rs b/src/ast/mod.rs index a92794d3b..8a37481a4 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -4643,6 +4643,10 @@ pub enum Statement { /// [Snowflake](https://docs.snowflake.com/en/sql-reference/sql/desc-table.html) /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/describe-table) has_table_keyword: bool, + /// Snowflake supports `DESC|DESCRIBE VIEW ` syntax. + /// + /// [Snowflake](https://docs.snowflake.com/en/sql-reference/sql/desc-view) + has_view_keyword: bool, /// Table name #[cfg_attr(feature = "visitor", visit(with = "visit_relation"))] table_name: ObjectName, @@ -5128,6 +5132,7 @@ impl fmt::Display for Statement { describe_alias, hive_format, has_table_keyword, + has_view_keyword, table_name, } => { write!(f, "{describe_alias} ")?; @@ -5135,7 +5140,9 @@ impl fmt::Display for Statement { if let Some(format) = hive_format { write!(f, "{format} ")?; } - if *has_table_keyword { + if *has_view_keyword { + write!(f, "VIEW ")?; + } else if *has_table_keyword { write!(f, "TABLE ")?; } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index dc793991f..0d3b212b6 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -14048,12 +14048,16 @@ impl<'a> Parser<'a> { } else { false }; + let has_view_keyword = dialect_of!(self is SnowflakeDialect) + && !has_table_keyword + && self.parse_keyword(Keyword::VIEW); let table_name = self.parse_object_name(false)?; Ok(Statement::ExplainTable { describe_alias, hive_format, has_table_keyword, + has_view_keyword, table_name, }) } diff --git a/tests/sqlparser_clickhouse.rs b/tests/sqlparser_clickhouse.rs index f16a1f8e4..09ca49751 100644 --- a/tests/sqlparser_clickhouse.rs +++ b/tests/sqlparser_clickhouse.rs @@ -1745,11 +1745,13 @@ fn parse_explain_table() { describe_alias, hive_format, has_table_keyword, + has_view_keyword, table_name, } => { pretty_assertions::assert_eq!(describe_alias, DescribeAlias::Explain); pretty_assertions::assert_eq!(hive_format, None); pretty_assertions::assert_eq!(has_table_keyword, true); + pretty_assertions::assert_eq!(has_view_keyword, false); pretty_assertions::assert_eq!("test_identifier", table_name.to_string()); } _ => panic!("Unexpected Statement, must be ExplainTable"), diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 22a633137..cb2ab84cf 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -5409,11 +5409,13 @@ fn parse_explain_table() { describe_alias, hive_format, has_table_keyword, + has_view_keyword, table_name, } => { assert_eq!(describe_alias, expected_describe_alias); assert_eq!(hive_format, None); assert_eq!(has_table_keyword, expected_table_keyword); + assert!(!has_view_keyword); assert_eq!("test_identifier", table_name.to_string()); } _ => panic!("Unexpected Statement, must be ExplainTable"), diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs index c1d7633b9..539712f3f 100644 --- a/tests/sqlparser_snowflake.rs +++ b/tests/sqlparser_snowflake.rs @@ -3359,12 +3359,14 @@ fn test_parse_position() { fn explain_describe() { snowflake().verified_stmt("DESCRIBE test.table"); snowflake().verified_stmt("DESCRIBE TABLE test.table"); + snowflake().verified_stmt("DESCRIBE VIEW test.view"); } #[test] fn explain_desc() { snowflake().verified_stmt("DESC test.table"); snowflake().verified_stmt("DESC TABLE test.table"); + snowflake().verified_stmt("DESC VIEW test.view"); } #[test] @@ -3374,17 +3376,39 @@ fn parse_explain_table() { describe_alias, hive_format, has_table_keyword, + has_view_keyword, table_name, } => { assert_eq!(describe_alias, DescribeAlias::Explain); assert_eq!(hive_format, None); assert_eq!(has_table_keyword, true); + assert_eq!(has_view_keyword, false); assert_eq!("test_identifier", table_name.to_string()); } _ => panic!("Unexpected Statement, must be ExplainTable"), } } +#[test] +fn parse_describe_view() { + match snowflake().verified_stmt("DESCRIBE VIEW test_view") { + Statement::ExplainTable { + describe_alias, + hive_format, + has_table_keyword, + has_view_keyword, + table_name, + } => { + assert_eq!(describe_alias, DescribeAlias::Describe); + assert_eq!(hive_format, None); + assert!(!has_table_keyword); + assert!(has_view_keyword); + assert_eq!("test_view", table_name.to_string()); + } + _ => panic!("Unexpected Statement, must be ExplainTable"), + } +} + #[test] fn parse_use() { let valid_object_names = ["mydb", "CATALOG", "DEFAULT"];