@@ -4621,3 +4621,96 @@ fn test_optimizer_hints() {
46214621 DELETE /*+ foobar */ FROM table_name",
46224622 ) ;
46234623}
4624+
4625+ #[ test]
4626+ fn parse_create_database_with_charset ( ) {
4627+ // Test DEFAULT CHARACTER SET with = sign
4628+ mysql_and_generic ( ) . verified_stmt ( "CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4" ) ;
4629+
4630+ // Test DEFAULT CHARACTER SET without = sign (normalized form)
4631+ mysql_and_generic ( ) . one_statement_parses_to (
4632+ "CREATE DATABASE mydb DEFAULT CHARACTER SET = utf8mb4" ,
4633+ "CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4" ,
4634+ ) ;
4635+
4636+ // Test CHARACTER SET without DEFAULT
4637+ mysql_and_generic ( ) . one_statement_parses_to (
4638+ "CREATE DATABASE mydb CHARACTER SET utf8mb4" ,
4639+ "CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4" ,
4640+ ) ;
4641+
4642+ // Test CHARSET shorthand
4643+ mysql_and_generic ( ) . one_statement_parses_to (
4644+ "CREATE DATABASE mydb CHARSET utf8mb4" ,
4645+ "CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4" ,
4646+ ) ;
4647+
4648+ // Test DEFAULT CHARSET shorthand
4649+ mysql_and_generic ( ) . one_statement_parses_to (
4650+ "CREATE DATABASE mydb DEFAULT CHARSET utf8mb4" ,
4651+ "CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4" ,
4652+ ) ;
4653+
4654+ // Test DEFAULT COLLATE
4655+ mysql_and_generic ( ) . verified_stmt ( "CREATE DATABASE mydb DEFAULT COLLATE utf8mb4_unicode_ci" ) ;
4656+
4657+ // Test COLLATE without DEFAULT
4658+ mysql_and_generic ( ) . one_statement_parses_to (
4659+ "CREATE DATABASE mydb COLLATE utf8mb4_unicode_ci" ,
4660+ "CREATE DATABASE mydb DEFAULT COLLATE utf8mb4_unicode_ci" ,
4661+ ) ;
4662+
4663+ // Test both CHARACTER SET and COLLATE together
4664+ mysql_and_generic ( ) . verified_stmt (
4665+ "CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci" ,
4666+ ) ;
4667+
4668+ // Test IF NOT EXISTS with CHARACTER SET
4669+ mysql_and_generic ( )
4670+ . verified_stmt ( "CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARACTER SET utf16" ) ;
4671+
4672+ // Test the exact syntax from the issue
4673+ mysql_and_generic ( ) . one_statement_parses_to (
4674+ "CREATE DATABASE IF NOT EXISTS noria DEFAULT CHARACTER SET = utf16" ,
4675+ "CREATE DATABASE IF NOT EXISTS noria DEFAULT CHARACTER SET utf16" ,
4676+ ) ;
4677+ }
4678+
4679+ #[ test]
4680+ fn parse_create_database_with_charset_errors ( ) {
4681+ // Missing charset name after CHARACTER SET
4682+ assert ! ( mysql_and_generic( )
4683+ . parse_sql_statements( "CREATE DATABASE mydb DEFAULT CHARACTER SET" )
4684+ . is_err( ) ) ;
4685+
4686+ // Missing charset name after CHARSET
4687+ assert ! ( mysql_and_generic( )
4688+ . parse_sql_statements( "CREATE DATABASE mydb CHARSET" )
4689+ . is_err( ) ) ;
4690+
4691+ // Missing collation name after COLLATE
4692+ assert ! ( mysql_and_generic( )
4693+ . parse_sql_statements( "CREATE DATABASE mydb DEFAULT COLLATE" )
4694+ . is_err( ) ) ;
4695+
4696+ // Equals sign but no value
4697+ assert ! ( mysql_and_generic( )
4698+ . parse_sql_statements( "CREATE DATABASE mydb CHARACTER SET =" )
4699+ . is_err( ) ) ;
4700+ }
4701+
4702+ #[ test]
4703+ fn parse_create_database_with_charset_option_ordering ( ) {
4704+ // MySQL allows COLLATE before CHARACTER SET - output is normalized to CHARACTER SET first
4705+ // (matches MySQL's own SHOW CREATE DATABASE output order)
4706+ mysql_and_generic ( ) . one_statement_parses_to (
4707+ "CREATE DATABASE mydb DEFAULT COLLATE utf8mb4_unicode_ci DEFAULT CHARACTER SET utf8mb4" ,
4708+ "CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci" ,
4709+ ) ;
4710+
4711+ // COLLATE first without DEFAULT keywords
4712+ mysql_and_generic ( ) . one_statement_parses_to (
4713+ "CREATE DATABASE mydb COLLATE utf8mb4_unicode_ci CHARACTER SET utf8mb4" ,
4714+ "CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci" ,
4715+ ) ;
4716+ }
0 commit comments