xref: /sqlite-3.40.0/test/with2.test (revision 37f3ac8f)
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