/ Hex Artifact Content
Login

Artifact a7308276aad2e6c0bfb5b0414424dd0d9cc0cad7:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .#**************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 54 43 4c 20 69 6e 74 65 72 66  s for TCL interf
01a0: 61 63 65 20 74 6f 20 74 68 65 0a 23 20 53 51 4c  ace to the.# SQL
01b0: 69 74 65 20 6c 69 62 72 61 72 79 2e 20 0a 23 0a  ite library. .#.
01c0: 23 20 41 63 74 75 61 6c 6c 79 2c 20 61 6c 6c 20  # Actually, all 
01d0: 74 65 73 74 73 20 61 72 65 20 62 61 73 65 64 20  tests are based 
01e0: 6f 6e 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  on the TCL inter
01f0: 66 61 63 65 2c 20 73 6f 20 74 68 65 20 6d 61 69  face, so the mai
0200: 6e 0a 23 20 69 6e 74 65 72 66 61 63 65 20 69 73  n.# interface is
0210: 20 70 72 65 74 74 79 20 77 65 6c 6c 20 74 65 73   pretty well tes
0220: 74 65 64 2e 20 20 54 68 69 73 20 66 69 6c 65 20  ted.  This file 
0230: 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 61 64  contains some ad
0240: 64 69 74 69 6f 6e 0a 23 20 74 65 73 74 73 20 66  dition.# tests f
0250: 6f 72 20 66 72 69 6e 67 65 20 69 73 73 75 65 73  or fringe issues
0260: 20 74 68 61 74 20 74 68 65 20 6d 61 69 6e 20 74   that the main t
0270: 65 73 74 20 73 75 69 74 65 20 64 6f 65 73 20 6e  est suite does n
0280: 6f 74 20 63 6f 76 65 72 2e 0a 23 0a 23 20 24 49  ot cover..#.# $I
0290: 64 3a 20 74 63 6c 73 71 6c 69 74 65 2e 74 65 73  d: tclsqlite.tes
02a0: 74 2c 76 20 31 2e 37 33 20 32 30 30 39 2f 30 33  t,v 1.73 2009/03
02b0: 2f 31 36 20 31 33 3a 31 39 3a 33 36 20 64 61 6e  /16 13:19:36 dan
02c0: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 0a  ielk1977 Exp $..
02d0: 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c  set testdir [fil
02e0: 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30  e dirname $argv0
02f0: 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69  ].source $testdi
0300: 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 23 20  r/tester.tcl..# 
0310: 43 68 65 63 6b 20 74 68 65 20 65 72 72 6f 72 20  Check the error 
0320: 6d 65 73 73 61 67 65 73 20 67 65 6e 65 72 61 74  messages generat
0330: 65 64 20 62 79 20 74 63 6c 73 71 6c 69 74 65 0a  ed by tclsqlite.
0340: 23 0a 69 66 20 7b 5b 73 71 6c 69 74 65 33 20 2d  #.if {[sqlite3 -
0350: 68 61 73 2d 63 6f 64 65 63 5d 7d 20 7b 0a 20 20  has-codec]} {.  
0360: 73 65 74 20 72 20 22 73 71 6c 69 74 65 5f 6f 72  set r "sqlite_or
0370: 69 67 20 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41  ig HANDLE FILENA
0380: 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45 43 2d 4b  ME ?-key CODEC-K
0390: 45 59 3f 22 0a 7d 20 65 6c 73 65 20 7b 0a 20 20  EY?".} else {.  
03a0: 73 65 74 20 72 20 22 73 71 6c 69 74 65 5f 6f 72  set r "sqlite_or
03b0: 69 67 20 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41  ig HANDLE FILENA
03c0: 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45  ME ?-vfs VFSNAME
03d0: 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f  ? ?-readonly BOO
03e0: 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42  LEAN? ?-create B
03f0: 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65  OOLEAN? ?-nomute
0400: 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c  x BOOLEAN? ?-ful
0410: 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20  lmutex BOOLEAN? 
0420: 3f 2d 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a  ?-uri BOOLEAN?".
0430: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e  }.do_test tcl-1.
0440: 31 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74  1 {.  set v [cat
0450: 63 68 20 7b 73 71 6c 69 74 65 33 20 62 6f 67 75  ch {sqlite3 bogu
0460: 73 7d 20 6d 73 67 5d 0a 20 20 72 65 67 73 75 62  s} msg].  regsub
0470: 20 7b 72 65 61 6c 6c 79 5f 73 71 6c 69 74 65 33   {really_sqlite3
0480: 7d 20 24 6d 73 67 20 7b 73 71 6c 69 74 65 33 7d  } $msg {sqlite3}
0490: 20 6d 73 67 0a 20 20 6c 61 70 70 65 6e 64 20 76   msg.  lappend v
04a0: 20 24 6d 73 67 0a 7d 20 5b 6c 69 73 74 20 31 20   $msg.} [list 1 
04b0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
04c0: 68 6f 75 6c 64 20 62 65 20 5c 22 24 72 5c 22 22  hould be \"$r\""
04d0: 5d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e  ].do_test tcl-1.
04e0: 32 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74  2 {.  set v [cat
04f0: 63 68 20 7b 64 62 20 62 6f 67 75 73 7d 20 6d 73  ch {db bogus} ms
0500: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24  g].  lappend v $
0510: 6d 73 67 0a 7d 20 7b 31 20 7b 62 61 64 20 6f 70  msg.} {1 {bad op
0520: 74 69 6f 6e 20 22 62 6f 67 75 73 22 3a 20 6d 75  tion "bogus": mu
0530: 73 74 20 62 65 20 61 75 74 68 6f 72 69 7a 65 72  st be authorizer
0540: 2c 20 62 61 63 6b 75 70 2c 20 62 75 73 79 2c 20  , backup, busy, 
0550: 63 61 63 68 65 2c 20 63 68 61 6e 67 65 73 2c 20  cache, changes, 
0560: 63 6c 6f 73 65 2c 20 63 6f 6c 6c 61 74 65 2c 20  close, collate, 
0570: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
0580: 2c 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 2c 20 63  , commit_hook, c
0590: 6f 6d 70 6c 65 74 65 2c 20 63 6f 70 79 2c 20 65  omplete, copy, e
05a0: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
05b0: 73 69 6f 6e 2c 20 65 72 72 6f 72 63 6f 64 65 2c  sion, errorcode,
05c0: 20 65 76 61 6c 2c 20 65 78 69 73 74 73 2c 20 66   eval, exists, f
05d0: 75 6e 63 74 69 6f 6e 2c 20 69 6e 63 72 62 6c 6f  unction, incrblo
05e0: 62 2c 20 69 6e 74 65 72 72 75 70 74 2c 20 6c 61  b, interrupt, la
05f0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 2c  st_insert_rowid,
0600: 20 6e 75 6c 6c 76 61 6c 75 65 2c 20 6f 6e 65 63   nullvalue, onec
0610: 6f 6c 75 6d 6e 2c 20 70 72 65 75 70 64 61 74 65  olumn, preupdate
0620: 2c 20 70 72 6f 66 69 6c 65 2c 20 70 72 6f 67 72  , profile, progr
0630: 65 73 73 2c 20 72 65 6b 65 79 2c 20 72 65 73 74  ess, rekey, rest
0640: 6f 72 65 2c 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f  ore, rollback_ho
0650: 6f 6b 2c 20 73 74 61 74 75 73 2c 20 74 69 6d 65  ok, status, time
0660: 6f 75 74 2c 20 74 6f 74 61 6c 5f 63 68 61 6e 67  out, total_chang
0670: 65 73 2c 20 74 72 61 63 65 2c 20 74 72 61 6e 73  es, trace, trans
0680: 61 63 74 69 6f 6e 2c 20 75 6e 6c 6f 63 6b 5f 6e  action, unlock_n
0690: 6f 74 69 66 79 2c 20 75 70 64 61 74 65 5f 68 6f  otify, update_ho
06a0: 6f 6b 2c 20 76 65 72 73 69 6f 6e 2c 20 6f 72 20  ok, version, or 
06b0: 77 61 6c 5f 68 6f 6f 6b 7d 7d 0a 64 6f 5f 74 65  wal_hook}}.do_te
06c0: 73 74 20 74 63 6c 2d 31 2e 32 2e 31 20 7b 0a 20  st tcl-1.2.1 {. 
06d0: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64   set v [catch {d
06e0: 62 20 63 61 63 68 65 20 62 6f 67 75 73 7d 20 6d  b cache bogus} m
06f0: 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20  sg].  lappend v 
0700: 24 6d 73 67 0a 7d 20 7b 31 20 7b 62 61 64 20 6f  $msg.} {1 {bad o
0710: 70 74 69 6f 6e 20 22 62 6f 67 75 73 22 3a 20 6d  ption "bogus": m
0720: 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20  ust be flush or 
0730: 73 69 7a 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  size}}.do_test t
0740: 63 6c 2d 31 2e 32 2e 32 20 7b 0a 20 20 73 65 74  cl-1.2.2 {.  set
0750: 20 76 20 5b 63 61 74 63 68 20 7b 64 62 20 63 61   v [catch {db ca
0760: 63 68 65 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70  che} msg].  lapp
0770: 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20  end v $msg.} {1 
0780: 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  {wrong # args: s
0790: 68 6f 75 6c 64 20 62 65 20 22 64 62 20 63 61 63  hould be "db cac
07a0: 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22  he option ?arg?"
07b0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31  }}.do_test tcl-1
07c0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
07d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
07e0: 61 20 69 6e 74 2c 20 62 20 69 6e 74 29 7d 0a 20  a int, b int)}. 
07f0: 20 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54   execsql {INSERT
0800: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0810: 31 30 2c 32 30 29 7d 0a 20 20 73 65 74 20 76 20  10,20)}.  set v 
0820: 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 64 62 20  [catch {.    db 
0830: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  eval {SELECT * F
0840: 52 4f 4d 20 74 31 7d 20 64 61 74 61 20 7b 0a 20  ROM t1} data {. 
0850: 20 20 20 20 20 65 72 72 6f 72 20 22 54 68 65 20       error "The 
0860: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 22 0a 20  error message". 
0870: 20 20 20 7d 0a 20 20 7d 20 6d 73 67 5d 0a 20 20     }.  } msg].  
0880: 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d  lappend v $msg.}
0890: 20 7b 31 20 7b 54 68 65 20 65 72 72 6f 72 20 6d   {1 {The error m
08a0: 65 73 73 61 67 65 7d 7d 0a 64 6f 5f 74 65 73 74  essage}}.do_test
08b0: 20 74 63 6c 2d 31 2e 34 20 7b 0a 20 20 73 65 74   tcl-1.4 {.  set
08c0: 20 76 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20   v [catch {.    
08d0: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
08e0: 2a 20 46 52 4f 4d 20 74 32 7d 20 64 61 74 61 20  * FROM t2} data 
08f0: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 22 54  {.      error "T
0900: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
0910: 22 0a 20 20 20 20 7d 0a 20 20 7d 20 6d 73 67 5d  ".    }.  } msg]
0920: 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73  .  lappend v $ms
0930: 67 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  g.} {1 {no such 
0940: 74 61 62 6c 65 3a 20 74 32 7d 7d 0a 64 6f 5f 74  table: t2}}.do_t
0950: 65 73 74 20 74 63 6c 2d 31 2e 35 20 7b 0a 20 20  est tcl-1.5 {.  
0960: 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 0a 20  set v [catch {. 
0970: 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45     db eval {SELE
0980: 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 64 61  CT * FROM t1} da
0990: 74 61 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  ta {.      break
09a0: 0a 20 20 20 20 7d 0a 20 20 7d 20 6d 73 67 5d 0a  .    }.  } msg].
09b0: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
09c0: 0a 7d 20 7b 30 20 7b 7d 7d 0a 63 61 74 63 68 20  .} {0 {}}.catch 
09d0: 7b 65 78 70 72 20 78 2a 7d 20 6d 73 67 0a 64 6f  {expr x*} msg.do
09e0: 5f 74 65 73 74 20 74 63 6c 2d 31 2e 36 20 7b 0a  _test tcl-1.6 {.
09f0: 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b    set v [catch {
0a00: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45  .    db eval {SE
0a10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20  LECT * FROM t1} 
0a20: 64 61 74 61 20 7b 0a 20 20 20 20 20 20 65 78 70  data {.      exp
0a30: 72 20 78 2a 0a 20 20 20 20 7d 0a 20 20 7d 20 6d  r x*.    }.  } m
0a40: 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20  sg].  lappend v 
0a50: 24 6d 73 67 0a 7d 20 5b 6c 69 73 74 20 31 20 24  $msg.} [list 1 $
0a60: 6d 73 67 5d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  msg].do_test tcl
0a70: 2d 31 2e 37 20 7b 0a 20 20 73 65 74 20 76 20 5b  -1.7 {.  set v [
0a80: 63 61 74 63 68 20 7b 64 62 7d 20 6d 73 67 5d 0a  catch {db} msg].
0a90: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
0aa0: 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61  .} {1 {wrong # a
0ab0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22  rgs: should be "
0ac0: 64 62 20 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e  db SUBCOMMAND ..
0ad0: 2e 22 7d 7d 0a 69 66 20 7b 5b 63 61 74 63 68 20  ."}}.if {[catch 
0ae0: 7b 64 62 20 61 75 74 68 20 7b 7d 7d 5d 3d 3d 30  {db auth {}}]==0
0af0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74 63  } {.  do_test tc
0b00: 6c 2d 31 2e 38 20 7b 0a 20 20 20 20 73 65 74 20  l-1.8 {.    set 
0b10: 76 20 5b 63 61 74 63 68 20 7b 64 62 20 61 75 74  v [catch {db aut
0b20: 68 6f 72 69 7a 65 72 20 31 20 32 20 33 7d 20 6d  horizer 1 2 3} m
0b30: 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  sg].    lappend 
0b40: 76 20 24 6d 73 67 0a 20 20 7d 20 7b 31 20 7b 77  v $msg.  } {1 {w
0b50: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
0b60: 75 6c 64 20 62 65 20 22 64 62 20 61 75 74 68 6f  uld be "db autho
0b70: 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f  rizer ?CALLBACK?
0b80: 22 7d 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 63  "}}.}.do_test tc
0b90: 6c 2d 31 2e 39 20 7b 0a 20 20 73 65 74 20 76 20  l-1.9 {.  set v 
0ba0: 5b 63 61 74 63 68 20 7b 64 62 20 62 75 73 79 20  [catch {db busy 
0bb0: 31 20 32 20 33 7d 20 6d 73 67 5d 0a 20 20 6c 61  1 2 3} msg].  la
0bc0: 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b  ppend v $msg.} {
0bd0: 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  1 {wrong # args:
0be0: 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20 62   should be "db b
0bf0: 75 73 79 20 43 41 4c 4c 42 41 43 4b 22 7d 7d 0a  usy CALLBACK"}}.
0c00: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 31 30  do_test tcl-1.10
0c10: 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63   {.  set v [catc
0c20: 68 20 7b 64 62 20 70 72 6f 67 72 65 73 73 20 31  h {db progress 1
0c30: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
0c40: 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72   v $msg.} {1 {wr
0c50: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
0c60: 6c 64 20 62 65 20 22 64 62 20 70 72 6f 67 72 65  ld be "db progre
0c70: 73 73 20 4e 20 43 41 4c 4c 42 41 43 4b 22 7d 7d  ss N CALLBACK"}}
0c80: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 31  .do_test tcl-1.1
0c90: 31 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74  1 {.  set v [cat
0ca0: 63 68 20 7b 64 62 20 63 68 61 6e 67 65 73 20 78  ch {db changes x
0cb0: 79 7a 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65  yz} msg].  lappe
0cc0: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b  nd v $msg.} {1 {
0cd0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
0ce0: 6f 75 6c 64 20 62 65 20 22 64 62 20 63 68 61 6e  ould be "db chan
0cf0: 67 65 73 20 22 7d 7d 0a 64 6f 5f 74 65 73 74 20  ges "}}.do_test 
0d00: 74 63 6c 2d 31 2e 31 32 20 7b 0a 20 20 73 65 74  tcl-1.12 {.  set
0d10: 20 76 20 5b 63 61 74 63 68 20 7b 64 62 20 63 6f   v [catch {db co
0d20: 6d 6d 69 74 5f 68 6f 6f 6b 20 61 20 62 20 63 7d  mmit_hook a b c}
0d30: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
0d40: 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f  v $msg.} {1 {wro
0d50: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
0d60: 64 20 62 65 20 22 64 62 20 63 6f 6d 6d 69 74 5f  d be "db commit_
0d70: 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 22  hook ?CALLBACK?"
0d80: 7d 7d 0a 69 66 63 61 70 61 62 6c 65 20 7b 63 6f  }}.ifcapable {co
0d90: 6d 70 6c 65 74 65 7d 20 7b 0a 20 20 64 6f 5f 74  mplete} {.  do_t
0da0: 65 73 74 20 74 63 6c 2d 31 2e 31 33 20 7b 0a 20  est tcl-1.13 {. 
0db0: 20 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20     set v [catch 
0dc0: 7b 64 62 20 63 6f 6d 70 6c 65 74 65 7d 20 6d 73  {db complete} ms
0dd0: 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 76  g].    lappend v
0de0: 20 24 6d 73 67 0a 20 20 7d 20 7b 31 20 7b 77 72   $msg.  } {1 {wr
0df0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
0e00: 6c 64 20 62 65 20 22 64 62 20 63 6f 6d 70 6c 65  ld be "db comple
0e10: 74 65 20 53 51 4c 22 7d 7d 0a 7d 0a 64 6f 5f 74  te SQL"}}.}.do_t
0e20: 65 73 74 20 74 63 6c 2d 31 2e 31 34 20 7b 0a 20  est tcl-1.14 {. 
0e30: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64   set v [catch {d
0e40: 62 20 65 76 61 6c 7d 20 6d 73 67 5d 0a 20 20 6c  b eval} msg].  l
0e50: 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20  append v $msg.} 
0e60: 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73  {1 {wrong # args
0e70: 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20  : should be "db 
0e80: 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41 59 2d  eval SQL ?ARRAY-
0e90: 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 7d  NAME? ?SCRIPT?"}
0ea0: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e  }.do_test tcl-1.
0eb0: 31 35 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61  15 {.  set v [ca
0ec0: 74 63 68 20 7b 64 62 20 66 75 6e 63 74 69 6f 6e  tch {db function
0ed0: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
0ee0: 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72   v $msg.} {1 {wr
0ef0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
0f00: 6c 64 20 62 65 20 22 64 62 20 66 75 6e 63 74 69  ld be "db functi
0f10: 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75  on NAME [-argcou
0f20: 6e 74 20 4e 5d 20 53 43 52 49 50 54 22 7d 7d 0a  nt N] SCRIPT"}}.
0f30: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 31 36  do_test tcl-1.16
0f40: 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63   {.  set v [catc
0f50: 68 20 7b 64 62 20 6c 61 73 74 5f 69 6e 73 65 72  h {db last_inser
0f60: 74 5f 72 6f 77 69 64 20 78 79 7a 7d 20 6d 73 67  t_rowid xyz} msg
0f70: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d  ].  lappend v $m
0f80: 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23  sg.} {1 {wrong #
0f90: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
0fa0: 20 22 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74   "db last_insert
0fb0: 5f 72 6f 77 69 64 20 22 7d 7d 0a 64 6f 5f 74 65  _rowid "}}.do_te
0fc0: 73 74 20 74 63 6c 2d 31 2e 31 37 20 7b 0a 20 20  st tcl-1.17 {.  
0fd0: 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64 62  set v [catch {db
0fe0: 20 72 65 6b 65 79 7d 20 6d 73 67 5d 0a 20 20 6c   rekey} msg].  l
0ff0: 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20  append v $msg.} 
1000: 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73  {1 {wrong # args
1010: 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20  : should be "db 
1020: 72 65 6b 65 79 20 4b 45 59 22 7d 7d 0a 64 6f 5f  rekey KEY"}}.do_
1030: 74 65 73 74 20 74 63 6c 2d 31 2e 31 38 20 7b 0a  test tcl-1.18 {.
1040: 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b    set v [catch {
1050: 64 62 20 74 69 6d 65 6f 75 74 7d 20 6d 73 67 5d  db timeout} msg]
1060: 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73  .  lappend v $ms
1070: 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20  g.} {1 {wrong # 
1080: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1090: 22 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c  "db timeout MILL
10a0: 49 53 45 43 4f 4e 44 53 22 7d 7d 0a 64 6f 5f 74  ISECONDS"}}.do_t
10b0: 65 73 74 20 74 63 6c 2d 31 2e 31 39 20 7b 0a 20  est tcl-1.19 {. 
10c0: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64   set v [catch {d
10d0: 62 20 63 6f 6c 6c 61 74 65 7d 20 6d 73 67 5d 0a  b collate} msg].
10e0: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
10f0: 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61  .} {1 {wrong # a
1100: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22  rgs: should be "
1110: 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20  db collate NAME 
1120: 53 43 52 49 50 54 22 7d 7d 0a 64 6f 5f 74 65 73  SCRIPT"}}.do_tes
1130: 74 20 74 63 6c 2d 31 2e 32 30 20 7b 0a 20 20 73  t tcl-1.20 {.  s
1140: 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64 62 20  et v [catch {db 
1150: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
1160: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
1170: 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72   v $msg.} {1 {wr
1180: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1190: 6c 64 20 62 65 20 22 64 62 20 63 6f 6c 6c 61 74  ld be "db collat
11a0: 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49 50  ion_needed SCRIP
11b0: 54 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  T"}}.do_test tcl
11c0: 2d 31 2e 32 31 20 7b 0a 20 20 73 65 74 20 76 20  -1.21 {.  set v 
11d0: 5b 63 61 74 63 68 20 7b 64 62 20 74 6f 74 61 6c  [catch {db total
11e0: 5f 63 68 61 6e 67 65 73 20 78 79 7a 7d 20 6d 73  _changes xyz} ms
11f0: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24  g].  lappend v $
1200: 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20  msg.} {1 {wrong 
1210: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1220: 65 20 22 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e  e "db total_chan
1230: 67 65 73 20 22 7d 7d 0a 64 6f 5f 74 65 73 74 20  ges "}}.do_test 
1240: 74 63 6c 2d 31 2e 32 32 20 7b 0a 20 20 73 65 74  tcl-1.22 {.  set
1250: 20 76 20 5b 63 61 74 63 68 20 7b 64 62 20 63 6f   v [catch {db co
1260: 70 79 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65  py} msg].  lappe
1270: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b  nd v $msg.} {1 {
1280: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1290: 6f 75 6c 64 20 62 65 20 22 64 62 20 63 6f 70 79  ould be "db copy
12a0: 20 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49   CONFLICT-ALGORI
12b0: 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
12c0: 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
12d0: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 7d  NULLINDICATOR?"}
12e0: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e  }.do_test tcl-1.
12f0: 32 33 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61  23 {.  set v [ca
1300: 74 63 68 20 7b 73 71 6c 69 74 65 33 20 64 62 32  tch {sqlite3 db2
1310: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 6e 6f   test.db -vfs no
1320: 73 75 63 68 76 66 73 7d 20 6d 73 67 5d 0a 20 20  suchvfs} msg].  
1330: 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d  lappend v $msg.}
1340: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 76 66 73   {1 {no such vfs
1350: 3a 20 6e 6f 73 75 63 68 76 66 73 7d 7d 0a 0a 63  : nosuchvfs}}..c
1360: 61 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a 72 65  atch {unset ::re
1370: 73 75 6c 74 7d 0a 64 6f 5f 74 65 73 74 20 74 63  sult}.do_test tc
1380: 6c 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  l-2.1 {.  execsq
1390: 6c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  l "CREATE TABLE 
13a0: 74 5c 75 30 31 32 33 78 28 61 20 69 6e 74 2c 20  t\u0123x(a int, 
13b0: 62 5c 75 31 32 33 35 20 66 6c 6f 61 74 29 22 0a  b\u1235 float)".
13c0: 7d 20 7b 7d 0a 69 66 63 61 70 61 62 6c 65 20 73  } {}.ifcapable s
13d0: 63 68 65 6d 61 5f 70 72 61 67 6d 61 73 20 7b 0a  chema_pragmas {.
13e0: 20 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 32 2e    do_test tcl-2.
13f0: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
1400: 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e  "PRAGMA table_in
1410: 66 6f 28 74 5c 75 30 31 32 33 78 29 22 0a 20 20  fo(t\u0123x)".  
1420: 7d 20 22 30 20 61 20 69 6e 74 20 30 20 7b 7d 20  } "0 a int 0 {} 
1430: 30 20 31 20 62 5c 75 31 32 33 35 20 66 6c 6f 61  0 1 b\u1235 floa
1440: 74 20 30 20 7b 7d 20 30 22 0a 7d 0a 64 6f 5f 74  t 0 {} 0".}.do_t
1450: 65 73 74 20 74 63 6c 2d 32 2e 33 20 7b 0a 20 20  est tcl-2.3 {.  
1460: 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20  execsql "INSERT 
1470: 49 4e 54 4f 20 74 5c 75 30 31 32 33 78 20 56 41  INTO t\u0123x VA
1480: 4c 55 45 53 28 31 2c 32 2e 33 29 22 0a 20 20 64  LUES(1,2.3)".  d
1490: 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 2a  b eval "SELECT *
14a0: 20 46 52 4f 4d 20 74 5c 75 30 31 32 33 78 22 20   FROM t\u0123x" 
14b0: 72 65 73 75 6c 74 20 62 72 65 61 6b 0a 20 20 73  result break.  s
14c0: 65 74 20 72 65 73 75 6c 74 28 2a 29 0a 7d 20 22  et result(*).} "
14d0: 61 20 62 5c 75 31 32 33 35 22 0a 0a 0a 23 20 54  a b\u1235"...# T
14e0: 65 73 74 20 74 68 65 20 6f 6e 65 63 6f 6c 75 6d  est the onecolum
14f0: 6e 20 6d 65 74 68 6f 64 0a 23 0a 64 6f 5f 74 65  n method.#.do_te
1500: 73 74 20 74 63 6c 2d 33 2e 31 20 7b 0a 20 20 65  st tcl-3.1 {.  e
1510: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
1520: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1530: 43 54 20 61 2a 32 2c 20 62 2a 32 20 46 52 4f 4d  CT a*2, b*2 FROM
1540: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
1550: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
1560: 2a 32 2b 31 2c 20 62 2a 32 2b 31 20 46 52 4f 4d  *2+1, b*2+1 FROM
1570: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
1580: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
1590: 2a 32 2b 33 2c 20 62 2a 32 2b 33 20 46 52 4f 4d  *2+3, b*2+3 FROM
15a0: 20 74 31 3b 0a 20 20 7d 0a 20 20 73 65 74 20 72   t1;.  }.  set r
15b0: 63 20 5b 63 61 74 63 68 20 7b 64 62 20 6f 6e 65  c [catch {db one
15c0: 63 6f 6c 75 6d 6e 20 7b 53 45 4c 45 43 54 20 2a  column {SELECT *
15d0: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
15e0: 59 20 61 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70  Y a}} msg].  lap
15f0: 70 65 6e 64 20 72 63 20 24 6d 73 67 0a 7d 20 7b  pend rc $msg.} {
1600: 30 20 31 30 7d 0a 64 6f 5f 74 65 73 74 20 74 63  0 10}.do_test tc
1610: 6c 2d 33 2e 32 20 7b 0a 20 20 64 62 20 6f 6e 65  l-3.2 {.  db one
1620: 63 6f 6c 75 6d 6e 20 7b 53 45 4c 45 43 54 20 2a  column {SELECT *
1630: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
1640: 3c 30 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  <0}.} {}.do_test
1650: 20 74 63 6c 2d 33 2e 33 20 7b 0a 20 20 73 65 74   tcl-3.3 {.  set
1660: 20 72 63 20 5b 63 61 74 63 68 20 7b 64 62 20 6f   rc [catch {db o
1670: 6e 65 63 6f 6c 75 6d 6e 7d 20 65 72 72 6d 73 67  necolumn} errmsg
1680: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24  ].  lappend rc $
1690: 65 72 72 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f  errmsg.} {1 {wro
16a0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
16b0: 64 20 62 65 20 22 64 62 20 6f 6e 65 63 6f 6c 75  d be "db onecolu
16c0: 6d 6e 20 53 51 4c 22 7d 7d 0a 64 6f 5f 74 65 73  mn SQL"}}.do_tes
16d0: 74 20 74 63 6c 2d 33 2e 34 20 7b 0a 20 20 73 65  t tcl-3.4 {.  se
16e0: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 64 62 20  t rc [catch {db 
16f0: 6f 6e 65 63 6f 6c 75 6d 6e 20 7b 53 45 4c 45 43  onecolumn {SELEC
1700: 54 20 62 6f 67 75 73 7d 7d 20 65 72 72 6d 73 67  T bogus}} errmsg
1710: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24  ].  lappend rc $
1720: 65 72 72 6d 73 67 0a 7d 20 7b 31 20 7b 6e 6f 20  errmsg.} {1 {no 
1730: 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 62 6f 67  such column: bog
1740: 75 73 7d 7d 0a 69 66 63 61 70 61 62 6c 65 20 7b  us}}.ifcapable {
1750: 74 63 6c 76 61 72 7d 20 7b 0a 20 20 64 6f 5f 74  tclvar} {.  do_t
1760: 65 73 74 20 74 63 6c 2d 33 2e 35 20 7b 0a 20 20  est tcl-3.5 {.  
1770: 20 20 73 65 74 20 62 20 35 30 0a 20 20 20 20 73    set b 50.    s
1780: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 64 62  et rc [catch {db
1790: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 2a 20 46   one {SELECT * F
17a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3e 24  ROM t1 WHERE b>$
17b0: 62 7d 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 61 70  b}} msg].    lap
17c0: 70 65 6e 64 20 72 63 20 24 6d 73 67 0a 20 20 7d  pend rc $msg.  }
17d0: 20 7b 30 20 34 31 7d 0a 20 20 64 6f 5f 74 65 73   {0 41}.  do_tes
17e0: 74 20 74 63 6c 2d 33 2e 36 20 7b 0a 20 20 20 20  t tcl-3.6 {.    
17f0: 73 65 74 20 62 20 35 30 30 0a 20 20 20 20 73 65  set b 500.    se
1800: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 64 62 20  t rc [catch {db 
1810: 6f 6e 65 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  one {SELECT * FR
1820: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3e 24 62  OM t1 WHERE b>$b
1830: 7d 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 61 70 70  }} msg].    lapp
1840: 65 6e 64 20 72 63 20 24 6d 73 67 0a 20 20 7d 20  end rc $msg.  } 
1850: 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  {0 {}}.  do_test
1860: 20 74 63 6c 2d 33 2e 37 20 7b 0a 20 20 20 20 73   tcl-3.7 {.    s
1870: 65 74 20 62 20 35 30 30 0a 20 20 20 20 73 65 74  et b 500.    set
1880: 20 72 63 20 5b 63 61 74 63 68 20 7b 64 62 20 6f   rc [catch {db o
1890: 6e 65 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  ne {.      INSER
18a0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
18b0: 28 39 39 2c 35 31 30 29 3b 0a 20 20 20 20 20 20  (99,510);.      
18c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
18d0: 20 57 48 45 52 45 20 62 3e 24 62 0a 20 20 20 20   WHERE b>$b.    
18e0: 7d 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 61 70 70  }} msg].    lapp
18f0: 65 6e 64 20 72 63 20 24 6d 73 67 0a 20 20 7d 20  end rc $msg.  } 
1900: 7b 30 20 39 39 7d 0a 7d 0a 69 66 63 61 70 61 62  {0 99}.}.ifcapab
1910: 6c 65 20 7b 21 74 63 6c 76 61 72 7d 20 7b 0a 20  le {!tclvar} {. 
1920: 20 20 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52    execsql {INSER
1930: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1940: 28 39 39 2c 35 31 30 29 7d 0a 7d 0a 0a 23 20 54  (99,510)}.}..# T
1950: 75 72 6e 20 74 68 65 20 62 75 73 79 20 68 61 6e  urn the busy han
1960: 64 6c 65 72 20 6f 6e 20 61 6e 64 20 6f 66 66 0a  dler on and off.
1970: 23 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 34 2e  #.do_test tcl-4.
1980: 31 20 7b 0a 20 20 70 72 6f 63 20 62 75 73 79 5f  1 {.  proc busy_
1990: 63 61 6c 6c 62 61 63 6b 20 7b 63 6e 74 7d 20 7b  callback {cnt} {
19a0: 0a 20 20 20 20 62 72 65 61 6b 0a 20 20 7d 0a 20  .    break.  }. 
19b0: 20 64 62 20 62 75 73 79 20 62 75 73 79 5f 63 61   db busy busy_ca
19c0: 6c 6c 62 61 63 6b 0a 20 20 64 62 20 62 75 73 79  llback.  db busy
19d0: 0a 7d 20 7b 62 75 73 79 5f 63 61 6c 6c 62 61 63  .} {busy_callbac
19e0: 6b 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 34  k}.do_test tcl-4
19f0: 2e 32 20 7b 0a 20 20 64 62 20 62 75 73 79 20 7b  .2 {.  db busy {
1a00: 7d 0a 20 20 64 62 20 62 75 73 79 0a 7d 20 7b 7d  }.  db busy.} {}
1a10: 0a 0a 69 66 63 61 70 61 62 6c 65 20 7b 74 63 6c  ..ifcapable {tcl
1a20: 76 61 72 7d 20 7b 0a 20 20 23 20 50 61 72 73 69  var} {.  # Parsi
1a30: 6e 67 20 6f 66 20 54 43 4c 20 76 61 72 69 61 62  ng of TCL variab
1a40: 6c 65 20 6e 61 6d 65 73 20 77 69 74 68 69 6e 20  le names within 
1a50: 53 51 4c 20 69 6e 74 6f 20 62 6f 75 6e 64 20 70  SQL into bound p
1a60: 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 23 0a 20  arameters..  #. 
1a70: 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 35 2e 31   do_test tcl-5.1
1a80: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
1a90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
1aa0: 61 2c 62 2c 63 29 7d 0a 20 20 20 20 63 61 74 63  a,b,c)}.    catc
1ab0: 68 20 7b 75 6e 73 65 74 20 78 7d 0a 20 20 20 20  h {unset x}.    
1ac0: 73 65 74 20 78 28 31 29 20 41 0a 20 20 20 20 73  set x(1) A.    s
1ad0: 65 74 20 78 28 32 29 20 42 0a 20 20 20 20 65 78  et x(2) B.    ex
1ae0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e  ecsql {.      IN
1af0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
1b00: 55 45 53 28 24 3a 3a 78 28 31 29 2c 24 3a 3a 78  UES($::x(1),$::x
1b10: 28 32 29 2c 24 3a 3a 78 28 33 29 29 3b 0a 20 20  (2),$::x(3));.  
1b20: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1b30: 4d 20 74 33 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  M t3.    }.  } {
1b40: 41 20 42 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73  A B {}}.  do_tes
1b50: 74 20 74 63 6c 2d 35 2e 32 20 7b 0a 20 20 20 20  t tcl-5.2 {.    
1b60: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
1b70: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 61 29  SELECT typeof(a)
1b80: 2c 20 74 79 70 65 6f 66 28 62 29 2c 20 74 79 70  , typeof(b), typ
1b90: 65 6f 66 28 63 29 20 46 52 4f 4d 20 74 33 0a 20  eof(c) FROM t3. 
1ba0: 20 20 20 7d 0a 20 20 7d 20 7b 74 65 78 74 20 74     }.  } {text t
1bb0: 65 78 74 20 6e 75 6c 6c 7d 0a 20 20 64 6f 5f 74  ext null}.  do_t
1bc0: 65 73 74 20 74 63 6c 2d 35 2e 33 20 7b 0a 20 20  est tcl-5.3 {.  
1bd0: 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 78    catch {unset x
1be0: 7d 0a 20 20 20 20 73 65 74 20 78 20 5b 62 69 6e  }.    set x [bin
1bf0: 61 72 79 20 66 6f 72 6d 61 74 20 68 31 32 20 36  ary format h12 6
1c00: 38 36 39 30 30 36 38 36 66 30 30 5d 0a 20 20 20  86900686f00].   
1c10: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
1c20: 20 55 50 44 41 54 45 20 74 33 20 53 45 54 20 61   UPDATE t3 SET a
1c30: 3d 24 3a 3a 78 3b 0a 20 20 20 20 7d 0a 20 20 20  =$::x;.    }.   
1c40: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 20   db eval {.     
1c50: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
1c60: 33 0a 20 20 20 20 7d 20 62 72 65 61 6b 0a 20 20  3.    } break.  
1c70: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 61    binary scan $a
1c80: 20 68 31 32 20 61 64 61 74 61 0a 20 20 20 20 73   h12 adata.    s
1c90: 65 74 20 61 64 61 74 61 0a 20 20 7d 20 7b 36 38  et adata.  } {68
1ca0: 36 39 30 30 36 38 36 66 30 30 7d 0a 20 20 64 6f  6900686f00}.  do
1cb0: 5f 74 65 73 74 20 74 63 6c 2d 35 2e 34 20 7b 0a  _test tcl-5.4 {.
1cc0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
1cd0: 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
1ce0: 66 28 61 29 2c 20 74 79 70 65 6f 66 28 62 29 2c  f(a), typeof(b),
1cf0: 20 74 79 70 65 6f 66 28 63 29 20 46 52 4f 4d 20   typeof(c) FROM 
1d00: 74 33 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 62 6c  t3.    }.  } {bl
1d10: 6f 62 20 74 65 78 74 20 6e 75 6c 6c 7d 0a 7d 0a  ob text null}.}.
1d20: 0a 23 20 4f 70 65 72 61 74 69 6f 6e 20 6f 66 20  .# Operation of 
1d30: 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
1d40: 74 69 6e 75 65 22 20 77 69 74 68 69 6e 20 72 6f  tinue" within ro
1d50: 77 20 73 63 72 69 70 74 73 0a 23 0a 64 6f 5f 74  w scripts.#.do_t
1d60: 65 73 74 20 74 63 6c 2d 36 2e 31 20 7b 0a 20 20  est tcl-6.1 {.  
1d70: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
1d80: 2a 20 46 52 4f 4d 20 74 31 7d 20 7b 0a 20 20 20  * FROM t1} {.   
1d90: 20 62 72 65 61 6b 0a 20 20 7d 0a 20 20 6c 61 70   break.  }.  lap
1da0: 70 65 6e 64 20 61 20 24 62 0a 7d 20 7b 31 30 20  pend a $b.} {10 
1db0: 32 30 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d  20}.do_test tcl-
1dc0: 36 2e 32 20 7b 0a 20 20 73 65 74 20 63 6e 74 20  6.2 {.  set cnt 
1dd0: 30 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c  0.  db eval {SEL
1de0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 7b  ECT * FROM t1} {
1df0: 0a 20 20 20 20 69 66 20 7b 24 61 3e 34 30 7d 20  .    if {$a>40} 
1e00: 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 69 6e 63  continue.    inc
1e10: 72 20 63 6e 74 0a 20 20 7d 0a 20 20 73 65 74 20  r cnt.  }.  set 
1e20: 63 6e 74 0a 7d 20 7b 34 7d 0a 64 6f 5f 74 65 73  cnt.} {4}.do_tes
1e30: 74 20 74 63 6c 2d 36 2e 33 20 7b 0a 20 20 73 65  t tcl-6.3 {.  se
1e40: 74 20 63 6e 74 20 30 0a 20 20 64 62 20 65 76 61  t cnt 0.  db eva
1e50: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
1e60: 20 74 31 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24   t1} {.    if {$
1e70: 61 3c 34 30 7d 20 63 6f 6e 74 69 6e 75 65 0a 20  a<40} continue. 
1e80: 20 20 20 69 6e 63 72 20 63 6e 74 0a 20 20 7d 0a     incr cnt.  }.
1e90: 20 20 73 65 74 20 63 6e 74 0a 7d 20 7b 35 7d 0a    set cnt.} {5}.
1ea0: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 36 2e 34 20  do_test tcl-6.4 
1eb0: 7b 0a 20 20 70 72 6f 63 20 72 65 74 75 72 6e 5f  {.  proc return_
1ec0: 74 65 73 74 20 7b 78 7d 20 7b 0a 20 20 20 20 64  test {x} {.    d
1ed0: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a  b eval {SELECT *
1ee0: 20 46 52 4f 4d 20 74 31 7d 20 7b 0a 20 20 20 20   FROM t1} {.    
1ef0: 20 20 69 66 20 7b 24 61 3d 3d 24 78 7d 20 7b 72    if {$a==$x} {r
1f00: 65 74 75 72 6e 20 24 62 7d 0a 20 20 20 20 7d 0a  eturn $b}.    }.
1f10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 5f 74 65 73    }.  return_tes
1f20: 74 20 31 30 0a 7d 20 32 30 0a 64 6f 5f 74 65 73  t 10.} 20.do_tes
1f30: 74 20 74 63 6c 2d 36 2e 35 20 7b 0a 20 20 72 65  t tcl-6.5 {.  re
1f40: 74 75 72 6e 5f 74 65 73 74 20 32 30 0a 7d 20 34  turn_test 20.} 4
1f50: 30 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 36 2e  0.do_test tcl-6.
1f60: 36 20 7b 0a 20 20 72 65 74 75 72 6e 5f 74 65 73  6 {.  return_tes
1f70: 74 20 39 39 0a 7d 20 35 31 30 0a 64 6f 5f 74 65  t 99.} 510.do_te
1f80: 73 74 20 74 63 6c 2d 36 2e 37 20 7b 0a 20 20 72  st tcl-6.7 {.  r
1f90: 65 74 75 72 6e 5f 74 65 73 74 20 30 0a 7d 20 7b  eturn_test 0.} {
1fa0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 37  }..do_test tcl-7
1fb0: 2e 31 20 7b 0a 20 20 64 62 20 76 65 72 73 69 6f  .1 {.  db versio
1fc0: 6e 0a 20 20 65 78 70 72 20 30 0a 7d 20 7b 30 7d  n.  expr 0.} {0}
1fd0: 0a 0a 23 20 6d 6f 64 69 66 79 20 61 6e 64 20 72  ..# modify and r
1fe0: 65 73 65 74 20 74 68 65 20 4e 55 4c 4c 20 72 65  eset the NULL re
1ff0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 23 0a 64  presentation.#.d
2000: 6f 5f 74 65 73 74 20 74 63 6c 2d 38 2e 31 20 7b  o_test tcl-8.1 {
2010: 0a 20 20 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20  .  db nullvalue 
2020: 4e 61 4e 0a 20 20 65 78 65 63 73 71 6c 20 7b 49  NaN.  execsql {I
2030: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2040: 4c 55 45 53 28 33 30 2c 4e 55 4c 4c 29 7d 0a 20  LUES(30,NULL)}. 
2050: 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54   db eval {SELECT
2060: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
2070: 20 62 20 49 53 20 4e 55 4c 4c 7d 0a 7d 20 7b 33   b IS NULL}.} {3
2080: 30 20 4e 61 4e 7d 0a 70 72 6f 63 20 63 6f 6e 63  0 NaN}.proc conc
2090: 61 74 46 75 6e 63 20 61 72 67 73 20 7b 72 65 74  atFunc args {ret
20a0: 75 72 6e 20 5b 6a 6f 69 6e 20 24 61 72 67 73 20  urn [join $args 
20b0: 7b 7d 5d 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  {}]}.do_test tcl
20c0: 2d 38 2e 32 20 7b 0a 20 20 64 62 20 66 75 6e 63  -8.2 {.  db func
20d0: 74 69 6f 6e 20 63 6f 6e 63 61 74 20 63 6f 6e 63  tion concat conc
20e0: 61 74 46 75 6e 63 0a 20 20 64 62 20 65 76 61 6c  atFunc.  db eval
20f0: 20 7b 53 45 4c 45 43 54 20 63 6f 6e 63 61 74 28   {SELECT concat(
2100: 27 61 27 2c 20 62 2c 20 27 7a 27 29 20 46 52 4f  'a', b, 'z') FRO
2110: 4d 20 74 31 20 57 48 45 52 45 20 62 20 69 73 20  M t1 WHERE b is 
2120: 4e 55 4c 4c 7d 0a 7d 20 7b 61 4e 61 4e 7a 7d 0a  NULL}.} {aNaNz}.
2130: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 38 2e 33 20  do_test tcl-8.3 
2140: 7b 0a 20 20 64 62 20 6e 75 6c 6c 76 61 6c 75 65  {.  db nullvalue
2150: 20 4e 55 4c 4c 0a 20 20 64 62 20 6e 75 6c 6c 76   NULL.  db nullv
2160: 61 6c 75 65 0a 7d 20 7b 4e 55 4c 4c 7d 0a 64 6f  alue.} {NULL}.do
2170: 5f 74 65 73 74 20 74 63 6c 2d 38 2e 34 20 7b 0a  _test tcl-8.4 {.
2180: 20 20 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 7b    db nullvalue {
2190: 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c  }.  db eval {SEL
21a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
21b0: 45 52 45 20 62 20 49 53 20 4e 55 4c 4c 7d 0a 7d  ERE b IS NULL}.}
21c0: 20 7b 33 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74   {30 {}}.do_test
21d0: 20 74 63 6c 2d 38 2e 35 20 7b 0a 20 20 64 62 20   tcl-8.5 {.  db 
21e0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 63 61 74 20  function concat 
21f0: 63 6f 6e 63 61 74 46 75 6e 63 0a 20 20 64 62 20  concatFunc.  db 
2200: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f 6e  eval {SELECT con
2210: 63 61 74 28 27 61 27 2c 20 62 2c 20 27 7a 27 29  cat('a', b, 'z')
2220: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
2230: 20 69 73 20 4e 55 4c 4c 7d 0a 7d 20 7b 61 7a 7d   is NULL}.} {az}
2240: 0a 0a 23 20 54 65 73 74 20 74 68 65 20 72 65 74  ..# Test the ret
2250: 75 72 6e 20 74 79 70 65 20 6f 66 20 75 73 65 72  urn type of user
2260: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
2270: 6e 73 0a 23 0a 64 6f 5f 74 65 73 74 20 74 63 6c  ns.#.do_test tcl
2280: 2d 39 2e 31 20 7b 0a 20 20 64 62 20 66 75 6e 63  -9.1 {.  db func
2290: 74 69 6f 6e 20 72 65 74 5f 73 74 72 20 7b 72 65  tion ret_str {re
22a0: 74 75 72 6e 20 22 68 69 22 7d 0a 20 20 65 78 65  turn "hi"}.  exe
22b0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 79 70  csql {SELECT typ
22c0: 65 6f 66 28 72 65 74 5f 73 74 72 28 29 29 7d 0a  eof(ret_str())}.
22d0: 7d 20 7b 74 65 78 74 7d 0a 64 6f 5f 74 65 73 74  } {text}.do_test
22e0: 20 74 63 6c 2d 39 2e 32 20 7b 0a 20 20 64 62 20   tcl-9.2 {.  db 
22f0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 5f 64 62 6c  function ret_dbl
2300: 20 7b 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b   {return [expr {
2310: 72 61 6e 64 28 29 2a 30 2e 35 7d 5d 7d 0a 20 20  rand()*0.5}]}.  
2320: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
2330: 74 79 70 65 6f 66 28 72 65 74 5f 64 62 6c 28 29  typeof(ret_dbl()
2340: 29 7d 0a 7d 20 7b 72 65 61 6c 7d 0a 64 6f 5f 74  )}.} {real}.do_t
2350: 65 73 74 20 74 63 6c 2d 39 2e 33 20 7b 0a 20 20  est tcl-9.3 {.  
2360: 64 62 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 5f  db function ret_
2370: 69 6e 74 20 7b 72 65 74 75 72 6e 20 5b 65 78 70  int {return [exp
2380: 72 20 7b 69 6e 74 28 72 61 6e 64 28 29 2a 32 30  r {int(rand()*20
2390: 30 29 7d 5d 7d 0a 20 20 65 78 65 63 73 71 6c 20  0)}]}.  execsql 
23a0: 7b 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 72  {SELECT typeof(r
23b0: 65 74 5f 69 6e 74 28 29 29 7d 0a 7d 20 7b 69 6e  et_int())}.} {in
23c0: 74 65 67 65 72 7d 0a 0a 23 20 52 65 63 75 72 73  teger}..# Recurs
23d0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  ive calls to the
23e0: 20 73 61 6d 65 20 75 73 65 72 2d 64 65 66 69 6e   same user-defin
23f0: 65 64 20 66 75 6e 63 74 69 6f 6e 0a 23 0a 69 66  ed function.#.if
2400: 63 61 70 61 62 6c 65 20 74 63 6c 76 61 72 20 7b  capable tclvar {
2410: 0a 20 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 39  .  do_test tcl-9
2420: 2e 31 30 20 7b 0a 20 20 20 20 70 72 6f 63 20 75  .10 {.    proc u
2430: 73 65 72 66 75 6e 63 5f 72 31 20 7b 6e 7d 20 7b  serfunc_r1 {n} {
2440: 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 3c 3d 30  .      if {$n<=0
2450: 7d 20 7b 72 65 74 75 72 6e 20 30 7d 0a 20 20 20  } {return 0}.   
2460: 20 20 20 73 65 74 20 6e 6d 31 20 5b 65 78 70 72     set nm1 [expr
2470: 20 7b 24 6e 2d 31 7d 5d 0a 20 20 20 20 20 20 72   {$n-1}].      r
2480: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 64 62  eturn [expr {[db
2490: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 72 31   eval {SELECT r1
24a0: 28 24 6e 6d 31 29 7d 5d 2b 24 6e 7d 5d 0a 20 20  ($nm1)}]+$n}].  
24b0: 20 20 7d 0a 20 20 20 20 64 62 20 66 75 6e 63 74    }.    db funct
24c0: 69 6f 6e 20 72 31 20 75 73 65 72 66 75 6e 63 5f  ion r1 userfunc_
24d0: 72 31 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  r1.    execsql {
24e0: 53 45 4c 45 43 54 20 72 31 28 31 30 29 7d 0a 20  SELECT r1(10)}. 
24f0: 20 7d 20 7b 35 35 7d 0a 20 20 64 6f 5f 74 65 73   } {55}.  do_tes
2500: 74 20 74 63 6c 2d 39 2e 31 31 20 7b 0a 20 20 20  t tcl-9.11 {.   
2510: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
2520: 20 72 31 28 31 30 30 29 7d 0a 20 20 7d 20 7b 35   r1(100)}.  } {5
2530: 30 35 30 7d 0a 7d 0a 0a 23 20 54 65 73 74 73 20  050}.}..# Tests 
2540: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 72 61 6e  for the new tran
2550: 73 61 63 74 69 6f 6e 20 6d 65 74 68 6f 64 0a 23  saction method.#
2560: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e  .do_test tcl-10.
2570: 31 20 7b 0a 20 20 64 62 20 74 72 61 6e 73 61 63  1 {.  db transac
2580: 74 69 6f 6e 20 7b 7d 0a 7d 20 7b 7d 0a 64 6f 5f  tion {}.} {}.do_
2590: 74 65 73 74 20 74 63 6c 2d 31 30 2e 32 20 7b 0a  test tcl-10.2 {.
25a0: 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e    db transaction
25b0: 20 64 65 66 65 72 72 65 64 20 7b 7d 0a 7d 20 7b   deferred {}.} {
25c0: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30  }.do_test tcl-10
25d0: 2e 33 20 7b 0a 20 20 64 62 20 74 72 61 6e 73 61  .3 {.  db transa
25e0: 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 20  ction immediate 
25f0: 7b 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  {}.} {}.do_test 
2600: 74 63 6c 2d 31 30 2e 34 20 7b 0a 20 20 64 62 20  tcl-10.4 {.  db 
2610: 74 72 61 6e 73 61 63 74 69 6f 6e 20 65 78 63 6c  transaction excl
2620: 75 73 69 76 65 20 7b 7d 0a 7d 20 7b 7d 0a 64 6f  usive {}.} {}.do
2630: 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e 35 20 7b  _test tcl-10.5 {
2640: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
2650: 20 7b 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e   {db transaction
2660: 20 78 79 7a 7a 79 20 7b 7d 7d 20 6d 73 67 5d 0a   xyzzy {}} msg].
2670: 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24 6d 73    lappend rc $ms
2680: 67 0a 7d 20 7b 31 20 7b 62 61 64 20 74 72 61 6e  g.} {1 {bad tran
2690: 73 61 63 74 69 6f 6e 20 74 79 70 65 20 22 78 79  saction type "xy
26a0: 7a 7a 79 22 3a 20 6d 75 73 74 20 62 65 20 64 65  zzy": must be de
26b0: 66 65 72 72 65 64 2c 20 65 78 63 6c 75 73 69 76  ferred, exclusiv
26c0: 65 2c 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 7d  e, or immediate}
26d0: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30  }.do_test tcl-10
26e0: 2e 36 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63  .6 {.  set rc [c
26f0: 61 74 63 68 20 7b 64 62 20 74 72 61 6e 73 61 63  atch {db transac
2700: 74 69 6f 6e 20 7b 65 72 72 6f 72 20 74 65 73 74  tion {error test
2710: 2d 65 72 72 6f 72 7d 7d 20 6d 73 67 5d 0a 20 20  -error}} msg].  
2720: 6c 61 70 70 65 6e 64 20 72 63 20 24 6d 73 67 0a  lappend rc $msg.
2730: 7d 20 7b 31 20 74 65 73 74 2d 65 72 72 6f 72 7d  } {1 test-error}
2740: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e  .do_test tcl-10.
2750: 37 20 7b 0a 20 20 64 62 20 74 72 61 6e 73 61 63  7 {.  db transac
2760: 74 69 6f 6e 20 7b 0a 20 20 20 20 64 62 20 65 76  tion {.    db ev
2770: 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45  al {CREATE TABLE
2780: 20 74 34 28 78 29 7d 0a 20 20 20 20 64 62 20 74   t4(x)}.    db t
2790: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20  ransaction {.   
27a0: 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53 45     db eval {INSE
27b0: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
27c0: 53 28 31 29 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a  S(1)}.    }.  }.
27d0: 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43    db eval {SELEC
27e0: 54 20 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d 20 31  T * FROM t4}.} 1
27f0: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e  .do_test tcl-10.
2800: 38 20 7b 0a 20 20 63 61 74 63 68 20 7b 0a 20 20  8 {.  catch {.  
2810: 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e    db transaction
2820: 20 7b 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c   {.      db eval
2830: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34   {INSERT INTO t4
2840: 20 56 41 4c 55 45 53 28 32 29 7d 0a 20 20 20 20   VALUES(2)}.    
2850: 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52    db eval {INSER
2860: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
2870: 28 33 29 7d 0a 20 20 20 20 20 20 64 62 20 65 76  (3)}.      db ev
2880: 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  al {INSERT INTO 
2890: 74 34 20 56 41 4c 55 45 53 28 34 29 7d 0a 20 20  t4 VALUES(4)}.  
28a0: 20 20 20 20 65 72 72 6f 72 20 74 65 73 74 2d 65      error test-e
28b0: 72 72 6f 72 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rror.    }.  }. 
28c0: 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54   db eval {SELECT
28d0: 20 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d 20 31 0a   * FROM t4}.} 1.
28e0: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e 39  do_test tcl-10.9
28f0: 20 7b 0a 20 20 64 62 20 74 72 61 6e 73 61 63 74   {.  db transact
2900: 69 6f 6e 20 7b 0a 20 20 20 20 64 62 20 65 76 61  ion {.    db eva
2910: 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l {INSERT INTO t
2920: 34 20 56 41 4c 55 45 53 28 32 29 7d 0a 20 20 20  4 VALUES(2)}.   
2930: 20 63 61 74 63 68 20 7b 0a 20 20 20 20 20 20 64   catch {.      d
2940: 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a  b transaction {.
2950: 20 20 20 20 20 20 20 20 64 62 20 65 76 61 6c 20          db eval 
2960: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20  {INSERT INTO t4 
2970: 56 41 4c 55 45 53 28 33 29 7d 0a 20 20 20 20 20  VALUES(3)}.     
2980: 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53 45     db eval {INSE
2990: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
29a0: 53 28 34 29 7d 0a 20 20 20 20 20 20 20 20 65 72  S(4)}.        er
29b0: 72 6f 72 20 74 65 73 74 2d 65 72 72 6f 72 0a 20  ror test-error. 
29c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29d0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  .  db eval {SELE
29e0: 43 54 20 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d 20  CT * FROM t4}.} 
29f0: 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 74 63  {1 2}.do_test tc
2a00: 6c 2d 31 30 2e 31 30 20 7b 0a 20 20 66 6f 72 20  l-10.10 {.  for 
2a10: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 31 7d  {set i 0} {$i<1}
2a20: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
2a30: 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b  db transaction {
2a40: 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b  .      db eval {
2a50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
2a60: 41 4c 55 45 53 28 35 29 7d 0a 20 20 20 20 20 20  ALUES(5)}.      
2a70: 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 7d 0a 20  continue.    }. 
2a80: 20 20 20 65 72 72 6f 72 20 22 54 68 69 73 20 6c     error "This l
2a90: 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ine should not b
2aa0: 65 20 72 75 6e 22 0a 20 20 7d 0a 20 20 64 62 20  e run".  }.  db 
2ab0: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  eval {SELECT * F
2ac0: 52 4f 4d 20 74 34 7d 0a 7d 20 7b 31 20 32 20 35  ROM t4}.} {1 2 5
2ad0: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30  }.do_test tcl-10
2ae0: 2e 31 31 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74  .11 {.  for {set
2af0: 20 69 20 30 7d 20 7b 24 69 3c 31 30 7d 20 7b 69   i 0} {$i<10} {i
2b00: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 64 62 20  ncr i} {.    db 
2b10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20  transaction {.  
2b20: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53      db eval {INS
2b30: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
2b40: 45 53 28 36 29 7d 0a 20 20 20 20 20 20 62 72 65  ES(6)}.      bre
2b50: 61 6b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  ak.    }.  }.  d
2b60: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a  b eval {SELECT *
2b70: 20 46 52 4f 4d 20 74 34 7d 0a 7d 20 7b 31 20 32   FROM t4}.} {1 2
2b80: 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 74 63   5 6}.do_test tc
2b90: 6c 2d 31 30 2e 31 32 20 7b 0a 20 20 73 65 74 20  l-10.12 {.  set 
2ba0: 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20  rc [catch {.    
2bb0: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
2bc0: 69 3c 31 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  i<10} {incr i} {
2bd0: 0a 20 20 20 20 20 20 64 62 20 74 72 61 6e 73 61  .      db transa
2be0: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20  ction {.        
2bf0: 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20  db eval {INSERT 
2c00: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 37  INTO t4 VALUES(7
2c10: 29 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  )}.        retur
2c20: 6e 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  n.      }.    }.
2c30: 20 20 7d 5d 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65    }].} {2}.do_te
2c40: 73 74 20 74 63 6c 2d 31 30 2e 31 33 20 7b 0a 20  st tcl-10.13 {. 
2c50: 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54   db eval {SELECT
2c60: 20 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d 20 7b 31   * FROM t4}.} {1
2c70: 20 32 20 35 20 36 20 37 7d 0a 0a 23 20 4e 6f 77   2 5 6 7}..# Now
2c80: 20 74 65 73 74 20 74 68 61 74 20 5b 64 62 20 74   test that [db t
2c90: 72 61 6e 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d  ransaction] comm
2ca0: 61 6e 64 73 20 6d 61 79 20 62 65 20 6e 65 73 74  ands may be nest
2cb0: 65 64 20 77 69 74 68 20 0a 23 20 74 68 65 20 65  ed with .# the e
2cc0: 78 70 65 63 74 65 64 20 72 65 73 75 6c 74 73 2e  xpected results.
2cd0: 0a 23 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31  .#.do_test tcl-1
2ce0: 30 2e 31 34 20 7b 0a 20 20 64 62 20 74 72 61 6e  0.14 {.  db tran
2cf0: 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 64 62  saction {.    db
2d00: 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 44 45   eval {.      DE
2d10: 4c 45 54 45 20 46 52 4f 4d 20 74 34 3b 0a 20 20  LETE FROM t4;.  
2d20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2d30: 74 34 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 29  t4 VALUES('one')
2d40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 74  ;.    }..    cat
2d50: 63 68 20 7b 20 0a 20 20 20 20 20 20 64 62 20 74  ch { .      db t
2d60: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20  ransaction {.   
2d70: 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 49       db eval { I
2d80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
2d90: 4c 55 45 53 28 27 74 77 6f 27 29 20 7d 0a 20 20  LUES('two') }.  
2da0: 20 20 20 20 20 20 64 62 20 74 72 61 6e 73 61 63        db transac
2db0: 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 20  tion {.         
2dc0: 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45 52   db eval { INSER
2dd0: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
2de0: 28 27 74 68 72 65 65 27 29 20 7d 0a 20 20 20 20  ('three') }.    
2df0: 20 20 20 20 20 20 65 72 72 6f 72 20 22 74 68 72        error "thr
2e00: 6f 77 20 61 6e 20 65 72 72 6f 72 21 22 0a 20 20  ow an error!".  
2e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2e20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 62 20      }.  }..  db 
2e30: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  eval {SELECT * F
2e40: 52 4f 4d 20 74 34 7d 0a 7d 20 7b 6f 6e 65 7d 0a  ROM t4}.} {one}.
2e50: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e 31  do_test tcl-10.1
2e60: 35 20 7b 0a 20 20 23 20 4d 61 6b 65 20 73 75 72  5 {.  # Make sur
2e70: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
2e80: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6c 65 66  has not been lef
2e90: 74 20 6f 70 65 6e 2e 0a 20 20 64 62 20 65 76 61  t open..  db eva
2ea0: 6c 20 7b 42 45 47 49 4e 20 3b 20 43 4f 4d 4d 49  l {BEGIN ; COMMI
2eb0: 54 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  T}.} {}.do_test 
2ec0: 74 63 6c 2d 31 30 2e 31 36 20 7b 0a 20 20 64 62  tcl-10.16 {.  db
2ed0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20   transaction {. 
2ee0: 20 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53     db eval { INS
2ef0: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
2f00: 45 53 28 27 74 77 6f 27 29 3b 20 7d 0a 20 20 20  ES('two'); }.   
2f10: 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   db transaction 
2f20: 7b 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c 20  {.      db eval 
2f30: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34  { INSERT INTO t4
2f40: 20 56 41 4c 55 45 53 28 27 74 68 72 65 65 27 29   VALUES('three')
2f50: 20 7d 0a 20 20 20 20 20 20 64 62 20 74 72 61 6e   }.      db tran
2f60: 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20  saction {.      
2f70: 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45    db eval { INSE
2f80: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
2f90: 53 28 27 66 6f 75 72 27 29 20 7d 0a 20 20 20 20  S('four') }.    
2fa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2fb0: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
2fc0: 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d 20 7b 6f 6e  * FROM t4}.} {on
2fd0: 65 20 74 77 6f 20 74 68 72 65 65 20 66 6f 75 72  e two three four
2fe0: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30  }.do_test tcl-10
2ff0: 2e 31 37 20 7b 0a 20 20 63 61 74 63 68 20 7b 0a  .17 {.  catch {.
3000: 20 20 20 20 64 62 20 74 72 61 6e 73 61 63 74 69      db transacti
3010: 6f 6e 20 7b 0a 20 20 20 20 20 20 64 62 20 65 76  on {.      db ev
3020: 61 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  al { INSERT INTO
3030: 20 74 34 20 56 41 4c 55 45 53 28 27 41 27 29 3b   t4 VALUES('A');
3040: 20 7d 0a 20 20 20 20 20 20 64 62 20 74 72 61 6e   }.      db tran
3050: 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20  saction {.      
3060: 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45    db eval { INSE
3070: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
3080: 53 28 27 42 27 29 20 7d 0a 20 20 20 20 20 20 20  S('B') }.       
3090: 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   db transaction 
30a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 20 65  {.          db e
30b0: 76 61 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  val { INSERT INT
30c0: 4f 20 74 34 20 56 41 4c 55 45 53 28 27 43 27 29  O t4 VALUES('C')
30d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72   }.          err
30e0: 6f 72 20 22 74 68 72 6f 77 20 61 6e 20 65 72 72  or "throw an err
30f0: 6f 72 21 22 0a 20 20 20 20 20 20 20 20 7d 0a 20  or!".        }. 
3100: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3110: 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  .  db eval {SELE
3120: 43 54 20 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d 20  CT * FROM t4}.} 
3130: 7b 6f 6e 65 20 74 77 6f 20 74 68 72 65 65 20 66  {one two three f
3140: 6f 75 72 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  our}.do_test tcl
3150: 2d 31 30 2e 31 38 20 7b 0a 20 20 23 20 4d 61 6b  -10.18 {.  # Mak
3160: 65 20 73 75 72 65 20 61 20 74 72 61 6e 73 61 63  e sure a transac
3170: 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  tion has not bee
3180: 6e 20 6c 65 66 74 20 6f 70 65 6e 2e 0a 20 20 64  n left open..  d
3190: 62 20 65 76 61 6c 20 7b 42 45 47 49 4e 20 3b 20  b eval {BEGIN ; 
31a0: 43 4f 4d 4d 49 54 7d 0a 7d 20 7b 7d 0a 0a 23 20  COMMIT}.} {}..# 
31b0: 4d 65 73 73 20 75 70 20 61 20 5b 64 62 20 74 72  Mess up a [db tr
31c0: 61 6e 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61  ansaction] comma
31d0: 6e 64 20 62 79 20 6c 6f 63 6b 69 6e 67 20 74 68  nd by locking th
31e0: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
31f0: 20 61 0a 23 20 73 65 63 6f 6e 64 20 63 6f 6e 6e   a.# second conn
3200: 65 63 74 69 6f 6e 20 77 68 65 6e 20 69 74 20 74  ection when it t
3210: 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 2e 20  ries to commit. 
3220: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 72  Make sure the tr
3230: 61 6e 73 61 63 74 69 6f 6e 0a 23 20 69 73 20 6e  ansaction.# is n
3240: 6f 74 20 73 74 69 6c 6c 20 6f 70 65 6e 20 61 66  ot still open af
3250: 74 65 72 20 74 68 65 20 22 64 61 74 61 62 61 73  ter the "databas
3260: 65 20 69 73 20 6c 6f 63 6b 65 64 22 20 65 78 63  e is locked" exc
3270: 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e  eption is thrown
3280: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d  ..#.do_test tcl-
3290: 31 30 2e 31 38 20 7b 0a 20 20 73 71 6c 69 74 65  10.18 {.  sqlite
32a0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
32b0: 64 62 32 20 65 76 61 6c 20 7b 0a 20 20 20 20 42  db2 eval {.    B
32c0: 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54  EGIN;.    SELECT
32d0: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
32e0: 61 73 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 73 65  aster;.  }..  se
32f0: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20  t rc [catch {.  
3300: 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e    db transaction
3310: 20 7b 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c   {.      db eval
3320: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34   {INSERT INTO t4
3330: 20 56 41 4c 55 45 53 28 27 66 69 76 65 27 29 7d   VALUES('five')}
3340: 0a 20 20 20 20 7d 0a 20 20 7d 20 6d 73 67 5d 0a  .    }.  } msg].
3350: 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a    list $rc $msg.
3360: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
3370: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65  s locked}}.do_te
3380: 73 74 20 74 63 6c 2d 31 30 2e 31 39 20 7b 0a 20  st tcl-10.19 {. 
3390: 20 64 62 20 65 76 61 6c 20 7b 42 45 47 49 4e 20   db eval {BEGIN 
33a0: 3b 20 43 4f 4d 4d 49 54 7d 0a 7d 20 7b 7d 0a 0a  ; COMMIT}.} {}..
33b0: 23 20 54 68 77 61 72 74 20 61 20 5b 64 62 20 74  # Thwart a [db t
33c0: 72 61 6e 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d  ransaction] comm
33d0: 61 6e 64 20 62 79 20 6c 6f 63 6b 69 6e 67 20 74  and by locking t
33e0: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
33f0: 67 20 61 0a 23 20 73 65 63 6f 6e 64 20 63 6f 6e  g a.# second con
3400: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 22 42 45  nection with "BE
3410: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2e 20  GIN EXCLUSIVE". 
3420: 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 74 72 61  Make sure no tra
3430: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 6f  nsaction is .# o
3440: 70 65 6e 20 61 66 74 65 72 20 74 68 65 20 22 64  pen after the "d
3450: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
3460: 64 22 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  d" exception is 
3470: 74 68 72 6f 77 6e 2e 0a 23 0a 64 6f 5f 74 65 73  thrown..#.do_tes
3480: 74 20 74 63 6c 2d 31 30 2e 32 30 20 7b 0a 20 20  t tcl-10.20 {.  
3490: 64 62 32 20 65 76 61 6c 20 7b 0a 20 20 20 20 43  db2 eval {.    C
34a0: 4f 4d 4d 49 54 3b 0a 20 20 20 20 42 45 47 49 4e  OMMIT;.    BEGIN
34b0: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a   EXCLUSIVE;.  }.
34c0: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
34d0: 7b 0a 20 20 20 20 64 62 20 74 72 61 6e 73 61 63  {.    db transac
34e0: 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 64 62 20  tion {.      db 
34f0: 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54  eval {INSERT INT
3500: 4f 20 74 34 20 56 41 4c 55 45 53 28 27 66 69 76  O t4 VALUES('fiv
3510: 65 27 29 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 6d  e')}.    }.  } m
3520: 73 67 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24  sg].  list $rc $
3530: 6d 73 67 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  msg.} {1 {databa
3540: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64  se is locked}}.d
3550: 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e 32 31  o_test tcl-10.21
3560: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20   {.  db2 close. 
3570: 20 64 62 20 65 76 61 6c 20 7b 42 45 47 49 4e 20   db eval {BEGIN 
3580: 3b 20 43 4f 4d 4d 49 54 7d 0a 7d 20 7b 7d 0a 64  ; COMMIT}.} {}.d
3590: 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e 32 32  o_test tcl-10.22
35a0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
35b0: 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 74 72   test.db.  db tr
35c0: 61 6e 73 61 63 74 69 6f 6e 20 65 78 63 6c 75 73  ansaction exclus
35d0: 69 76 65 20 7b 0a 20 20 20 20 63 61 74 63 68 20  ive {.    catch 
35e0: 7b 20 64 62 32 20 65 76 61 6c 20 7b 53 45 4c 45  { db2 eval {SELE
35f0: 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
3600: 5f 6d 61 73 74 65 72 7d 20 7d 20 6d 73 67 0a 20  _master} } msg. 
3610: 20 20 20 73 65 74 20 6d 73 67 20 22 64 62 32 3a     set msg "db2:
3620: 20 24 6d 73 67 22 0a 20 20 7d 0a 20 20 73 65 74   $msg".  }.  set
3630: 20 6d 73 67 0a 7d 20 7b 64 62 32 3a 20 64 61 74   msg.} {db2: dat
3640: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
3650: 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74  .db2 close..do_t
3660: 65 73 74 20 74 63 6c 2d 31 31 2e 31 20 7b 0a 20  est tcl-11.1 {. 
3670: 20 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54   db eval {INSERT
3680: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
3690: 36 29 7d 0a 20 20 64 62 20 65 78 69 73 74 73 20  6)}.  db exists 
36a0: 7b 53 45 4c 45 43 54 20 78 2c 78 2a 32 2c 78 2b  {SELECT x,x*2,x+
36b0: 78 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  x FROM t4 WHERE 
36c0: 78 3d 3d 36 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  x==6}.} {1}.do_t
36d0: 65 73 74 20 74 63 6c 2d 31 31 2e 32 20 7b 0a 20  est tcl-11.2 {. 
36e0: 20 64 62 20 65 78 69 73 74 73 20 7b 53 45 4c 45   db exists {SELE
36f0: 43 54 20 30 20 46 52 4f 4d 20 74 34 20 57 48 45  CT 0 FROM t4 WHE
3700: 52 45 20 78 3d 3d 36 7d 0a 7d 20 7b 31 7d 0a 64  RE x==6}.} {1}.d
3710: 6f 5f 74 65 73 74 20 74 63 6c 2d 31 31 2e 33 20  o_test tcl-11.3 
3720: 7b 0a 20 20 64 62 20 65 78 69 73 74 73 20 7b 53  {.  db exists {S
3730: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74 34 20  ELECT 1 FROM t4 
3740: 57 48 45 52 45 20 78 3d 3d 38 7d 0a 7d 20 7b 30  WHERE x==8}.} {0
3750: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 31  }.do_test tcl-11
3760: 2e 33 2e 31 20 7b 0a 20 20 74 63 6c 5f 6f 62 6a  .3.1 {.  tcl_obj
3770: 70 72 6f 63 20 64 62 20 65 78 69 73 74 73 20 7b  proc db exists {
3780: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74 34  SELECT 1 FROM t4
3790: 20 57 48 45 52 45 20 78 3d 3d 38 7d 0a 7d 20 7b   WHERE x==8}.} {
37a0: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d  0}..do_test tcl-
37b0: 31 32 2e 31 20 7b 0a 20 20 75 6e 73 65 74 20 2d  12.1 {.  unset -
37c0: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 61 20 62 20 63  nocomplain a b c
37d0: 20 76 65 72 73 69 6f 6e 0a 20 20 73 65 74 20 76   version.  set v
37e0: 65 72 73 69 6f 6e 20 5b 64 62 20 76 65 72 73 69  ersion [db versi
37f0: 6f 6e 5d 0a 20 20 73 63 61 6e 20 24 76 65 72 73  on].  scan $vers
3800: 69 6f 6e 20 22 25 64 2e 25 64 2e 25 64 22 20 61  ion "%d.%d.%d" a
3810: 20 62 20 63 0a 20 20 65 78 70 72 20 24 61 2a 31   b c.  expr $a*1
3820: 30 30 30 30 30 30 20 2b 20 24 62 2a 31 30 30 30  000000 + $b*1000
3830: 20 2b 20 24 63 0a 7d 20 5b 73 71 6c 69 74 65 33   + $c.} [sqlite3
3840: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
3850: 65 72 5d 0a 0a 0a 23 20 43 68 65 63 6b 20 74 6f  er]...# Check to
3860: 20 73 65 65 20 74 68 61 74 20 77 68 65 6e 20 62   see that when b
3870: 69 6e 64 69 6e 67 73 20 6f 66 20 74 68 65 20 66  indings of the f
3880: 6f 72 6d 20 40 61 61 61 20 61 72 65 20 75 73 65  orm @aaa are use
3890: 64 20 69 6e 73 74 65 61 64 0a 23 20 6f 66 20 24  d instead.# of $
38a0: 61 61 61 2c 20 74 68 61 74 20 6f 62 6a 65 63 74  aaa, that object
38b0: 73 20 61 72 65 20 74 72 65 61 74 65 64 20 61 73  s are treated as
38c0: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 20 61   bytearray and a
38d0: 72 65 20 69 6e 73 65 72 74 65 64 0a 23 20 61 73  re inserted.# as
38e0: 20 42 4c 4f 42 73 2e 0a 23 0a 69 66 63 61 70 61   BLOBs..#.ifcapa
38f0: 62 6c 65 20 74 63 6c 76 61 72 20 7b 0a 20 20 64  ble tclvar {.  d
3900: 6f 5f 74 65 73 74 20 74 63 6c 2d 31 33 2e 31 20  o_test tcl-13.1 
3910: 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 43  {.    db eval {C
3920: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 78  REATE TABLE t5(x
3930: 20 42 4c 4f 42 29 7d 0a 20 20 20 20 73 65 74 20   BLOB)}.    set 
3940: 78 20 61 62 63 31 32 33 0a 20 20 20 20 64 62 20  x abc123.    db 
3950: 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54  eval {INSERT INT
3960: 4f 20 74 35 20 56 41 4c 55 45 53 28 24 78 29 7d  O t5 VALUES($x)}
3970: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45  .    db eval {SE
3980: 4c 45 43 54 20 74 79 70 65 6f 66 28 78 29 20 46  LECT typeof(x) F
3990: 52 4f 4d 20 74 35 7d 0a 20 20 7d 20 7b 74 65 78  ROM t5}.  } {tex
39a0: 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 63 6c  t}.  do_test tcl
39b0: 2d 31 33 2e 32 20 7b 0a 20 20 20 20 62 69 6e 61  -13.2 {.    bina
39c0: 72 79 20 73 63 61 6e 20 24 78 20 48 20 6e 6f 74  ry scan $x H not
39d0: 55 73 65 64 0a 20 20 20 20 64 62 20 65 76 61 6c  Used.    db eval
39e0: 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20   {.      DELETE 
39f0: 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 20 20 49  FROM t5;.      I
3a00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41  NSERT INTO t5 VA
3a10: 4c 55 45 53 28 24 78 29 3b 0a 20 20 20 20 20 20  LUES($x);.      
3a20: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 78 29  SELECT typeof(x)
3a30: 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d 0a   FROM t5;.    }.
3a40: 20 20 7d 20 7b 74 65 78 74 7d 0a 20 20 64 6f 5f    } {text}.  do_
3a50: 74 65 73 74 20 74 63 6c 2d 31 33 2e 33 20 7b 0a  test tcl-13.3 {.
3a60: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20      db eval {.  
3a70: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
3a80: 74 35 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t5;.      INSERT
3a90: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
3aa0: 40 78 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  @x);.      SELEC
3ab0: 54 20 74 79 70 65 6f 66 28 78 29 20 46 52 4f 4d  T typeof(x) FROM
3ac0: 20 74 35 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t5;.    }.  } {
3ad0: 62 6c 6f 62 7d 0a 20 20 64 6f 5f 74 65 73 74 20  blob}.  do_test 
3ae0: 74 63 6c 2d 31 33 2e 34 20 7b 0a 20 20 20 20 73  tcl-13.4 {.    s
3af0: 65 74 20 79 20 31 32 33 34 0a 20 20 20 20 64 62  et y 1234.    db
3b00: 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 44 45   eval {.      DE
3b10: 4c 45 54 45 20 46 52 4f 4d 20 74 35 3b 0a 20 20  LETE FROM t5;.  
3b20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3b30: 74 35 20 56 41 4c 55 45 53 28 40 79 29 3b 0a 20  t5 VALUES(@y);. 
3b40: 20 20 20 20 20 53 45 4c 45 43 54 20 68 65 78 28       SELECT hex(
3b50: 78 29 2c 20 74 79 70 65 6f 66 28 78 29 20 46 52  x), typeof(x) FR
3b60: 4f 4d 20 74 35 0a 20 20 20 20 7d 0a 20 20 7d 20  OM t5.    }.  } 
3b70: 7b 33 31 33 32 33 33 33 34 20 62 6c 6f 62 7d 0a  {31323334 blob}.
3b80: 7d 0a 0a 64 62 20 66 75 6e 63 20 78 43 61 6c 6c  }..db func xCall
3b90: 20 78 43 61 6c 6c 0a 70 72 6f 63 20 78 43 61 6c   xCall.proc xCal
3ba0: 6c 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 22 76  l {} { return "v
3bb0: 61 6c 75 65 22 20 7d 0a 64 6f 5f 65 78 65 63 73  alue" }.do_execs
3bc0: 71 6c 5f 74 65 73 74 20 74 63 6c 2d 31 34 2e 31  ql_test tcl-14.1
3bd0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
3be0: 45 20 74 36 28 78 29 3b 0a 20 20 49 4e 53 45 52  E t6(x);.  INSER
3bf0: 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53  T INTO t6 VALUES
3c00: 28 31 29 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 74  (1);.}.do_test t
3c10: 63 6c 2d 31 34 2e 32 20 7b 0a 20 20 64 62 20 6f  cl-14.2 {.  db o
3c20: 6e 65 20 7b 53 45 4c 45 43 54 20 78 20 46 52 4f  ne {SELECT x FRO
3c30: 4d 20 74 36 20 57 48 45 52 45 20 78 43 61 6c 6c  M t6 WHERE xCall
3c40: 28 29 21 3d 27 76 61 6c 75 65 27 7d 0a 7d 20 7b  ()!='value'}.} {
3c50: 7d 0a 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  }....finish_test
3c60: 0a                                               .