• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {file delete -force test2.db}
43  catch {file delete -force 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}
174do_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}}
181do_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#
189do_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}
196do_test misuse-5.2 {
197  catchsql2 {SELECT * FROM t1}
198} {0 {a b 1 2}}
199do_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
207finish_test
208