@@ -4341,6 +4341,31 @@ fn parse_named_window_functions() {
4341
4341
supported_dialects. verified_stmt ( sql) ;
4342
4342
}
4343
4343
4344
+ #[ test]
4345
+ fn parse_window_clause ( ) {
4346
+ let sql = "SELECT * \
4347
+ FROM mytable \
4348
+ WINDOW \
4349
+ window1 AS (ORDER BY 1 ASC, 2 DESC, 3 NULLS FIRST), \
4350
+ window2 AS (window1), \
4351
+ window3 AS (PARTITION BY a, b, c), \
4352
+ window4 AS (ROWS UNBOUNDED PRECEDING), \
4353
+ window5 AS (window1 PARTITION BY a), \
4354
+ window6 AS (window1 ORDER BY a), \
4355
+ window7 AS (window1 ROWS UNBOUNDED PRECEDING), \
4356
+ window8 AS (window1 PARTITION BY a ORDER BY b ROWS UNBOUNDED PRECEDING) \
4357
+ ORDER BY C3";
4358
+ verified_only_select ( sql) ;
4359
+
4360
+ let sql = "SELECT from mytable WINDOW window1 AS window2" ;
4361
+ let dialects = all_dialects_except ( |d| d. is :: < BigQueryDialect > ( ) || d. is :: < GenericDialect > ( ) ) ;
4362
+ let res = dialects. parse_sql_statements ( sql) ;
4363
+ assert_eq ! (
4364
+ ParserError :: ParserError ( "Expected (, found: window2" . to_string( ) ) ,
4365
+ res. unwrap_err( )
4366
+ ) ;
4367
+ }
4368
+
4344
4369
#[ test]
4345
4370
fn test_parse_named_window ( ) {
4346
4371
let sql = "SELECT \
@@ -4438,7 +4463,7 @@ fn test_parse_named_window() {
4438
4463
value: "window1" . to_string( ) ,
4439
4464
quote_style: None ,
4440
4465
} ,
4441
- WindowSpec {
4466
+ NamedWindowExpr :: WindowSpec ( WindowSpec {
4442
4467
window_name: None ,
4443
4468
partition_by: vec![ ] ,
4444
4469
order_by: vec![ OrderByExpr {
@@ -4450,22 +4475,22 @@ fn test_parse_named_window() {
4450
4475
nulls_first: None ,
4451
4476
} ] ,
4452
4477
window_frame: None ,
4453
- } ,
4478
+ } ) ,
4454
4479
) ,
4455
4480
NamedWindowDefinition (
4456
4481
Ident {
4457
4482
value: "window2" . to_string( ) ,
4458
4483
quote_style: None ,
4459
4484
} ,
4460
- WindowSpec {
4485
+ NamedWindowExpr :: WindowSpec ( WindowSpec {
4461
4486
window_name: None ,
4462
4487
partition_by: vec![ Expr :: Identifier ( Ident {
4463
4488
value: "C11" . to_string( ) ,
4464
4489
quote_style: None ,
4465
4490
} ) ] ,
4466
4491
order_by: vec![ ] ,
4467
4492
window_frame: None ,
4468
- } ,
4493
+ } ) ,
4469
4494
) ,
4470
4495
] ,
4471
4496
qualify : None ,
@@ -4475,6 +4500,21 @@ fn test_parse_named_window() {
4475
4500
assert_eq ! ( actual_select_only, expected) ;
4476
4501
}
4477
4502
4503
+ #[ test]
4504
+ fn parse_window_clause_named_window ( ) {
4505
+ let sql = "SELECT * FROM mytable WINDOW window1 AS window2" ;
4506
+ let Select { named_window, .. } =
4507
+ all_dialects_where ( |d| d. supports_window_clause_named_window_reference ( ) )
4508
+ . verified_only_select ( sql) ;
4509
+ assert_eq ! (
4510
+ vec![ NamedWindowDefinition (
4511
+ Ident :: new( "window1" ) ,
4512
+ NamedWindowExpr :: NamedWindow ( Ident :: new( "window2" ) )
4513
+ ) ] ,
4514
+ named_window
4515
+ ) ;
4516
+ }
4517
+
4478
4518
#[ test]
4479
4519
fn parse_aggregate_with_group_by ( ) {
4480
4520
let sql = "SELECT a, COUNT(1), MIN(b), MAX(b) FROM foo GROUP BY a" ;
0 commit comments