@@ -476,9 +476,9 @@ impl<'a> SelectStatementParser for Parser<'a> {
476
476
#[ cfg( test) ]
477
477
mod test_utils {
478
478
use crate :: {
479
- DistinctType , Expression , Identifier , LimitClause , NamedWindowDefinition , OrderingTerm ,
480
- QualifiedTableName , Select , SelectFrom , SelectItem , SelectStatement , UnionStatement ,
481
- UnionStatementType ,
479
+ CteExpression , DistinctType , Expression , Identifier , LimitClause , NamedWindowDefinition ,
480
+ OrderingTerm , QualifiedTableName , Select , SelectFrom , SelectItem , SelectStatement ,
481
+ Statement , UnionStatement , UnionStatementType , WithCteStatement ,
482
482
} ;
483
483
484
484
pub fn select_statement_with_columns (
@@ -613,6 +613,28 @@ mod test_utils {
613
613
..Default :: default ( )
614
614
} )
615
615
}
616
+
617
+ pub fn select_statement_with_cte_clause (
618
+ recursive : bool ,
619
+ expressions : Vec < CteExpression > ,
620
+ ) -> Statement {
621
+ Statement :: WithCte ( WithCteStatement {
622
+ recursive,
623
+ cte_expressions : expressions,
624
+ statement : Box :: new ( Statement :: Select ( SelectStatement :: Select ( Select {
625
+ distinct_type : DistinctType :: None ,
626
+ columns : vec ! [ SelectItem :: Expression ( Expression :: Identifier (
627
+ Identifier :: Wildcard ,
628
+ ) ) ] ,
629
+ from : Some ( SelectFrom :: Table ( QualifiedTableName {
630
+ table_id : Identifier :: Single ( "table_1" . to_string ( ) ) ,
631
+ alias : None ,
632
+ indexed_type : None ,
633
+ } ) ) ,
634
+ ..Default :: default ( )
635
+ } ) ) ) ,
636
+ } )
637
+ }
616
638
}
617
639
618
640
#[ cfg( test) ]
@@ -1826,3 +1848,61 @@ mod test_select_limit_clause {
1826
1848
) ;
1827
1849
}
1828
1850
}
1851
+
1852
+ #[ cfg( test) ]
1853
+ mod test_select_cte_clause {
1854
+ use super :: super :: cte:: test_utils:: cte_expression;
1855
+ use super :: test_utils:: { select_statement_with_cte_clause, select_statement_with_from} ;
1856
+ use crate :: parser:: test_utils:: * ;
1857
+ use crate :: { Identifier , QualifiedTableName , SelectFrom } ;
1858
+
1859
+ #[ test]
1860
+ fn test_select_cte_clause ( ) {
1861
+ let expected_statement = select_statement_with_cte_clause (
1862
+ true ,
1863
+ vec ! [ cte_expression(
1864
+ Identifier :: Single ( "cte_1" . to_string( ) ) ,
1865
+ vec![ ] ,
1866
+ None ,
1867
+ select_statement_with_from( SelectFrom :: Table ( QualifiedTableName :: from(
1868
+ Identifier :: Single ( "cte_table" . to_string( ) ) ,
1869
+ ) ) ) ,
1870
+ ) ] ,
1871
+ ) ;
1872
+
1873
+ run_sunny_day_test (
1874
+ "WITH RECURSIVE cte_1 AS (SELECT * FROM cte_table) SELECT * FROM table_1" ,
1875
+ expected_statement,
1876
+ ) ;
1877
+ }
1878
+
1879
+ #[ test]
1880
+ fn test_select_with_multiple_ctes ( ) {
1881
+ let expected_statement = select_statement_with_cte_clause (
1882
+ true ,
1883
+ vec ! [
1884
+ cte_expression(
1885
+ Identifier :: Single ( "cte_1" . to_string( ) ) ,
1886
+ vec![ ] ,
1887
+ None ,
1888
+ select_statement_with_from( SelectFrom :: Table ( QualifiedTableName :: from(
1889
+ Identifier :: Single ( "cte_table1" . to_string( ) ) ,
1890
+ ) ) ) ,
1891
+ ) ,
1892
+ cte_expression(
1893
+ Identifier :: Single ( "cte_2" . to_string( ) ) ,
1894
+ vec![ ] ,
1895
+ None ,
1896
+ select_statement_with_from( SelectFrom :: Table ( QualifiedTableName :: from(
1897
+ Identifier :: Single ( "cte_table2" . to_string( ) ) ,
1898
+ ) ) ) ,
1899
+ ) ,
1900
+ ] ,
1901
+ ) ;
1902
+
1903
+ run_sunny_day_test (
1904
+ "WITH RECURSIVE cte_1 AS (SELECT * FROM cte_table1), cte_2 AS (SELECT * FROM cte_table2) SELECT * FROM table_1" ,
1905
+ expected_statement,
1906
+ ) ;
1907
+ }
1908
+ }
0 commit comments