fix conversion back to original journal_mode after migration
[sqlcipher.git] / test / misuse.test
blobe15cf3357e7fea4b2fb3e1211bb75abc9cd4f194
1 # 2002 May 10
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.
13 # This file implements tests for the SQLITE_MISUSE detection logic.
14 # This test file leaks memory and file descriptors.
16 # $Id: misuse.test,v 1.11 2006/01/03 00:33:50 drh Exp $
18 set testdir [file dirname $argv0]
19 source $testdir/tester.tcl
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
38 # Make sure the test logic works
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}}
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.
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.
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}}}
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}}
88 # Attempt to register a new SQL function while an sqlite_exec() is active.
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}}
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}}
120 # Attempt to register a new SQL aggregate while an sqlite_exec() is active.
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}}
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}}
152 # Attempt to close the database from an sqlite_exec callback.
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}
175 if {[clang_sanitize_address]==0} {
176   do_test misuse-4.4 {
177   # Flush the TCL statement cache here, otherwise the sqlite3_close() will
178   # fail because there are still un-finalized() VDBEs.
179     db cache flush
180       sqlite3_close $::DB
181       catchsql2 {SELECT * FROM t1}
182   } {1 {bad parameter or other API misuse}}
183   do_test misuse-4.5 {
184     catchsql {
185       SELECT * FROM t1
186     }
187   } {1 {bad parameter or other API misuse}}
189   # Attempt to use a database after it has been closed.
190   #
191   do_test misuse-5.1 {
192     db close
193       sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db]
194       execsql {
195         SELECT * FROM t1
196       }
197   } {1 2}
198   do_test misuse-5.2 {
199     catchsql2 {SELECT * FROM t1}
200   } {0 {a b 1 2}}
201   do_test misuse-5.3 {
202     db close
203       set r [catch {
204         sqlite3_prepare $::DB {SELECT * FROM t1} -1 TAIL
205       } msg]
206     lappend r $msg
207   } {1 {(21) bad parameter or other API misuse}}
210 finish_test