xref: /sqlite-3.40.0/test/misuse.test (revision bd41d566)
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
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 {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}}
53do_test misuse-1.2 {
54  catchsql2 {
55    SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1
56  }
57} {1 {no such function: x_coalesce}}
58do_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#
72ifcapable {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}
79do_test misuse-1.5 {
80  catchsql2 {SELECT * FROM t1}
81} {0 {a b 1 2}}
82do_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#
90do_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}
97do_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.
103do_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 {}}
111do_test misuse-2.4 {
112  catchsql2 {SELECT * FROM t1}
113} {0 {a b 1 2}}
114do_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#
122do_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}
129do_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.
135do_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 {}}
143do_test misuse-3.4 {
144  catchsql2 {SELECT * FROM t1}
145} {0 {a b 1 2}}
146do_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.
156do_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}
163do_test misuse-4.2 {
164  catchsql2 {SELECT * FROM t1}
165} {0 {a b 1 2}}
166do_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
175if {[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 {library routine called out of sequence}}
183  do_test misuse-4.5 {
184    catchsql {
185      SELECT * FROM t1
186    }
187  } {1 {library routine called out of sequence}}
188
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) library routine called out of sequence}}
208}
209
210finish_test
211