1d092ed43Sdrh# 2014-10-24 2d092ed43Sdrh# 3d092ed43Sdrh# The author disclaims copyright to this source code. In place of 4d092ed43Sdrh# a legal notice, here is a blessing: 5d092ed43Sdrh# 6d092ed43Sdrh# May you do good and not evil. 7d092ed43Sdrh# May you find forgiveness for yourself and forgive others. 8d092ed43Sdrh# May you share freely, never taking more than you give. 9d092ed43Sdrh# 10d092ed43Sdrh#************************************************************************* 11d092ed43Sdrh# 12d092ed43Sdrh# This file implements regression tests for SQLite library. The 13d092ed43Sdrh# focus of this script is testing automatic index creation logic, 14d092ed43Sdrh# and specifically ensuring that automatic indexes can be used with 15d092ed43Sdrh# co-routine subqueries. 16d092ed43Sdrh# 17d092ed43Sdrh 18d092ed43Sdrhset testdir [file dirname $argv0] 19d092ed43Sdrhsource $testdir/tester.tcl 20fb785b2cSdanset testprefix autoindex5 21d092ed43Sdrh 22d092ed43Sdrh# Schema is from the Debian security database 23d092ed43Sdrh# 24d092ed43Sdrhdo_execsql_test autoindex5-1.0 { 25d092ed43Sdrh CREATE TABLE source_package_status 26d092ed43Sdrh (bug_name TEXT NOT NULL, 27d092ed43Sdrh package INTEGER NOT NULL, 28d092ed43Sdrh vulnerable INTEGER NOT NULL, 29d092ed43Sdrh urgency TEXT NOT NULL, 30d092ed43Sdrh PRIMARY KEY (bug_name, package)); 31d092ed43Sdrh CREATE INDEX source_package_status_package 32d092ed43Sdrh ON source_package_status(package); 33d092ed43Sdrh 34d092ed43Sdrh CREATE TABLE source_packages 35d092ed43Sdrh (name TEXT NOT NULL, 36d092ed43Sdrh release TEXT NOT NULL, 37d092ed43Sdrh subrelease TEXT NOT NULL, 38d092ed43Sdrh archive TEXT NOT NULL, 39d092ed43Sdrh version TEXT NOT NULL, 40d092ed43Sdrh version_id INTEGER NOT NULL DEFAULT 0, 41d092ed43Sdrh PRIMARY KEY (name, release, subrelease, archive)); 42d092ed43Sdrh 43d092ed43Sdrh CREATE TABLE bugs 44d092ed43Sdrh (name TEXT NOT NULL PRIMARY KEY, 45d092ed43Sdrh cve_status TEXT NOT NULL 46d092ed43Sdrh CHECK (cve_status IN 47d092ed43Sdrh ('', 'CANDIDATE', 'ASSIGNED', 'RESERVED', 'REJECTED')), 48d092ed43Sdrh not_for_us INTEGER NOT NULL CHECK (not_for_us IN (0, 1)), 49d092ed43Sdrh description TEXT NOT NULL, 50d092ed43Sdrh release_date TEXT NOT NULL, 51d092ed43Sdrh source_file TEXT NOT NULL, 52d092ed43Sdrh source_line INTEGER NOT NULL); 53d092ed43Sdrh 54d092ed43Sdrh CREATE TABLE package_notes 55d092ed43Sdrh (id INTEGER NOT NULL PRIMARY KEY, 56d092ed43Sdrh bug_name TEXT NOT NULL, 57d092ed43Sdrh package TEXT NOT NULL, 58d092ed43Sdrh fixed_version TEXT 59d092ed43Sdrh CHECK (fixed_version IS NULL OR fixed_version <> ''), 60d092ed43Sdrh fixed_version_id INTEGER NOT NULL DEFAULT 0, 61d092ed43Sdrh release TEXT NOT NULL, 62d092ed43Sdrh package_kind TEXT NOT NULL DEFAULT 'unknown', 63d092ed43Sdrh urgency TEXT NOT NULL, 64d092ed43Sdrh bug_origin TEXT NOT NULL DEFAULT ''); 65d092ed43Sdrh CREATE INDEX package_notes_package 66d092ed43Sdrh ON package_notes(package); 67d092ed43Sdrh CREATE UNIQUE INDEX package_notes_bug 68d092ed43Sdrh ON package_notes(bug_name, package, release); 69d092ed43Sdrh 70d092ed43Sdrh CREATE TABLE debian_bugs 71d092ed43Sdrh (bug INTEGER NOT NULL, 72d092ed43Sdrh note INTEGER NOT NULL, 73d092ed43Sdrh PRIMARY KEY (bug, note)); 74d092ed43Sdrh 75d092ed43Sdrh 76d092ed43Sdrh CREATE VIEW debian_cve AS 77d092ed43Sdrh SELECT DISTINCT debian_bugs.bug, st.bug_name 78d092ed43Sdrh FROM package_notes, debian_bugs, source_package_status AS st 79d092ed43Sdrh WHERE package_notes.bug_name = st.bug_name 80d092ed43Sdrh AND debian_bugs.note = package_notes.id 81d092ed43Sdrh ORDER BY debian_bugs.bug; 82d092ed43Sdrh} {} 83d092ed43Sdrh 84d092ed43Sdrh# The following query should use an automatic index for the view 85d092ed43Sdrh# in FROM clause of the subquery of the second result column. 86d092ed43Sdrh# 87cdf88760Sdrhdo_eqp_test autoindex5-1.1 { 88d092ed43Sdrh SELECT 89d092ed43Sdrh st.bug_name, 90d092ed43Sdrh (SELECT ALL debian_cve.bug FROM debian_cve 91d092ed43Sdrh WHERE debian_cve.bug_name = st.bug_name 92d092ed43Sdrh ORDER BY debian_cve.bug), 93d092ed43Sdrh sp.release 94d092ed43Sdrh FROM 95d092ed43Sdrh source_package_status AS st, 96d092ed43Sdrh source_packages AS sp, 97d092ed43Sdrh bugs 98d092ed43Sdrh WHERE 99d092ed43Sdrh sp.rowid = st.package 100d092ed43Sdrh AND st.bug_name = bugs.name 101d092ed43Sdrh AND ( st.bug_name LIKE 'CVE-%' OR st.bug_name LIKE 'TEMP-%' ) 102d092ed43Sdrh AND ( sp.release = 'sid' OR sp.release = 'stretch' OR sp.release = 'jessie' 103d092ed43Sdrh OR sp.release = 'wheezy' OR sp.release = 'squeeze' ) 104d092ed43Sdrh ORDER BY sp.name, st.bug_name, sp.release, sp.subrelease; 1058210233cSdrh} {SEARCH debian_cve USING AUTOMATIC COVERING INDEX (bug_name=?)} 106d092ed43Sdrh 107fb785b2cSdan#------------------------------------------------------------------------- 108fb785b2cSdan# Test that ticket [8a2adec1] has been fixed. 109fb785b2cSdan# 110fb785b2cSdando_execsql_test 2.1 { 111fb785b2cSdan CREATE TABLE one(o); 112fb785b2cSdan INSERT INTO one DEFAULT VALUES; 113fb785b2cSdan 114fb785b2cSdan CREATE TABLE t1(x, z); 115fb785b2cSdan INSERT INTO t1 VALUES('aaa', 4.0); 116fb785b2cSdan INSERT INTO t1 VALUES('aaa', 4.0); 117fb785b2cSdan CREATE VIEW vvv AS 118fb785b2cSdan SELECT * FROM t1 119fb785b2cSdan UNION ALL 120fb785b2cSdan SELECT 0, 0 WHERE 0; 121fb785b2cSdan 122fb785b2cSdan SELECT ( 123fb785b2cSdan SELECT sum(z) FROM vvv WHERE x='aaa' 124fb785b2cSdan ) FROM one; 125fb785b2cSdan} {8.0} 126*b9248ef5Sdan 127*b9248ef5Sdan# At one point the following was returning "no such column: rowid". This 128*b9248ef5Sdan# was incorrect - "rowid" matches against the rowid of table t1 in this 129*b9248ef5Sdan# query. 1306e5020e8Sdrhdo_catchsql_test 2.2 { 13100a6153fSdrh DROP TABLE t1; 13200a6153fSdrh CREATE TABLE t1(aaa); 13300a6153fSdrh INSERT INTO t1(aaa) VALUES(9); 13400a6153fSdrh SELECT ( 13500a6153fSdrh SELECT aaa FROM t1 GROUP BY ( 13600a6153fSdrh SELECT bbb FROM ( 13700a6153fSdrh SELECT ccc AS bbb FROM ( 13800a6153fSdrh SELECT 1 ccc 13900a6153fSdrh ) WHERE rowid IS NOT 1 14000a6153fSdrh ) WHERE bbb = 1 14100a6153fSdrh ) 14200a6153fSdrh ); 143*b9248ef5Sdan} {0 9} 1440b57d312Sdrh 1450b57d312Sdrh# Ticket https://www.sqlite.org/src/info/787fa716be3a7f65 1460b57d312Sdrh# Segfault due to multiple uses of the same subquery where the 1470b57d312Sdrh# subquery is implemented via coroutine. 1480b57d312Sdrh# 1498cd2e4aeSdanifcapable windowfunc { 1500b57d312Sdrhsqlite3 db :memory: 1510b57d312Sdrhdo_execsql_test 3.0 { 1520b57d312Sdrh -- This is the original test case reported on the mailing list 1530b57d312Sdrh CREATE TABLE artists ( 1540b57d312Sdrh id integer NOT NULL PRIMARY KEY AUTOINCREMENT, 1550b57d312Sdrh name varchar(255) 1560b57d312Sdrh ); 1570b57d312Sdrh CREATE TABLE albums ( 1580b57d312Sdrh id integer NOT NULL PRIMARY KEY AUTOINCREMENT, 1590b57d312Sdrh name varchar(255), 1600b57d312Sdrh artist_id integer REFERENCES artists 1610b57d312Sdrh ); 1620b57d312Sdrh INSERT INTO artists (name) VALUES ('Ar'); 1630b57d312Sdrh INSERT INTO albums (name, artist_id) VALUES ('Al', 1); 1640b57d312Sdrh SELECT artists.* 1650b57d312Sdrh FROM artists 1660b57d312Sdrh INNER JOIN artists AS 'b' ON (b.id = artists.id) 1670b57d312Sdrh WHERE (artists.id IN ( 1680b57d312Sdrh SELECT albums.artist_id 1690b57d312Sdrh FROM albums 1700b57d312Sdrh WHERE ((name = 'Al') 1710b57d312Sdrh AND (albums.artist_id IS NOT NULL) 1720b57d312Sdrh AND (albums.id IN ( 1730b57d312Sdrh SELECT id 1740b57d312Sdrh FROM ( 1750b57d312Sdrh SELECT albums.id, 1760b57d312Sdrh row_number() OVER ( 1770b57d312Sdrh PARTITION BY albums.artist_id 1780b57d312Sdrh ORDER BY name 1790b57d312Sdrh ) AS 'x' 1800b57d312Sdrh FROM albums 1810b57d312Sdrh WHERE (name = 'Al') 1820b57d312Sdrh ) AS 't1' 1830b57d312Sdrh WHERE (x = 1) 1840b57d312Sdrh )) 1850b57d312Sdrh AND (albums.id IN (1, 2))) 1860b57d312Sdrh )); 1870b57d312Sdrh} {1 Ar} 1888cd2e4aeSdan} ;# windowfunc 1898cd2e4aeSdan 1900b57d312Sdrh# The remaining test cases were discovered (by Dan) during trouble-shooting 1910b57d312Sdrhsqlite3 db :memory: 1920b57d312Sdrhdo_execsql_test 3.1 { 1930b57d312Sdrh CREATE TABLE t1 (a); INSERT INTO t1 (a) VALUES (104); 1940b57d312Sdrh CREATE TABLE t2 (b); INSERT INTO t2 (b) VALUES (104); 1950b57d312Sdrh CREATE TABLE t3 (c); INSERT INTO t3 (c) VALUES (104); 1960b57d312Sdrh CREATE TABLE t4 (d); INSERT INTO t4 (d) VALUES (104); 1970b57d312Sdrh SELECT * 1980b57d312Sdrh FROM t1 CROSS JOIN t2 ON (t1.a = t2.b) WHERE t2.b IN ( 1990b57d312Sdrh SELECT t3.c 2000b57d312Sdrh FROM t3 2010b57d312Sdrh WHERE t3.c IN ( 2020b57d312Sdrh SELECT d FROM (SELECT DISTINCT d FROM t4) AS x WHERE x.d=104 2030b57d312Sdrh ) 2040b57d312Sdrh ); 2050b57d312Sdrh} {104 104} 2060b57d312Sdrhsqlite3 db :memory: 2070b57d312Sdrhdo_execsql_test 3.2 { 2080b57d312Sdrh CREATE TABLE t5(a, b, c, d); 2090b57d312Sdrh CREATE INDEX t5a ON t5(a); 2100b57d312Sdrh CREATE INDEX t5b ON t5(b); 2110b57d312Sdrh CREATE TABLE t6(e); 2120b57d312Sdrh INSERT INTO t6 VALUES(1); 2130b57d312Sdrh INSERT INTO t5 VALUES(1,1,1,1), (2,2,2,2); 2140b57d312Sdrh SELECT * FROM t5 WHERE (a=1 OR b=2) AND c IN ( 2150b57d312Sdrh SELECT e FROM (SELECT DISTINCT e FROM t6) WHERE e=1 2160b57d312Sdrh ); 2170b57d312Sdrh} {1 1 1 1} 2180b57d312Sdrhsqlite3 db :memory: 2190b57d312Sdrhdo_execsql_test 3.3 { 2200b57d312Sdrh CREATE TABLE t1(a1, a2, a3); 2210b57d312Sdrh CREATE INDEX t1a2 ON t1(a2, a1); 2220b57d312Sdrh CREATE INDEX t1a3 ON t1(a3, a1); 2230b57d312Sdrh CREATE TABLE t2(d); 2240b57d312Sdrh INSERT INTO t1 VALUES(3, 1, 1), (3, 2, 2); 2250b57d312Sdrh INSERT INTO t2 VALUES(3); 2260b57d312Sdrh SELECT *, 'x' FROM t1 WHERE (a2=1 OR a3=2) AND a1 = ( 2270b57d312Sdrh SELECT d FROM (SELECT DISTINCT d FROM t2) WHERE d=3 2280b57d312Sdrh ); 2290b57d312Sdrh} {3 1 1 x 3 2 2 x} 2300b57d312Sdrh 2310b57d312Sdrh 232fb785b2cSdan 233d092ed43Sdrh 234d092ed43Sdrhfinish_test 235