@@ -50,6 +50,7 @@ mod test_utils;
5050#[ cfg( test) ]
5151use pretty_assertions:: assert_eq;
5252use sqlparser:: ast:: ColumnOption :: Comment ;
53+ use sqlparser:: ast:: DateTimeField :: Seconds ;
5354use sqlparser:: ast:: Expr :: { Identifier , UnaryOp } ;
5455use sqlparser:: ast:: Value :: Number ;
5556use sqlparser:: test_utils:: all_dialects_except;
@@ -5399,6 +5400,19 @@ fn parse_interval_all() {
53995400 expr_from_projection( only( & select. projection) ) ,
54005401 ) ;
54015402
5403+ let sql = "SELECT INTERVAL 5 DAYS" ;
5404+ let select = verified_only_select ( sql) ;
5405+ assert_eq ! (
5406+ & Expr :: Interval ( Interval {
5407+ value: Box :: new( Expr :: Value ( number( "5" ) ) ) ,
5408+ leading_field: Some ( DateTimeField :: Days ) ,
5409+ leading_precision: None ,
5410+ last_field: None ,
5411+ fractional_seconds_precision: None ,
5412+ } ) ,
5413+ expr_from_projection( only( & select. projection) ) ,
5414+ ) ;
5415+
54025416 let sql = "SELECT INTERVAL '10' HOUR (1)" ;
54035417 let select = verified_only_select ( sql) ;
54045418 assert_eq ! (
@@ -5426,10 +5440,18 @@ fn parse_interval_all() {
54265440
54275441 verified_only_select ( "SELECT INTERVAL '1' YEAR" ) ;
54285442 verified_only_select ( "SELECT INTERVAL '1' MONTH" ) ;
5443+ verified_only_select ( "SELECT INTERVAL '1' WEEK" ) ;
54295444 verified_only_select ( "SELECT INTERVAL '1' DAY" ) ;
54305445 verified_only_select ( "SELECT INTERVAL '1' HOUR" ) ;
54315446 verified_only_select ( "SELECT INTERVAL '1' MINUTE" ) ;
54325447 verified_only_select ( "SELECT INTERVAL '1' SECOND" ) ;
5448+ verified_only_select ( "SELECT INTERVAL '1' YEARS" ) ;
5449+ verified_only_select ( "SELECT INTERVAL '1' MONTHS" ) ;
5450+ verified_only_select ( "SELECT INTERVAL '1' WEEKS" ) ;
5451+ verified_only_select ( "SELECT INTERVAL '1' DAYS" ) ;
5452+ verified_only_select ( "SELECT INTERVAL '1' HOURS" ) ;
5453+ verified_only_select ( "SELECT INTERVAL '1' MINUTES" ) ;
5454+ verified_only_select ( "SELECT INTERVAL '1' SECONDS" ) ;
54335455 verified_only_select ( "SELECT INTERVAL '1' YEAR TO MONTH" ) ;
54345456 verified_only_select ( "SELECT INTERVAL '1' DAY TO HOUR" ) ;
54355457 verified_only_select ( "SELECT INTERVAL '1' DAY TO MINUTE" ) ;
@@ -5439,10 +5461,21 @@ fn parse_interval_all() {
54395461 verified_only_select ( "SELECT INTERVAL '1' MINUTE TO SECOND" ) ;
54405462 verified_only_select ( "SELECT INTERVAL 1 YEAR" ) ;
54415463 verified_only_select ( "SELECT INTERVAL 1 MONTH" ) ;
5464+ verified_only_select ( "SELECT INTERVAL 1 WEEK" ) ;
54425465 verified_only_select ( "SELECT INTERVAL 1 DAY" ) ;
54435466 verified_only_select ( "SELECT INTERVAL 1 HOUR" ) ;
54445467 verified_only_select ( "SELECT INTERVAL 1 MINUTE" ) ;
54455468 verified_only_select ( "SELECT INTERVAL 1 SECOND" ) ;
5469+ verified_only_select ( "SELECT INTERVAL 1 YEARS" ) ;
5470+ verified_only_select ( "SELECT INTERVAL 1 MONTHS" ) ;
5471+ verified_only_select ( "SELECT INTERVAL 1 WEEKS" ) ;
5472+ verified_only_select ( "SELECT INTERVAL 1 DAYS" ) ;
5473+ verified_only_select ( "SELECT INTERVAL 1 HOURS" ) ;
5474+ verified_only_select ( "SELECT INTERVAL 1 MINUTES" ) ;
5475+ verified_only_select ( "SELECT INTERVAL 1 SECONDS" ) ;
5476+ verified_only_select (
5477+ "SELECT '2 years 15 months 100 weeks 99 hours 123456789 milliseconds'::INTERVAL" ,
5478+ ) ;
54465479}
54475480
54485481#[ test]
@@ -11356,16 +11389,12 @@ fn test_group_by_nothing() {
1135611389#[ test]
1135711390fn test_extract_seconds_ok ( ) {
1135811391 let dialects = all_dialects_where ( |d| d. allow_extract_custom ( ) ) ;
11359- let stmt = dialects. verified_expr ( "EXTRACT(seconds FROM '2 seconds'::INTERVAL)" ) ;
11392+ let stmt = dialects. verified_expr ( "EXTRACT(SECONDS FROM '2 seconds'::INTERVAL)" ) ;
1136011393
1136111394 assert_eq ! (
1136211395 stmt,
1136311396 Expr :: Extract {
11364- field: DateTimeField :: Custom ( Ident {
11365- value: "seconds" . to_string( ) ,
11366- quote_style: None ,
11367- span: Span :: empty( ) ,
11368- } ) ,
11397+ field: Seconds ,
1136911398 syntax: ExtractSyntax :: From ,
1137011399 expr: Box :: new( Expr :: Cast {
1137111400 kind: CastKind :: DoubleColon ,
@@ -11376,7 +11405,59 @@ fn test_extract_seconds_ok() {
1137611405 format: None ,
1137711406 } ) ,
1137811407 }
11379- )
11408+ ) ;
11409+
11410+ let actual_ast = dialects
11411+ . parse_sql_statements ( "SELECT EXTRACT(seconds FROM '2 seconds'::INTERVAL)" )
11412+ . unwrap ( ) ;
11413+
11414+ let expected_ast = vec ! [ Statement :: Query ( Box :: new( Query {
11415+ with: None ,
11416+ body: Box :: new( SetExpr :: Select ( Box :: new( Select {
11417+ select_token: AttachedToken :: empty( ) ,
11418+ distinct: None ,
11419+ top: None ,
11420+ top_before_distinct: false ,
11421+ projection: vec![ UnnamedExpr ( Expr :: Extract {
11422+ field: Seconds ,
11423+ syntax: ExtractSyntax :: From ,
11424+ expr: Box :: new( Expr :: Cast {
11425+ kind: CastKind :: DoubleColon ,
11426+ expr: Box :: new( Expr :: Value ( Value :: SingleQuotedString (
11427+ "2 seconds" . to_string( ) ,
11428+ ) ) ) ,
11429+ data_type: DataType :: Interval ,
11430+ format: None ,
11431+ } ) ,
11432+ } ) ] ,
11433+ into: None ,
11434+ from: vec![ ] ,
11435+ lateral_views: vec![ ] ,
11436+ prewhere: None ,
11437+ selection: None ,
11438+ group_by: GroupByExpr :: Expressions ( vec![ ] , vec![ ] ) ,
11439+ cluster_by: vec![ ] ,
11440+ distribute_by: vec![ ] ,
11441+ sort_by: vec![ ] ,
11442+ having: None ,
11443+ named_window: vec![ ] ,
11444+ qualify: None ,
11445+ window_before_qualify: false ,
11446+ value_table_mode: None ,
11447+ connect_by: None ,
11448+ } ) ) ) ,
11449+ order_by: None ,
11450+ limit: None ,
11451+ limit_by: vec![ ] ,
11452+ offset: None ,
11453+ fetch: None ,
11454+ locks: vec![ ] ,
11455+ for_clause: None ,
11456+ settings: None ,
11457+ format_clause: None ,
11458+ } ) ) ] ;
11459+
11460+ assert_eq ! ( actual_ast, expected_ast) ;
1138011461}
1138111462
1138211463#[ test]
@@ -11405,17 +11486,6 @@ fn test_extract_seconds_single_quote_ok() {
1140511486 )
1140611487}
1140711488
11408- #[ test]
11409- fn test_extract_seconds_err ( ) {
11410- let sql = "SELECT EXTRACT(seconds FROM '2 seconds'::INTERVAL)" ;
11411- let dialects = all_dialects_except ( |d| d. allow_extract_custom ( ) ) ;
11412- let err = dialects. parse_sql_statements ( sql) . unwrap_err ( ) ;
11413- assert_eq ! (
11414- err. to_string( ) ,
11415- "sql parser error: Expected: date/time field, found: seconds"
11416- ) ;
11417- }
11418-
1141911489#[ test]
1142011490fn test_extract_seconds_single_quote_err ( ) {
1142111491 let sql = r#"SELECT EXTRACT('seconds' FROM '2 seconds'::INTERVAL)"# ;
0 commit comments