$q=(newQuery("select * from table where a in (select * from cte where a = ?)","int",1))->setCTE("cte","select * from other_table where a = ? and b = ?",["str","str"],[2,3]);
$this->assertSame("WITH RECURSIVE cte as (select * from other_table where a = ? and b = ?) select * from table where a in (select * from cte where a = ?)",$q->getQuery());
$q=(newQuery("select * from table where a in (select * from cte1 join cte2 using (a) where a = ?)","int",1))->setCTE("cte1","select * from other_table where a = ? and b = ?",["str","str"],[2,3])->setCTE("cte2","select * from other_table where c between ? and ?",["datetime","datetime"],[4,5]);
$this->assertSame("WITH RECURSIVE cte1 as (select * from other_table where a = ? and b = ?), cte2 as (select * from other_table where c between ? and ?) select * from table where a in (select * from cte1 join cte2 using (a) where a = ?)",$q->getQuery());
$q=(newQuery("select * from table1"))->setWhere("a between ? and ?",["datetime","datetime"],[1,2])
->setCTE("cte1","select * from table2 where a = ? and b = ?",["str","str"],[3,4])
->pushCTE("cte2")
->setBody("select * from table3 join cte1 using (a) join cte2 using (a) where a = ?","int",5);
$this->assertSame("WITH RECURSIVE cte1 as (select * from table2 where a = ? and b = ?), cte2 as (select * from table1 WHERE a between ? and ?) select * from table3 join cte1 using (a) join cte2 using (a) where a = ?",$q->getQuery());
$q=(newquery("select *, ? as const from table","datetime",1))
->setWhereNot("b = ?","bool",2)
->setGroup("col1","col2")
->setWhere("a = ?","str",3)
->setLimit(4,5)
->setOrder("col3")
->setCTE("cte","select ? as const","int",6);
$this->assertSame("WITH RECURSIVE cte as (select ? as const) select *, ? as const from table WHERE a = ? AND NOT (b = ?) GROUP BY col1, col2 ORDER BY col3 LIMIT 4 OFFSET 5",$q->getQuery());