@@ -50,6 +50,7 @@ mod test_utils;
50
50
#[ cfg( test) ]
51
51
use pretty_assertions:: assert_eq;
52
52
use sqlparser:: ast:: ColumnOption :: Comment ;
53
+ use sqlparser:: ast:: DateTimeField :: Seconds ;
53
54
use sqlparser:: ast:: Expr :: { Identifier , UnaryOp } ;
54
55
use sqlparser:: ast:: Value :: Number ;
55
56
use sqlparser:: test_utils:: all_dialects_except;
@@ -5227,6 +5228,19 @@ fn parse_interval_all() {
5227
5228
expr_from_projection( only( & select. projection) ) ,
5228
5229
) ;
5229
5230
5231
+ let sql = "SELECT INTERVAL 5 DAYS" ;
5232
+ let select = verified_only_select ( sql) ;
5233
+ assert_eq ! (
5234
+ & Expr :: Interval ( Interval {
5235
+ value: Box :: new( Expr :: Value ( number( "5" ) ) ) ,
5236
+ leading_field: Some ( DateTimeField :: Days ) ,
5237
+ leading_precision: None ,
5238
+ last_field: None ,
5239
+ fractional_seconds_precision: None ,
5240
+ } ) ,
5241
+ expr_from_projection( only( & select. projection) ) ,
5242
+ ) ;
5243
+
5230
5244
let sql = "SELECT INTERVAL '10' HOUR (1)" ;
5231
5245
let select = verified_only_select ( sql) ;
5232
5246
assert_eq ! (
@@ -5254,10 +5268,18 @@ fn parse_interval_all() {
5254
5268
5255
5269
verified_only_select ( "SELECT INTERVAL '1' YEAR" ) ;
5256
5270
verified_only_select ( "SELECT INTERVAL '1' MONTH" ) ;
5271
+ verified_only_select ( "SELECT INTERVAL '1' WEEK" ) ;
5257
5272
verified_only_select ( "SELECT INTERVAL '1' DAY" ) ;
5258
5273
verified_only_select ( "SELECT INTERVAL '1' HOUR" ) ;
5259
5274
verified_only_select ( "SELECT INTERVAL '1' MINUTE" ) ;
5260
5275
verified_only_select ( "SELECT INTERVAL '1' SECOND" ) ;
5276
+ verified_only_select ( "SELECT INTERVAL '1' YEARS" ) ;
5277
+ verified_only_select ( "SELECT INTERVAL '1' MONTHS" ) ;
5278
+ verified_only_select ( "SELECT INTERVAL '1' WEEKS" ) ;
5279
+ verified_only_select ( "SELECT INTERVAL '1' DAYS" ) ;
5280
+ verified_only_select ( "SELECT INTERVAL '1' HOURS" ) ;
5281
+ verified_only_select ( "SELECT INTERVAL '1' MINUTES" ) ;
5282
+ verified_only_select ( "SELECT INTERVAL '1' SECONDS" ) ;
5261
5283
verified_only_select ( "SELECT INTERVAL '1' YEAR TO MONTH" ) ;
5262
5284
verified_only_select ( "SELECT INTERVAL '1' DAY TO HOUR" ) ;
5263
5285
verified_only_select ( "SELECT INTERVAL '1' DAY TO MINUTE" ) ;
@@ -5267,10 +5289,21 @@ fn parse_interval_all() {
5267
5289
verified_only_select ( "SELECT INTERVAL '1' MINUTE TO SECOND" ) ;
5268
5290
verified_only_select ( "SELECT INTERVAL 1 YEAR" ) ;
5269
5291
verified_only_select ( "SELECT INTERVAL 1 MONTH" ) ;
5292
+ verified_only_select ( "SELECT INTERVAL 1 WEEK" ) ;
5270
5293
verified_only_select ( "SELECT INTERVAL 1 DAY" ) ;
5271
5294
verified_only_select ( "SELECT INTERVAL 1 HOUR" ) ;
5272
5295
verified_only_select ( "SELECT INTERVAL 1 MINUTE" ) ;
5273
5296
verified_only_select ( "SELECT INTERVAL 1 SECOND" ) ;
5297
+ verified_only_select ( "SELECT INTERVAL 1 YEARS" ) ;
5298
+ verified_only_select ( "SELECT INTERVAL 1 MONTHS" ) ;
5299
+ verified_only_select ( "SELECT INTERVAL 1 WEEKS" ) ;
5300
+ verified_only_select ( "SELECT INTERVAL 1 DAYS" ) ;
5301
+ verified_only_select ( "SELECT INTERVAL 1 HOURS" ) ;
5302
+ verified_only_select ( "SELECT INTERVAL 1 MINUTES" ) ;
5303
+ verified_only_select ( "SELECT INTERVAL 1 SECONDS" ) ;
5304
+ verified_only_select (
5305
+ "SELECT '2 years 15 months 100 weeks 99 hours 123456789 milliseconds'::INTERVAL" ,
5306
+ ) ;
5274
5307
}
5275
5308
5276
5309
#[ test]
@@ -11175,16 +11208,12 @@ fn test_group_by_nothing() {
11175
11208
#[ test]
11176
11209
fn test_extract_seconds_ok ( ) {
11177
11210
let dialects = all_dialects_where ( |d| d. allow_extract_custom ( ) ) ;
11178
- let stmt = dialects. verified_expr ( "EXTRACT(seconds FROM '2 seconds'::INTERVAL)" ) ;
11211
+ let stmt = dialects. verified_expr ( "EXTRACT(SECONDS FROM '2 seconds'::INTERVAL)" ) ;
11179
11212
11180
11213
assert_eq ! (
11181
11214
stmt,
11182
11215
Expr :: Extract {
11183
- field: DateTimeField :: Custom ( Ident {
11184
- value: "seconds" . to_string( ) ,
11185
- quote_style: None ,
11186
- span: Span :: empty( ) ,
11187
- } ) ,
11216
+ field: Seconds ,
11188
11217
syntax: ExtractSyntax :: From ,
11189
11218
expr: Box :: new( Expr :: Cast {
11190
11219
kind: CastKind :: DoubleColon ,
@@ -11195,7 +11224,59 @@ fn test_extract_seconds_ok() {
11195
11224
format: None ,
11196
11225
} ) ,
11197
11226
}
11198
- )
11227
+ ) ;
11228
+
11229
+ let actual_ast = dialects
11230
+ . parse_sql_statements ( "SELECT EXTRACT(seconds FROM '2 seconds'::INTERVAL)" )
11231
+ . unwrap ( ) ;
11232
+
11233
+ let expected_ast = vec ! [ Statement :: Query ( Box :: new( Query {
11234
+ with: None ,
11235
+ body: Box :: new( SetExpr :: Select ( Box :: new( Select {
11236
+ select_token: AttachedToken :: empty( ) ,
11237
+ distinct: None ,
11238
+ top: None ,
11239
+ top_before_distinct: false ,
11240
+ projection: vec![ UnnamedExpr ( Expr :: Extract {
11241
+ field: Seconds ,
11242
+ syntax: ExtractSyntax :: From ,
11243
+ expr: Box :: new( Expr :: Cast {
11244
+ kind: CastKind :: DoubleColon ,
11245
+ expr: Box :: new( Expr :: Value ( Value :: SingleQuotedString (
11246
+ "2 seconds" . to_string( ) ,
11247
+ ) ) ) ,
11248
+ data_type: DataType :: Interval ,
11249
+ format: None ,
11250
+ } ) ,
11251
+ } ) ] ,
11252
+ into: None ,
11253
+ from: vec![ ] ,
11254
+ lateral_views: vec![ ] ,
11255
+ prewhere: None ,
11256
+ selection: None ,
11257
+ group_by: GroupByExpr :: Expressions ( vec![ ] , vec![ ] ) ,
11258
+ cluster_by: vec![ ] ,
11259
+ distribute_by: vec![ ] ,
11260
+ sort_by: vec![ ] ,
11261
+ having: None ,
11262
+ named_window: vec![ ] ,
11263
+ qualify: None ,
11264
+ window_before_qualify: false ,
11265
+ value_table_mode: None ,
11266
+ connect_by: None ,
11267
+ } ) ) ) ,
11268
+ order_by: None ,
11269
+ limit: None ,
11270
+ limit_by: vec![ ] ,
11271
+ offset: None ,
11272
+ fetch: None ,
11273
+ locks: vec![ ] ,
11274
+ for_clause: None ,
11275
+ settings: None ,
11276
+ format_clause: None ,
11277
+ } ) ) ] ;
11278
+
11279
+ assert_eq ! ( actual_ast, expected_ast) ;
11199
11280
}
11200
11281
11201
11282
#[ test]
@@ -11224,17 +11305,6 @@ fn test_extract_seconds_single_quote_ok() {
11224
11305
)
11225
11306
}
11226
11307
11227
- #[ test]
11228
- fn test_extract_seconds_err ( ) {
11229
- let sql = "SELECT EXTRACT(seconds FROM '2 seconds'::INTERVAL)" ;
11230
- let dialects = all_dialects_except ( |d| d. allow_extract_custom ( ) ) ;
11231
- let err = dialects. parse_sql_statements ( sql) . unwrap_err ( ) ;
11232
- assert_eq ! (
11233
- err. to_string( ) ,
11234
- "sql parser error: Expected: date/time field, found: seconds"
11235
- ) ;
11236
- }
11237
-
11238
11308
#[ test]
11239
11309
fn test_extract_seconds_single_quote_err ( ) {
11240
11310
let sql = r#"SELECT EXTRACT('seconds' FROM '2 seconds'::INTERVAL)"# ;
0 commit comments