From 5f5e92dc2822745fa486edcb915e036c2f0fe7bc Mon Sep 17 00:00:00 2001 From: osipovartem Date: Tue, 8 Sep 2026 23:09:00 +0300 Subject: [PATCH] Parse Snowflake structured ARRAY types --- src/parser/mod.rs | 8 +++++--- tests/sqlparser_snowflake.rs | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 72f3e6dfdd..80b33f9d92 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12629,12 +12629,14 @@ impl<'a> Parser<'a> { Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))), Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)), Keyword::ARRAY => { - if self.dialect.supports_array_typedef_without_element_type() { - Ok(DataType::Array(ArrayElemTypeDef::None)) - } else if dialect_of!(self is ClickHouseDialect) { + if dialect_of!(self is ClickHouseDialect | SnowflakeDialect) + && self.peek_token_ref().token == Token::LParen + { Ok(self.parse_sub_type(|internal_type| { DataType::Array(ArrayElemTypeDef::Parenthesis(internal_type)) })?) + } else if self.dialect.supports_array_typedef_without_element_type() { + Ok(DataType::Array(ArrayElemTypeDef::None)) } else { self.expect_token(&Token::Lt)?; let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?; diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs index f1b9213e5b..519a28ef26 100644 --- a/tests/sqlparser_snowflake.rs +++ b/tests/sqlparser_snowflake.rs @@ -1289,6 +1289,27 @@ fn parse_array() { }, expr_from_projection(only(&select.projection)) ); + + let sql = "SELECT CAST(a AS ARRAY(VARCHAR)) FROM customer"; + let select = snowflake() + .verified_only_select_with_canonical(sql, "SELECT CAST(a AS Array(VARCHAR)) FROM customer"); + assert_eq!( + &Expr::Cast { + kind: CastKind::Cast, + expr: Box::new(Expr::Identifier(Ident::new("a"))), + data_type: DataType::Array(ArrayElemTypeDef::Parenthesis(Box::new(DataType::Varchar( + None + ),))), + array: false, + format: None, + }, + expr_from_projection(only(&select.projection)) + ); + + snowflake().one_statement_parses_to( + "CREATE TABLE t (a ARRAY(NUMBER))", + "CREATE TABLE t (a Array(NUMBER))", + ); } #[test]