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.6 2004/06/26 09:50:12 danielk1977 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 set ::DB [sqlite3 db test2.db] 44 execsql { 45 CREATE TABLE t1(a,b); 46 INSERT INTO t1 VALUES(1,2); 47 } 48 catchsql2 { 49 SELECT * FROM t1 50 } 51} {0 {a b 1 2}} 52do_test misuse-1.2 { 53 catchsql2 { 54 SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1 55 } 56} {1 {no such function: x_coalesce}} 57do_test misuse-1.3 { 58 sqlite3_create_function $::DB 59 catchsql2 { 60 SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1 61 } 62} {0 {xyz 1}} 63 64# Use the x_sqlite_exec() SQL function to simulate the effect of two 65# threads trying to use the same database at the same time. 66# 67# It used to be prohibited to invoke sqlite_exec() from within a function, 68# but that has changed. The following tests used to cause errors but now 69# they do not. 70# 71do_test misuse-1.4 { 72 catchsql2 { 73 SELECT x_sqlite_exec('SELECT * FROM t1') AS xyz; 74 } 75} {0 {xyz {1 2}}} 76do_test misuse-1.5 { 77 catchsql2 {SELECT * FROM t1} 78} {0 {a b 1 2}} 79do_test misuse-1.6 { 80 catchsql { 81 SELECT * FROM t1 82 } 83} {0 {1 2}} 84 85# Attempt to register a new SQL function while an sqlite_exec() is active. 86# 87do_test misuse-2.1 { 88 db close 89 set ::DB [sqlite3 db test2.db] 90 execsql { 91 SELECT * FROM t1 92 } 93} {1 2} 94do_test misuse-2.2 { 95 catchsql2 {SELECT * FROM t1} 96} {0 {a b 1 2}} 97do_test misuse-2.3 { 98 set v [catch { 99 db eval {SELECT * FROM t1} {} { 100 sqlite3_create_function $::DB 101 } 102 } msg] 103 lappend v $msg 104} {1 {library routine called out of sequence}} 105do_test misuse-2.4 { 106 catchsql2 {SELECT * FROM t1} 107} {1 {library routine called out of sequence}} 108do_test misuse-2.5 { 109 catchsql { 110 SELECT * FROM t1 111 } 112} {1 {library routine called out of sequence}} 113 114# Attempt to register a new SQL aggregate while an sqlite_exec() is active. 115# 116do_test misuse-3.1 { 117 db close 118 set ::DB [sqlite3 db test2.db] 119 execsql { 120 SELECT * FROM t1 121 } 122} {1 2} 123do_test misuse-3.2 { 124 catchsql2 {SELECT * FROM t1} 125} {0 {a b 1 2}} 126do_test misuse-3.3 { 127 set v [catch { 128 db eval {SELECT * FROM t1} {} { 129 sqlite3_create_aggregate $::DB 130 } 131 } msg] 132 lappend v $msg 133} {1 {library routine called out of sequence}} 134do_test misuse-3.4 { 135 catchsql2 {SELECT * FROM t1} 136} {1 {library routine called out of sequence}} 137do_test misuse-3.5 { 138 catchsql { 139 SELECT * FROM t1 140 } 141} {1 {library routine called out of sequence}} 142 143# Attempt to close the database from an sqlite_exec callback. 144# 145# Update for v3: The db cannot be closed because there are active 146# VMs. The sqlite3_close call would return SQLITE_BUSY. 147do_test misuse-4.1 { 148 db close 149 set ::DB [sqlite3 db test2.db] 150 execsql { 151 SELECT * FROM t1 152 } 153} {1 2} 154do_test misuse-4.2 { 155 catchsql2 {SELECT * FROM t1} 156} {0 {a b 1 2}} 157do_test misuse-4.3 { 158 set v [catch { 159 db eval {SELECT * FROM t1} {} { 160 set r [sqlite3_close $::DB] 161 } 162 } msg] 163 lappend v $msg $r 164} {0 {} SQLITE_BUSY} 165do_test misuse-4.4 { 166 sqlite3_close $::DB 167 catchsql2 {SELECT * FROM t1} 168} {1 {library routine called out of sequence}} 169do_test misuse-4.5 { 170 catchsql { 171 SELECT * FROM t1 172 } 173} {1 {library routine called out of sequence}} 174 175# Attempt to use a database after it has been closed. 176# 177do_test misuse-5.1 { 178 db close 179 set ::DB [sqlite3 db test2.db] 180 execsql { 181 SELECT * FROM t1 182 } 183} {1 2} 184do_test misuse-5.2 { 185 catchsql2 {SELECT * FROM t1} 186} {0 {a b 1 2}} 187do_test misuse-5.3 { 188 db close 189 set r [catch { 190 sqlite3_prepare $::DB {SELECT * FROM t1} -1 TAIL 191 } msg] 192 lappend r $msg 193} {1 {(21) library routine called out of sequence}} 194 195finish_test 196