Skip to content

Commit d569d59

Browse files
committed
Handle Snowflake TEXT(n) casts
1 parent 913cf0e commit d569d59

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

src/dialect/snowflake.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1925,3 +1925,64 @@ fn parse_multi_table_insert_when_clauses(
19251925

19261926
Ok((when_clauses, else_clause))
19271927
}
1928+
1929+
#[cfg(test)]
1930+
mod tests {
1931+
use super::SnowflakeDialect;
1932+
use crate::ast::{DataType, ObjectName};
1933+
use crate::parser::Parser;
1934+
1935+
#[test]
1936+
fn parses_cast_to_text_with_size_in_snowflake() {
1937+
Parser::parse_sql(
1938+
&SnowflakeDialect,
1939+
r#"SELECT
1940+
_ID::TEXT(16777216) AS _ID,
1941+
TO_TIMESTAMP_NTZ(CREATED_ON) AS CREATED_ON,
1942+
DEPARTMENT::TEXT(16777216) AS DEPARTMENT,
1943+
DOB::TEXT(16777216) AS DOB,
1944+
FIRST_NAME::TEXT(16777216) AS FIRST_NAME,
1945+
GENDER::TEXT(16777216) AS GENDER,
1946+
IS_ACTIVE::BOOLEAN AS IS_ACTIVE,
1947+
LAST_NAME::TEXT(16777216) AS LAST_NAME,
1948+
MIDDLE_NAME::TEXT(16777216) AS MIDDLE_NAME,
1949+
ORGANIZATION::TEXT(16777216) AS ORGANIZATION,
1950+
STATUS::TEXT(16777216) AS STATUS,
1951+
TO_TIMESTAMP_NTZ(UPDATED_ON) AS UPDATED_ON,
1952+
USER_ID::TEXT(16777216) AS USER_ID,
1953+
EMAIL::TEXT(16777216) AS EMAIL,
1954+
JOB_TITLE::TEXT(16777216) AS JOB_TITLE
1955+
FROM INCARE_ANALYTICS.USER_DETAILS;"#,
1956+
)
1957+
.unwrap();
1958+
}
1959+
1960+
#[test]
1961+
fn parses_text_with_size_as_custom_data_type() {
1962+
let data_type = Parser::new(&SnowflakeDialect)
1963+
.try_with_sql("TEXT(16777216)")
1964+
.unwrap()
1965+
.parse_data_type()
1966+
.unwrap();
1967+
1968+
assert_eq!(
1969+
data_type,
1970+
DataType::Custom(
1971+
ObjectName::from(vec!["TEXT".into()]),
1972+
vec!["16777216".to_string()],
1973+
)
1974+
);
1975+
assert_eq!(data_type.to_string(), "TEXT(16777216)");
1976+
}
1977+
1978+
#[test]
1979+
fn preserves_bare_text_data_type() {
1980+
let data_type = Parser::new(&SnowflakeDialect)
1981+
.try_with_sql("TEXT")
1982+
.unwrap()
1983+
.parse_data_type()
1984+
.unwrap();
1985+
1986+
assert_eq!(data_type, DataType::Text);
1987+
}
1988+
}

src/parser/mod.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12170,7 +12170,17 @@ 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+
let type_name = w.value.clone();
12175+
if let Some(modifiers) = self.parse_optional_type_modifiers()? {
12176+
Ok(DataType::Custom(
12177+
ObjectName::from(Ident::new(type_name)),
12178+
modifiers,
12179+
))
12180+
} else {
12181+
Ok(DataType::Text)
12182+
}
12183+
}
1217412184
Keyword::TINYTEXT => Ok(DataType::TinyText),
1217512185
Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
1217612186
Keyword::LONGTEXT => Ok(DataType::LongText),

0 commit comments

Comments
 (0)