| OLD | NEW | 
 | (Empty) | 
|    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  |  | 
|   18 set testdir [file dirname $argv0] |  | 
|   19 source $testdir/tester.tcl |  | 
|   20  |  | 
|   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 |  | 
|   35 } |  | 
|   36  |  | 
|   37  |  | 
|   38 # Make sure the test logic works |  | 
|   39 # |  | 
|   40 do_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}} |  | 
|   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}} |  | 
|   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 # |  | 
|   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}}} |  | 
|   78 } |  | 
|   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}} |  | 
|   87  |  | 
|   88 # Attempt to register a new SQL function while an sqlite_exec() is active. |  | 
|   89 # |  | 
|   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}} |  | 
|  100  |  | 
|  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}} |  | 
|  119  |  | 
|  120 # Attempt to register a new SQL aggregate while an sqlite_exec() is active. |  | 
|  121 # |  | 
|  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}} |  | 
|  132  |  | 
|  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}} |  | 
|  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. |  | 
|  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} |  | 
|  174 do_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}} |  | 
|  181 do_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 # |  | 
|  189 do_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} |  | 
|  196 do_test misuse-5.2 { |  | 
|  197   catchsql2 {SELECT * FROM t1} |  | 
|  198 } {0 {a b 1 2}} |  | 
|  199 do_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  |  | 
|  207 finish_test |  | 
| OLD | NEW |