| OLD | NEW | 
 | (Empty) | 
|    1 # 2001 September 15 |  | 
|    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 TCL interface to the |  | 
|   12 # SQLite library.  |  | 
|   13 # |  | 
|   14 # Actually, all tests are based on the TCL interface, so the main |  | 
|   15 # interface is pretty well tested.  This file contains some addition |  | 
|   16 # tests for fringe issues that the main test suite does not cover. |  | 
|   17 # |  | 
|   18 # $Id: tclsqlite.test,v 1.73 2009/03/16 13:19:36 danielk1977 Exp $ |  | 
|   19  |  | 
|   20 set testdir [file dirname $argv0] |  | 
|   21 source $testdir/tester.tcl |  | 
|   22  |  | 
|   23 # Check the error messages generated by tclsqlite |  | 
|   24 # |  | 
|   25 if {[sqlite3 -has-codec]} { |  | 
|   26   set r "sqlite_orig HANDLE FILENAME ?-key CODEC-KEY?" |  | 
|   27 } else { |  | 
|   28   set r "sqlite3 HANDLE FILENAME ?-vfs VFSNAME? ?-readonly BOOLEAN? ?-create BOO
     LEAN? ?-nomutex BOOLEAN? ?-fullmutex BOOLEAN?" |  | 
|   29 } |  | 
|   30 do_test tcl-1.1 { |  | 
|   31   set v [catch {sqlite3 bogus} msg] |  | 
|   32   regsub {really_sqlite3} $msg {sqlite3} msg |  | 
|   33   lappend v $msg |  | 
|   34 } [list 1 "wrong # args: should be \"$r\""] |  | 
|   35 do_test tcl-1.2 { |  | 
|   36   set v [catch {db bogus} msg] |  | 
|   37   lappend v $msg |  | 
|   38 } {1 {bad option "bogus": must be authorizer, backup, busy, cache, changes, clos
     e, collate, collation_needed, commit_hook, complete, copy, enable_load_extension
     , errorcode, eval, exists, function, incrblob, interrupt, last_insert_rowid, nul
     lvalue, onecolumn, profile, progress, rekey, restore, rollback_hook, status, tim
     eout, total_changes, trace, transaction, unlock_notify, update_hook, or version}
     } |  | 
