Annotation of embedaddon/sqlite3/test/misuse.test, revision 1.1.1.1
1.1 misho 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.11 2006/01/03 00:33:50 drh Exp $
17:
18: set testdir [file dirname $argv0]
19: source $testdir/tester.tcl
20:
21: proc 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: #
40: do_test misuse-1.1 {
41: db close
42: catch {forcedelete test2.db}
43: catch {forcedelete test2.db-journal}
44: sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
45: execsql {
46: CREATE TABLE t1(a,b);
47: INSERT INTO t1 VALUES(1,2);
48: }
49: catchsql2 {
50: SELECT * FROM t1
51: }
52: } {0 {a b 1 2}}
53: do_test misuse-1.2 {
54: catchsql2 {
55: SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1
56: }
57: } {1 {no such function: x_coalesce}}
58: do_test misuse-1.3 {
59: sqlite3_create_function $::DB
60: catchsql2 {
61: SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1
62: }
63: } {0 {xyz 1}}
64:
65: # Use the x_sqlite_exec() SQL function to simulate the effect of two
66: # threads trying to use the same database at the same time.
67: #
68: # It used to be prohibited to invoke sqlite_exec() from within a function,
69: # but that has changed. The following tests used to cause errors but now
70: # they do not.
71: #
72: ifcapable {utf16} {
73: do_test misuse-1.4 {
74: catchsql2 {
75: SELECT x_sqlite_exec('SELECT * FROM t1') AS xyz;
76: }
77: } {0 {xyz {1 2}}}
78: }
79: do_test misuse-1.5 {
80: catchsql2 {SELECT * FROM t1}
81: } {0 {a b 1 2}}
82: do_test misuse-1.6 {
83: catchsql {
84: SELECT * FROM t1
85: }
86: } {0 {1 2}}
87:
88: # Attempt to register a new SQL function while an sqlite_exec() is active.
89: #
90: do_test misuse-2.1 {
91: db close
92: sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
93: execsql {
94: SELECT * FROM t1
95: }
96: } {1 2}
97: do_test misuse-2.2 {
98: catchsql2 {SELECT * FROM t1}
99: } {0 {a b 1 2}}
100:
101: # We used to disallow creating new function from within an exec().
102: # But now this is acceptable.
103: do_test misuse-2.3 {
104: set v [catch {
105: db eval {SELECT * FROM t1} {} {
106: sqlite3_create_function $::DB
107: }
108: } msg]
109: lappend v $msg
110: } {0 {}}
111: do_test misuse-2.4 {
112: catchsql2 {SELECT * FROM t1}
113: } {0 {a b 1 2}}
114: do_test misuse-2.5 {
115: catchsql {
116: SELECT * FROM t1
117: }
118: } {0 {1 2}}
119:
120: # Attempt to register a new SQL aggregate while an sqlite_exec() is active.
121: #
122: do_test misuse-3.1 {
123: db close
124: sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
125: execsql {
126: SELECT * FROM t1
127: }
128: } {1 2}
129: do_test misuse-3.2 {
130: catchsql2 {SELECT * FROM t1}
131: } {0 {a b 1 2}}
132:
133: # We used to disallow creating new function from within an exec().
134: # But now this is acceptable.
135: do_test misuse-3.3 {
136: set v [catch {
137: db eval {SELECT * FROM t1} {} {
138: sqlite3_create_aggregate $::DB
139: }
140: } msg]
141: lappend v $msg
142: } {0 {}}
143: do_test misuse-3.4 {
144: catchsql2 {SELECT * FROM t1}
145: } {0 {a b 1 2}}
146: do_test misuse-3.5 {
147: catchsql {
148: SELECT * FROM t1
149: }
150: } {0 {1 2}}
151:
152: # Attempt to close the database from an sqlite_exec callback.
153: #
154: # Update for v3: The db cannot be closed because there are active
155: # VMs. The sqlite3_close call would return SQLITE_BUSY.
156: do_test misuse-4.1 {
157: db close
158: sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
159: execsql {
160: SELECT * FROM t1
161: }
162: } {1 2}
163: do_test misuse-4.2 {
164: catchsql2 {SELECT * FROM t1}
165: } {0 {a b 1 2}}
166: do_test misuse-4.3 {
167: set v [catch {
168: db eval {SELECT * FROM t1} {} {
169: set r [sqlite3_close $::DB]
170: }
171: } msg]
172: lappend v $msg $r
173: } {0 {} SQLITE_BUSY}
174: do_test misuse-4.4 {
175: # Flush the TCL statement cache here, otherwise the sqlite3_close() will
176: # fail because there are still un-finalized() VDBEs.
177: db cache flush
178: sqlite3_close $::DB
179: catchsql2 {SELECT * FROM t1}
180: } {1 {library routine called out of sequence}}
181: do_test misuse-4.5 {
182: catchsql {
183: SELECT * FROM t1
184: }
185: } {1 {library routine called out of sequence}}
186:
187: # Attempt to use a database after it has been closed.
188: #
189: do_test misuse-5.1 {
190: db close
191: sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
192: execsql {
193: SELECT * FROM t1
194: }
195: } {1 2}
196: do_test misuse-5.2 {
197: catchsql2 {SELECT * FROM t1}
198: } {0 {a b 1 2}}
199: do_test misuse-5.3 {
200: db close
201: set r [catch {
202: sqlite3_prepare $::DB {SELECT * FROM t1} -1 TAIL
203: } msg]
204: lappend r $msg
205: } {1 {(21) library routine called out of sequence}}
206:
207: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>