@@ -2389,7 +2389,7 @@ fn parse_ctes() {
23892389
23902390 fn assert_ctes_in_select ( expected : & [ & str ] , sel : & Query ) {
23912391 for ( i, exp) in expected. iter ( ) . enumerate ( ) {
2392- let Cte { alias, query } = & sel. ctes [ i] ;
2392+ let Cte { alias, query } = & sel. with . as_ref ( ) . unwrap ( ) . cte_tables [ i] ;
23932393 assert_eq ! ( * exp, query. to_string( ) ) ;
23942394 assert_eq ! (
23952395 if i == 0 {
@@ -2432,7 +2432,7 @@ fn parse_ctes() {
24322432 // CTE in a CTE...
24332433 let sql = & format ! ( "WITH outer_cte AS ({}) SELECT * FROM outer_cte" , with) ;
24342434 let select = verified_query ( sql) ;
2435- assert_ctes_in_select ( & cte_sqls, & only ( & select. ctes ) . query ) ;
2435+ assert_ctes_in_select ( & cte_sqls, & only ( & select. with . unwrap ( ) . cte_tables ) . query ) ;
24362436}
24372437
24382438#[ test]
@@ -2441,10 +2441,47 @@ fn parse_cte_renamed_columns() {
24412441 let query = all_dialects ( ) . verified_query ( sql) ;
24422442 assert_eq ! (
24432443 vec![ Ident :: new( "col1" ) , Ident :: new( "col2" ) ] ,
2444- query. ctes. first( ) . unwrap( ) . alias. columns
2444+ query
2445+ . with
2446+ . unwrap( )
2447+ . cte_tables
2448+ . first( )
2449+ . unwrap( )
2450+ . alias
2451+ . columns
24452452 ) ;
24462453}
24472454
2455+ #[ test]
2456+ fn parse_recursive_cte ( ) {
2457+ let cte_query = "SELECT 1 UNION ALL SELECT val + 1 FROM nums WHERE val < 10" . to_owned ( ) ;
2458+ let sql = & format ! (
2459+ "WITH RECURSIVE nums (val) AS ({}) SELECT * FROM nums" ,
2460+ cte_query
2461+ ) ;
2462+
2463+ let cte_query = verified_query ( & cte_query) ;
2464+ let query = verified_query ( sql) ;
2465+
2466+ let with = query. with . as_ref ( ) . unwrap ( ) ;
2467+ assert ! ( with. recursive) ;
2468+ assert_eq ! ( with. cte_tables. len( ) , 1 ) ;
2469+ let expected = Cte {
2470+ alias : TableAlias {
2471+ name : Ident {
2472+ value : "nums" . to_string ( ) ,
2473+ quote_style : None ,
2474+ } ,
2475+ columns : vec ! [ Ident {
2476+ value: "val" . to_string( ) ,
2477+ quote_style: None ,
2478+ } ] ,
2479+ } ,
2480+ query : cte_query,
2481+ } ;
2482+ assert_eq ! ( with. cte_tables. first( ) . unwrap( ) , & expected) ;
2483+ }
2484+
24482485#[ test]
24492486fn parse_derived_tables ( ) {
24502487 let sql = "SELECT a.x, b.y FROM (SELECT x FROM foo) AS a CROSS JOIN (SELECT y FROM bar) AS b" ;
@@ -3266,8 +3303,8 @@ fn parse_drop_index() {
32663303fn all_keywords_sorted ( ) {
32673304 // assert!(ALL_KEYWORDS.is_sorted())
32683305 let mut copy = Vec :: from ( ALL_KEYWORDS ) ;
3269- copy. sort ( ) ;
3270- assert ! ( copy == ALL_KEYWORDS )
3306+ copy. sort_unstable ( ) ;
3307+ assert_eq ! ( copy, ALL_KEYWORDS )
32713308}
32723309
32733310fn parse_sql_statements ( sql : & str ) -> Result < Vec < Statement > , ParserError > {
0 commit comments