|   39 do_test tcl-1.2.1 { |  | 
|   40   set v [catch {db cache bogus} msg] |  | 
|   41   lappend v $msg |  | 
|   42 } {1 {bad option "bogus": must be flush or size}} |  | 
|   43 do_test tcl-1.2.2 { |  | 
|   44   set v [catch {db cache} msg] |  | 
|   45   lappend v $msg |  | 
|   46 } {1 {wrong # args: should be "db cache option ?arg?"}} |  | 
|   47 do_test tcl-1.3 { |  | 
|   48   execsql {CREATE TABLE t1(a int, b int)} |  | 
|   49   execsql {INSERT INTO t1 VALUES(10,20)} |  | 
|   50   set v [catch { |  | 
|   51     db eval {SELECT * FROM t1} data { |  | 
|   52       error "The error message" |  | 
|   53     } |  | 
|   54   } msg] |  | 
|   55   lappend v $msg |  | 
|   56 } {1 {The error message}} |  | 
|   57 do_test tcl-1.4 { |  | 
|   58   set v [catch { |  | 
|   59     db eval {SELECT * FROM t2} data { |  | 
|   60       error "The error message" |  | 
|   61     } |  | 
|   62   } msg] |  | 
|   63   lappend v $msg |  | 
|   64 } {1 {no such table: t2}} |  | 
|   65 do_test tcl-1.5 { |  | 
|   66   set v [catch { |  | 
|   67     db eval {SELECT * FROM t1} data { |  | 
|   68       break |  | 
|   69     } |  | 
|   70   } msg] |  | 
|   71   lappend v $msg |  | 
|   72 } {0 {}} |  | 
|   73 catch {expr x*} msg |  | 
|   74 do_test tcl-1.6 { |  | 
|   75   set v [catch { |  | 
|   76     db eval {SELECT * FROM t1} data { |  | 
|   77       expr x* |  | 
|   78     } |  | 
|   79   } msg] |  | 
|   80   lappend v $msg |  | 
|   81 } [list 1 $msg] |  | 
|   82 do_test tcl-1.7 { |  | 
|   83   set v [catch {db} msg] |  | 
|   84   lappend v $msg |  | 
|   85 } {1 {wrong # args: should be "db SUBCOMMAND ..."}} |  | 
|   86 if {[catch {db auth {}}]==0} { |  | 
|   87   do_test tcl-1.8 { |  | 
|   88     set v [catch {db authorizer 1 2 3} msg] |  | 
|   89     lappend v $msg |  | 
|   90   } {1 {wrong # args: should be "db authorizer ?CALLBACK?"}} |  | 
|   91 } |  | 
|   92 do_test tcl-1.9 { |  | 
|   93   set v [catch {db busy 1 2 3} msg] |  | 
|   94   lappend v $msg |  | 
|   95 } {1 {wrong # args: should be "db busy CALLBACK"}} |  | 
|   96 do_test tcl-1.10 { |  | 
|   97   set v [catch {db progress 1} msg] |  | 
|   98   lappend v $msg |  | 
|   99 } {1 {wrong # args: should be "db progress N CALLBACK"}} |  | 
|  100 do_test tcl-1.11 { |  | 
|  101   set v [catch {db changes xyz} msg] |  | 
|  102   lappend v $msg |  | 
|  103 } {1 {wrong # args: should be "db changes "}} |  | 
|  104 do_test tcl-1.12 { |  | 
|  105   set v [catch {db commit_hook a b c} msg] |  | 
|  106   lappend v $msg |  | 
|  107 } {1 {wrong # args: should be "db commit_hook ?CALLBACK?"}} |  | 
|  108 ifcapable {complete} { |  | 
|  109   do_test tcl-1.13 { |  | 
|  110     set v [catch {db complete} msg] |  | 
|  111     lappend v $msg |  | 
|  112   } {1 {wrong # args: should be "db complete SQL"}} |  | 
|  113 } |  | 
|  114 do_test tcl-1.14 { |  | 
|  115   set v [catch {db eval} msg] |  | 
|  116   lappend v $msg |  | 
|  117 } {1 {wrong # args: should be "db eval SQL ?ARRAY-NAME? ?SCRIPT?"}} |  | 
|  118 do_test tcl-1.15 { |  | 
|  119   set v [catch {db function} msg] |  | 
|  120   lappend v $msg |  | 
|  121 } {1 {wrong # args: should be "db function NAME [-argcount N] SCRIPT"}} |  | 
|  122 do_test tcl-1.16 { |  | 
|  123   set v [catch {db last_insert_rowid xyz} msg] |  | 
|  124   lappend v $msg |  | 
|  125 } {1 {wrong # args: should be "db last_insert_rowid "}} |  | 
|  126 do_test tcl-1.17 { |  | 
|  127   set v [catch {db rekey} msg] |  | 
|  128   lappend v $msg |  | 
|  129 } {1 {wrong # args: should be "db rekey KEY"}} |  | 
|  130 do_test tcl-1.18 { |  | 
|  131   set v [catch {db timeout} msg] |  | 
|  132   lappend v $msg |  | 
|  133 } {1 {wrong # args: should be "db timeout MILLISECONDS"}} |  | 
|  134 do_test tcl-1.19 { |  | 
|  135   set v [catch {db collate} msg] |  | 
|  136   lappend v $msg |  | 
|  137 } {1 {wrong # args: should be "db collate NAME SCRIPT"}} |  | 
|  138 do_test tcl-1.20 { |  | 
|  139   set v [catch {db collation_needed} msg] |  | 
|  140   lappend v $msg |  | 
|  141 } {1 {wrong # args: should be "db collation_needed SCRIPT"}} |  | 
|  142 do_test tcl-1.21 { |  | 
|  143   set v [catch {db total_changes xyz} msg] |  | 
|  144   lappend v $msg |  | 
|  145 } {1 {wrong # args: should be "db total_changes "}} |  | 
|  146 do_test tcl-1.20 { |  | 
|  147   set v [catch {db copy} msg] |  | 
|  148   lappend v $msg |  | 
|  149 } {1 {wrong # args: should be "db copy CONFLICT-ALGORITHM TABLE FILENAME ?SEPARA
     TOR? ?NULLINDICATOR?"}} |  | 
|  150 do_test tcl-1.21 { |  | 
|  151   set v [catch {sqlite3 db2 test.db -vfs nosuchvfs} msg] |  | 
|  152   lappend v $msg |  | 
|  153 } {1 {no such vfs: nosuchvfs}} |  | 
|  154  |  | 
|  155 catch {unset ::result} |  | 
|  156 do_test tcl-2.1 { |  | 
|  157   execsql "CREATE TABLE t\u0123x(a int, b\u1235 float)" |  | 
|  158 } {} |  | 
|  159 ifcapable schema_pragmas { |  | 
|  160   do_test tcl-2.2 { |  | 
|  161     execsql "PRAGMA table_info(t\u0123x)" |  | 
|  162   } "0 a int 0 {} 0 1 b\u1235 float 0 {} 0" |  | 
|  163 } |  | 
|  164 do_test tcl-2.3 { |  | 
|  165   execsql "INSERT INTO t\u0123x VALUES(1,2.3)" |  | 
|  166   db eval "SELECT * FROM t\u0123x" result break |  | 
|  167   set result(*) |  | 
|  168 } "a b\u1235" |  | 
|  169  |  | 
|  170  |  | 
|  171 # Test the onecolumn method |  | 
|  172 # |  | 
|  173 do_test tcl-3.1 { |  | 
|  174   execsql { |  | 
|  175     INSERT INTO t1 SELECT a*2, b*2 FROM t1; |  | 
|  176     INSERT INTO t1 SELECT a*2+1, b*2+1 FROM t1; |  | 
|  177     INSERT INTO t1 SELECT a*2+3, b*2+3 FROM t1; |  | 
|  178   } |  | 
|  179   set rc [catch {db onecolumn {SELECT * FROM t1 ORDER BY a}} msg] |  | 
|  180   lappend rc $msg |  | 
|  181 } {0 10} |  | 
|  182 do_test tcl-3.2 { |  | 
|  183   db onecolumn {SELECT * FROM t1 WHERE a<0} |  | 
|  184 } {} |  | 
|  185 do_test tcl-3.3 { |  | 
|  186   set rc [catch {db onecolumn} errmsg] |  | 
|  187   lappend rc $errmsg |  | 
|  188 } {1 {wrong # args: should be "db onecolumn SQL"}} |  | 
|  189 do_test tcl-3.4 { |  | 
|  190   set rc [catch {db onecolumn {SELECT bogus}} errmsg] |  | 
|  191   lappend rc $errmsg |  | 
|  192 } {1 {no such column: bogus}} |  | 
|  193 ifcapable {tclvar} { |  | 
|  194   do_test tcl-3.5 { |  | 
|  195     set b 50 |  | 
|  196     set rc [catch {db one {SELECT * FROM t1 WHERE b>$b}} msg] |  | 
|  197     lappend rc $msg |  | 
|  198   } {0 41} |  | 
|  199   do_test tcl-3.6 { |  | 
|  200     set b 500 |  | 
|  201     set rc [catch {db one {SELECT * FROM t1 WHERE b>$b}} msg] |  | 
|  202     lappend rc $msg |  | 
|  203   } {0 {}} |  | 
|  204   do_test tcl-3.7 { |  | 
|  205     set b 500 |  | 
|  206     set rc [catch {db one { |  | 
|  207       INSERT INTO t1 VALUES(99,510); |  | 
|  208       SELECT * FROM t1 WHERE b>$b |  | 
|  209     }} msg] |  | 
|  210     lappend rc $msg |  | 
|  211   } {0 99} |  | 
|  212 } |  | 
|  213 ifcapable {!tclvar} { |  | 
|  214    execsql {INSERT INTO t1 VALUES(99,510)} |  | 
|  215 } |  | 
|  216  |  | 
|  217 # Turn the busy handler on and off |  | 
|  218 # |  | 
|  219 do_test tcl-4.1 { |  | 
|  220   proc busy_callback {cnt} { |  | 
|  221     break |  | 
|  222   } |  | 
|  223   db busy busy_callback |  | 
|  224   db busy |  | 
|  225 } {busy_callback} |  | 
|  226 do_test tcl-4.2 { |  | 
|  227   db busy {} |  | 
|  228   db busy |  | 
|  229 } {} |  | 
|  230  |  | 
|  231 ifcapable {tclvar} { |  | 
|  232   # Parsing of TCL variable names within SQL into bound parameters. |  | 
|  233   # |  | 
|  234   do_test tcl-5.1 { |  | 
|  235     execsql {CREATE TABLE t3(a,b,c)} |  | 
|  236     catch {unset x} |  | 
|  237     set x(1) A |  | 
|  238     set x(2) B |  | 
|  239     execsql { |  | 
|  240       INSERT INTO t3 VALUES($::x(1),$::x(2),$::x(3)); |  | 
|  241       SELECT * FROM t3 |  | 
|  242     } |  | 
|  243   } {A B {}} |  | 
|  244   do_test tcl-5.2 { |  | 
|  245     execsql { |  | 
|  246       SELECT typeof(a), typeof(b), typeof(c) FROM t3 |  | 
|  247     } |  | 
|  248   } {text text null} |  | 
|  249   do_test tcl-5.3 { |  | 
|  250     catch {unset x} |  | 
|  251     set x [binary format h12 686900686f00] |  | 
|  252     execsql { |  | 
|  253       UPDATE t3 SET a=$::x; |  | 
|  254     } |  | 
|  255     db eval { |  | 
|  256       SELECT a FROM t3 |  | 
|  257     } break |  | 
|  258     binary scan $a h12 adata |  | 
|  259     set adata |  | 
|  260   } {686900686f00} |  | 
|  261   do_test tcl-5.4 { |  | 
|  262     execsql { |  | 
|  263       SELECT typeof(a), typeof(b), typeof(c) FROM t3 |  | 
|  264     } |  | 
|  265   } {blob text null} |  | 
|  266 } |  | 
|  267  |  | 
|  268 # Operation of "break" and "continue" within row scripts |  | 
|  269 # |  | 
|  270 do_test tcl-6.1 { |  | 
|  271   db eval {SELECT * FROM t1} { |  | 
|  272     break |  | 
|  273   } |  | 
|  274   lappend a $b |  | 
|  275 } {10 20} |  | 
|  276 do_test tcl-6.2 { |  | 
|  277   set cnt 0 |  | 
|  278   db eval {SELECT * FROM t1} { |  | 
|  279     if {$a>40} continue |  | 
|  280     incr cnt |  | 
|  281   } |  | 
|  282   set cnt |  | 
|  283 } {4} |  | 
|  284 do_test tcl-6.3 { |  | 
|  285   set cnt 0 |  | 
|  286   db eval {SELECT * FROM t1} { |  | 
|  287     if {$a<40} continue |  | 
|  288     incr cnt |  | 
|  289   } |  | 
|  290   set cnt |  | 
|  291 } {5} |  | 
|  292 do_test tcl-6.4 { |  | 
|  293   proc return_test {x} { |  | 
|  294     db eval {SELECT * FROM t1} { |  | 
|  295       if {$a==$x} {return $b} |  | 
|  296     } |  | 
|  297   } |  | 
|  298   return_test 10 |  | 
|  299 } 20 |  | 
|  300 do_test tcl-6.5 { |  | 
|  301   return_test 20 |  | 
|  302 } 40 |  | 
|  303 do_test tcl-6.6 { |  | 
|  304   return_test 99 |  | 
|  305 } 510 |  | 
|  306 do_test tcl-6.7 { |  | 
|  307   return_test 0 |  | 
|  308 } {} |  | 
|  309  |  | 
|  310 do_test tcl-7.1 { |  | 
|  311   db version |  | 
|  312   expr 0 |  | 
|  313 } {0} |  | 
|  314  |  | 
|  315 # modify and reset the NULL representation |  | 
|  316 # |  | 
|  317 do_test tcl-8.1 { |  | 
|  318   db nullvalue NaN |  | 
|  319   execsql {INSERT INTO t1 VALUES(30,NULL)} |  | 
|  320   db eval {SELECT * FROM t1 WHERE b IS NULL} |  | 
|  321 } {30 NaN} |  | 
|  322 do_test tcl-8.2 { |  | 
|  323   db nullvalue NULL |  | 
|  324   db nullvalue |  | 
|  325 } {NULL} |  | 
|  326 do_test tcl-8.3 { |  | 
|  327   db nullvalue {} |  | 
|  328   db eval {SELECT * FROM t1 WHERE b IS NULL} |  | 
|  329 } {30 {}} |  | 
|  330  |  | 
|  331 # Test the return type of user-defined functions |  | 
|  332 # |  | 
|  333 do_test tcl-9.1 { |  | 
|  334   db function ret_str {return "hi"} |  | 
|  335   execsql {SELECT typeof(ret_str())} |  | 
|  336 } {text} |  | 
|  337 do_test tcl-9.2 { |  | 
|  338   db function ret_dbl {return [expr {rand()*0.5}]} |  | 
|  339   execsql {SELECT typeof(ret_dbl())} |  | 
|  340 } {real} |  | 
|  341 do_test tcl-9.3 { |  | 
|  342   db function ret_int {return [expr {int(rand()*200)}]} |  | 
|  343   execsql {SELECT typeof(ret_int())} |  | 
|  344 } {integer} |  | 
|  345  |  | 
|  346 # Recursive calls to the same user-defined function |  | 
|  347 # |  | 
|  348 ifcapable tclvar { |  | 
|  349   do_test tcl-9.10 { |  | 
|  350     proc userfunc_r1 {n} { |  | 
|  351       if {$n<=0} {return 0} |  | 
|  352       set nm1 [expr {$n-1}] |  | 
|  353       return [expr {[db eval {SELECT r1($nm1)}]+$n}] |  | 
|  354     } |  | 
|  355     db function r1 userfunc_r1 |  | 
|  356     execsql {SELECT r1(10)} |  | 
|  357   } {55} |  | 
|  358   do_test tcl-9.11 { |  | 
|  359     execsql {SELECT r1(100)} |  | 
|  360   } {5050} |  | 
|  361 } |  | 
|  362  |  | 
|  363 # Tests for the new transaction method |  | 
|  364 # |  | 
|  365 do_test tcl-10.1 { |  | 
|  366   db transaction {} |  | 
|  367 } {} |  | 
|  368 do_test tcl-10.2 { |  | 
|  369   db transaction deferred {} |  | 
|  370 } {} |  | 
|  371 do_test tcl-10.3 { |  | 
|  372   db transaction immediate {} |  | 
|  373 } {} |  | 
|  374 do_test tcl-10.4 { |  | 
|  375   db transaction exclusive {} |  | 
|  376 } {} |  | 
|  377 do_test tcl-10.5 { |  | 
|  378   set rc [catch {db transaction xyzzy {}} msg] |  | 
|  379   lappend rc $msg |  | 
|  380 } {1 {bad transaction type "xyzzy": must be deferred, exclusive, or immediate}} |  | 
|  381 do_test tcl-10.6 { |  | 
|  382   set rc [catch {db transaction {error test-error}} msg] |  | 
|  383   lappend rc $msg |  | 
|  384 } {1 test-error} |  | 
|  385 do_test tcl-10.7 { |  | 
|  386   db transaction { |  | 
|  387     db eval {CREATE TABLE t4(x)} |  | 
|  388     db transaction { |  | 
|  389       db eval {INSERT INTO t4 VALUES(1)} |  | 
|  390     } |  | 
|  391   } |  | 
|  392   db eval {SELECT * FROM t4} |  | 
|  393 } 1 |  | 
|  394 do_test tcl-10.8 { |  | 
|  395   catch { |  | 
|  396     db transaction { |  | 
|  397       db eval {INSERT INTO t4 VALUES(2)} |  | 
|  398       db eval {INSERT INTO t4 VALUES(3)} |  | 
|  399       db eval {INSERT INTO t4 VALUES(4)} |  | 
|  400       error test-error |  | 
|  401     } |  | 
|  402   } |  | 
|  403   db eval {SELECT * FROM t4} |  | 
|  404 } 1 |  | 
|  405 do_test tcl-10.9 { |  | 
|  406   db transaction { |  | 
|  407     db eval {INSERT INTO t4 VALUES(2)} |  | 
|  408     catch { |  | 
|  409       db transaction { |  | 
|  410         db eval {INSERT INTO t4 VALUES(3)} |  | 
|  411         db eval {INSERT INTO t4 VALUES(4)} |  | 
|  412         error test-error |  | 
|  413       } |  | 
|  414     } |  | 
|  415   } |  | 
|  416   db eval {SELECT * FROM t4} |  | 
|  417 } {1 2} |  | 
|  418 do_test tcl-10.10 { |  | 
|  419   for {set i 0} {$i<1} {incr i} { |  | 
|  420     db transaction { |  | 
|  421       db eval {INSERT INTO t4 VALUES(5)} |  | 
|  422       continue |  | 
|  423     } |  | 
|  424     error "This line should not be run" |  | 
|  425   } |  | 
|  426   db eval {SELECT * FROM t4} |  | 
|  427 } {1 2 5} |  | 
|  428 do_test tcl-10.11 { |  | 
|  429   for {set i 0} {$i<10} {incr i} { |  | 
|  430     db transaction { |  | 
|  431       db eval {INSERT INTO t4 VALUES(6)} |  | 
|  432       break |  | 
|  433     } |  | 
|  434   } |  | 
|  435   db eval {SELECT * FROM t4} |  | 
|  436 } {1 2 5 6} |  | 
|  437 do_test tcl-10.12 { |  | 
|  438   set rc [catch { |  | 
|  439     for {set i 0} {$i<10} {incr i} { |  | 
|  440       db transaction { |  | 
|  441         db eval {INSERT INTO t4 VALUES(7)} |  | 
|  442         return |  | 
|  443       } |  | 
|  444     } |  | 
|  445   }] |  | 
|  446 } {2} |  | 
|  447 do_test tcl-10.13 { |  | 
|  448   db eval {SELECT * FROM t4} |  | 
|  449 } {1 2 5 6 7} |  | 
|  450  |  | 
|  451 # Now test that [db transaction] commands may be nested with  |  | 
|  452 # the expected results. |  | 
|  453 # |  | 
|  454 do_test tcl-10.14 { |  | 
|  455   db transaction { |  | 
|  456     db eval { |  | 
|  457       DELETE FROM t4; |  | 
|  458       INSERT INTO t4 VALUES('one'); |  | 
|  459     } |  | 
|  460  |  | 
|  461     catch {  |  | 
|  462       db transaction { |  | 
|  463         db eval { INSERT INTO t4 VALUES('two') } |  | 
|  464         db transaction { |  | 
|  465           db eval { INSERT INTO t4 VALUES('three') } |  | 
|  466           error "throw an error!" |  | 
|  467         } |  | 
|  468       } |  | 
|  469     } |  | 
|  470   } |  | 
|  471  |  | 
|  472   db eval {SELECT * FROM t4} |  | 
|  473 } {one} |  | 
|  474 do_test tcl-10.15 { |  | 
|  475   # Make sure a transaction has not been left open. |  | 
|  476   db eval {BEGIN ; COMMIT} |  | 
|  477 } {} |  | 
|  478 do_test tcl-10.16 { |  | 
|  479   db transaction { |  | 
|  480     db eval { INSERT INTO t4 VALUES('two'); } |  | 
|  481     db transaction { |  | 
|  482       db eval { INSERT INTO t4 VALUES('three') } |  | 
|  483       db transaction { |  | 
|  484         db eval { INSERT INTO t4 VALUES('four') } |  | 
|  485       } |  | 
|  486     } |  | 
|  487   } |  | 
|  488   db eval {SELECT * FROM t4} |  | 
|  489 } {one two three four} |  | 
|  490 do_test tcl-10.17 { |  | 
|  491   catch { |  | 
|  492     db transaction { |  | 
|  493       db eval { INSERT INTO t4 VALUES('A'); } |  | 
|  494       db transaction { |  | 
|  495         db eval { INSERT INTO t4 VALUES('B') } |  | 
|  496         db transaction { |  | 
|  497           db eval { INSERT INTO t4 VALUES('C') } |  | 
|  498           error "throw an error!" |  | 
|  499         } |  | 
|  500       } |  | 
|  501     } |  | 
|  502   } |  | 
|  503   db eval {SELECT * FROM t4} |  | 
|  504 } {one two three four} |  | 
|  505 do_test tcl-10.18 { |  | 
|  506   # Make sure a transaction has not been left open. |  | 
|  507   db eval {BEGIN ; COMMIT} |  | 
|  508 } {} |  | 
|  509  |  | 
|  510 # Mess up a [db transaction] command by locking the database using a |  | 
|  511 # second connection when it tries to commit. Make sure the transaction |  | 
|  512 # is not still open after the "database is locked" exception is thrown. |  | 
|  513 # |  | 
|  514 do_test tcl-10.18 { |  | 
|  515   sqlite3 db2 test.db |  | 
|  516   db2 eval { |  | 
|  517     BEGIN; |  | 
|  518     SELECT * FROM sqlite_master; |  | 
|  519   } |  | 
|  520  |  | 
|  521   set rc [catch { |  | 
|  522     db transaction { |  | 
|  523       db eval {INSERT INTO t4 VALUES('five')} |  | 
|  524     } |  | 
|  525   } msg] |  | 
|  526   list $rc $msg |  | 
|  527 } {1 {database is locked}} |  | 
|  528 do_test tcl-10.19 { |  | 
|  529   db eval {BEGIN ; COMMIT} |  | 
|  530 } {} |  | 
|  531  |  | 
|  532 # Thwart a [db transaction] command by locking the database using a |  | 
|  533 # second connection with "BEGIN EXCLUSIVE". Make sure no transaction is  |  | 
|  534 # open after the "database is locked" exception is thrown. |  | 
|  535 # |  | 
|  536 do_test tcl-10.20 { |  | 
|  537   db2 eval { |  | 
|  538     COMMIT; |  | 
|  539     BEGIN EXCLUSIVE; |  | 
|  540   } |  | 
|  541   set rc [catch { |  | 
|  542     db transaction { |  | 
|  543       db eval {INSERT INTO t4 VALUES('five')} |  | 
|  544     } |  | 
|  545   } msg] |  | 
|  546   list $rc $msg |  | 
|  547 } {1 {database is locked}} |  | 
|  548 do_test tcl-10.21 { |  | 
|  549   db2 close |  | 
|  550   db eval {BEGIN ; COMMIT} |  | 
|  551 } {} |  | 
|  552 do_test tcl-10.22 { |  | 
|  553   sqlite3 db2 test.db |  | 
|  554   db transaction exclusive { |  | 
|  555     catch { db2 eval {SELECT * FROM sqlite_master} } msg |  | 
|  556     set msg "db2: $msg" |  | 
|  557   } |  | 
|  558   set msg |  | 
|  559 } {db2: database is locked} |  | 
|  560 db2 close |  | 
|  561  |  | 
|  562 do_test tcl-11.1 { |  | 
|  563   db eval {INSERT INTO t4 VALUES(6)} |  | 
|  564   db exists {SELECT x,x*2,x+x FROM t4 WHERE x==6} |  | 
|  565 } {1} |  | 
|  566 do_test tcl-11.2 { |  | 
|  567   db exists {SELECT 0 FROM t4 WHERE x==6} |  | 
|  568 } {1} |  | 
|  569 do_test tcl-11.3 { |  | 
|  570   db exists {SELECT 1 FROM t4 WHERE x==8} |  | 
|  571 } {0} |  | 
|  572  |  | 
|  573 do_test tcl-12.1 { |  | 
|  574   unset -nocomplain a b c version |  | 
|  575   set version [db version] |  | 
|  576   scan $version "%d.%d.%d" a b c |  | 
|  577   expr $a*1000000 + $b*1000 + $c |  | 
|  578 } [sqlite3_libversion_number] |  | 
|  579  |  | 
|  580  |  | 
|  581 # Check to see that when bindings of the form @aaa are used instead |  | 
|  582 # of $aaa, that objects are treated as bytearray and are inserted |  | 
|  583 # as BLOBs. |  | 
|  584 # |  | 
|  585 ifcapable tclvar { |  | 
|  586   do_test tcl-13.1 { |  | 
|  587     db eval {CREATE TABLE t5(x BLOB)} |  | 
|  588     set x abc123 |  | 
|  589     db eval {INSERT INTO t5 VALUES($x)} |  | 
|  590     db eval {SELECT typeof(x) FROM t5} |  | 
|  591   } {text} |  | 
|  592   do_test tcl-13.2 { |  | 
|  593     binary scan $x H notUsed |  | 
|  594     db eval { |  | 
|  595       DELETE FROM t5; |  | 
|  596       INSERT INTO t5 VALUES($x); |  | 
|  597       SELECT typeof(x) FROM t5; |  | 
|  598     } |  | 
|  599   } {text} |  | 
|  600   do_test tcl-13.3 { |  | 
|  601     db eval { |  | 
|  602       DELETE FROM t5; |  | 
|  603       INSERT INTO t5 VALUES(@x); |  | 
|  604       SELECT typeof(x) FROM t5; |  | 
|  605     } |  | 
|  606   } {blob} |  | 
|  607   do_test tcl-13.4 { |  | 
|  608     set y 1234 |  | 
|  609     db eval { |  | 
|  610       DELETE FROM t5; |  | 
|  611       INSERT INTO t5 VALUES(@y); |  | 
|  612       SELECT hex(x), typeof(x) FROM t5 |  | 
|  613     } |  | 
|  614   } {31323334 blob} |  | 
|  615 } |  | 
|  616  |  | 
|  617  |  | 
|  618 finish_test |  | 
| OLD | NEW |