Skip to content

Commit 4a3e8ca

Browse files
committed
Support Snowflake TEXT(n) casts
1 parent 913cf0e commit 4a3e8ca

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

src/parser/mod.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12170,7 +12170,18 @@ impl<'a> Parser<'a> {
1217012170
self.expect_token(&Token::RParen)?;
1217112171
Ok(DataType::FixedString(character_length))
1217212172
}
12173-
Keyword::TEXT => Ok(DataType::Text),
12173+
Keyword::TEXT => {
12174+
if dialect_is!(dialect is SnowflakeDialect)
12175+
&& self.peek_token_ref().token == Token::LParen
12176+
{
12177+
Ok(DataType::Custom(
12178+
ObjectName::from(vec![Ident::new("TEXT")]),
12179+
self.parse_optional_type_modifiers()?.unwrap_or_default(),
12180+
))
12181+
} else {
12182+
Ok(DataType::Text)
12183+
}
12184+
}
1217412185
Keyword::TINYTEXT => Ok(DataType::TinyText),
1217512186
Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
1217612187
Keyword::LONGTEXT => Ok(DataType::LongText),

tests/sqlparser_snowflake.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5010,3 +5010,51 @@ fn test_select_dollar_column_from_stage() {
50105010
// With table function args, without alias
50115011
snowflake().verified_stmt("SELECT $1, $2 FROM @mystage1(file_format => 'myformat')");
50125012
}
5013+
5014+
#[test]
5015+
fn test_snowflake_text_cast_with_length() {
5016+
let expr = snowflake().verified_expr("_ID::TEXT(16777216)");
5017+
match expr {
5018+
Expr::Cast {
5019+
kind: CastKind::DoubleColon,
5020+
data_type,
5021+
..
5022+
} => {
5023+
assert_eq!(
5024+
data_type,
5025+
DataType::Custom(
5026+
ObjectName::from(vec![Ident::new("TEXT")]),
5027+
vec!["16777216".to_string()],
5028+
)
5029+
);
5030+
}
5031+
_ => unreachable!(),
5032+
}
5033+
}
5034+
5035+
#[test]
5036+
fn test_snowflake_create_table_with_text_length() {
5037+
match snowflake().verified_stmt("CREATE TABLE my_table (a TEXT(16777216), b TEXT)") {
5038+
Statement::CreateTable(CreateTable { columns, .. }) => {
5039+
assert_eq!(
5040+
columns,
5041+
vec![
5042+
ColumnDef {
5043+
name: "a".into(),
5044+
data_type: DataType::Custom(
5045+
ObjectName::from(vec![Ident::new("TEXT")]),
5046+
vec!["16777216".to_string()],
5047+
),
5048+
options: vec![],
5049+
},
5050+
ColumnDef {
5051+
name: "b".into(),
5052+
data_type: DataType::Text,
5053+
options: vec![],
5054+
},
5055+
]
5056+
);
5057+
}
5058+
_ => unreachable!(),
5059+
}
5060+
}

0 commit comments

Comments
 (0)