From 4a3e8cab65dfb5e76ea1fb7ef6fd5717da1cf154 Mon Sep 17 00:00:00 2001 From: Yoav Cohen Date: Sun, 5 Apr 2026 17:40:27 +0200 Subject: [PATCH] Support Snowflake TEXT(n) casts --- src/parser/mod.rs | 13 +++++++++- tests/sqlparser_snowflake.rs | 48 ++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 6282ed3d7..3062c5272 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12170,7 +12170,18 @@ impl<'a> Parser<'a> { self.expect_token(&Token::RParen)?; Ok(DataType::FixedString(character_length)) } - Keyword::TEXT => Ok(DataType::Text), + Keyword::TEXT => { + if dialect_is!(dialect is SnowflakeDialect) + && self.peek_token_ref().token == Token::LParen + { + Ok(DataType::Custom( + ObjectName::from(vec![Ident::new("TEXT")]), + self.parse_optional_type_modifiers()?.unwrap_or_default(), + )) + } else { + Ok(DataType::Text) + } + } Keyword::TINYTEXT => Ok(DataType::TinyText), Keyword::MEDIUMTEXT => Ok(DataType::MediumText), Keyword::LONGTEXT => Ok(DataType::LongText), diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs index 790bf1515..ee0b560fa 100644 --- a/tests/sqlparser_snowflake.rs +++ b/tests/sqlparser_snowflake.rs @@ -5010,3 +5010,51 @@ fn test_select_dollar_column_from_stage() { // With table function args, without alias snowflake().verified_stmt("SELECT $1, $2 FROM @mystage1(file_format => 'myformat')"); } + +#[test] +fn test_snowflake_text_cast_with_length() { + let expr = snowflake().verified_expr("_ID::TEXT(16777216)"); + match expr { + Expr::Cast { + kind: CastKind::DoubleColon, + data_type, + .. + } => { + assert_eq!( + data_type, + DataType::Custom( + ObjectName::from(vec![Ident::new("TEXT")]), + vec!["16777216".to_string()], + ) + ); + } + _ => unreachable!(), + } +} + +#[test] +fn test_snowflake_create_table_with_text_length() { + match snowflake().verified_stmt("CREATE TABLE my_table (a TEXT(16777216), b TEXT)") { + Statement::CreateTable(CreateTable { columns, .. }) => { + assert_eq!( + columns, + vec![ + ColumnDef { + name: "a".into(), + data_type: DataType::Custom( + ObjectName::from(vec![Ident::new("TEXT")]), + vec!["16777216".to_string()], + ), + options: vec![], + }, + ColumnDef { + name: "b".into(), + data_type: DataType::Text, + options: vec![], + }, + ] + ); + } + _ => unreachable!(), + } +}