/trunk/src/sqlite/test/misuse.test
Unknown | 207 lines | 195 code | 12 blank | 0 comment | 0 complexity | 70b8773afd77dd5f9cb1cc4a22c951e2 MD5 | raw file
Possible License(s): BSD-3-Clause
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 18set testdir [file dirname $argv0] 19source $testdir/tester.tcl 20 21proc 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# 40do_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}} 53do_test misuse-1.2 { 54 catchsql2 { 55 SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1 56 } 57} {1 {no such function: x_coalesce}} 58do_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# 72ifcapable {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} 79do_test misuse-1.5 { 80 catchsql2 {SELECT * FROM t1} 81} {0 {a b 1 2}} 82do_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# 90do_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} 97do_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. 103do_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 {}} 111do_test misuse-2.4 { 112 catchsql2 {SELECT * FROM t1} 113} {0 {a b 1 2}} 114do_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# 122do_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} 129do_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. 135do_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 {}} 143do_test misuse-3.4 { 144 catchsql2 {SELECT * FROM t1} 145} {0 {a b 1 2}} 146do_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. 156do_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} 163do_test misuse-4.2 { 164 catchsql2 {SELECT * FROM t1} 165} {0 {a b 1 2}} 166do_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} 174do_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}} 181do_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# 189do_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} 196do_test misuse-5.2 { 197 catchsql2 {SELECT * FROM t1} 198} {0 {a b 1 2}} 199do_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 207finish_test