diff --git a/src/dialect/databricks.rs b/src/dialect/databricks.rs index 55e4f56cc..876eef22f 100644 --- a/src/dialect/databricks.rs +++ b/src/dialect/databricks.rs @@ -90,4 +90,9 @@ impl Dialect for DatabricksDialect { fn supports_optimize_table(&self) -> bool { true } + + /// See + fn supports_bang_not_operator(&self) -> bool { + true + } } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 6282ed3d7..5e7e00705 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_of!(self is SnowflakeDialect) { + let type_name = w.to_ident(next_token.span); + if let Some(modifiers) = self.parse_optional_type_modifiers()? { + Ok(DataType::Custom(type_name.into(), modifiers)) + } else { + Ok(DataType::Text) + } + } 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..9af8fffbe 100644 --- a/tests/sqlparser_snowflake.rs +++ b/tests/sqlparser_snowflake.rs @@ -5010,3 +5010,27 @@ 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_text_cast_with_length_modifier() { + let select = snowflake().verified_only_select("SELECT col::TEXT(16777216) AS col FROM t"); + + match &select.projection[0] { + SelectItem::ExprWithAlias { + expr: Expr::Cast { data_type, .. }, + alias, + } => { + assert_eq!(alias, &Ident::new("col")); + assert_eq!( + data_type, + &DataType::Custom( + ObjectName::from(vec![Ident::new("TEXT")]), + vec!["16777216".to_string()], + ) + ); + } + _ => unreachable!(), + } + + snowflake().verified_stmt("SELECT col::TEXT(16777216) AS col FROM t"); +}