1# 2009 Nov 11 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# 12# The focus of this file is testing the CLI shell tool. Specifically, 13# the ".recommend" command. 14# 15# 16 17# Test plan: 18# 19# shell1-1.*: Basic command line option handling. 20# shell1-2.*: Basic "dot" command token parsing. 21# shell1-3.*: Basic test that "dot" command can be called. 22# 23set testdir [file dirname $argv0] 24source $testdir/tester.tcl 25set testprefix shell6 26 27if {$tcl_platform(platform)=="windows"} { 28 set CLI "sqlite3.exe" 29} else { 30 set CLI "./sqlite3" 31} 32if {![file executable $CLI]} { 33 finish_test 34 return 35} 36 37 38proc squish {txt} { 39 regsub -all {[[:space:]]+} $txt { } 40} 41 42proc do_rec_test {tn sql res} { 43 set res [squish [string trim $res]] 44 set tst [subst -nocommands { 45 squish [lindex [catchcmd [list -rec test.db {$sql;}]] 1] 46 }] 47 uplevel [list do_test $tn $tst $res] 48} 49 50proc do_setup_rec_test {tn setup sql res} { 51 reset_db 52 db eval $setup 53 uplevel [list do_rec_test $tn $sql $res] 54} 55 56 57do_setup_rec_test 1.1 { CREATE TABLE t1(a, b, c) } { 58 SELECT * FROM t1 59} { 60 (no new indexes) 61 0|0|0|SCAN TABLE t1 62} 63 64do_setup_rec_test 1.2 { 65 CREATE TABLE t1(a, b, c); 66} { 67 SELECT * FROM t1 WHERE b>?; 68} { 69 CREATE INDEX t1_idx_00000062 ON t1(b) 70 0|0|0|SEARCH TABLE t1 USING INDEX t1_idx_00000062 (b>?) 71} 72 73do_setup_rec_test 1.3 { 74 CREATE TABLE t1(a, b, c); 75} { 76 SELECT * FROM t1 WHERE b COLLATE nocase BETWEEN ? AND ? 77} { 78 CREATE INDEX t1_idx_3e094c27 ON t1(b COLLATE NOCASE) 79 0|0|0|SEARCH TABLE t1 USING INDEX t1_idx_3e094c27 (b>? AND b<?) 80} 81 82do_setup_rec_test 1.4 { 83 CREATE TABLE t1(a, b, c); 84} { 85 SELECT a FROM t1 ORDER BY b; 86} { 87 CREATE INDEX t1_idx_00000062 ON t1(b) 88 0|0|0|SCAN TABLE t1 USING INDEX t1_idx_00000062 89} 90 91do_setup_rec_test 1.5 { 92 CREATE TABLE t1(a, b, c); 93} { 94 SELECT a FROM t1 WHERE a=? ORDER BY b; 95} { 96 CREATE INDEX t1_idx_000123a7 ON t1(a, b) 97 0|0|0|SEARCH TABLE t1 USING COVERING INDEX t1_idx_000123a7 (a=?) 98} 99 100do_setup_rec_test 1.6 { 101 CREATE TABLE t1(a, b, c); 102} { 103 SELECT min(a) FROM t1 104} { 105 CREATE INDEX t1_idx_00000061 ON t1(a) 106 0|0|0|SEARCH TABLE t1 USING COVERING INDEX t1_idx_00000061 107} 108 109do_setup_rec_test 1.7 { 110 CREATE TABLE t1(a, b, c); 111} { 112 SELECT * FROM t1 ORDER BY a, b, c; 113} { 114 CREATE INDEX t1_idx_033e95fe ON t1(a, b, c) 115 0|0|0|SCAN TABLE t1 USING COVERING INDEX t1_idx_033e95fe 116} 117 118do_setup_rec_test 1.8 { 119 CREATE TABLE t1(a, b, c); 120} { 121 SELECT * FROM t1 ORDER BY a ASC, b COLLATE nocase DESC, c ASC; 122} { 123 CREATE INDEX t1_idx_5be6e222 ON t1(a, b COLLATE NOCASE DESC, c) 124 0|0|0|SCAN TABLE t1 USING COVERING INDEX t1_idx_5be6e222 125} 126 127do_setup_rec_test 1.9 { 128 CREATE TABLE t1(a COLLATE NOCase, b, c); 129} { 130 SELECT * FROM t1 WHERE a=? 131} { 132 CREATE INDEX t1_idx_00000061 ON t1(a) 133 0|0|0|SEARCH TABLE t1 USING INDEX t1_idx_00000061 (a=?) 134} 135 136 137# Tables with names that require quotes. 138# 139do_setup_rec_test 8.1 { 140 CREATE TABLE "t t"(a, b, c); 141} { 142 SELECT * FROM "t t" WHERE a=? 143} { 144 CREATE INDEX 't t_idx_00000061' ON 't t'(a) 145 0|0|0|SEARCH TABLE t t USING INDEX t t_idx_00000061 (a=?) 146} 147 148do_setup_rec_test 8.2 { 149 CREATE TABLE "t t"(a, b, c); 150} { 151 SELECT * FROM "t t" WHERE b BETWEEN ? AND ? 152} { 153 CREATE INDEX 't t_idx_00000062' ON 't t'(b) 154 0|0|0|SEARCH TABLE t t USING INDEX t t_idx_00000062 (b>? AND b<?) 155} 156 157# Columns with names that require quotes. 158# 159do_setup_rec_test 9.1 { 160 CREATE TABLE t3(a, "b b", c); 161} { 162 SELECT * FROM t3 WHERE "b b" = ? 163} { 164 CREATE INDEX t3_idx_00050c52 ON t3('b b') 165 0|0|0|SEARCH TABLE t3 USING INDEX t3_idx_00050c52 (b b=?) 166} 167 168do_setup_rec_test 9.2 { 169 CREATE TABLE t3(a, "b b", c); 170} { 171 SELECT * FROM t3 ORDER BY "b b" 172} { 173 CREATE INDEX t3_idx_00050c52 ON t3('b b') 174 0|0|0|SCAN TABLE t3 USING INDEX t3_idx_00050c52 175} 176 177# Transitive constraints 178# 179do_setup_rec_test 10.1 { 180 CREATE TABLE t5(a, b); 181 CREATE TABLE t6(c, d); 182} { 183 SELECT * FROM t5, t6 WHERE a=? AND b=c AND c=? 184} { 185 CREATE INDEX t5_idx_000123a7 ON t5(a, b) 186 CREATE INDEX t6_idx_00000063 ON t6(c) 187 0|0|1|SEARCH TABLE t6 USING INDEX t6_idx_00000063 (c=?) 188 0|1|0|SEARCH TABLE t5 USING COVERING INDEX t5_idx_000123a7 (a=? AND b=?) 189} 190 191finish_test 192