diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 6b25cdae..dc306388 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -758,6 +758,7 @@ pub enum Statement { like: Option, engine: Option, default_charset: Option, + collation: Option, }, /// SQLite's `CREATE VIRTUAL TABLE .. USING ()` CreateVirtualTable { @@ -1208,6 +1209,7 @@ impl fmt::Display for Statement { like, default_charset, engine, + collation, } => { // We want to allow the following options // Empty column list, allowed by PostgreSQL: @@ -1339,6 +1341,9 @@ impl fmt::Display for Statement { if let Some(default_charset) = default_charset { write!(f, " DEFAULT CHARSET={}", default_charset)?; } + if let Some(collation) = collation { + write!(f, " COLLATE={}", collation)?; + } Ok(()) } Statement::CreateVirtualTable { diff --git a/src/parser.rs b/src/parser.rs index 8b332da7..90df61b4 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1560,6 +1560,7 @@ impl<'a> Parser<'a> { like: None, default_charset: None, engine: None, + collation: None, }) } @@ -1754,6 +1755,16 @@ impl<'a> Parser<'a> { None }; + let collation = if self.parse_keywords(&[Keyword::COLLATE]) { + self.expect_token(&Token::Eq)?; + match self.next_token() { + Token::Word(w) => Some(w.value), + unexpected => self.expected("identifier", unexpected)?, + } + } else { + None + }; + Ok(Statement::CreateTable { name: table_name, temporary, @@ -1773,6 +1784,7 @@ impl<'a> Parser<'a> { like, engine, default_charset, + collation, }) } diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index 9682eabf..350daf9a 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -211,6 +211,32 @@ fn parse_create_table_engine_default_charset() { } } +#[test] +fn parse_create_table_collate() { + let sql = "CREATE TABLE foo (id INT(11)) COLLATE=utf8mb4_0900_ai_ci"; + match mysql().verified_stmt(sql) { + Statement::CreateTable { + name, + columns, + collation, + .. + } => { + assert_eq!(name.to_string(), "foo"); + assert_eq!( + vec![ColumnDef { + name: Ident::new("id"), + data_type: DataType::Int(Some(11)), + collation: None, + options: vec![], + },], + columns + ); + assert_eq!(collation, Some("utf8mb4_0900_ai_ci".to_string())); + } + _ => unreachable!(), + } +} + #[test] fn parse_create_table_comment_character_set() { let sql = "CREATE TABLE foo (s TEXT CHARACTER SET utf8mb4 COMMENT 'comment')";