diff --git a/src/parser/mod.rs b/src/parser/mod.rs index dcf7a4a8f..ccac9535e 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -6946,8 +6946,12 @@ impl<'a> Parser<'a> { let create_table_config = self.parse_optional_create_table_config()?; - let default_charset = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) { - self.expect_token(&Token::Eq)?; + let default_charset = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) + || self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARACTER, Keyword::SET]) + || self.parse_keywords(&[Keyword::CHARSET]) + || self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) + { + let _ = self.consume_token(&Token::Eq); let next_token = self.next_token(); match next_token.token { Token::Word(w) => Some(w.value), @@ -6957,8 +6961,10 @@ impl<'a> Parser<'a> { None }; - let collation = if self.parse_keywords(&[Keyword::COLLATE]) { - self.expect_token(&Token::Eq)?; + let collation = if self.parse_keywords(&[Keyword::COLLATE]) + || self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) + { + let _ = self.consume_token(&Token::Eq); let next_token = self.next_token(); match next_token.token { Token::Word(w) => Some(w.value), diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index 884351491..c4aec13f3 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -947,6 +947,36 @@ fn parse_create_table_engine_default_charset() { } } +#[test] +fn parse_create_table_charset_collate() { + let sql = + "CREATE TABLE foo (id INT(11)) CHARACTER SET utf8mb3 DEFAULT COLLATE utf8mb4_0900_ai_ci"; + let expected = + "CREATE TABLE foo (id INT(11)) DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb4_0900_ai_ci"; + match mysql().one_statement_parses_to(sql, expected) { + Statement::CreateTable(CreateTable { + name, + columns, + collation, + default_charset, + .. + }) => { + assert_eq!(name.to_string(), "foo"); + assert_eq!( + vec![ColumnDef { + name: Ident::new("id"), + data_type: DataType::Int(Some(11)), + options: vec![], + },], + columns + ); + assert_eq!(default_charset, Some("utf8mb3".to_string())); + assert_eq!(collation, Some("utf8mb4_0900_ai_ci".to_string())); + } + _ => unreachable!(), + } +} + #[test] fn parse_create_table_collate() { let sql = "CREATE TABLE foo (id INT(11)) COLLATE=utf8mb4_0900_ai_ci";