xref: /sqlite-3.40.0/test/tclsqlite.test (revision b4e9af9f)
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