xref: /illumos-gate/usr/src/lib/libsqlite/test/misuse.test (revision 1da57d551424de5a9d469760be7c4b4d4f10a755)
1*1da57d55SToomas Soome#
2c5c4113dSnw141292# 2002 May 10
3c5c4113dSnw141292#
4c5c4113dSnw141292# The author disclaims copyright to this source code.  In place of
5c5c4113dSnw141292# a legal notice, here is a blessing:
6c5c4113dSnw141292#
7c5c4113dSnw141292#    May you do good and not evil.
8c5c4113dSnw141292#    May you find forgiveness for yourself and forgive others.
9c5c4113dSnw141292#    May you share freely, never taking more than you give.
10c5c4113dSnw141292#
11c5c4113dSnw141292#***********************************************************************
12c5c4113dSnw141292# This file implements regression tests for SQLite library.
13c5c4113dSnw141292#
14c5c4113dSnw141292# This file implements tests for the SQLITE_MISUSE detection logic.
15c5c4113dSnw141292# This test file leaks memory and file descriptors.
16c5c4113dSnw141292#
17c5c4113dSnw141292# $Id: misuse.test,v 1.4 2004/01/07 19:24:48 drh Exp $
18c5c4113dSnw141292
19c5c4113dSnw141292set testdir [file dirname $argv0]
20c5c4113dSnw141292source $testdir/tester.tcl
21c5c4113dSnw141292
22c5c4113dSnw141292# Make sure the test logic works
23c5c4113dSnw141292#
24c5c4113dSnw141292do_test misuse-1.1 {
25c5c4113dSnw141292  db close
26c5c4113dSnw141292  catch {file delete -force test2.db}
27c5c4113dSnw141292  set ::DB [sqlite db test2.db]
28c5c4113dSnw141292  execsql {
29c5c4113dSnw141292    CREATE TABLE t1(a,b);
30c5c4113dSnw141292    INSERT INTO t1 VALUES(1,2);
31c5c4113dSnw141292  }
32c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT * FROM t1} {}
33c5c4113dSnw141292} {0 {a b 1 2}}
34c5c4113dSnw141292do_test misuse-1.2 {
35c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1} {}
36c5c4113dSnw141292} {1 {no such function: x_coalesce}}
37c5c4113dSnw141292do_test misuse-1.3 {
38c5c4113dSnw141292  sqlite_create_function $::DB
39c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1} {}
40c5c4113dSnw141292} {0 {xyz 1}}
41c5c4113dSnw141292
42c5c4113dSnw141292# Use the x_sqlite_exec() SQL function to simulate the effect of two
43c5c4113dSnw141292# threads trying to use the same database at the same time.
44c5c4113dSnw141292#
45c5c4113dSnw141292# It used to be prohibited to invoke sqlite_exec() from within a function,
46c5c4113dSnw141292# but that has changed.  The following tests used to cause errors but now
47c5c4113dSnw141292# they do not.
48c5c4113dSnw141292#
49c5c4113dSnw141292do_test misuse-1.4 {
50c5c4113dSnw141292  sqlite_exec_printf $::DB {
51c5c4113dSnw141292     SELECT x_sqlite_exec('SELECT * FROM t1') AS xyz;
52c5c4113dSnw141292  } {}
53c5c4113dSnw141292} {0 {xyz {1 2}}}
54c5c4113dSnw141292do_test misuse-1.5 {
55c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT * FROM t1} {}
56c5c4113dSnw141292} {0 {a b 1 2}}
57c5c4113dSnw141292do_test misuse-1.6 {
58c5c4113dSnw141292  catchsql {
59c5c4113dSnw141292    SELECT * FROM t1
60c5c4113dSnw141292  }
61c5c4113dSnw141292} {0 {1 2}}
62c5c4113dSnw141292
63c5c4113dSnw141292# Attempt to register a new SQL function while an sqlite_exec() is active.
64c5c4113dSnw141292#
65c5c4113dSnw141292do_test misuse-2.1 {
66c5c4113dSnw141292  db close
67c5c4113dSnw141292  set ::DB [sqlite db test2.db]
68c5c4113dSnw141292  execsql {
69c5c4113dSnw141292    SELECT * FROM t1
70c5c4113dSnw141292  }
71c5c4113dSnw141292} {1 2}
72c5c4113dSnw141292do_test misuse-2.2 {
73c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT * FROM t1} {}
74c5c4113dSnw141292} {0 {a b 1 2}}
75c5c4113dSnw141292do_test misuse-2.3 {
76c5c4113dSnw141292  set v [catch {
77c5c4113dSnw141292    db eval {SELECT * FROM t1} {} {
78c5c4113dSnw141292      sqlite_create_function $::DB
79c5c4113dSnw141292    }
80c5c4113dSnw141292  } msg]
81c5c4113dSnw141292  lappend v $msg
82c5c4113dSnw141292} {1 {library routine called out of sequence}}
83c5c4113dSnw141292do_test misuse-2.4 {
84c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT * FROM t1} {}
85c5c4113dSnw141292} {21 {library routine called out of sequence}}
86c5c4113dSnw141292do_test misuse-2.5 {
87c5c4113dSnw141292  catchsql {
88c5c4113dSnw141292    SELECT * FROM t1
89c5c4113dSnw141292  }
90c5c4113dSnw141292} {1 {library routine called out of sequence}}
91c5c4113dSnw141292
92c5c4113dSnw141292# Attempt to register a new SQL aggregate while an sqlite_exec() is active.
93c5c4113dSnw141292#
94c5c4113dSnw141292do_test misuse-3.1 {
95c5c4113dSnw141292  db close
96c5c4113dSnw141292  set ::DB [sqlite db test2.db]
97c5c4113dSnw141292  execsql {
98c5c4113dSnw141292    SELECT * FROM t1
99c5c4113dSnw141292  }
100c5c4113dSnw141292} {1 2}
101c5c4113dSnw141292do_test misuse-3.2 {
102c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT * FROM t1} {}
103c5c4113dSnw141292} {0 {a b 1 2}}
104c5c4113dSnw141292do_test misuse-3.3 {
105c5c4113dSnw141292  set v [catch {
106c5c4113dSnw141292    db eval {SELECT * FROM t1} {} {
107c5c4113dSnw141292      sqlite_create_aggregate $::DB
108c5c4113dSnw141292    }
109c5c4113dSnw141292  } msg]
110c5c4113dSnw141292  lappend v $msg
111c5c4113dSnw141292} {1 {library routine called out of sequence}}
112c5c4113dSnw141292do_test misuse-3.4 {
113c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT * FROM t1} {}
114c5c4113dSnw141292} {21 {library routine called out of sequence}}
115c5c4113dSnw141292do_test misuse-3.5 {
116c5c4113dSnw141292  catchsql {
117c5c4113dSnw141292    SELECT * FROM t1
118c5c4113dSnw141292  }
119c5c4113dSnw141292} {1 {library routine called out of sequence}}
120c5c4113dSnw141292
121c5c4113dSnw141292# Attempt to close the database from an sqlite_exec callback.
122c5c4113dSnw141292#
123c5c4113dSnw141292do_test misuse-4.1 {
124c5c4113dSnw141292  db close
125c5c4113dSnw141292  set ::DB [sqlite db test2.db]
126c5c4113dSnw141292  execsql {
127c5c4113dSnw141292    SELECT * FROM t1
128c5c4113dSnw141292  }
129c5c4113dSnw141292} {1 2}
130c5c4113dSnw141292do_test misuse-4.2 {
131c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT * FROM t1} {}
132c5c4113dSnw141292} {0 {a b 1 2}}
133c5c4113dSnw141292do_test misuse-4.3 {
134c5c4113dSnw141292  set v [catch {
135c5c4113dSnw141292    db eval {SELECT * FROM t1} {} {
136c5c4113dSnw141292      sqlite_close $::DB
137c5c4113dSnw141292    }
138c5c4113dSnw141292  } msg]
139c5c4113dSnw141292  lappend v $msg
140c5c4113dSnw141292} {1 {library routine called out of sequence}}
141c5c4113dSnw141292do_test misuse-4.4 {
142c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT * FROM t1} {}
143c5c4113dSnw141292} {21 {library routine called out of sequence}}
144c5c4113dSnw141292do_test misuse-4.5 {
145c5c4113dSnw141292  catchsql {
146c5c4113dSnw141292    SELECT * FROM t1
147c5c4113dSnw141292  }
148c5c4113dSnw141292} {1 {library routine called out of sequence}}
149c5c4113dSnw141292
150c5c4113dSnw141292# Attempt to use a database after it has been closed.
151c5c4113dSnw141292#
152c5c4113dSnw141292do_test misuse-5.1 {
153c5c4113dSnw141292  db close
154c5c4113dSnw141292  set ::DB [sqlite db test2.db]
155c5c4113dSnw141292  execsql {
156c5c4113dSnw141292    SELECT * FROM t1
157c5c4113dSnw141292  }
158c5c4113dSnw141292} {1 2}
159c5c4113dSnw141292do_test misuse-5.2 {
160c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT * FROM t1} {}
161c5c4113dSnw141292} {0 {a b 1 2}}
162c5c4113dSnw141292do_test misuse-5.3 {
163c5c4113dSnw141292  db close
164c5c4113dSnw141292  sqlite_exec_printf $::DB {SELECT * FROM t1} {}
165c5c4113dSnw141292} {21 {library routine called out of sequence}}
166c5c4113dSnw141292
167c5c4113dSnw141292finish_test
168