PageRenderTime 32ms CodeModel.GetById 29ms app.highlight 2ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/src/sqlite/test/misuse.test

#
Unknown | 207 lines | 195 code | 12 blank | 0 comment | 0 complexity | 70b8773afd77dd5f9cb1cc4a22c951e2 MD5 | raw file
Possible License(s): BSD-3-Clause
  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