@@ -51,6 +51,7 @@ mod test_utils;
5151use pretty_assertions:: assert_eq;
5252use sqlparser:: ast:: ColumnOption :: Comment ;
5353use sqlparser:: ast:: Expr :: { Identifier , UnaryOp } ;
54+ use sqlparser:: ast:: Value :: Number ;
5455use sqlparser:: test_utils:: all_dialects_except;
5556
5657#[ test]
@@ -9250,7 +9251,7 @@ fn parse_cache_table() {
92509251 format!(
92519252 "CACHE {table_flag} TABLE '{cache_table_name}' OPTIONS('K1' = 'V1', 'K2' = 0.88) {sql}" ,
92529253 )
9253- . as_str( )
9254+ . as_str( )
92549255 ) ,
92559256 Statement :: Cache {
92569257 table_flag: Some ( ObjectName ( vec![ Ident :: new( table_flag) ] ) ) ,
@@ -9275,7 +9276,7 @@ fn parse_cache_table() {
92759276 format!(
92769277 "CACHE {table_flag} TABLE '{cache_table_name}' OPTIONS('K1' = 'V1', 'K2' = 0.88) AS {sql}" ,
92779278 )
9278- . as_str( )
9279+ . as_str( )
92799280 ) ,
92809281 Statement :: Cache {
92819282 table_flag: Some ( ObjectName ( vec![ Ident :: new( table_flag) ] ) ) ,
@@ -11459,7 +11460,7 @@ fn parse_explain_with_option_list() {
1145911460 } ) ,
1146011461 } ,
1146111462 ] ;
11462- run_explain_analyze (
11463+ run_explain_analyze (
1146311464 all_dialects_where ( |d| d. supports_explain_with_utility_options ( ) ) ,
1146411465 "EXPLAIN (ANALYZE, VERBOSE true, WAL OFF, FORMAT YAML, USER_DEF_NUM -100.1) SELECT sqrt(id) FROM foo" ,
1146511466 false ,
@@ -12440,3 +12441,83 @@ fn test_reserved_keywords_for_identifiers() {
1244012441 let sql = "SELECT MAX(interval) FROM tbl" ;
1244112442 dialects. parse_sql_statements ( sql) . unwrap ( ) ;
1244212443}
12444+
12445+ #[ test]
12446+ fn parse_create_table_with_enum_types ( ) {
12447+ let sql = "CREATE TABLE t0 (foo ENUM8('a' = 1, 'b' = 2), bar ENUM16('a' = 1, 'b' = 2), baz ENUM('a', 'b'))" ;
12448+ match all_dialects ( ) . verified_stmt ( sql) {
12449+ Statement :: CreateTable ( CreateTable { name, columns, .. } ) => {
12450+ std:: assert_eq!( name. to_string( ) , "t0" ) ;
12451+ std:: assert_eq!(
12452+ vec![
12453+ ColumnDef {
12454+ name: Ident :: new( "foo" ) ,
12455+ data_type: DataType :: Enum (
12456+ vec![
12457+ EnumMember :: NamedValue (
12458+ "a" . to_string( ) ,
12459+ Expr :: Value ( Number ( "1" . parse( ) . unwrap( ) , false ) )
12460+ ) ,
12461+ EnumMember :: NamedValue (
12462+ "b" . to_string( ) ,
12463+ Expr :: Value ( Number ( "2" . parse( ) . unwrap( ) , false ) )
12464+ )
12465+ ] ,
12466+ Some ( 8 )
12467+ ) ,
12468+ collation: None ,
12469+ options: vec![ ] ,
12470+ } ,
12471+ ColumnDef {
12472+ name: Ident :: new( "bar" ) ,
12473+ data_type: DataType :: Enum (
12474+ vec![
12475+ EnumMember :: NamedValue (
12476+ "a" . to_string( ) ,
12477+ Expr :: Value ( Number ( "1" . parse( ) . unwrap( ) , false ) )
12478+ ) ,
12479+ EnumMember :: NamedValue (
12480+ "b" . to_string( ) ,
12481+ Expr :: Value ( Number ( "2" . parse( ) . unwrap( ) , false ) )
12482+ )
12483+ ] ,
12484+ Some ( 16 )
12485+ ) ,
12486+ collation: None ,
12487+ options: vec![ ] ,
12488+ } ,
12489+ ColumnDef {
12490+ name: Ident :: new( "baz" ) ,
12491+ data_type: DataType :: Enum (
12492+ vec![
12493+ EnumMember :: Name ( "a" . to_string( ) ) ,
12494+ EnumMember :: Name ( "b" . to_string( ) )
12495+ ] ,
12496+ None
12497+ ) ,
12498+ collation: None ,
12499+ options: vec![ ] ,
12500+ }
12501+ ] ,
12502+ columns
12503+ ) ;
12504+ }
12505+ _ => unreachable ! ( ) ,
12506+ }
12507+
12508+ // invalid case missing value for enum pair
12509+ std:: assert_eq!(
12510+ all_dialects( )
12511+ . parse_sql_statements( "CREATE TABLE t0 (foo ENUM8('a' = 1, 'b' = ))" )
12512+ . unwrap_err( ) ,
12513+ ParserError :: ParserError ( "Expected: a value, found: )" . to_string( ) )
12514+ ) ;
12515+
12516+ // invalid case that name is not a string
12517+ std:: assert_eq!(
12518+ all_dialects( )
12519+ . parse_sql_statements( "CREATE TABLE t0 (foo ENUM8('a' = 1, 2))" )
12520+ . unwrap_err( ) ,
12521+ ParserError :: ParserError ( "Expected: literal string, found: 2" . to_string( ) )
12522+ ) ;
12523+ }
0 commit comments