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