1b290f117Sdan# 2014 January 11 2b290f117Sdan# 3b290f117Sdan# The author disclaims copyright to this source code. In place of 4b290f117Sdan# a legal notice, here is a blessing: 5b290f117Sdan# 6b290f117Sdan# May you do good and not evil. 7b290f117Sdan# May you find forgiveness for yourself and forgive others. 8b290f117Sdan# May you share freely, never taking more than you give. 9b290f117Sdan# 10b290f117Sdan#*********************************************************************** 11b290f117Sdan# This file implements regression tests for SQLite library. The 12b290f117Sdan# focus of this file is testing the WITH clause. 13b290f117Sdan# 14b290f117Sdan 15b290f117Sdanset testdir [file dirname $argv0] 16b290f117Sdansource $testdir/tester.tcl 17b290f117Sdanset ::testprefix with2 18b290f117Sdan 197f3068aaSdanifcapable {!cte} { 207f3068aaSdan finish_test 217f3068aaSdan return 227f3068aaSdan} 237f3068aaSdan 24b290f117Sdando_execsql_test 1.0 { 25b290f117Sdan CREATE TABLE t1(a); 26b290f117Sdan INSERT INTO t1 VALUES(1); 27b290f117Sdan INSERT INTO t1 VALUES(2); 28b290f117Sdan} 29b290f117Sdan 30b290f117Sdando_execsql_test 1.1 { 31b290f117Sdan WITH x1 AS (SELECT * FROM t1) 32b290f117Sdan SELECT sum(a) FROM x1; 33b290f117Sdan} {3} 34b290f117Sdan 35b290f117Sdando_execsql_test 1.2 { 36b290f117Sdan WITH x1 AS (SELECT * FROM t1) 37b290f117Sdan SELECT (SELECT sum(a) FROM x1); 38b290f117Sdan} {3} 39b290f117Sdan 40b290f117Sdando_execsql_test 1.3 { 41b290f117Sdan WITH x1 AS (SELECT * FROM t1) 42b290f117Sdan SELECT (SELECT sum(a) FROM x1); 43b290f117Sdan} {3} 44b290f117Sdan 45b290f117Sdando_execsql_test 1.4 { 46b290f117Sdan CREATE TABLE t2(i); 47b290f117Sdan INSERT INTO t2 VALUES(2); 48b290f117Sdan INSERT INTO t2 VALUES(3); 49b290f117Sdan INSERT INTO t2 VALUES(5); 50b290f117Sdan 51b290f117Sdan WITH x1 AS (SELECT i FROM t2), 52b290f117Sdan i(a) AS ( 53b290f117Sdan SELECT min(i)-1 FROM x1 UNION SELECT a+1 FROM i WHERE a<10 54b290f117Sdan ) 55b290f117Sdan SELECT a FROM i WHERE a NOT IN x1 56b290f117Sdan} {1 4 6 7 8 9 10} 57b290f117Sdan 5898f45e53Sdando_execsql_test 1.5 { 5998f45e53Sdan WITH x1 AS (SELECT a FROM t1), 6098f45e53Sdan x2 AS (SELECT i FROM t2), 6198f45e53Sdan x3 AS (SELECT * FROM x1, x2 WHERE x1.a IN x2 AND x2.i IN x1) 6298f45e53Sdan SELECT * FROM x3 6398f45e53Sdan} {2 2} 6498f45e53Sdan 6598f45e53Sdando_execsql_test 1.6 { 6698f45e53Sdan CREATE TABLE t3 AS SELECT 3 AS x; 6798f45e53Sdan CREATE TABLE t4 AS SELECT 4 AS x; 6898f45e53Sdan 6998f45e53Sdan WITH x1 AS (SELECT * FROM t3), 7098f45e53Sdan x2 AS ( 7198f45e53Sdan WITH t3 AS (SELECT * FROM t4) 7298f45e53Sdan SELECT * FROM x1 7398f45e53Sdan ) 7498f45e53Sdan SELECT * FROM x2; 7598f45e53Sdan} {3} 7698f45e53Sdan 777c829327Sdando_execsql_test 1.7 { 781fe3c4b5Sdan WITH x2 AS ( 791fe3c4b5Sdan WITH t3 AS (SELECT * FROM t4) 801fe3c4b5Sdan SELECT * FROM t3 811fe3c4b5Sdan ) 821fe3c4b5Sdan SELECT * FROM x2; 831fe3c4b5Sdan} {4} 841fe3c4b5Sdan 851fe3c4b5Sdando_execsql_test 1.8 { 861fe3c4b5Sdan WITH x2 AS ( 871fe3c4b5Sdan WITH t3 AS (SELECT * FROM t4) 881fe3c4b5Sdan SELECT * FROM main.t3 891fe3c4b5Sdan ) 901fe3c4b5Sdan SELECT * FROM x2; 911fe3c4b5Sdan} {3} 921fe3c4b5Sdan 931fe3c4b5Sdando_execsql_test 1.9 { 947c829327Sdan WITH x1 AS (SELECT * FROM t1) 957c829327Sdan SELECT (SELECT sum(a) FROM x1), (SELECT max(a) FROM x1); 967c829327Sdan} {3 2} 977c829327Sdan 981fe3c4b5Sdando_execsql_test 1.10 { 997c829327Sdan WITH x1 AS (SELECT * FROM t1) 1007c829327Sdan SELECT (SELECT sum(a) FROM x1), (SELECT max(a) FROM x1), a FROM x1; 1017c829327Sdan} {3 2 1 3 2 2} 1027c829327Sdan 1031fe3c4b5Sdando_execsql_test 1.11 { 1047c829327Sdan WITH 1057c829327Sdan i(x) AS ( 1067c829327Sdan WITH 1077c829327Sdan j(x) AS ( SELECT * FROM i ), 1087c829327Sdan i(x) AS ( SELECT * FROM t1 ) 1097c829327Sdan SELECT * FROM j 1107c829327Sdan ) 1117c829327Sdan SELECT * FROM i; 1127c829327Sdan} {1 2} 1137c829327Sdan 1141fe3c4b5Sdando_execsql_test 1.12 { 1151fe3c4b5Sdan WITH r(i) AS ( 1161fe3c4b5Sdan VALUES('.') 1171fe3c4b5Sdan UNION ALL 1181fe3c4b5Sdan SELECT i || '.' FROM r, ( 1191fe3c4b5Sdan SELECT x FROM x INTERSECT SELECT y FROM y 1201fe3c4b5Sdan ) WHERE length(i) < 10 1211fe3c4b5Sdan ), 1221fe3c4b5Sdan x(x) AS ( VALUES(1) UNION ALL VALUES(2) UNION ALL VALUES(3) ), 1231fe3c4b5Sdan y(y) AS ( VALUES(2) UNION ALL VALUES(4) UNION ALL VALUES(6) ) 1241fe3c4b5Sdan 1251fe3c4b5Sdan SELECT * FROM r; 1261fe3c4b5Sdan} {. .. ... .... ..... ...... ....... ........ ......... ..........} 1271fe3c4b5Sdan 1281fe3c4b5Sdando_execsql_test 1.13 { 1291fe3c4b5Sdan WITH r(i) AS ( 1301fe3c4b5Sdan VALUES('.') 1311fe3c4b5Sdan UNION ALL 1321fe3c4b5Sdan SELECT i || '.' FROM r, ( SELECT x FROM x WHERE x=2 ) WHERE length(i) < 10 1331fe3c4b5Sdan ), 1341fe3c4b5Sdan x(x) AS ( VALUES(1) UNION ALL VALUES(2) UNION ALL VALUES(3) ) 1351fe3c4b5Sdan 1361fe3c4b5Sdan SELECT * FROM r ORDER BY length(i) DESC; 1371fe3c4b5Sdan} {.......... ......... ........ ....... ...... ..... .... ... .. .} 1381fe3c4b5Sdan 1391fe3c4b5Sdando_execsql_test 1.14 { 1401fe3c4b5Sdan WITH 1411fe3c4b5Sdan t4(x) AS ( 1421fe3c4b5Sdan VALUES(4) 1431fe3c4b5Sdan UNION ALL 1441fe3c4b5Sdan SELECT x+1 FROM t4 WHERE x<10 1451fe3c4b5Sdan ) 1461fe3c4b5Sdan SELECT * FROM t4; 1471fe3c4b5Sdan} {4 5 6 7 8 9 10} 1481fe3c4b5Sdan 1491fe3c4b5Sdando_execsql_test 1.15 { 1501fe3c4b5Sdan WITH 1511fe3c4b5Sdan t4(x) AS ( 1521fe3c4b5Sdan VALUES(4) 1531fe3c4b5Sdan UNION ALL 1541fe3c4b5Sdan SELECT x+1 FROM main.t4 WHERE x<10 1551fe3c4b5Sdan ) 1561fe3c4b5Sdan SELECT * FROM t4; 1571fe3c4b5Sdan} {4 5} 1581fe3c4b5Sdan 1591fe3c4b5Sdando_catchsql_test 1.16 { 1601fe3c4b5Sdan WITH 1611fe3c4b5Sdan t4(x) AS ( 1621fe3c4b5Sdan VALUES(4) 1631fe3c4b5Sdan UNION ALL 1641fe3c4b5Sdan SELECT x+1 FROM t4, main.t4, t4 WHERE x<10 1651fe3c4b5Sdan ) 1661fe3c4b5Sdan SELECT * FROM t4; 1671fe3c4b5Sdan} {1 {multiple references to recursive table: t4}} 1681fe3c4b5Sdan 1691fe3c4b5Sdan 1707c829327Sdan#--------------------------------------------------------------------------- 1717c829327Sdan# Check that variables can be used in CTEs. 1727c829327Sdan# 1737c829327Sdanset ::min [expr 3] 1747c829327Sdanset ::max [expr 9] 1757c829327Sdando_execsql_test 2.1 { 1767c829327Sdan WITH i(x) AS ( 1777c829327Sdan VALUES($min) UNION ALL SELECT x+1 FROM i WHERE x < $max 1787c829327Sdan ) 1797c829327Sdan SELECT * FROM i; 1807c829327Sdan} {3 4 5 6 7 8 9} 1817c829327Sdan 1827c829327Sdando_execsql_test 2.2 { 1837c829327Sdan WITH i(x) AS ( 1847c829327Sdan VALUES($min) UNION ALL SELECT x+1 FROM i WHERE x < $max 1857c829327Sdan ) 1867c829327Sdan SELECT x FROM i JOIN i AS j USING (x); 1877c829327Sdan} {3 4 5 6 7 8 9} 1887c829327Sdan 1897c829327Sdan#--------------------------------------------------------------------------- 1907c829327Sdan# Check that circular references are rejected. 1917c829327Sdan# 1927c829327Sdando_catchsql_test 3.1 { 1937c829327Sdan WITH i(x, y) AS ( VALUES(1, (SELECT x FROM i)) ) 1947c829327Sdan SELECT * FROM i; 1957c829327Sdan} {1 {circular reference: i}} 1967c829327Sdan 1977c829327Sdando_catchsql_test 3.2 { 1987c829327Sdan WITH 1997c829327Sdan i(x) AS ( SELECT * FROM j ), 2007c829327Sdan j(x) AS ( SELECT * FROM k ), 2017c829327Sdan k(x) AS ( SELECT * FROM i ) 2027c829327Sdan SELECT * FROM i; 2037c829327Sdan} {1 {circular reference: i}} 2047c829327Sdan 2057c829327Sdando_catchsql_test 3.3 { 2067c829327Sdan WITH 2077c829327Sdan i(x) AS ( SELECT * FROM (SELECT * FROM j) ), 2087c829327Sdan j(x) AS ( SELECT * FROM (SELECT * FROM i) ) 2097c829327Sdan SELECT * FROM i; 2107c829327Sdan} {1 {circular reference: i}} 2117c829327Sdan 2127c829327Sdando_catchsql_test 3.4 { 2137c829327Sdan WITH 2147c829327Sdan i(x) AS ( SELECT * FROM (SELECT * FROM j) ), 2157c829327Sdan j(x) AS ( SELECT * FROM (SELECT * FROM i) ) 2167c829327Sdan SELECT * FROM j; 2177c829327Sdan} {1 {circular reference: j}} 2187c829327Sdan 2197c829327Sdando_catchsql_test 3.5 { 2207c829327Sdan WITH 2217c829327Sdan i(x) AS ( 2227c829327Sdan WITH j(x) AS ( SELECT * FROM i ) 2237c829327Sdan SELECT * FROM j 2247c829327Sdan ) 2257c829327Sdan SELECT * FROM i; 2267c829327Sdan} {1 {circular reference: i}} 2277c829327Sdan 2287c829327Sdan#--------------------------------------------------------------------------- 2297c829327Sdan# Try empty and very long column lists. 2307c829327Sdan# 2317c829327Sdando_catchsql_test 4.1 { 2327c829327Sdan WITH x() AS ( SELECT 1,2,3 ) 2337c829327Sdan SELECT * FROM x; 2347c829327Sdan} {1 {near ")": syntax error}} 2357c829327Sdan 2367c829327Sdanproc genstmt {n} { 2377c829327Sdan for {set i 1} {$i<=$n} {incr i} { 2387c829327Sdan lappend cols "c$i" 2397c829327Sdan lappend vals $i 2407c829327Sdan } 2417c829327Sdan return " 2427c829327Sdan WITH x([join $cols ,]) AS (SELECT [join $vals ,]) 2437c829327Sdan SELECT (c$n == $n) FROM x 2447c829327Sdan " 2457c829327Sdan} 2467c829327Sdan 2477c829327Sdando_execsql_test 4.2 [genstmt 10] 1 2487c829327Sdando_execsql_test 4.3 [genstmt 100] 1 2497c829327Sdando_execsql_test 4.4 [genstmt 255] 1 2507c829327Sdanset nLimit [sqlite3_limit db SQLITE_LIMIT_COLUMN -1] 2517c829327Sdando_execsql_test 4.5 [genstmt [expr $nLimit-1]] 1 2527c829327Sdando_execsql_test 4.6 [genstmt $nLimit] 1 253108aa00aSdrhdo_catchsql_test 4.7 [genstmt [expr $nLimit+1]] \ 254108aa00aSdrh {1 {too many columns in result set}} 2557c829327Sdan 256ebbf08a0Sdan#--------------------------------------------------------------------------- 257ebbf08a0Sdan# Check that adding a WITH clause to an INSERT disables the xfer 258ebbf08a0Sdan# optimization. 259ebbf08a0Sdan# 260ebbf08a0Sdanproc do_xfer_test {tn bXfer sql {res {}}} { 261ebbf08a0Sdan set ::sqlite3_xferopt_count 0 262ebbf08a0Sdan uplevel [list do_test $tn [subst -nocommands { 263ebbf08a0Sdan set dres [db eval {$sql}] 264ebbf08a0Sdan list [set ::sqlite3_xferopt_count] [set dres] 265ebbf08a0Sdan }] [list $bXfer $res]] 266ebbf08a0Sdan} 267ebbf08a0Sdan 268ebbf08a0Sdando_execsql_test 5.1 { 269ebbf08a0Sdan DROP TABLE IF EXISTS t1; 270ebbf08a0Sdan DROP TABLE IF EXISTS t2; 271ebbf08a0Sdan CREATE TABLE t1(a, b); 272ebbf08a0Sdan CREATE TABLE t2(a, b); 273ebbf08a0Sdan} 274ebbf08a0Sdan 275ebbf08a0Sdando_xfer_test 5.2 1 { INSERT INTO t1 SELECT * FROM t2 } 276ebbf08a0Sdando_xfer_test 5.3 0 { INSERT INTO t1 SELECT a, b FROM t2 } 277ebbf08a0Sdando_xfer_test 5.4 0 { INSERT INTO t1 SELECT b, a FROM t2 } 278ebbf08a0Sdando_xfer_test 5.5 0 { 279ebbf08a0Sdan WITH x AS (SELECT a, b FROM t2) INSERT INTO t1 SELECT * FROM x 280ebbf08a0Sdan} 281ebbf08a0Sdando_xfer_test 5.6 0 { 282ebbf08a0Sdan WITH x AS (SELECT a, b FROM t2) INSERT INTO t1 SELECT * FROM t2 283ebbf08a0Sdan} 284ebbf08a0Sdando_xfer_test 5.7 0 { 285ebbf08a0Sdan INSERT INTO t1 WITH x AS ( SELECT * FROM t2 ) SELECT * FROM x 286ebbf08a0Sdan} 287ebbf08a0Sdando_xfer_test 5.8 0 { 288ebbf08a0Sdan INSERT INTO t1 WITH x(a,b) AS ( SELECT * FROM t2 ) SELECT * FROM x 289ebbf08a0Sdan} 290ebbf08a0Sdan 2911fe3c4b5Sdan#--------------------------------------------------------------------------- 2921fe3c4b5Sdan# Check that syntax (and other) errors in statements with WITH clauses 2931fe3c4b5Sdan# attached to them do not cause problems (e.g. memory leaks). 2941fe3c4b5Sdan# 2951fe3c4b5Sdando_execsql_test 6.1 { 2961fe3c4b5Sdan DROP TABLE IF EXISTS t1; 2971fe3c4b5Sdan DROP TABLE IF EXISTS t2; 2981fe3c4b5Sdan CREATE TABLE t1(a, b); 2991fe3c4b5Sdan CREATE TABLE t2(a, b); 3001fe3c4b5Sdan} 3011fe3c4b5Sdan 3021fe3c4b5Sdando_catchsql_test 6.2 { 3031fe3c4b5Sdan WITH x AS (SELECT * FROM t1) 3041fe3c4b5Sdan INSERT INTO t2 VALUES(1, 2,); 3051fe3c4b5Sdan} {1 {near ")": syntax error}} 3061fe3c4b5Sdan 3071fe3c4b5Sdando_catchsql_test 6.3 { 3081fe3c4b5Sdan WITH x AS (SELECT * FROM t1) 3091fe3c4b5Sdan INSERT INTO t2 SELECT a, b, FROM t1; 3101fe3c4b5Sdan} {1 {near "FROM": syntax error}} 3111fe3c4b5Sdan 3121fe3c4b5Sdando_catchsql_test 6.3 { 3131fe3c4b5Sdan WITH x AS (SELECT * FROM t1) 3141fe3c4b5Sdan INSERT INTO t2 SELECT a, b FROM abc; 3151fe3c4b5Sdan} {1 {no such table: abc}} 3161fe3c4b5Sdan 3171fe3c4b5Sdando_catchsql_test 6.4 { 3181fe3c4b5Sdan WITH x AS (SELECT * FROM t1) 3191fe3c4b5Sdan INSERT INTO t2 SELECT a, b, FROM t1 a a a; 3201fe3c4b5Sdan} {1 {near "FROM": syntax error}} 3211fe3c4b5Sdan 3221fe3c4b5Sdando_catchsql_test 6.5 { 3231fe3c4b5Sdan WITH x AS (SELECT * FROM t1) 3241fe3c4b5Sdan DELETE FROM t2 WHERE; 3251fe3c4b5Sdan} {1 {near ";": syntax error}} 3261fe3c4b5Sdan 3271fe3c4b5Sdando_catchsql_test 6.6 { 3281fe3c4b5Sdan WITH x AS (SELECT * FROM t1) DELETE FROM t2 WHERE 3296116ee4eSdrh} {1 {incomplete input}} 3301fe3c4b5Sdan 3311fe3c4b5Sdando_catchsql_test 6.7 { 3321fe3c4b5Sdan WITH x AS (SELECT * FROM t1) DELETE FROM t2 WHRE 1; 3331fe3c4b5Sdan} {/1 {near .* syntax error}/} 3341fe3c4b5Sdan 3351fe3c4b5Sdando_catchsql_test 6.8 { 3361fe3c4b5Sdan WITH x AS (SELECT * FROM t1) UPDATE t2 SET a = 10, b = ; 3371fe3c4b5Sdan} {/1 {near .* syntax error}/} 3381fe3c4b5Sdan 3391fe3c4b5Sdando_catchsql_test 6.9 { 3401fe3c4b5Sdan WITH x AS (SELECT * FROM t1) UPDATE t2 SET a = 10, b = 1 WHERE a===b; 3411fe3c4b5Sdan} {/1 {near .* syntax error}/} 3421fe3c4b5Sdan 3431fe3c4b5Sdando_catchsql_test 6.10 { 3441fe3c4b5Sdan WITH x(a,b) AS ( 3451fe3c4b5Sdan SELECT 1, 1 3461fe3c4b5Sdan UNION ALL 3471fe3c4b5Sdan SELECT a*b,a+b FROM x WHERE c=2 3481fe3c4b5Sdan ) 3491fe3c4b5Sdan SELECT * FROM x 3501fe3c4b5Sdan} {1 {no such column: c}} 3511fe3c4b5Sdan 3521fe3c4b5Sdan#------------------------------------------------------------------------- 3531fe3c4b5Sdan# Recursive queries in IN(...) expressions. 3541fe3c4b5Sdan# 3551fe3c4b5Sdando_execsql_test 7.1 { 3561fe3c4b5Sdan CREATE TABLE t5(x INTEGER); 3571fe3c4b5Sdan CREATE TABLE t6(y INTEGER); 3581fe3c4b5Sdan 3591fe3c4b5Sdan WITH s(x) AS ( VALUES(7) UNION ALL SELECT x+7 FROM s WHERE x<49 ) 3601fe3c4b5Sdan INSERT INTO t5 3611fe3c4b5Sdan SELECT * FROM s; 3621fe3c4b5Sdan 3631fe3c4b5Sdan INSERT INTO t6 3641fe3c4b5Sdan WITH s(x) AS ( VALUES(2) UNION ALL SELECT x+2 FROM s WHERE x<49 ) 3651fe3c4b5Sdan SELECT * FROM s; 3661fe3c4b5Sdan} 3671fe3c4b5Sdan 3681fe3c4b5Sdando_execsql_test 7.2 { 3691fe3c4b5Sdan SELECT * FROM t6 WHERE y IN (SELECT x FROM t5) 3701fe3c4b5Sdan} {14 28 42} 3711fe3c4b5Sdan 3721fe3c4b5Sdando_execsql_test 7.3 { 3731fe3c4b5Sdan WITH ss AS (SELECT x FROM t5) 3741fe3c4b5Sdan SELECT * FROM t6 WHERE y IN (SELECT x FROM ss) 3751fe3c4b5Sdan} {14 28 42} 3761fe3c4b5Sdan 3771fe3c4b5Sdando_execsql_test 7.4 { 3781fe3c4b5Sdan WITH ss(x) AS ( VALUES(7) UNION ALL SELECT x+7 FROM ss WHERE x<49 ) 3791fe3c4b5Sdan SELECT * FROM t6 WHERE y IN (SELECT x FROM ss) 3801fe3c4b5Sdan} {14 28 42} 3811fe3c4b5Sdan 3821fe3c4b5Sdando_execsql_test 7.5 { 3831fe3c4b5Sdan SELECT * FROM t6 WHERE y IN ( 3841fe3c4b5Sdan WITH ss(x) AS ( VALUES(7) UNION ALL SELECT x+7 FROM ss WHERE x<49 ) 3851fe3c4b5Sdan SELECT x FROM ss 3861fe3c4b5Sdan ) 3871fe3c4b5Sdan} {14 28 42} 3881fe3c4b5Sdan 3899afccba2Sdan#------------------------------------------------------------------------- 3909afccba2Sdan# At one point the following was causing an assertion failure and a 3919afccba2Sdan# memory leak. 3929afccba2Sdan# 3939afccba2Sdando_execsql_test 8.1 { 3949afccba2Sdan CREATE TABLE t7(y); 3959afccba2Sdan INSERT INTO t7 VALUES(NULL); 3969afccba2Sdan CREATE VIEW v AS SELECT * FROM t7 ORDER BY y; 3979afccba2Sdan} 3989afccba2Sdan 3999afccba2Sdando_execsql_test 8.2 { 4009afccba2Sdan WITH q(a) AS ( 4019afccba2Sdan SELECT 1 4029afccba2Sdan UNION 4039afccba2Sdan SELECT a+1 FROM q, v WHERE a<5 4049afccba2Sdan ) 4059afccba2Sdan SELECT * FROM q; 4069afccba2Sdan} {1 2 3 4 5} 4079afccba2Sdan 4089afccba2Sdando_execsql_test 8.3 { 4099afccba2Sdan WITH q(a) AS ( 4109afccba2Sdan SELECT 1 4119afccba2Sdan UNION ALL 4129afccba2Sdan SELECT a+1 FROM q, v WHERE a<5 4139afccba2Sdan ) 4149afccba2Sdan SELECT * FROM q; 4159afccba2Sdan} {1 2 3 4 5} 4161fe3c4b5Sdan 41776f7b16fSdrh# 2021-03-18 41876f7b16fSdrh# Ticket bb8a9fd4a9b7fce5 41976f7b16fSdrhreset_db 42076f7b16fSdrhdo_execsql_test 9.1 { 42176f7b16fSdrh WITH xyz(a) AS ( 42276f7b16fSdrh WITH abc AS ( SELECT 1234 ) SELECT * FROM abc 42376f7b16fSdrh ) 42476f7b16fSdrh SELECT * FROM xyz AS one, xyz AS two, ( 42576f7b16fSdrh SELECT * FROM xyz UNION ALL SELECT * FROM xyz 42676f7b16fSdrh ); 42776f7b16fSdrh} {1234 1234 1234 1234 1234 1234} 428f09a1794Sdrhifcapable vtab { 42976f7b16fSdrhload_static_extension db series 43076f7b16fSdrhdo_execsql_test 9.2 { 43176f7b16fSdrh WITH 43276f7b16fSdrh cst(rsx, rsy) AS ( 43376f7b16fSdrh SELECT 100, 100 43476f7b16fSdrh ), 43576f7b16fSdrh cst2(minx, maxx, stepx, miny, maxy, stepy, qualitativex, qualitativey) AS ( 43676f7b16fSdrh SELECT NULL, NULL, NULL, NULL, NULL, NULL, 0, 0 43776f7b16fSdrh ), 43876f7b16fSdrh ds0(m, n, x, y, x2, y2, title, size, mark, label, markmode) AS ( 43976f7b16fSdrh SELECT 1, 2, 3, 4, 5, 6, 7 , 8, 9, 10, 11 44076f7b16fSdrh ), 44176f7b16fSdrh ds(m, n, x, y, x2, y2, title, size, mark, label, markmode) AS ( 44276f7b16fSdrh SELECT m, n, x, 44376f7b16fSdrh y, x2, 44476f7b16fSdrh y2, 44576f7b16fSdrh title, size, mark, label, markmode 44676f7b16fSdrh FROM ds0 44776f7b16fSdrh WINDOW w AS (PARTITION BY m, x ORDER BY n) 44876f7b16fSdrh ), 44976f7b16fSdrh d(m, n, x, y, x2, y2, labelx,labely,title,size,mark,label,markmode) AS ( 45076f7b16fSdrh SELECT m, n, x, y, x2, y2, x, y, title, size, mark, label, markmode 45176f7b16fSdrh FROM ds, cst2 45276f7b16fSdrh ), 45376f7b16fSdrh ylabels(y, label) AS ( 45476f7b16fSdrh SELECT y, MIN(labely) FROM d GROUP BY y 45576f7b16fSdrh ), 45676f7b16fSdrh yaxis(maxy, miny, stepy , minstepy) AS ( 45776f7b16fSdrh WITH 45876f7b16fSdrh xt0(minx, maxx) AS ( 45976f7b16fSdrh SELECT coalesce(miny, min(min(y2), 46076f7b16fSdrh min(y))), coalesce(maxy, max(max(y2), 46176f7b16fSdrh max(y))) + qualitativey 46276f7b16fSdrh FROM d, cst2 46376f7b16fSdrh ), 46476f7b16fSdrh xt1(mx, mn) AS (SELECT maxx, minx FROM xt0), 46576f7b16fSdrh xt2(mx, mn, step) AS (SELECT mx, mn, (mx-mn) FROM xt1), 46676f7b16fSdrh 46776f7b16fSdrh xt3(mx, mn, ms) AS ( 46876f7b16fSdrh SELECT mx, mn, first_value(rs) OVER (order by x desc) AS ms 46976f7b16fSdrh FROM (SELECT mx, mn, step, f,(mx-mn) as rng, 47076f7b16fSdrh 1.0*step/f as rs, 1.0*(mx-mn)/(step/f) AS x 47176f7b16fSdrh FROM xt2, (SELECT 1 AS f UNION ALL SELECT 2 47276f7b16fSdrh UNION ALL SELECT 4 47376f7b16fSdrh UNION ALL SELECT 5)) AS src 47476f7b16fSdrh WHERE x < 10 limit 1), 47576f7b16fSdrh xt4(minstepy) AS ( 47676f7b16fSdrh SELECT MIN(abs(y2-y)) FROM d WHERE y2 != y 47776f7b16fSdrh ) 47876f7b16fSdrh SELECT (mx/ms)*ms, (mn/ms)*ms, coalesce(stepy, ms), 47976f7b16fSdrh coalesce(minstepy, ms, stepy) FROM xt3, cst2,xt4 48076f7b16fSdrh ), 48176f7b16fSdrh distinct_mark_n_m(mark, ze, zem, title) AS ( 48276f7b16fSdrh SELECT DISTINCT mark, n AS ze, m AS zem, title FROM ds0 48376f7b16fSdrh ), 48476f7b16fSdrh facet0(m, mi, title, radial) AS ( 48576f7b16fSdrh SELECT md, row_number() OVER () - 1, title, 'radial' 48676f7b16fSdrh IN (SELECT mark FROM distinct_mark_n_m WHERE zem = md) 48776f7b16fSdrh FROM (SELECT DISTINCT zem AS md, title AS title 48876f7b16fSdrh FROM distinct_mark_n_m ORDER BY 2, 1) 48976f7b16fSdrh ), 49076f7b16fSdrh facet(m, mi, xorigin, yorigin, title, radial) AS ( 49176f7b16fSdrh SELECT m, mi, 49276f7b16fSdrh rsx * 1.2 * IFNULL(CASE WHEN ( 49376f7b16fSdrh 0 49476f7b16fSdrh ) > 0 THEN mi / ( 49576f7b16fSdrh 0 49676f7b16fSdrh ) ELSE mi % ( 49776f7b16fSdrh 2 49876f7b16fSdrh ) END, mi), 49976f7b16fSdrh rsy * 1.2 * IFNULL(CASE WHEN ( 50076f7b16fSdrh 2 50176f7b16fSdrh ) > 0 THEN mi / ( 50276f7b16fSdrh 2 50376f7b16fSdrh ) ELSE mi / ( 50476f7b16fSdrh 0 50576f7b16fSdrh ) END, 0), 50676f7b16fSdrh title, radial FROM facet0, cst 50776f7b16fSdrh ), 50876f7b16fSdrh radygrid(m, mi, tty, wty, ttx, ttx2, xorigin, yorigin) AS ( 50976f7b16fSdrh SELECT m, mi, rsy / 2 / ((maxy-miny)/stepy) * (value-1) AS tty, 51076f7b16fSdrh coalesce(NULL, miny + stepy * (value-1)) AS wty, 51176f7b16fSdrh xorigin, xorigin+rsx, xorigin + rsx / 2, 51276f7b16fSdrh yorigin + rsy / 2 51376f7b16fSdrh FROM generate_series(1), yaxis, cst, 51476f7b16fSdrh facet LEFT JOIN ylabels ON ylabels.y = (miny + (value-1) * stepy) 51576f7b16fSdrh WHERE radial AND stop = 1+1.0*(maxy-miny)/stepy 51676f7b16fSdrh ), 51776f7b16fSdrh ypos(m, mi, pcx, pcy, radial) AS ( 51876f7b16fSdrh SELECT m, mi, xorigin, yorigin + CASE 51976f7b16fSdrh WHEN 0 BETWEEN miny AND maxy THEN 52076f7b16fSdrh rsy - (0 - miny) * rsy / (maxy-miny) 52176f7b16fSdrh WHEN 0 >= maxy THEN 0 52276f7b16fSdrh ELSE rsy 52376f7b16fSdrh END, radial FROM yaxis, cst, facet WHERE NOT radial 52476f7b16fSdrh UNION ALL 52576f7b16fSdrh SELECT m, mi, xorigin + rsx / 2, yorigin + (CASE 52676f7b16fSdrh WHEN 0 BETWEEN miny AND maxy THEN 52776f7b16fSdrh rsy - (0 - miny) * rsy / 2 / (maxy-miny) 52876f7b16fSdrh WHEN 0 >= maxy THEN 0 52976f7b16fSdrh ELSE rsy 53076f7b16fSdrh END ) / 2, radial FROM yaxis, cst, facet WHERE radial 53176f7b16fSdrh ) 53276f7b16fSdrh SELECT * FROM radygrid , ypos; 53376f7b16fSdrh} {} 534f09a1794Sdrh} ;# end ifcapable vtab 5351fe3c4b5Sdan 536d685dd6bSdrh# 2021-03-19 537d685dd6bSdrh# dbsqlfuzz 01b8355086998f0a452cb31208e80b9d29ca739a 538d685dd6bSdrh# 539d685dd6bSdrh# Correlated CTEs should not be materialized. 540d685dd6bSdrh# 541d685dd6bSdrhreset_db 542d685dd6bSdrhdo_execsql_test 10.1 { 543d685dd6bSdrh SELECT 1 AS c WHERE ( 544d685dd6bSdrh SELECT ( 545d685dd6bSdrh WITH t1(a) AS (VALUES( c )) 546d685dd6bSdrh SELECT ( SELECT t1a.a FROM t1 AS t1a, t1 AS t1x ) 547d685dd6bSdrh FROM t1 AS xyz GROUP BY 1 548d685dd6bSdrh ) 549d685dd6bSdrh ) 550d685dd6bSdrh} {1} 551d685dd6bSdrh 55293c8139cSdrh# 2021-05-21 55393c8139cSdrh# Forum post https://sqlite.org/forum/forumpost/aa4a7a3980 55493c8139cSdrh# 555*37f3ac8fSdanifcapable altertable { 55693c8139cSdrhreset_db 55793c8139cSdrh do_execsql_test 11.1 { 55893c8139cSdrh CREATE TABLE t1(a); 55993c8139cSdrh CREATE VIEW v2(c) AS 56093c8139cSdrh WITH x AS ( 56193c8139cSdrh WITH y AS ( 56293c8139cSdrh WITH z AS(SELECT * FROM t1) 56393c8139cSdrh SELECT * FROM v2 56493c8139cSdrh ) SELECT a 56593c8139cSdrh ) SELECT * from t1; 56693c8139cSdrh ALTER TABLE t1 RENAME COLUMN a TO b; 56793c8139cSdrh SELECT sql FROM sqlite_schema WHERE name='t1'; 56893c8139cSdrh } {{CREATE TABLE t1(b)}} 56993c8139cSdrh do_catchsql_test 11.2 { 57093c8139cSdrh INSERT INTO t1 VALUES(55); 57193c8139cSdrh SELECT * FROM v2; 57293c8139cSdrh } {0 55} 57393c8139cSdrh do_catchsql_test 11.3 { 57493c8139cSdrh DROP VIEW v2; 57593c8139cSdrh CREATE VIEW v2(c) AS 57693c8139cSdrh WITH x AS ( 57793c8139cSdrh WITH y AS ( 57893c8139cSdrh WITH z AS(SELECT * FROM t1) 57993c8139cSdrh SELECT * FROM v2 58093c8139cSdrh ) SELECT a 58193c8139cSdrh ) SELECT * from t1, x; 58293c8139cSdrh SELECT * FROM v2; 58393c8139cSdrh } {1 {no such column: a}} 58493c8139cSdrh do_catchsql_test 11.4 { 58593c8139cSdrh DROP VIEW v2; 58693c8139cSdrh CREATE VIEW v2(c) AS 58793c8139cSdrh WITH x AS ( 58893c8139cSdrh WITH y AS ( 58993c8139cSdrh WITH z AS(SELECT * FROM t1) 59093c8139cSdrh SELECT * FROM v2 59193c8139cSdrh ) SELECT * 59293c8139cSdrh ) SELECT * from t1, x; 59393c8139cSdrh SELECT * FROM v2; 59493c8139cSdrh } {1 {no tables specified}} 59593c8139cSdrh do_catchsql_test 11.5 { 59693c8139cSdrh WITH x AS ( 59793c8139cSdrh WITH y AS ( 59893c8139cSdrh WITH z AS(SELECT * FROM t1) 59993c8139cSdrh SELECT * FROM no_such_table 60093c8139cSdrh ) SELECT a 60193c8139cSdrh ) SELECT * from t1; 60293c8139cSdrh } {0 55} 603*37f3ac8fSdan} 60493c8139cSdrh 6057cc73b39Sdrh# 2021-05-23 dbsqlfuzz 6b7a144674e215f06ddfeb9042c873d9ee956ac0 */ 6067cc73b39Sdrhreset_db 607*37f3ac8fSdanifcapable altertable { 6087cc73b39Sdrh do_execsql_test 12.1 { 6097cc73b39Sdrh CREATE TABLE t1(a); 6107cc73b39Sdrh INSERT INTO t1 VALUES(1),('hello'),(4.25),(NULL),(x'3c626c6f623e'); 6117cc73b39Sdrh CREATE VIEW v2(c) AS WITH x AS (WITH y AS (WITH z AS(SELECT * FROM t1) SELECT * FROM v2) SELECT a) SELECT * from t1; 6127cc73b39Sdrh CREATE VIEW v3(c) AS WITH x AS (WITH y AS (WITH z AS(SELECT * FROM v2) SELECT * FROM v3) SELECT a) SELECT * from t1; 6137cc73b39Sdrh ALTER TABLE t1 RENAME TO t1x; 6147cc73b39Sdrh SELECT quote(c) FROM v3; 6157cc73b39Sdrh } {1 'hello' 4.25 NULL X'3C626C6F623E'} 616*37f3ac8fSdan} 6177cc73b39Sdrh 618df67ec08Sdrh# 2021-08-11 https://sqlite.org/forum/forumpost/d496c3d29bc93736 619df67ec08Sdrhreset_db 620df67ec08Sdrhdo_execsql_test 13.1 { 621df67ec08Sdrh WITH 622df67ec08Sdrh t1(x) AS (SELECT 111), 623df67ec08Sdrh t2(y) AS (SELECT 222), 624df67ec08Sdrh t3(z) AS (SELECT * FROM t2 WHERE false UNION ALL SELECT * FROM t2) 625df67ec08Sdrh SELECT * FROM t1, t3; 626df67ec08Sdrh} {111 222} 627df67ec08Sdrh 628b290f117Sdanfinish_test 629