From bac9926e44ae2de5886b76fa10e986addacbd244 Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Mon, 9 Nov 2026 12:19:23 +0100 Subject: [PATCH] PostgreSQL: Support `NCHAR VARYING` --- src/ast/data_type.rs | 5 +++++ src/parser/mod.rs | 11 ++++++++++- tests/sqlparser_common.rs | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ast/data_type.rs b/src/ast/data_type.rs index abd7b8dd41..164eb8d620 100644 --- a/src/ast/data_type.rs +++ b/src/ast/data_type.rs @@ -116,6 +116,10 @@ pub enum DataType { /// /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#national-character-string-type Nchar(Option), + /// National char varying type, e.g. NCHAR VARYING(10), [SQL Standard]. + /// + /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#national-character-string-type + NcharVarying(Option), /// Uuid type. Uuid, /// Large character object with optional length, @@ -574,6 +578,7 @@ impl fmt::Display for DataType { format_character_string_type(f, "NATIONAL CHAR VARYING", size) } DataType::Nchar(size) => format_character_string_type(f, "NCHAR", size), + DataType::NcharVarying(size) => format_character_string_type(f, "NCHAR VARYING", 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 3bc8e88e20..e16df5975a 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -13877,7 +13877,15 @@ impl<'a> Parser<'a> { )) } } - Keyword::NCHAR => Ok(DataType::Nchar(self.parse_optional_character_length()?)), + Keyword::NCHAR => { + if self.parse_keyword(Keyword::VARYING) { + Ok(DataType::NcharVarying( + self.parse_optional_character_length()?, + )) + } else { + Ok(DataType::Nchar(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()?)), @@ -23098,6 +23106,7 @@ mod tests { ); test_parse_data_type!(dialect, "NCHAR", DataType::Nchar(None)); test_parse_data_type!(dialect, "NCHAR(20)", DataType::Nchar(length)); + test_parse_data_type!(dialect, "NCHAR VARYING(20)", DataType::NcharVarying(length)); } #[test] diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 477f024667..f8e549f241 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -23495,6 +23495,7 @@ fn parse_national_character_string_types() { "NATIONAL CHAR VARYING(4)", "NCHAR", "NCHAR(4)", + "NCHAR VARYING(4)", ] { dialects.verified_stmt(&format!("CREATE TABLE t (c {data_type})")); dialects.verified_expr(&format!("CAST('ab' AS {data_type})"));