@@ -6501,7 +6501,17 @@ fn parse_multiple_statements() {
65016501 ) ;
65026502 test_with ( "DELETE FROM foo" , "SELECT" , " bar" ) ;
65036503 test_with ( "INSERT INTO foo VALUES (1)" , "SELECT" , " bar" ) ;
6504- test_with ( "CREATE TABLE foo (baz INT)" , "SELECT" , " bar" ) ;
6504+ // Since MySQL supports the `CREATE TABLE SELECT` syntax, this needs to be handled separately
6505+ let res = parse_sql_statements ( "CREATE TABLE foo (baz INT); SELECT bar" ) ;
6506+ assert_eq ! (
6507+ vec![
6508+ one_statement_parses_to( "CREATE TABLE foo (baz INT)" , "" ) ,
6509+ one_statement_parses_to( "SELECT bar" , "" ) ,
6510+ ] ,
6511+ res. unwrap( )
6512+ ) ;
6513+ // Check that extra semicolon at the end is stripped by normalization:
6514+ one_statement_parses_to ( "CREATE TABLE foo (baz INT);" , "CREATE TABLE foo (baz INT)" ) ;
65056515 // Make sure that empty statements do not cause an error:
65066516 let res = parse_sql_statements ( ";;" ) ;
65076517 assert_eq ! ( 0 , res. unwrap( ) . len( ) ) ;
@@ -11717,3 +11727,24 @@ fn parse_comments() {
1171711727 ParserError :: ParserError ( "Expected: comment object_type, found: UNKNOWN" . to_string( ) )
1171811728 ) ;
1171911729}
11730+
11731+ #[ test]
11732+ fn parse_create_table_select ( ) {
11733+ let dialects = all_dialects_where ( |d| d. supports_create_table_select ( ) ) ;
11734+ let sql_1 = r#"CREATE TABLE foo (baz INT) SELECT bar"# ;
11735+ let expected = r#"CREATE TABLE foo (baz INT) AS SELECT bar"# ;
11736+ let _ = dialects. one_statement_parses_to ( sql_1, expected) ;
11737+
11738+ let sql_2 = r#"CREATE TABLE foo (baz INT, name STRING) SELECT bar, oth_name FROM test.table_a"# ;
11739+ let expected =
11740+ r#"CREATE TABLE foo (baz INT, name STRING) AS SELECT bar, oth_name FROM test.table_a"# ;
11741+ let _ = dialects. one_statement_parses_to ( sql_2, expected) ;
11742+
11743+ let dialects = all_dialects_where ( |d| !d. supports_create_table_select ( ) ) ;
11744+ for sql in [ sql_1, sql_2] {
11745+ assert_eq ! (
11746+ dialects. parse_sql_statements( sql) . unwrap_err( ) ,
11747+ ParserError :: ParserError ( "Expected: end of statement, found: SELECT" . to_string( ) )
11748+ ) ;
11749+ }
11750+ }
0 commit comments