File tree 4 files changed +61
-10
lines changed
4 files changed +61
-10
lines changed Original file line number Diff line number Diff line change @@ -418,9 +418,6 @@ impl Display for CreateTable {
418
418
write ! ( f, " WITH TAG ({})" , display_comma_separated( tag. as_slice( ) ) ) ?;
419
419
}
420
420
421
- if let Some ( query) = & self . query {
422
- write ! ( f, " AS {query}" ) ?;
423
- }
424
421
if let Some ( default_charset) = & self . default_charset {
425
422
write ! ( f, " DEFAULT CHARSET={default_charset}" ) ?;
426
423
}
@@ -440,6 +437,9 @@ impl Display for CreateTable {
440
437
if self . strict {
441
438
write ! ( f, " STRICT" ) ?;
442
439
}
440
+ if let Some ( query) = & self . query {
441
+ write ! ( f, " AS {query}" ) ?;
442
+ }
443
443
Ok ( ( ) )
444
444
}
445
445
}
Original file line number Diff line number Diff line change @@ -5432,13 +5432,6 @@ impl<'a> Parser<'a> {
5432
5432
5433
5433
let create_table_config = self . parse_optional_create_table_config ( ) ?;
5434
5434
5435
- // Parse optional `AS ( query )`
5436
- let query = if self . parse_keyword ( Keyword :: AS ) {
5437
- Some ( self . parse_boxed_query ( ) ?)
5438
- } else {
5439
- None
5440
- } ;
5441
-
5442
5435
let default_charset = if self . parse_keywords ( & [ Keyword :: DEFAULT , Keyword :: CHARSET ] ) {
5443
5436
self . expect_token ( & Token :: Eq ) ?;
5444
5437
let next_token = self . next_token ( ) ;
@@ -5491,6 +5484,13 @@ impl<'a> Parser<'a> {
5491
5484
None
5492
5485
} ;
5493
5486
5487
+ // Parse optional `AS ( query )`
5488
+ let query = if self . parse_keyword ( Keyword :: AS ) {
5489
+ Some ( self . parse_boxed_query ( ) ?)
5490
+ } else {
5491
+ None
5492
+ } ;
5493
+
5494
5494
Ok ( CreateTableBuilder :: new ( table_name)
5495
5495
. temporary ( temporary)
5496
5496
. columns ( columns)
Original file line number Diff line number Diff line change @@ -802,6 +802,30 @@ fn test_query_with_format_clause() {
802
802
}
803
803
}
804
804
805
+ #[ test]
806
+ fn parse_create_table_on_commit_and_as_query ( ) {
807
+ let sql = r#"CREATE LOCAL TEMPORARY TABLE test ON COMMIT PRESERVE ROWS AS SELECT 1"# ;
808
+ match clickhouse_and_generic ( ) . verified_stmt ( sql) {
809
+ Statement :: CreateTable ( CreateTable {
810
+ name,
811
+ on_commit,
812
+ query,
813
+ ..
814
+ } ) => {
815
+ assert_eq ! ( name. to_string( ) , "test" ) ;
816
+ assert_eq ! ( on_commit, Some ( OnCommit :: PreserveRows ) ) ;
817
+ assert_eq ! (
818
+ query. unwrap( ) . body. as_select( ) . unwrap( ) . projection,
819
+ vec![ UnnamedExpr ( Expr :: Value ( Value :: Number (
820
+ "1" . parse( ) . unwrap( ) ,
821
+ false
822
+ ) ) ) ]
823
+ ) ;
824
+ }
825
+ _ => unreachable ! ( ) ,
826
+ }
827
+ }
828
+
805
829
fn clickhouse ( ) -> TestedDialects {
806
830
TestedDialects {
807
831
dialects : vec ! [ Box :: new( ClickHouseDialect { } ) ] ,
Original file line number Diff line number Diff line change @@ -812,6 +812,33 @@ fn parse_create_table_collate() {
812
812
}
813
813
}
814
814
815
+ #[ test]
816
+ fn parse_create_table_both_options_and_as_query ( ) {
817
+ let sql = "CREATE TABLE foo (id INT(11)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb4_0900_ai_ci AS SELECT 1" ;
818
+ match mysql_and_generic ( ) . verified_stmt ( sql) {
819
+ Statement :: CreateTable ( CreateTable {
820
+ name,
821
+ collation,
822
+ query,
823
+ ..
824
+ } ) => {
825
+ assert_eq ! ( name. to_string( ) , "foo" ) ;
826
+ assert_eq ! ( collation, Some ( "utf8mb4_0900_ai_ci" . to_string( ) ) ) ;
827
+ assert_eq ! (
828
+ query. unwrap( ) . body. as_select( ) . unwrap( ) . projection,
829
+ vec![ SelectItem :: UnnamedExpr ( Expr :: Value ( number( "1" ) ) ) ]
830
+ ) ;
831
+ }
832
+ _ => unreachable ! ( ) ,
833
+ }
834
+
835
+ let sql = r"CREATE TABLE foo (id INT(11)) ENGINE=InnoDB AS SELECT 1 DEFAULT CHARSET=utf8mb3" ;
836
+ assert ! ( matches!(
837
+ mysql_and_generic( ) . parse_sql_statements( sql) ,
838
+ Err ( ParserError :: ParserError ( _) )
839
+ ) ) ;
840
+ }
841
+
815
842
#[ test]
816
843
fn parse_create_table_comment_character_set ( ) {
817
844
let sql = "CREATE TABLE foo (s TEXT CHARACTER SET utf8mb4 COMMENT 'comment')" ;
You can’t perform that action at this time.
0 commit comments