xref: /sqlite-3.40.0/test/misuse.test (revision e35ee196)
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