134055854Sdrh# 2020-10-19 234055854Sdrh# 334055854Sdrh# The author disclaims copyright to this source code. In place of 434055854Sdrh# a legal notice, here is a blessing: 534055854Sdrh# 634055854Sdrh# May you do good and not evil. 734055854Sdrh# May you find forgiveness for yourself and forgive others. 834055854Sdrh# May you share freely, never taking more than you give. 934055854Sdrh# 1034055854Sdrh#*********************************************************************** 1134055854Sdrh# This file implements regression tests for SQLite library. The 1234055854Sdrh# focus of this file is recursive common table expressions with 1334055854Sdrh# multiple recursive terms in the compound select. 1434055854Sdrh# 1534055854Sdrh 1634055854Sdrhset testdir [file dirname $argv0] 1734055854Sdrhsource $testdir/tester.tcl 1834055854Sdrhset ::testprefix with5 1934055854Sdrh 2034055854Sdrhifcapable {!cte} { 2134055854Sdrh finish_test 2234055854Sdrh return 2334055854Sdrh} 2434055854Sdrh 2534055854Sdrhdo_execsql_test 100 { 2634055854Sdrh CREATE TABLE link(aa INT, bb INT); 2734055854Sdrh CREATE INDEX link_f ON link(aa,bb); 2834055854Sdrh CREATE INDEX link_t ON link(bb,aa); 2934055854Sdrh INSERT INTO link(aa,bb) VALUES 3034055854Sdrh (1,3), 3134055854Sdrh (5,3), 3234055854Sdrh (7,1), 3334055854Sdrh (7,9), 3434055854Sdrh (9,9), 3534055854Sdrh (5,11), 3634055854Sdrh (11,7), 3734055854Sdrh (2,4), 3834055854Sdrh (4,6), 3934055854Sdrh (8,6); 4034055854Sdrh} {} 4134055854Sdrhdo_execsql_test 110 { 4234055854Sdrh WITH RECURSIVE closure(x) AS ( 4334055854Sdrh VALUES(1) 4434055854Sdrh UNION 4534055854Sdrh SELECT aa FROM closure, link WHERE link.bb=closure.x 4634055854Sdrh UNION 4734055854Sdrh SELECT bb FROM closure, link WHERE link.aa=closure.x 4834055854Sdrh ) 4934055854Sdrh SELECT x FROM closure ORDER BY x; 5034055854Sdrh} {1 3 5 7 9 11} 5134055854Sdrhdo_execsql_test 111 { 5234055854Sdrh WITH RECURSIVE closure(x) AS ( 5334055854Sdrh VALUES(1) 5434055854Sdrh UNION 5534055854Sdrh SELECT aa FROM link, closure WHERE link.bb=closure.x 5634055854Sdrh UNION 5734055854Sdrh SELECT bb FROM closure, link WHERE link.aa=closure.x 5834055854Sdrh ) 5934055854Sdrh SELECT x FROM closure ORDER BY x; 6034055854Sdrh} {1 3 5 7 9 11} 6134055854Sdrhdo_execsql_test 112 { 6234055854Sdrh WITH RECURSIVE closure(x) AS ( 6334055854Sdrh VALUES(1) 6434055854Sdrh UNION 6534055854Sdrh SELECT bb FROM closure, link WHERE link.aa=closure.x 6634055854Sdrh UNION 6734055854Sdrh SELECT aa FROM link, closure WHERE link.bb=closure.x 6834055854Sdrh ) 6934055854Sdrh SELECT x FROM closure ORDER BY x; 7034055854Sdrh} {1 3 5 7 9 11} 7134055854Sdrhdo_execsql_test 113 { 7234055854Sdrh WITH RECURSIVE closure(x) AS ( 7334055854Sdrh VALUES(1),(200),(300),(400) 7434055854Sdrh INTERSECT 7534055854Sdrh VALUES(1) 7634055854Sdrh UNION 7734055854Sdrh SELECT bb FROM closure, link WHERE link.aa=closure.x 7834055854Sdrh UNION 7934055854Sdrh SELECT aa FROM link, closure WHERE link.bb=closure.x 8034055854Sdrh ) 8134055854Sdrh SELECT x FROM closure ORDER BY x; 8234055854Sdrh} {1 3 5 7 9 11} 8334055854Sdrhdo_execsql_test 114 { 8434055854Sdrh WITH RECURSIVE closure(x) AS ( 8534055854Sdrh VALUES(1),(200),(300),(400) 8634055854Sdrh UNION ALL 8734055854Sdrh VALUES(2) 8834055854Sdrh UNION 8934055854Sdrh SELECT bb FROM closure, link WHERE link.aa=closure.x 9034055854Sdrh UNION 9134055854Sdrh SELECT aa FROM link, closure WHERE link.bb=closure.x 9234055854Sdrh ) 9334055854Sdrh SELECT x FROM closure ORDER BY x; 9434055854Sdrh} {1 2 3 4 5 6 7 8 9 11 200 300 400} 9534055854Sdrh 96*07d7a8dcSdrhdo_catchsql_test 120 { 97*07d7a8dcSdrh WITH RECURSIVE closure(x) AS ( 98*07d7a8dcSdrh VALUES(1),(200),(300),(400) 99*07d7a8dcSdrh UNION ALL 100*07d7a8dcSdrh VALUES(2) 101*07d7a8dcSdrh UNION ALL 102*07d7a8dcSdrh SELECT bb FROM closure, link WHERE link.aa=closure.x 103*07d7a8dcSdrh UNION 104*07d7a8dcSdrh SELECT aa FROM link, closure WHERE link.bb=closure.x 105*07d7a8dcSdrh ) 106*07d7a8dcSdrh SELECT x FROM closure ORDER BY x; 107*07d7a8dcSdrh} {1 {circular reference: closure}} 108*07d7a8dcSdrhdo_catchsql_test 121 { 109*07d7a8dcSdrh WITH RECURSIVE closure(x) AS ( 110*07d7a8dcSdrh VALUES(1),(200),(300),(400) 111*07d7a8dcSdrh UNION ALL 112*07d7a8dcSdrh VALUES(2) 113*07d7a8dcSdrh UNION 114*07d7a8dcSdrh SELECT bb FROM closure, link WHERE link.aa=closure.x 115*07d7a8dcSdrh UNION ALL 116*07d7a8dcSdrh SELECT aa FROM link, closure WHERE link.bb=closure.x 117*07d7a8dcSdrh ) 118*07d7a8dcSdrh SELECT x FROM closure ORDER BY x; 119*07d7a8dcSdrh} {1 {circular reference: closure}} 120*07d7a8dcSdrh 121*07d7a8dcSdrhdo_execsql_test 130 { 122*07d7a8dcSdrh WITH RECURSIVE closure(x) AS ( 123*07d7a8dcSdrh SELECT 1 AS x 124*07d7a8dcSdrh UNION 125*07d7a8dcSdrh SELECT aa FROM link JOIN closure ON bb=x 126*07d7a8dcSdrh UNION 127*07d7a8dcSdrh SELECT bb FROM link JOIN closure on aa=x 128*07d7a8dcSdrh ORDER BY x LIMIT 4 129*07d7a8dcSdrh ) 130*07d7a8dcSdrh SELECT * FROM closure; 131*07d7a8dcSdrh} {1 3 5 7} 132*07d7a8dcSdrhdo_execsql_test 131 { 133*07d7a8dcSdrh WITH RECURSIVE closure(x) AS ( 134*07d7a8dcSdrh SELECT 1 AS x 135*07d7a8dcSdrh UNION ALL 136*07d7a8dcSdrh SELECT 2 137*07d7a8dcSdrh UNION 138*07d7a8dcSdrh SELECT aa FROM link JOIN closure ON bb=x 139*07d7a8dcSdrh UNION 140*07d7a8dcSdrh SELECT bb FROM link JOIN closure on aa=x 141*07d7a8dcSdrh ORDER BY x LIMIT 4 142*07d7a8dcSdrh ) 143*07d7a8dcSdrh SELECT * FROM closure; 144*07d7a8dcSdrh} {1 2 3 4} 145*07d7a8dcSdrh 146*07d7a8dcSdrhdo_execsql_test 200 { 147*07d7a8dcSdrh CREATE TABLE linkA(aa1,aa2); 148*07d7a8dcSdrh INSERT INTO linkA(aa1,aa2) VALUES(1,3),(5,7),(9,11); 149*07d7a8dcSdrh CREATE TABLE linkB(bb1,bb2); 150*07d7a8dcSdrh INSERT INTO linkB(bb1,bb2) VALUES(7,9),(11,13),(3,5); 151*07d7a8dcSdrh CREATE TABLE linkC(cc1,cc2); 152*07d7a8dcSdrh INSERT INTO linkC(cc1,cc2) VALUES(1,2),(2,4),(6,8); 153*07d7a8dcSdrh CREATE TABLE linkD(dd1,dd2); 154*07d7a8dcSdrh INSERT INTO linkD(dd1,dd2) VALUES(4,6),(100,110); 155*07d7a8dcSdrh} {} 156*07d7a8dcSdrhdo_execsql_test 210 { 157*07d7a8dcSdrh WITH RECURSIVE closure(x) AS ( 158*07d7a8dcSdrh VALUES(1) 159*07d7a8dcSdrh UNION ALL 160*07d7a8dcSdrh SELECT aa2 FROM linkA JOIN closure ON x=aa1 161*07d7a8dcSdrh UNION ALL 162*07d7a8dcSdrh SELECT bb2 FROM linkB JOIN closure ON x=bb1 163*07d7a8dcSdrh UNION ALL 164*07d7a8dcSdrh SELECT cc2 FROM linkC JOIN closure ON x=cc1 165*07d7a8dcSdrh UNION ALL 166*07d7a8dcSdrh SELECT dd2 FROM linkD JOIN closure ON x=dd1 167*07d7a8dcSdrh ) 168*07d7a8dcSdrh SELECT x FROM closure ORDER BY +x; 169*07d7a8dcSdrh} {1 2 3 4 5 6 7 8 9 11 13} 170*07d7a8dcSdrhdo_execsql_test 220 { 171*07d7a8dcSdrh CREATE TABLE linkA_ipk(aa1 INTEGER PRIMARY KEY,aa2); 172*07d7a8dcSdrh INSERT INTO linkA_ipk(aa1,aa2) SELECT aa1, aa2 FROM linkA; 173*07d7a8dcSdrh CREATE TABLE linkB_ipk(bb1 INTEGER PRIMARY KEY,bb2); 174*07d7a8dcSdrh INSERT INTO linkB_ipk(bb1,bb2) SELECT bb1, bb2 FROM linkB; 175*07d7a8dcSdrh CREATE TABLE linkC_ipk(cc1 INTEGER PRIMARY KEY,cc2); 176*07d7a8dcSdrh INSERT INTO linkC_ipk(cc1,cc2) SELECT cc1, cc2 FROM linkC; 177*07d7a8dcSdrh CREATE TABLE linkD_ipk(dd1 INTEGER PRIMARY KEY,dd2); 178*07d7a8dcSdrh INSERT INTO linkD_ipk(dd1,dd2) SELECT dd1, dd2 FROM linkD; 179*07d7a8dcSdrh WITH RECURSIVE closure(x) AS ( 180*07d7a8dcSdrh VALUES(1) 181*07d7a8dcSdrh UNION ALL 182*07d7a8dcSdrh SELECT aa2 FROM linkA_ipk JOIN closure ON x=aa1 183*07d7a8dcSdrh UNION ALL 184*07d7a8dcSdrh SELECT bb2 FROM linkB_ipk JOIN closure ON x=bb1 185*07d7a8dcSdrh UNION ALL 186*07d7a8dcSdrh SELECT cc2 FROM linkC_ipk JOIN closure ON x=cc1 187*07d7a8dcSdrh UNION ALL 188*07d7a8dcSdrh SELECT dd2 FROM linkD_ipk JOIN closure ON x=dd1 189*07d7a8dcSdrh ) 190*07d7a8dcSdrh SELECT x FROM closure ORDER BY +x; 191*07d7a8dcSdrh} {1 2 3 4 5 6 7 8 9 11 13} 192*07d7a8dcSdrh 193*07d7a8dcSdrh 19434055854Sdrhfinish_test 195