1 # 2002 May 10 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 # This file implements regression tests for SQLite library. 12 # 13 # This file implements tests for the SQLITE_MISUSE detection logic. 14 # This test file leaks memory and file descriptors. 15 # 16 # $Id: misuse.test,v 1.11 2006/01/03 00:33:50 drh Exp $ 17 18 set testdir [file dirname $argv0] 19 source $testdir/tester.tcl 20 21 proc catchsql2 {sql} { 22 set r [ 23 catch { 24 set res [list] 25 db eval $sql data { 26 if { $res==[list] } { 27 foreach f $data(*) {lappend res $f} 28 } 29 foreach f $data(*) {lappend res $data($f)} 30 } 31 set res 32 } msg 33 ] 34 lappend r $msg 35 } 36 37 38 # Make sure the test logic works 39 # 40 do_test misuse-1.1 { 41 db close 42 catch {file delete -force test2.db} 43 catch {file delete -force test2.db-journal} 44 sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db] 45 execsql { 46 CREATE TABLE t1(a,b); 47 INSERT INTO t1 VALUES(1,2); 48 } 49 catchsql2 { 50 SELECT * FROM t1 51 } 52 } {0 {a b 1 2}} 53 do_test misuse-1.2 { 54 catchsql2 { 55 SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1 56 } 57 } {1 {no such function: x_coalesce}} 58 do_test misuse-1.3 { 59 sqlite3_create_function $::DB 60 catchsql2 { 61 SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1 62 } 63 } {0 {xyz 1}} 64 65 # Use the x_sqlite_exec() SQL function to simulate the effect of two 66 # threads trying to use the same database at the same time. 67 # 68 # It used to be prohibited to invoke sqlite_exec() from within a function, 69 # but that has changed. The following tests used to cause errors but now 70 # they do not. 71 # 72 ifcapable {utf16} { 73 do_test misuse-1.4 { 74 catchsql2 { 75 SELECT x_sqlite_exec('SELECT * FROM t1') AS xyz; 76 } 77 } {0 {xyz {1 2}}} 78 } 79 do_test misuse-1.5 { 80 catchsql2 {SELECT * FROM t1} 81 } {0 {a b 1 2}} 82 do_test misuse-1.6 { 83 catchsql { 84 SELECT * FROM t1 85 } 86 } {0 {1 2}} 87 88 # Attempt to register a new SQL function while an sqlite_exec() is active. 89 # 90 do_test misuse-2.1 { 91 db close 92 sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db] 93 execsql { 94 SELECT * FROM t1 95 } 96 } {1 2} 97 do_test misuse-2.2 { 98 catchsql2 {SELECT * FROM t1} 99 } {0 {a b 1 2}} 100 101 # We used to disallow creating new function from within an exec(). 102 # But now this is acceptable. 103 do_test misuse-2.3 { 104 set v [catch { 105 db eval {SELECT * FROM t1} {} { 106 sqlite3_create_function $::DB 107 } 108 } msg] 109 lappend v $msg 110 } {0 {}} 111 do_test misuse-2.4 { 112 catchsql2 {SELECT * FROM t1} 113 } {0 {a b 1 2}} 114 do_test misuse-2.5 { 115 catchsql { 116 SELECT * FROM t1 117 } 118 } {0 {1 2}} 119 120 # Attempt to register a new SQL aggregate while an sqlite_exec() is active. 121 # 122 do_test misuse-3.1 { 123 db close 124 sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db] 125 execsql { 126 SELECT * FROM t1 127 } 128 } {1 2} 129 do_test misuse-3.2 { 130 catchsql2 {SELECT * FROM t1} 131 } {0 {a b 1 2}} 132 133 # We used to disallow creating new function from within an exec(). 134 # But now this is acceptable. 135 do_test misuse-3.3 { 136 set v [catch { 137 db eval {SELECT * FROM t1} {} { 138 sqlite3_create_aggregate $::DB 139 } 140 } msg] 141 lappend v $msg 142 } {0 {}} 143 do_test misuse-3.4 { 144 catchsql2 {SELECT * FROM t1} 145 } {0 {a b 1 2}} 146 do_test misuse-3.5 { 147 catchsql { 148 SELECT * FROM t1 149 } 150 } {0 {1 2}} 151 152 # Attempt to close the database from an sqlite_exec callback. 153 # 154 # Update for v3: The db cannot be closed because there are active 155 # VMs. The sqlite3_close call would return SQLITE_BUSY. 156 do_test misuse-4.1 { 157 db close 158 sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db] 159 execsql { 160 SELECT * FROM t1 161 } 162 } {1 2} 163 do_test misuse-4.2 { 164 catchsql2 {SELECT * FROM t1} 165 } {0 {a b 1 2}} 166 do_test misuse-4.3 { 167 set v [catch { 168 db eval {SELECT * FROM t1} {} { 169 set r [sqlite3_close $::DB] 170 } 171 } msg] 172 lappend v $msg $r 173 } {0 {} SQLITE_BUSY} 174 do_test misuse-4.4 { 175 # Flush the TCL statement cache here, otherwise the sqlite3_close() will 176 # fail because there are still un-finalized() VDBEs. 177 db cache flush 178 sqlite3_close $::DB 179 catchsql2 {SELECT * FROM t1} 180 } {1 {library routine called out of sequence}} 181 do_test misuse-4.5 { 182 catchsql { 183 SELECT * FROM t1 184 } 185 } {1 {library routine called out of sequence}} 186 187 # Attempt to use a database after it has been closed. 188 # 189 do_test misuse-5.1 { 190 db close 191 sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db] 192 execsql { 193 SELECT * FROM t1 194 } 195 } {1 2} 196 do_test misuse-5.2 { 197 catchsql2 {SELECT * FROM t1} 198 } {0 {a b 1 2}} 199 do_test misuse-5.3 { 200 db close 201 set r [catch { 202 sqlite3_prepare $::DB {SELECT * FROM t1} -1 TAIL 203 } msg] 204 lappend r $msg 205 } {1 {(21) library routine called out of sequence}} 206 207 finish_test 208