1# 2# 2002 May 10 3# 4# The author disclaims copyright to this source code. In place of 5# a legal notice, here is a blessing: 6# 7# May you do good and not evil. 8# May you find forgiveness for yourself and forgive others. 9# May you share freely, never taking more than you give. 10# 11#*********************************************************************** 12# This file implements regression tests for SQLite library. 13# 14# This file implements tests for the SQLITE_MISUSE detection logic. 15# This test file leaks memory and file descriptors. 16# 17# $Id: misuse.test,v 1.4 2004/01/07 19:24:48 drh Exp $ 18 19set testdir [file dirname $argv0] 20source $testdir/tester.tcl 21 22# Make sure the test logic works 23# 24do_test misuse-1.1 { 25 db close 26 catch {file delete -force test2.db} 27 set ::DB [sqlite db test2.db] 28 execsql { 29 CREATE TABLE t1(a,b); 30 INSERT INTO t1 VALUES(1,2); 31 } 32 sqlite_exec_printf $::DB {SELECT * FROM t1} {} 33} {0 {a b 1 2}} 34do_test misuse-1.2 { 35 sqlite_exec_printf $::DB {SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1} {} 36} {1 {no such function: x_coalesce}} 37do_test misuse-1.3 { 38 sqlite_create_function $::DB 39 sqlite_exec_printf $::DB {SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1} {} 40} {0 {xyz 1}} 41 42# Use the x_sqlite_exec() SQL function to simulate the effect of two 43# threads trying to use the same database at the same time. 44# 45# It used to be prohibited to invoke sqlite_exec() from within a function, 46# but that has changed. The following tests used to cause errors but now 47# they do not. 48# 49do_test misuse-1.4 { 50 sqlite_exec_printf $::DB { 51 SELECT x_sqlite_exec('SELECT * FROM t1') AS xyz; 52 } {} 53} {0 {xyz {1 2}}} 54do_test misuse-1.5 { 55 sqlite_exec_printf $::DB {SELECT * FROM t1} {} 56} {0 {a b 1 2}} 57do_test misuse-1.6 { 58 catchsql { 59 SELECT * FROM t1 60 } 61} {0 {1 2}} 62 63# Attempt to register a new SQL function while an sqlite_exec() is active. 64# 65do_test misuse-2.1 { 66 db close 67 set ::DB [sqlite db test2.db] 68 execsql { 69 SELECT * FROM t1 70 } 71} {1 2} 72do_test misuse-2.2 { 73 sqlite_exec_printf $::DB {SELECT * FROM t1} {} 74} {0 {a b 1 2}} 75do_test misuse-2.3 { 76 set v [catch { 77 db eval {SELECT * FROM t1} {} { 78 sqlite_create_function $::DB 79 } 80 } msg] 81 lappend v $msg 82} {1 {library routine called out of sequence}} 83do_test misuse-2.4 { 84 sqlite_exec_printf $::DB {SELECT * FROM t1} {} 85} {21 {library routine called out of sequence}} 86do_test misuse-2.5 { 87 catchsql { 88 SELECT * FROM t1 89 } 90} {1 {library routine called out of sequence}} 91 92# Attempt to register a new SQL aggregate while an sqlite_exec() is active. 93# 94do_test misuse-3.1 { 95 db close 96 set ::DB [sqlite db test2.db] 97 execsql { 98 SELECT * FROM t1 99 } 100} {1 2} 101do_test misuse-3.2 { 102 sqlite_exec_printf $::DB {SELECT * FROM t1} {} 103} {0 {a b 1 2}} 104do_test misuse-3.3 { 105 set v [catch { 106 db eval {SELECT * FROM t1} {} { 107 sqlite_create_aggregate $::DB 108 } 109 } msg] 110 lappend v $msg 111} {1 {library routine called out of sequence}} 112do_test misuse-3.4 { 113 sqlite_exec_printf $::DB {SELECT * FROM t1} {} 114} {21 {library routine called out of sequence}} 115do_test misuse-3.5 { 116 catchsql { 117 SELECT * FROM t1 118 } 119} {1 {library routine called out of sequence}} 120 121# Attempt to close the database from an sqlite_exec callback. 122# 123do_test misuse-4.1 { 124 db close 125 set ::DB [sqlite db test2.db] 126 execsql { 127 SELECT * FROM t1 128 } 129} {1 2} 130do_test misuse-4.2 { 131 sqlite_exec_printf $::DB {SELECT * FROM t1} {} 132} {0 {a b 1 2}} 133do_test misuse-4.3 { 134 set v [catch { 135 db eval {SELECT * FROM t1} {} { 136 sqlite_close $::DB 137 } 138 } msg] 139 lappend v $msg 140} {1 {library routine called out of sequence}} 141do_test misuse-4.4 { 142 sqlite_exec_printf $::DB {SELECT * FROM t1} {} 143} {21 {library routine called out of sequence}} 144do_test misuse-4.5 { 145 catchsql { 146 SELECT * FROM t1 147 } 148} {1 {library routine called out of sequence}} 149 150# Attempt to use a database after it has been closed. 151# 152do_test misuse-5.1 { 153 db close 154 set ::DB [sqlite db test2.db] 155 execsql { 156 SELECT * FROM t1 157 } 158} {1 2} 159do_test misuse-5.2 { 160 sqlite_exec_printf $::DB {SELECT * FROM t1} {} 161} {0 {a b 1 2}} 162do_test misuse-5.3 { 163 db close 164 sqlite_exec_printf $::DB {SELECT * FROM t1} {} 165} {21 {library routine called out of sequence}} 166 167finish_test 168