1b19a2bc6Sdrh# 2001 September 15 2960e8c63Sdrh# 3b19a2bc6Sdrh# The author disclaims copyright to this source code. In place of 4b19a2bc6Sdrh# a legal notice, here is a blessing: 5960e8c63Sdrh# 6b19a2bc6Sdrh# May you do good and not evil. 7b19a2bc6Sdrh# May you find forgiveness for yourself and forgive others. 8b19a2bc6Sdrh# May you share freely, never taking more than you give. 9960e8c63Sdrh# 10960e8c63Sdrh#*********************************************************************** 11960e8c63Sdrh# This file implements regression tests for TCL interface to the 12960e8c63Sdrh# SQLite library. 13960e8c63Sdrh# 14960e8c63Sdrh# Actually, all tests are based on the TCL interface, so the main 15960e8c63Sdrh# interface is pretty well tested. This file contains some addition 16960e8c63Sdrh# tests for fringe issues that the main test suite does not cover. 17960e8c63Sdrh# 18*b4e9af9fSdanielk1977# $Id: tclsqlite.test,v 1.57 2007/05/01 17:49:49 danielk1977 Exp $ 19960e8c63Sdrh 20960e8c63Sdrhset testdir [file dirname $argv0] 21960e8c63Sdrhsource $testdir/tester.tcl 22960e8c63Sdrh 23960e8c63Sdrh# Check the error messages generated by tclsqlite 24960e8c63Sdrh# 25ef4ac8f9Sdrhif {[sqlite3 -has-codec]} { 269eb9e26bSdrh set r "sqlite_orig HANDLE FILENAME ?-key CODEC-KEY?" 2722fbcb8dSdrh} else { 28ef4ac8f9Sdrh set r "sqlite3 HANDLE FILENAME ?MODE?" 2922fbcb8dSdrh} 30960e8c63Sdrhdo_test tcl-1.1 { 31ef4ac8f9Sdrh set v [catch {sqlite3 bogus} msg] 32960e8c63Sdrh lappend v $msg 3322fbcb8dSdrh} [list 1 "wrong # args: should be \"$r\""] 34960e8c63Sdrhdo_test tcl-1.2 { 35960e8c63Sdrh set v [catch {db bogus} msg] 36960e8c63Sdrh lappend v $msg 37*b4e9af9fSdanielk1977} {1 {bad option "bogus": must be authorizer, busy, cache, changes, close, collate, collation_needed, commit_hook, complete, copy, enable_load_extension, errorcode, eval, exists, function, incrblob, interrupt, last_insert_rowid, nullvalue, onecolumn, profile, progress, rekey, rollback_hook, timeout, total_changes, trace, transaction, update_hook, or version}} 38960e8c63Sdrhdo_test tcl-1.3 { 39960e8c63Sdrh execsql {CREATE TABLE t1(a int, b int)} 40960e8c63Sdrh execsql {INSERT INTO t1 VALUES(10,20)} 41960e8c63Sdrh set v [catch { 42960e8c63Sdrh db eval {SELECT * FROM t1} data { 43960e8c63Sdrh error "The error message" 44960e8c63Sdrh } 45960e8c63Sdrh } msg] 46960e8c63Sdrh lappend v $msg 47960e8c63Sdrh} {1 {The error message}} 48960e8c63Sdrhdo_test tcl-1.4 { 49960e8c63Sdrh set v [catch { 50960e8c63Sdrh db eval {SELECT * FROM t2} data { 51960e8c63Sdrh error "The error message" 52960e8c63Sdrh } 53960e8c63Sdrh } msg] 54960e8c63Sdrh lappend v $msg 55960e8c63Sdrh} {1 {no such table: t2}} 56960e8c63Sdrhdo_test tcl-1.5 { 57960e8c63Sdrh set v [catch { 58960e8c63Sdrh db eval {SELECT * FROM t1} data { 59960e8c63Sdrh break 60960e8c63Sdrh } 61960e8c63Sdrh } msg] 62960e8c63Sdrh lappend v $msg 63960e8c63Sdrh} {0 {}} 64960e8c63Sdrhdo_test tcl-1.6 { 65960e8c63Sdrh set v [catch { 66960e8c63Sdrh db eval {SELECT * FROM t1} data { 67960e8c63Sdrh expr x* 68960e8c63Sdrh } 69960e8c63Sdrh } msg] 70a297b5c3Sdrh regsub {:.*$} $msg {} msg 71960e8c63Sdrh lappend v $msg 72960e8c63Sdrh} {1 {syntax error in expression "x*"}} 730f14e2ebSdrhdo_test tcl-1.7 { 740f14e2ebSdrh set v [catch {db} msg] 750f14e2ebSdrh lappend v $msg 760f14e2ebSdrh} {1 {wrong # args: should be "db SUBCOMMAND ..."}} 771211de37Sdrhif {[catch {db auth {}}]==0} { 780f14e2ebSdrh do_test tcl-1.8 { 790f14e2ebSdrh set v [catch {db authorizer 1 2 3} msg] 800f14e2ebSdrh lappend v $msg 810f14e2ebSdrh } {1 {wrong # args: should be "db authorizer ?CALLBACK?"}} 821211de37Sdrh} 830f14e2ebSdrhdo_test tcl-1.9 { 840f14e2ebSdrh set v [catch {db busy 1 2 3} msg] 850f14e2ebSdrh lappend v $msg 860f14e2ebSdrh} {1 {wrong # args: should be "db busy CALLBACK"}} 870f14e2ebSdrhdo_test tcl-1.10 { 880f14e2ebSdrh set v [catch {db progress 1} msg] 890f14e2ebSdrh lappend v $msg 900f14e2ebSdrh} {1 {wrong # args: should be "db progress N CALLBACK"}} 910f14e2ebSdrhdo_test tcl-1.11 { 920f14e2ebSdrh set v [catch {db changes xyz} msg] 930f14e2ebSdrh lappend v $msg 940f14e2ebSdrh} {1 {wrong # args: should be "db changes "}} 950f14e2ebSdrhdo_test tcl-1.12 { 960f14e2ebSdrh set v [catch {db commit_hook a b c} msg] 970f14e2ebSdrh lappend v $msg 980f14e2ebSdrh} {1 {wrong # args: should be "db commit_hook ?CALLBACK?"}} 99ccae6026Sdrhifcapable {complete} { 1000f14e2ebSdrh do_test tcl-1.13 { 1010f14e2ebSdrh set v [catch {db complete} msg] 1020f14e2ebSdrh lappend v $msg 1030f14e2ebSdrh } {1 {wrong # args: should be "db complete SQL"}} 104ccae6026Sdrh} 1050f14e2ebSdrhdo_test tcl-1.14 { 1060f14e2ebSdrh set v [catch {db eval} msg] 1070f14e2ebSdrh lappend v $msg 108895d7472Sdrh} {1 {wrong # args: should be "db eval SQL ?ARRAY-NAME? ?SCRIPT?"}} 1090f14e2ebSdrhdo_test tcl-1.15 { 1100f14e2ebSdrh set v [catch {db function} msg] 1110f14e2ebSdrh lappend v $msg 1120f14e2ebSdrh} {1 {wrong # args: should be "db function NAME SCRIPT"}} 1137ddad969Sdanielk1977do_test tcl-1.16 { 1140f14e2ebSdrh set v [catch {db last_insert_rowid xyz} msg] 1150f14e2ebSdrh lappend v $msg 1160f14e2ebSdrh} {1 {wrong # args: should be "db last_insert_rowid "}} 1177ddad969Sdanielk1977do_test tcl-1.17 { 1180f14e2ebSdrh set v [catch {db rekey} msg] 1190f14e2ebSdrh lappend v $msg 1200f14e2ebSdrh} {1 {wrong # args: should be "db rekey KEY"}} 1217ddad969Sdanielk1977do_test tcl-1.18 { 1220f14e2ebSdrh set v [catch {db timeout} msg] 1230f14e2ebSdrh lappend v $msg 1240f14e2ebSdrh} {1 {wrong # args: should be "db timeout MILLISECONDS"}} 1257ddad969Sdanielk1977do_test tcl-1.19 { 1260f14e2ebSdrh set v [catch {db collate} msg] 1270f14e2ebSdrh lappend v $msg 1280f14e2ebSdrh} {1 {wrong # args: should be "db collate NAME SCRIPT"}} 1297ddad969Sdanielk1977do_test tcl-1.20 { 1300f14e2ebSdrh set v [catch {db collation_needed} msg] 1310f14e2ebSdrh lappend v $msg 1320f14e2ebSdrh} {1 {wrong # args: should be "db collation_needed SCRIPT"}} 1337ddad969Sdanielk1977do_test tcl-1.21 { 1340f14e2ebSdrh set v [catch {db total_changes xyz} msg] 1350f14e2ebSdrh lappend v $msg 1360f14e2ebSdrh} {1 {wrong # args: should be "db total_changes "}} 1371067fe11Stpoindexdo_test tcl-1.20 { 1381067fe11Stpoindex set v [catch {db copy} msg] 1391067fe11Stpoindex lappend v $msg 1401067fe11Stpoindex} {1 {wrong # args: should be "db copy CONFLICT-ALGORITHM TABLE FILENAME ?SEPARATOR? ?NULLINDICATOR?"}} 1410f14e2ebSdrh 142960e8c63Sdrh 143ef4ac8f9Sdrhif {[sqlite3 -tcl-uses-utf]} { 144c275b4eaSdrh catch {unset ::result} 1456d4abfbeSdrh do_test tcl-2.1 { 1466d4abfbeSdrh execsql "CREATE TABLE t\u0123x(a int, b\u1235 float)" 14727188fb5Sdanielk1977 } {} 14827188fb5Sdanielk1977 ifcapable schema_pragmas { 14927188fb5Sdanielk1977 do_test tcl-2.2 { 1506d4abfbeSdrh execsql "PRAGMA table_info(t\u0123x)" 1519f6696acSdrh } "0 a int 0 {} 0 1 b\u1235 float 0 {} 0" 15227188fb5Sdanielk1977 } 15327188fb5Sdanielk1977 do_test tcl-2.3 { 1546d4abfbeSdrh execsql "INSERT INTO t\u0123x VALUES(1,2.3)" 1556d4abfbeSdrh db eval "SELECT * FROM t\u0123x" result break 1566d4abfbeSdrh set result(*) 1576d4abfbeSdrh } "a b\u1235" 1586d4abfbeSdrh} 1596d4abfbeSdrh 1606d4abfbeSdrh 1615d9d7576Sdrh# Test the onecolumn method 1625d9d7576Sdrh# 1635d9d7576Sdrhdo_test tcl-3.1 { 1645d9d7576Sdrh execsql { 1655d9d7576Sdrh INSERT INTO t1 SELECT a*2, b*2 FROM t1; 1665d9d7576Sdrh INSERT INTO t1 SELECT a*2+1, b*2+1 FROM t1; 1675d9d7576Sdrh INSERT INTO t1 SELECT a*2+3, b*2+3 FROM t1; 1685d9d7576Sdrh } 16922fbcb8dSdrh set rc [catch {db onecolumn {SELECT * FROM t1 ORDER BY a}} msg] 17022fbcb8dSdrh lappend rc $msg 17122fbcb8dSdrh} {0 10} 1725d9d7576Sdrhdo_test tcl-3.2 { 1735d9d7576Sdrh db onecolumn {SELECT * FROM t1 WHERE a<0} 1745d9d7576Sdrh} {} 1755d9d7576Sdrhdo_test tcl-3.3 { 1765d9d7576Sdrh set rc [catch {db onecolumn} errmsg] 1775d9d7576Sdrh lappend rc $errmsg 1785d9d7576Sdrh} {1 {wrong # args: should be "db onecolumn SQL"}} 1790f14e2ebSdrhdo_test tcl-3.4 { 1800f14e2ebSdrh set rc [catch {db onecolumn {SELECT bogus}} errmsg] 1810f14e2ebSdrh lappend rc $errmsg 1820f14e2ebSdrh} {1 {no such column: bogus}} 1836bf89570Sdrhifcapable {tclvar} { 1841807ce37Sdrh do_test tcl-3.5 { 1851807ce37Sdrh set b 50 1861807ce37Sdrh set rc [catch {db one {SELECT * FROM t1 WHERE b>$b}} msg] 1871807ce37Sdrh lappend rc $msg 1881807ce37Sdrh } {0 41} 1891807ce37Sdrh do_test tcl-3.6 { 1901807ce37Sdrh set b 500 1911807ce37Sdrh set rc [catch {db one {SELECT * FROM t1 WHERE b>$b}} msg] 1921807ce37Sdrh lappend rc $msg 1931807ce37Sdrh } {0 {}} 1941807ce37Sdrh do_test tcl-3.7 { 1951807ce37Sdrh set b 500 1961807ce37Sdrh set rc [catch {db one { 1971807ce37Sdrh INSERT INTO t1 VALUES(99,510); 1981807ce37Sdrh SELECT * FROM t1 WHERE b>$b 1991807ce37Sdrh }} msg] 2001807ce37Sdrh lappend rc $msg 2011807ce37Sdrh } {0 99} 2026bf89570Sdrh} 2036bf89570Sdrhifcapable {!tclvar} { 2046bf89570Sdrh execsql {INSERT INTO t1 VALUES(99,510)} 2056bf89570Sdrh} 2065d9d7576Sdrh 2070f14e2ebSdrh# Turn the busy handler on and off 2080f14e2ebSdrh# 2090f14e2ebSdrhdo_test tcl-4.1 { 2100f14e2ebSdrh proc busy_callback {cnt} { 2110f14e2ebSdrh break 2120f14e2ebSdrh } 2130f14e2ebSdrh db busy busy_callback 2140f14e2ebSdrh db busy 2150f14e2ebSdrh} {busy_callback} 2160f14e2ebSdrhdo_test tcl-4.2 { 2170f14e2ebSdrh db busy {} 2180f14e2ebSdrh db busy 2190f14e2ebSdrh} {} 2206d4abfbeSdrh 2216bf89570Sdrhifcapable {tclvar} { 22292febd92Sdrh # Parsing of TCL variable names within SQL into bound parameters. 22392febd92Sdrh # 22492febd92Sdrh do_test tcl-5.1 { 22592febd92Sdrh execsql {CREATE TABLE t3(a,b,c)} 22692febd92Sdrh catch {unset x} 22792febd92Sdrh set x(1) 5 22892febd92Sdrh set x(2) 7 22992febd92Sdrh execsql { 23092febd92Sdrh INSERT INTO t3 VALUES($::x(1),$::x(2),$::x(3)); 23192febd92Sdrh SELECT * FROM t3 23292febd92Sdrh } 23392febd92Sdrh } {5 7 {}} 23492febd92Sdrh do_test tcl-5.2 { 23592febd92Sdrh execsql { 23692febd92Sdrh SELECT typeof(a), typeof(b), typeof(c) FROM t3 23792febd92Sdrh } 23892febd92Sdrh } {text text null} 23992febd92Sdrh do_test tcl-5.3 { 24092febd92Sdrh catch {unset x} 24192febd92Sdrh set x [binary format h12 686900686f00] 24292febd92Sdrh execsql { 24392febd92Sdrh UPDATE t3 SET a=$::x; 24492febd92Sdrh } 24592febd92Sdrh db eval { 24692febd92Sdrh SELECT a FROM t3 24792febd92Sdrh } break 24892febd92Sdrh binary scan $a h12 adata 24992febd92Sdrh set adata 25092febd92Sdrh } {686900686f00} 25192febd92Sdrh do_test tcl-5.4 { 25292febd92Sdrh execsql { 25392febd92Sdrh SELECT typeof(a), typeof(b), typeof(c) FROM t3 25492febd92Sdrh } 25592febd92Sdrh } {blob text null} 2566bf89570Sdrh} 25792febd92Sdrh 258fd241b0eSdrh# Operation of "break" and "continue" within row scripts 259fd241b0eSdrh# 260fd241b0eSdrhdo_test tcl-6.1 { 261fd241b0eSdrh db eval {SELECT * FROM t1} { 262fd241b0eSdrh break 263fd241b0eSdrh } 264fd241b0eSdrh lappend a $b 265fd241b0eSdrh} {10 20} 266fd241b0eSdrhdo_test tcl-6.2 { 267fd241b0eSdrh set cnt 0 268fd241b0eSdrh db eval {SELECT * FROM t1} { 269fd241b0eSdrh if {$a>40} continue 270fd241b0eSdrh incr cnt 271fd241b0eSdrh } 272fd241b0eSdrh set cnt 273fd241b0eSdrh} {4} 274fd241b0eSdrhdo_test tcl-6.3 { 275fd241b0eSdrh set cnt 0 276fd241b0eSdrh db eval {SELECT * FROM t1} { 277fd241b0eSdrh if {$a<40} continue 278fd241b0eSdrh incr cnt 279fd241b0eSdrh } 280fd241b0eSdrh set cnt 281fd241b0eSdrh} {5} 282fd241b0eSdrhdo_test tcl-6.4 { 283fd241b0eSdrh proc return_test {x} { 284fd241b0eSdrh db eval {SELECT * FROM t1} { 285fd241b0eSdrh if {$a==$x} {return $b} 286fd241b0eSdrh } 287fd241b0eSdrh } 288fd241b0eSdrh return_test 10 289fd241b0eSdrh} 20 290fd241b0eSdrhdo_test tcl-6.5 { 291fd241b0eSdrh return_test 20 292fd241b0eSdrh} 40 293fd241b0eSdrhdo_test tcl-6.6 { 294fd241b0eSdrh return_test 99 295fd241b0eSdrh} 510 296fd241b0eSdrhdo_test tcl-6.7 { 297fd241b0eSdrh return_test 0 298fd241b0eSdrh} {} 299fd241b0eSdrh 3004397de57Sdanielk1977do_test tcl-7.1 { 3014397de57Sdanielk1977 db version 3024397de57Sdanielk1977 expr 0 3034397de57Sdanielk1977} {0} 3044397de57Sdanielk1977 30555c45f2eSdanielk1977# modify and reset the NULL representation 30655c45f2eSdanielk1977# 30755c45f2eSdanielk1977do_test tcl-8.1 { 30855c45f2eSdanielk1977 db nullvalue NaN 30955c45f2eSdanielk1977 execsql {INSERT INTO t1 VALUES(30,NULL)} 31055c45f2eSdanielk1977 db eval {SELECT * FROM t1 WHERE b IS NULL} 31155c45f2eSdanielk1977} {30 NaN} 31255c45f2eSdanielk1977do_test tcl-8.2 { 31355c45f2eSdanielk1977 db nullvalue NULL 31455c45f2eSdanielk1977 db nullvalue 31555c45f2eSdanielk1977} {NULL} 31655c45f2eSdanielk1977do_test tcl-8.3 { 31755c45f2eSdanielk1977 db nullvalue {} 31855c45f2eSdanielk1977 db eval {SELECT * FROM t1 WHERE b IS NULL} 31955c45f2eSdanielk1977} {30 {}} 32055c45f2eSdanielk1977 321c7f269d5Sdrh# Test the return type of user-defined functions 322c7f269d5Sdrh# 323c7f269d5Sdrhdo_test tcl-9.1 { 324c7f269d5Sdrh db function ret_str {return "hi"} 325c7f269d5Sdrh execsql {SELECT typeof(ret_str())} 326c7f269d5Sdrh} {text} 327c7f269d5Sdrhdo_test tcl-9.2 { 3289645d8d4Sdrh db function ret_dbl {return [expr {rand()*0.5}]} 329c7f269d5Sdrh execsql {SELECT typeof(ret_dbl())} 330c7f269d5Sdrh} {real} 331c7f269d5Sdrhdo_test tcl-9.3 { 3329645d8d4Sdrh db function ret_int {return [expr {int(rand()*200)}]} 333c7f269d5Sdrh execsql {SELECT typeof(ret_int())} 334c7f269d5Sdrh} {integer} 335c7f269d5Sdrh 336d1e4733dSdrh# Recursive calls to the same user-defined function 337d1e4733dSdrh# 3383bdca9c9Sdanielk1977ifcapable tclvar { 339d1e4733dSdrh do_test tcl-9.10 { 340d1e4733dSdrh proc userfunc_r1 {n} { 341d1e4733dSdrh if {$n<=0} {return 0} 342d1e4733dSdrh set nm1 [expr {$n-1}] 343d1e4733dSdrh return [expr {[db eval {SELECT r1($nm1)}]+$n}] 344d1e4733dSdrh } 345d1e4733dSdrh db function r1 userfunc_r1 346d1e4733dSdrh execsql {SELECT r1(10)} 347d1e4733dSdrh } {55} 348d1e4733dSdrh do_test tcl-9.11 { 349d1e4733dSdrh execsql {SELECT r1(100)} 350d1e4733dSdrh } {5050} 3513bdca9c9Sdanielk1977} 352d1e4733dSdrh 353b5555e7eSdrh# Tests for the new transaction method 354b5555e7eSdrh# 355b5555e7eSdrhdo_test tcl-10.1 { 356b5555e7eSdrh db transaction {} 357b5555e7eSdrh} {} 358b5555e7eSdrhdo_test tcl-10.2 { 359b5555e7eSdrh db transaction deferred {} 360b5555e7eSdrh} {} 361b5555e7eSdrhdo_test tcl-10.3 { 362b5555e7eSdrh db transaction immediate {} 363b5555e7eSdrh} {} 364b5555e7eSdrhdo_test tcl-10.4 { 365b5555e7eSdrh db transaction exclusive {} 366b5555e7eSdrh} {} 367b5555e7eSdrhdo_test tcl-10.5 { 368b5555e7eSdrh set rc [catch {db transaction xyzzy {}} msg] 369b5555e7eSdrh lappend rc $msg 370b5555e7eSdrh} {1 {bad transaction type "xyzzy": must be deferred, exclusive, or immediate}} 371b5555e7eSdrhdo_test tcl-10.6 { 372b5555e7eSdrh set rc [catch {db transaction {error test-error}} msg] 373b5555e7eSdrh lappend rc $msg 374b5555e7eSdrh} {1 test-error} 375b5555e7eSdrhdo_test tcl-10.7 { 376b5555e7eSdrh db transaction { 377b5555e7eSdrh db eval {CREATE TABLE t4(x)} 378b5555e7eSdrh db transaction { 379b5555e7eSdrh db eval {INSERT INTO t4 VALUES(1)} 380b5555e7eSdrh } 381b5555e7eSdrh } 382b5555e7eSdrh db eval {SELECT * FROM t4} 383b5555e7eSdrh} 1 384b5555e7eSdrhdo_test tcl-10.8 { 385b5555e7eSdrh catch { 386b5555e7eSdrh db transaction { 387b5555e7eSdrh db eval {INSERT INTO t4 VALUES(2)} 388b5555e7eSdrh db eval {INSERT INTO t4 VALUES(3)} 389b5555e7eSdrh db eval {INSERT INTO t4 VALUES(4)} 390b5555e7eSdrh error test-error 391b5555e7eSdrh } 392b5555e7eSdrh } 393b5555e7eSdrh db eval {SELECT * FROM t4} 394b5555e7eSdrh} 1 395b5555e7eSdrhdo_test tcl-10.9 { 396b5555e7eSdrh db transaction { 397b5555e7eSdrh db eval {INSERT INTO t4 VALUES(2)} 398b5555e7eSdrh catch { 399b5555e7eSdrh db transaction { 400b5555e7eSdrh db eval {INSERT INTO t4 VALUES(3)} 401b5555e7eSdrh db eval {INSERT INTO t4 VALUES(4)} 402b5555e7eSdrh error test-error 403b5555e7eSdrh } 404b5555e7eSdrh } 405b5555e7eSdrh } 406b5555e7eSdrh db eval {SELECT * FROM t4} 407b5555e7eSdrh} {1 2 3 4} 408b5555e7eSdrhdo_test tcl-10.10 { 409b5555e7eSdrh for {set i 0} {$i<1} {incr i} { 410b5555e7eSdrh db transaction { 411b5555e7eSdrh db eval {INSERT INTO t4 VALUES(5)} 412b5555e7eSdrh continue 413b5555e7eSdrh } 414b5555e7eSdrh } 415b5555e7eSdrh db eval {SELECT * FROM t4} 416b5555e7eSdrh} {1 2 3 4 5} 417b5555e7eSdrhdo_test tcl-10.11 { 418b5555e7eSdrh for {set i 0} {$i<10} {incr i} { 419b5555e7eSdrh db transaction { 420b5555e7eSdrh db eval {INSERT INTO t4 VALUES(6)} 421b5555e7eSdrh break 422b5555e7eSdrh } 423b5555e7eSdrh } 424b5555e7eSdrh db eval {SELECT * FROM t4} 425b5555e7eSdrh} {1 2 3 4 5 6} 426b5555e7eSdrhdo_test tcl-10.12 { 427b5555e7eSdrh set rc [catch { 428b5555e7eSdrh for {set i 0} {$i<10} {incr i} { 429b5555e7eSdrh db transaction { 430b5555e7eSdrh db eval {INSERT INTO t4 VALUES(7)} 431b5555e7eSdrh return 432b5555e7eSdrh } 433b5555e7eSdrh } 434b5555e7eSdrh }] 435b5555e7eSdrh} {2} 436b5555e7eSdrhdo_test tcl-10.13 { 437b5555e7eSdrh db eval {SELECT * FROM t4} 438b5555e7eSdrh} {1 2 3 4 5 6 7} 439c7f269d5Sdrh 44097f2ebc1Sdrhdo_test tcl-11.1 { 44197f2ebc1Sdrh db exists {SELECT x,x*2,x+x FROM t4 WHERE x==4} 44297f2ebc1Sdrh} {1} 44397f2ebc1Sdrhdo_test tcl-11.2 { 44497f2ebc1Sdrh db exists {SELECT 0 FROM t4 WHERE x==4} 44597f2ebc1Sdrh} {1} 44697f2ebc1Sdrhdo_test tcl-11.3 { 44797f2ebc1Sdrh db exists {SELECT 1 FROM t4 WHERE x==8} 44897f2ebc1Sdrh} {0} 44997f2ebc1Sdrh 450161fb796Sdanielk1977do_test tcl-12.1 { 451161fb796Sdanielk1977 unset -nocomplain a b c version 452161fb796Sdanielk1977 set version [db version] 453161fb796Sdanielk1977 scan $version "%d.%d.%d" a b c 454161fb796Sdanielk1977 expr $a*1000000 + $b*1000 + $c 455161fb796Sdanielk1977} [sqlite3_libversion_number] 456161fb796Sdanielk1977 457960e8c63Sdrhfinish_test 458