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