📄 format3.test
字号:
count {SELECT w FROM t1 WHERE w+1==98}} {97 99}do_test format3-5.35 { count {SELECT w FROM t1 WHERE w<3}} {1 2 4}do_test format3-5.36 { count {SELECT w FROM t1 WHERE w<=3}} {1 2 3 6}do_test format3-5.37 { count {SELECT w FROM t1 WHERE w+1<=4 ORDER BY w}} {1 2 3 199}# Do the same kind of thing except use a join as the data source.#do_test format3-6.1 { db close sqlite db test.db count { SELECT w, p FROM t2, t1 WHERE x=q AND y=s AND r=8977 }} {34 67 6}do_test format3-6.2 { count { SELECT w, p FROM t2, t1 WHERE x=q AND s=y AND r=8977 }} {34 67 6}do_test format3-6.3 { count { SELECT w, p FROM t2, t1 WHERE x=q AND s=y AND r=8977 AND w>10 }} {34 67 6}do_test format3-6.4 { count { SELECT w, p FROM t2, t1 WHERE p<80 AND x=q AND s=y AND r=8977 AND w>10 }} {34 67 6}do_test format3-6.5 { count { SELECT w, p FROM t2, t1 WHERE p<80 AND x=q AND 8977=r AND s=y AND w>10 }} {34 67 6}do_test format3-6.6 { count { SELECT w, p FROM t2, t1 WHERE x=q AND p=77 AND s=y AND w>5 }} {24 77 6}do_test format3-6.7 { count { SELECT w, p FROM t1, t2 WHERE x=q AND p>77 AND s=y AND w=5 }} {5 96 6}# Lets do a 3-way join.#do_test format3-7.1 { count { SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=11 }} {11 90 11 9}do_test format3-7.2 { count { SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=12 }} {12 89 12 9}do_test format3-7.3 { count { SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C WHERE A.w=15 AND B.p=C.w AND B.r=10202-A.y }} {15 86 86 9}# Test to see that the special case of a constant WHERE clause is# handled.#do_test format3-8.1 { count { SELECT * FROM t1 WHERE 0 }} {0}do_test format3-8.2 { count { SELECT * FROM t1 WHERE 1 LIMIT 1 }} {1 0 4 1}do_test format3-8.3 { execsql { SELECT 99 WHERE 0 }} {}do_test format3-8.4 { execsql { SELECT 99 WHERE 1 }} {99}# Verify that IN operators in a WHERE clause are handled correctly.#do_test format3-9.1 { count { SELECT * FROM t1 WHERE rowid IN (1,2,3,1234) order by 1; }} {1 0 4 2 1 9 3 1 16 0}do_test format3-9.2 { count { SELECT * FROM t1 WHERE rowid+0 IN (1,2,3,1234) order by 1; }} {1 0 4 2 1 9 3 1 16 199}do_test format3-9.3 { count { SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1; }} {1 0 4 2 1 9 3 1 16 10}do_test format3-9.4 { count { SELECT * FROM t1 WHERE w+0 IN (-1,1,2,3) order by 1; }} {1 0 4 2 1 9 3 1 16 199}do_test format3-9.5 { count { SELECT * FROM t1 WHERE rowid IN (select rowid from t1 where rowid IN (-1,2,4)) ORDER BY 1; }} {2 1 9 4 2 25 1}do_test format3-9.6 { count { SELECT * FROM t1 WHERE rowid+0 IN (select rowid from t1 where rowid IN (-1,2,4)) ORDER BY 1; }} {2 1 9 4 2 25 199}do_test format3-9.7 { count { SELECT * FROM t1 WHERE w IN (select rowid from t1 where rowid IN (-1,2,4)) ORDER BY 1; }} {2 1 9 4 2 25 7}do_test format3-9.8 { count { SELECT * FROM t1 WHERE w+0 IN (select rowid from t1 where rowid IN (-1,2,4)) ORDER BY 1; }} {2 1 9 4 2 25 199}do_test format3-9.9 { count { SELECT * FROM t1 WHERE x IN (1,7) ORDER BY 1; }} {2 1 9 3 1 16 6}do_test format3-9.10 { count { SELECT * FROM t1 WHERE x+0 IN (1,7) ORDER BY 1; }} {2 1 9 3 1 16 199}do_test format3-9.11 { count { SELECT * FROM t1 WHERE y IN (6400,8100) ORDER BY 1; }} {79 6 6400 89 6 8100 199}do_test format3-9.12 { count { SELECT * FROM t1 WHERE x=6 AND y IN (6400,8100) ORDER BY 1; }} {79 6 6400 89 6 8100 74}do_test format3-9.13 { count { SELECT * FROM t1 WHERE x IN (1,7) AND y NOT IN (6400,8100) ORDER BY 1; }} {2 1 9 3 1 16 6}do_test format3-9.14 { count { SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,10) ORDER BY 1; }} {2 1 9 6}# This procedure executes the SQL. Then it checks the generated program# for the SQL and appends a "nosort" to the result if the program contains the# SortCallback opcode. If the program does not contain the SortCallback# opcode it appends "sort"#proc cksort {sql} { set data [execsql $sql] set prog [execsql "EXPLAIN $sql"] if {[regexp SortCallback $prog]} {set x sort} {set x nosort} lappend data $x return $data}# Check out the logic that attempts to implement the ORDER BY clause# using an index rather than by sorting.#do_test format3-10.1 { execsql { CREATE TABLE t3(a,b,c); CREATE INDEX t3a ON t3(a); CREATE INDEX t3bc ON t3(b,c); CREATE INDEX t3acb ON t3(a,c,b); INSERT INTO t3 SELECT w, 101-w, y FROM t1; SELECT count(*), sum(a), sum(b), sum(c) FROM t3; }} {100 5050 5050 348550}do_test format3-10.2 { cksort { SELECT * FROM t3 ORDER BY a LIMIT 3 }} {1 100 4 2 99 9 3 98 16 nosort}do_test format3-10.3 { cksort { SELECT * FROM t3 ORDER BY a+1 LIMIT 3 }} {1 100 4 2 99 9 3 98 16 sort}do_test format3-10.4 { cksort { SELECT * FROM t3 WHERE a<10 ORDER BY a LIMIT 3 }} {1 100 4 2 99 9 3 98 16 nosort}do_test format3-10.5 { cksort { SELECT * FROM t3 WHERE a>0 AND a<10 ORDER BY a LIMIT 3 }} {1 100 4 2 99 9 3 98 16 nosort}do_test format3-10.6 { cksort { SELECT * FROM t3 WHERE a>0 ORDER BY a LIMIT 3 }} {1 100 4 2 99 9 3 98 16 nosort}do_test format3-10.7 { cksort { SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 3 }} {1 100 4 2 99 9 3 98 16 sort}do_test format3-10.8 { cksort { SELECT * FROM t3 WHERE a IN (3,5,7,1,9,4,2) ORDER BY a LIMIT 3 }} {1 100 4 2 99 9 3 98 16 sort}do_test format3-10.9 { cksort { SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3 }} {1 100 4 nosort}do_test format3-10.10 { cksort { SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3 }} {1 100 4 nosort}do_test format3-10.11 { cksort { SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3 }} {1 100 4 nosort}do_test format3-10.12 { cksort { SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c,b LIMIT 3 }} {1 100 4 nosort}do_test format3-10.13 { cksort { SELECT * FROM t3 WHERE a>0 ORDER BY a DESC LIMIT 3 }} {100 1 10201 99 2 10000 98 3 9801 nosort}do_test format3-10.13.1 { cksort { SELECT * FROM t3 WHERE a>0 ORDER BY a+1 DESC LIMIT 3 }} {100 1 10201 99 2 10000 98 3 9801 sort}do_test format3-10.14 { cksort { SELECT * FROM t3 ORDER BY b LIMIT 3 }} {100 1 10201 99 2 10000 98 3 9801 nosort}do_test format3-10.15 { cksort { SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t3.a LIMIT 3 }} {1 0 2 1 3 1 nosort}do_test format3-10.16 { cksort { SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t1.x, t3.a LIMIT 3 }} {1 0 2 1 3 1 sort}do_test format3-10.17 { cksort { SELECT y FROM t1 ORDER BY w COLLATE text LIMIT 3; }} {4 121 10201 sort}do_test format3-10.18 { cksort { SELECT y FROM t1 ORDER BY w COLLATE numeric LIMIT 3; }} {4 9 16 sort}do_test format3-10.19 { cksort { SELECT y FROM t1 ORDER BY w LIMIT 3; }} {4 9 16 nosort}# Check that all comparisons are numeric. Similar tests in misc1.test# check the same comparisons on a format4+ database and find that some# are numeric and some are text.#do_test format3-11.1 { execsql {SELECT '0'=='0.0'}} {1}do_test format3-11.2 { execsql {SELECT '0'==0.0}} {1}do_test format3-11.3 { execsql {SELECT '123456789012345678901'=='123456789012345678900'}} {1}do_test format3-11.4 { execsql { CREATE TABLE t6(a INT UNIQUE, b TEXT UNIQUE); INSERT INTO t6 VALUES('0','0.0'); SELECT * FROM t6; }} {0 0.0}do_test format3-11.5 { execsql { INSERT OR IGNORE INTO t6 VALUES(0.0,'x'); SELECT * FROM t6; }} {0 0.0}do_test format3-11.6 { execsql { INSERT OR IGNORE INTO t6 VALUES('y',0); SELECT * FROM t6; }} {0 0.0}do_test format3-11.7 { execsql { CREATE TABLE t7(x INTEGER, y TEXT, z); INSERT INTO t7 VALUES(0,0,1); INSERT INTO t7 VALUES(0.0,0,2); INSERT INTO t7 VALUES(0,0.0,3); INSERT INTO t7 VALUES(0.0,0.0,4); SELECT DISTINCT x, y FROM t7 ORDER BY z; }} {0 0}# Make sure attempts to attach a format 3 database fail.#do_test format3-12.1 { file delete -force test2.db sqlite db2 test2.db catchsql { CREATE TABLE t8(x,y); ATTACH DATABASE 'test.db' AS format3; } db2;} {1 {incompatible file format in auxiliary database: format3}}do_test format3-12.2 { catchsql { ATTACH DATABASE 'test2.db' AS test2; }} {1 {cannot attach auxiliary databases to an older format master database}}db2 closefinish_test
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -