diff --git a/src/ast/data_type.rs b/src/ast/data_type.rs index 6b56ae3151..fb444a8732 100644 --- a/src/ast/data_type.rs +++ b/src/ast/data_type.rs @@ -104,6 +104,10 @@ pub enum DataType { /// /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#national-character-string-type NationalCharacterVarying(Option), + /// National char type, e.g. NATIONAL CHAR(10), [SQL Standard]. + /// + /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#national-character-string-type + NationalChar(Option), /// Uuid type. Uuid, /// Large character object with optional length, @@ -557,6 +561,7 @@ impl fmt::Display for DataType { DataType::NationalCharacterVarying(size) => { format_character_string_type(f, "NATIONAL CHARACTER VARYING", size) } + DataType::NationalChar(size) => format_character_string_type(f, "NATIONAL CHAR", size), DataType::Uuid => write!(f, "UUID"), DataType::CharacterLargeObject(size) => { format_type_with_optional_length(f, "CHARACTER LARGE OBJECT", size, false) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index df022b8b71..3a23683326 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -13865,6 +13865,12 @@ impl<'a> Parser<'a> { )) } } + Keyword::NATIONAL if self.peek_keyword(Keyword::CHAR) => { + let _ = self.parse_keyword(Keyword::CHAR); + Ok(DataType::NationalChar( + self.parse_optional_character_length()?, + )) + } Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)), Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)), Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_binary_length()?)), @@ -23076,6 +23082,8 @@ mod tests { "NATIONAL CHARACTER VARYING(20)", DataType::NationalCharacterVarying(length) ); + test_parse_data_type!(dialect, "NATIONAL CHAR", DataType::NationalChar(None)); + test_parse_data_type!(dialect, "NATIONAL CHAR(20)", DataType::NationalChar(length)); } #[test] diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index a7c574dd75..50bbb13b4f 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -23490,6 +23490,8 @@ fn parse_national_character_string_types() { "NATIONAL CHARACTER(4)", "NATIONAL CHARACTER VARYING", "NATIONAL CHARACTER VARYING(4)", + "NATIONAL CHAR", + "NATIONAL CHAR(4)", ] { dialects.verified_stmt(&format!("CREATE TABLE t (c {data_type})")); dialects.verified_expr(&format!("CAST('ab' AS {data_type})"));