@@ -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;
@@ -5400,6 +5401,19 @@ fn parse_interval_all() {
54005401 expr_from_projection( only( & select. projection) ) ,
54015402 ) ;
54025403
5404+ let sql = "SELECT INTERVAL 5 DAYS" ;
5405+ let select = verified_only_select ( sql) ;
5406+ assert_eq ! (
5407+ & Expr :: Interval ( Interval {
5408+ value: Box :: new( Expr :: Value ( number( "5" ) ) ) ,
5409+ leading_field: Some ( DateTimeField :: Days ) ,
5410+ leading_precision: None ,
5411+ last_field: None ,
5412+ fractional_seconds_precision: None ,
5413+ } ) ,
5414+ expr_from_projection( only( & select. projection) ) ,
5415+ ) ;
5416+
54035417 let sql = "SELECT INTERVAL '10' HOUR (1)" ;
54045418 let select = verified_only_select ( sql) ;
54055419 assert_eq ! (
@@ -5427,10 +5441,18 @@ fn parse_interval_all() {
54275441
54285442 verified_only_select ( "SELECT INTERVAL '1' YEAR" ) ;
54295443 verified_only_select ( "SELECT INTERVAL '1' MONTH" ) ;
5444+ verified_only_select ( "SELECT INTERVAL '1' WEEK" ) ;
54305445 verified_only_select ( "SELECT INTERVAL '1' DAY" ) ;
54315446 verified_only_select ( "SELECT INTERVAL '1' HOUR" ) ;
54325447 verified_only_select ( "SELECT INTERVAL '1' MINUTE" ) ;
54335448 verified_only_select ( "SELECT INTERVAL '1' SECOND" ) ;
5449+ verified_only_select ( "SELECT INTERVAL '1' YEARS" ) ;
5450+ verified_only_select ( "SELECT INTERVAL '1' MONTHS" ) ;
5451+ verified_only_select ( "SELECT INTERVAL '1' WEEKS" ) ;
5452+ verified_only_select ( "SELECT INTERVAL '1' DAYS" ) ;
5453+ verified_only_select ( "SELECT INTERVAL '1' HOURS" ) ;
5454+ verified_only_select ( "SELECT INTERVAL '1' MINUTES" ) ;
5455+ verified_only_select ( "SELECT INTERVAL '1' SECONDS" ) ;
54345456 verified_only_select ( "SELECT INTERVAL '1' YEAR TO MONTH" ) ;
54355457 verified_only_select ( "SELECT INTERVAL '1' DAY TO HOUR" ) ;
54365458 verified_only_select ( "SELECT INTERVAL '1' DAY TO MINUTE" ) ;
@@ -5440,10 +5462,21 @@ fn parse_interval_all() {
54405462 verified_only_select ( "SELECT INTERVAL '1' MINUTE TO SECOND" ) ;
54415463 verified_only_select ( "SELECT INTERVAL 1 YEAR" ) ;
54425464 verified_only_select ( "SELECT INTERVAL 1 MONTH" ) ;
5465+ verified_only_select ( "SELECT INTERVAL 1 WEEK" ) ;
54435466 verified_only_select ( "SELECT INTERVAL 1 DAY" ) ;
54445467 verified_only_select ( "SELECT INTERVAL 1 HOUR" ) ;
54455468 verified_only_select ( "SELECT INTERVAL 1 MINUTE" ) ;
54465469 verified_only_select ( "SELECT INTERVAL 1 SECOND" ) ;
5470+ verified_only_select ( "SELECT INTERVAL 1 YEARS" ) ;
5471+ verified_only_select ( "SELECT INTERVAL 1 MONTHS" ) ;
5472+ verified_only_select ( "SELECT INTERVAL 1 WEEKS" ) ;
5473+ verified_only_select ( "SELECT INTERVAL 1 DAYS" ) ;
5474+ verified_only_select ( "SELECT INTERVAL 1 HOURS" ) ;
5475+ verified_only_select ( "SELECT INTERVAL 1 MINUTES" ) ;
5476+ verified_only_select ( "SELECT INTERVAL 1 SECONDS" ) ;
5477+ verified_only_select (
5478+ "SELECT '2 years 15 months 100 weeks 99 hours 123456789 milliseconds'::INTERVAL" ,
5479+ ) ;
54475480}
54485481
54495482#[ test]
@@ -11359,16 +11392,12 @@ fn test_group_by_nothing() {
1135911392#[ test]
1136011393fn test_extract_seconds_ok ( ) {
1136111394 let dialects = all_dialects_where ( |d| d. allow_extract_custom ( ) ) ;
11362- let stmt = dialects. verified_expr ( "EXTRACT(seconds FROM '2 seconds'::INTERVAL)" ) ;
11395+ let stmt = dialects. verified_expr ( "EXTRACT(SECONDS FROM '2 seconds'::INTERVAL)" ) ;
1136311396
1136411397 assert_eq ! (
1136511398 stmt,
1136611399 Expr :: Extract {
11367- field: DateTimeField :: Custom ( Ident {
11368- value: "seconds" . to_string( ) ,
11369- quote_style: None ,
11370- span: Span :: empty( ) ,
11371- } ) ,
11400+ field: Seconds ,
1137211401 syntax: ExtractSyntax :: From ,
1137311402 expr: Box :: new( Expr :: Cast {
1137411403 kind: CastKind :: DoubleColon ,
@@ -11379,7 +11408,59 @@ fn test_extract_seconds_ok() {
1137911408 format: None ,
1138011409 } ) ,
1138111410 }
11382- )
11411+ ) ;
11412+
11413+ let actual_ast = dialects
11414+ . parse_sql_statements ( "SELECT EXTRACT(seconds FROM '2 seconds'::INTERVAL)" )
11415+ . unwrap ( ) ;
11416+
11417+ let expected_ast = vec ! [ Statement :: Query ( Box :: new( Query {
11418+ with: None ,
11419+ body: Box :: new( SetExpr :: Select ( Box :: new( Select {
11420+ select_token: AttachedToken :: empty( ) ,
11421+ distinct: None ,
11422+ top: None ,
11423+ top_before_distinct: false ,
11424+ projection: vec![ UnnamedExpr ( Expr :: Extract {
11425+ field: Seconds ,
11426+ syntax: ExtractSyntax :: From ,
11427+ expr: Box :: new( Expr :: Cast {
11428+ kind: CastKind :: DoubleColon ,
11429+ expr: Box :: new( Expr :: Value ( Value :: SingleQuotedString (
11430+ "2 seconds" . to_string( ) ,
11431+ ) ) ) ,
11432+ data_type: DataType :: Interval ,
11433+ format: None ,
11434+ } ) ,
11435+ } ) ] ,
11436+ into: None ,
11437+ from: vec![ ] ,
11438+ lateral_views: vec![ ] ,
11439+ prewhere: None ,
11440+ selection: None ,
11441+ group_by: GroupByExpr :: Expressions ( vec![ ] , vec![ ] ) ,
11442+ cluster_by: vec![ ] ,
11443+ distribute_by: vec![ ] ,
11444+ sort_by: vec![ ] ,
11445+ having: None ,
11446+ named_window: vec![ ] ,
11447+ qualify: None ,
11448+ window_before_qualify: false ,
11449+ value_table_mode: None ,
11450+ connect_by: None ,
11451+ } ) ) ) ,
11452+ order_by: None ,
11453+ limit: None ,
11454+ limit_by: vec![ ] ,
11455+ offset: None ,
11456+ fetch: None ,
11457+ locks: vec![ ] ,
11458+ for_clause: None ,
11459+ settings: None ,
11460+ format_clause: None ,
11461+ } ) ) ] ;
11462+
11463+ assert_eq ! ( actual_ast, expected_ast) ;
1138311464}
1138411465
1138511466#[ test]
@@ -11408,17 +11489,6 @@ fn test_extract_seconds_single_quote_ok() {
1140811489 )
1140911490}
1141011491
11411- #[ test]
11412- fn test_extract_seconds_err ( ) {
11413- let sql = "SELECT EXTRACT(seconds FROM '2 seconds'::INTERVAL)" ;
11414- let dialects = all_dialects_except ( |d| d. allow_extract_custom ( ) ) ;
11415- let err = dialects. parse_sql_statements ( sql) . unwrap_err ( ) ;
11416- assert_eq ! (
11417- err. to_string( ) ,
11418- "sql parser error: Expected: date/time field, found: seconds"
11419- ) ;
11420- }
11421-
1142211492#[ test]
1142311493fn test_extract_seconds_single_quote_err ( ) {
1142411494 let sql = r#"SELECT EXTRACT('seconds' FROM '2 seconds'::INTERVAL)"# ;
0 commit comments