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]