/ Hex Artifact Content
Login

Artifact 37a61c2da7e3bfe3b8c1a2867199f6b860df5d43:


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 6f 66 69 6c 65 2c 20  olumn, profile, 
0620: 70 72 6f 67 72 65 73 73 2c 20 72 65 6b 65 79 2c  progress, rekey,
0630: 20 72 65 73 74 6f 72 65 2c 20 72 6f 6c 6c 62 61   restore, rollba
0640: 63 6b 5f 68 6f 6f 6b 2c 20 73 74 61 74 75 73 2c  ck_hook, status,
0650: 20 74 69 6d 65 6f 75 74 2c 20 74 6f 74 61 6c 5f   timeout, total_
0660: 63 68 61 6e 67 65 73 2c 20 74 72 61 63 65 2c 20  changes, trace, 
0670: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 75 6e 6c  transaction, unl
0680: 6f 63 6b 5f 6e 6f 74 69 66 79 2c 20 75 70 64 61  ock_notify, upda
0690: 74 65 5f 68 6f 6f 6b 2c 20 76 65 72 73 69 6f 6e  te_hook, version
06a0: 2c 20 6f 72 20 77 61 6c 5f 68 6f 6f 6b 7d 7d 0a  , or wal_hook}}.
06b0: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 32 2e  do_test tcl-1.2.
06c0: 31 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74  1 {.  set v [cat
06d0: 63 68 20 7b 64 62 20 63 61 63 68 65 20 62 6f 67  ch {db cache bog
06e0: 75 73 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65  us} msg].  lappe
06f0: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b  nd v $msg.} {1 {
0700: 62 61 64 20 6f 70 74 69 6f 6e 20 22 62 6f 67 75  bad option "bogu
0710: 73 22 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73  s": must be flus
0720: 68 20 6f 72 20 73 69 7a 65 7d 7d 0a 64 6f 5f 74  h or size}}.do_t
0730: 65 73 74 20 74 63 6c 2d 31 2e 32 2e 32 20 7b 0a  est tcl-1.2.2 {.
0740: 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b    set v [catch {
0750: 64 62 20 63 61 63 68 65 7d 20 6d 73 67 5d 0a 20  db cache} msg]. 
0760: 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a   lappend v $msg.
0770: 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61 72  } {1 {wrong # ar
0780: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 64  gs: should be "d
0790: 62 20 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f  b cache option ?
07a0: 61 72 67 3f 22 7d 7d 0a 64 6f 5f 74 65 73 74 20  arg?"}}.do_test 
07b0: 74 63 6c 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63  tcl-1.3 {.  exec
07c0: 73 71 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c  sql {CREATE TABL
07d0: 45 20 74 31 28 61 20 69 6e 74 2c 20 62 20 69 6e  E t1(a int, b in
07e0: 74 29 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 49  t)}.  execsql {I
07f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0800: 4c 55 45 53 28 31 30 2c 32 30 29 7d 0a 20 20 73  LUES(10,20)}.  s
0810: 65 74 20 76 20 5b 63 61 74 63 68 20 7b 0a 20 20  et v [catch {.  
0820: 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43    db eval {SELEC
0830: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 64 61 74  T * FROM t1} dat
0840: 61 20 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  a {.      error 
0850: 22 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61  "The error messa
0860: 67 65 22 0a 20 20 20 20 7d 0a 20 20 7d 20 6d 73  ge".    }.  } ms
0870: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24  g].  lappend v $
0880: 6d 73 67 0a 7d 20 7b 31 20 7b 54 68 65 20 65 72  msg.} {1 {The er
0890: 72 6f 72 20 6d 65 73 73 61 67 65 7d 7d 0a 64 6f  ror message}}.do
08a0: 5f 74 65 73 74 20 74 63 6c 2d 31 2e 34 20 7b 0a  _test tcl-1.4 {.
08b0: 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b    set v [catch {
08c0: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45  .    db eval {SE
08d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 20  LECT * FROM t2} 
08e0: 64 61 74 61 20 7b 0a 20 20 20 20 20 20 65 72 72  data {.      err
08f0: 6f 72 20 22 54 68 65 20 65 72 72 6f 72 20 6d 65  or "The error me
0900: 73 73 61 67 65 22 0a 20 20 20 20 7d 0a 20 20 7d  ssage".    }.  }
0910: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
0920: 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 6e 6f 20  v $msg.} {1 {no 
0930: 73 75 63 68 20 74 61 62 6c 65 3a 20 74 32 7d 7d  such table: t2}}
0940: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 35  .do_test tcl-1.5
0950: 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63   {.  set v [catc
0960: 68 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20  h {.    db eval 
0970: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
0980: 31 7d 20 64 61 74 61 20 7b 0a 20 20 20 20 20 20  1} data {.      
0990: 62 72 65 61 6b 0a 20 20 20 20 7d 0a 20 20 7d 20  break.    }.  } 
09a0: 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76  msg].  lappend v
09b0: 20 24 6d 73 67 0a 7d 20 7b 30 20 7b 7d 7d 0a 63   $msg.} {0 {}}.c
09c0: 61 74 63 68 20 7b 65 78 70 72 20 78 2a 7d 20 6d  atch {expr x*} m
09d0: 73 67 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31  sg.do_test tcl-1
09e0: 2e 36 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61  .6 {.  set v [ca
09f0: 74 63 68 20 7b 0a 20 20 20 20 64 62 20 65 76 61  tch {.    db eva
0a00: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
0a10: 20 74 31 7d 20 64 61 74 61 20 7b 0a 20 20 20 20   t1} data {.    
0a20: 20 20 65 78 70 72 20 78 2a 0a 20 20 20 20 7d 0a    expr x*.    }.
0a30: 20 20 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65    } msg].  lappe
0a40: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 5b 6c 69 73  nd v $msg.} [lis
0a50: 74 20 31 20 24 6d 73 67 5d 0a 64 6f 5f 74 65 73  t 1 $msg].do_tes
0a60: 74 20 74 63 6c 2d 31 2e 37 20 7b 0a 20 20 73 65  t tcl-1.7 {.  se
0a70: 74 20 76 20 5b 63 61 74 63 68 20 7b 64 62 7d 20  t v [catch {db} 
0a80: 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76  msg].  lappend v
0a90: 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e   $msg.} {1 {wron
0aa0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
0ab0: 20 62 65 20 22 64 62 20 53 55 42 43 4f 4d 4d 41   be "db SUBCOMMA
0ac0: 4e 44 20 2e 2e 2e 22 7d 7d 0a 69 66 20 7b 5b 63  ND ..."}}.if {[c
0ad0: 61 74 63 68 20 7b 64 62 20 61 75 74 68 20 7b 7d  atch {db auth {}
0ae0: 7d 5d 3d 3d 30 7d 20 7b 0a 20 20 64 6f 5f 74 65  }]==0} {.  do_te
0af0: 73 74 20 74 63 6c 2d 31 2e 38 20 7b 0a 20 20 20  st tcl-1.8 {.   
0b00: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64   set v [catch {d
0b10: 62 20 61 75 74 68 6f 72 69 7a 65 72 20 31 20 32  b authorizer 1 2
0b20: 20 33 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 61 70   3} msg].    lap
0b30: 70 65 6e 64 20 76 20 24 6d 73 67 0a 20 20 7d 20  pend v $msg.  } 
0b40: 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73  {1 {wrong # args
0b50: 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20  : should be "db 
0b60: 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c  authorizer ?CALL
0b70: 42 41 43 4b 3f 22 7d 7d 0a 7d 0a 64 6f 5f 74 65  BACK?"}}.}.do_te
0b80: 73 74 20 74 63 6c 2d 31 2e 39 20 7b 0a 20 20 73  st tcl-1.9 {.  s
0b90: 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64 62 20  et v [catch {db 
0ba0: 62 75 73 79 20 31 20 32 20 33 7d 20 6d 73 67 5d  busy 1 2 3} msg]
0bb0: 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73  .  lappend v $ms
0bc0: 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20  g.} {1 {wrong # 
0bd0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
0be0: 22 64 62 20 62 75 73 79 20 43 41 4c 4c 42 41 43  "db busy CALLBAC
0bf0: 4b 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  K"}}.do_test tcl
0c00: 2d 31 2e 31 30 20 7b 0a 20 20 73 65 74 20 76 20  -1.10 {.  set v 
0c10: 5b 63 61 74 63 68 20 7b 64 62 20 70 72 6f 67 72  [catch {db progr
0c20: 65 73 73 20 31 7d 20 6d 73 67 5d 0a 20 20 6c 61  ess 1} msg].  la
0c30: 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b  ppend v $msg.} {
0c40: 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  1 {wrong # args:
0c50: 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20 70   should be "db p
0c60: 72 6f 67 72 65 73 73 20 4e 20 43 41 4c 4c 42 41  rogress N CALLBA
0c70: 43 4b 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 63  CK"}}.do_test tc
0c80: 6c 2d 31 2e 31 31 20 7b 0a 20 20 73 65 74 20 76  l-1.11 {.  set v
0c90: 20 5b 63 61 74 63 68 20 7b 64 62 20 63 68 61 6e   [catch {db chan
0ca0: 67 65 73 20 78 79 7a 7d 20 6d 73 67 5d 0a 20 20  ges xyz} msg].  
0cb0: 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d  lappend v $msg.}
0cc0: 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67   {1 {wrong # arg
0cd0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62  s: should be "db
0ce0: 20 63 68 61 6e 67 65 73 20 22 7d 7d 0a 64 6f 5f   changes "}}.do_
0cf0: 74 65 73 74 20 74 63 6c 2d 31 2e 31 32 20 7b 0a  test tcl-1.12 {.
0d00: 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b    set v [catch {
0d10: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 61  db commit_hook a
0d20: 20 62 20 63 7d 20 6d 73 67 5d 0a 20 20 6c 61 70   b c} msg].  lap
0d30: 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31  pend v $msg.} {1
0d40: 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   {wrong # args: 
0d50: 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20 63 6f  should be "db co
0d60: 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42  mmit_hook ?CALLB
0d70: 41 43 4b 3f 22 7d 7d 0a 69 66 63 61 70 61 62 6c  ACK?"}}.ifcapabl
0d80: 65 20 7b 63 6f 6d 70 6c 65 74 65 7d 20 7b 0a 20  e {complete} {. 
0d90: 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 31   do_test tcl-1.1
0da0: 33 20 7b 0a 20 20 20 20 73 65 74 20 76 20 5b 63  3 {.    set v [c
0db0: 61 74 63 68 20 7b 64 62 20 63 6f 6d 70 6c 65 74  atch {db complet
0dc0: 65 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 61 70 70  e} msg].    lapp
0dd0: 65 6e 64 20 76 20 24 6d 73 67 0a 20 20 7d 20 7b  end v $msg.  } {
0de0: 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  1 {wrong # args:
0df0: 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20 63   should be "db c
0e00: 6f 6d 70 6c 65 74 65 20 53 51 4c 22 7d 7d 0a 7d  omplete SQL"}}.}
0e10: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 31  .do_test tcl-1.1
0e20: 34 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74  4 {.  set v [cat
0e30: 63 68 20 7b 64 62 20 65 76 61 6c 7d 20 6d 73 67  ch {db eval} msg
0e40: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d  ].  lappend v $m
0e50: 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23  sg.} {1 {wrong #
0e60: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
0e70: 20 22 64 62 20 65 76 61 6c 20 53 51 4c 20 3f 41   "db eval SQL ?A
0e80: 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49  RRAY-NAME? ?SCRI
0e90: 50 54 3f 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  PT?"}}.do_test t
0ea0: 63 6c 2d 31 2e 31 35 20 7b 0a 20 20 73 65 74 20  cl-1.15 {.  set 
0eb0: 76 20 5b 63 61 74 63 68 20 7b 64 62 20 66 75 6e  v [catch {db fun
0ec0: 63 74 69 6f 6e 7d 20 6d 73 67 5d 0a 20 20 6c 61  ction} msg].  la
0ed0: 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b  ppend v $msg.} {
0ee0: 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  1 {wrong # args:
0ef0: 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20 66   should be "db f
0f00: 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61  unction NAME [-a
0f10: 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49 50  rgcount N] SCRIP
0f20: 54 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  T"}}.do_test tcl
0f30: 2d 31 2e 31 36 20 7b 0a 20 20 73 65 74 20 76 20  -1.16 {.  set v 
0f40: 5b 63 61 74 63 68 20 7b 64 62 20 6c 61 73 74 5f  [catch {db last_
0f50: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 78 79 7a  insert_rowid xyz
0f60: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
0f70: 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72   v $msg.} {1 {wr
0f80: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
0f90: 6c 64 20 62 65 20 22 64 62 20 6c 61 73 74 5f 69  ld be "db last_i
0fa0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 22 7d 7d 0a  nsert_rowid "}}.
0fb0: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 31 37  do_test tcl-1.17
0fc0: 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63   {.  set v [catc
0fd0: 68 20 7b 64 62 20 72 65 6b 65 79 7d 20 6d 73 67  h {db rekey} msg
0fe0: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d  ].  lappend v $m
0ff0: 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23  sg.} {1 {wrong #
1000: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1010: 20 22 64 62 20 72 65 6b 65 79 20 4b 45 59 22 7d   "db rekey KEY"}
1020: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e  }.do_test tcl-1.
1030: 31 38 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61  18 {.  set v [ca
1040: 74 63 68 20 7b 64 62 20 74 69 6d 65 6f 75 74 7d  tch {db timeout}
1050: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
1060: 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f  v $msg.} {1 {wro
1070: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1080: 64 20 62 65 20 22 64 62 20 74 69 6d 65 6f 75 74  d be "db timeout
1090: 20 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 7d 7d   MILLISECONDS"}}
10a0: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 31  .do_test tcl-1.1
10b0: 39 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74  9 {.  set v [cat
10c0: 63 68 20 7b 64 62 20 63 6f 6c 6c 61 74 65 7d 20  ch {db collate} 
10d0: 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76  msg].  lappend v
10e0: 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e   $msg.} {1 {wron
10f0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1100: 20 62 65 20 22 64 62 20 63 6f 6c 6c 61 74 65 20   be "db collate 
1110: 4e 41 4d 45 20 53 43 52 49 50 54 22 7d 7d 0a 64  NAME SCRIPT"}}.d
1120: 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 32 30 20  o_test tcl-1.20 
1130: 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63 68  {.  set v [catch
1140: 20 7b 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e   {db collation_n
1150: 65 65 64 65 64 7d 20 6d 73 67 5d 0a 20 20 6c 61  eeded} msg].  la
1160: 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b  ppend v $msg.} {
1170: 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  1 {wrong # args:
1180: 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20 63   should be "db c
1190: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
11a0: 53 43 52 49 50 54 22 7d 7d 0a 64 6f 5f 74 65 73  SCRIPT"}}.do_tes
11b0: 74 20 74 63 6c 2d 31 2e 32 31 20 7b 0a 20 20 73  t tcl-1.21 {.  s
11c0: 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64 62 20  et v [catch {db 
11d0: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20 78 79  total_changes xy
11e0: 7a 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  z} msg].  lappen
11f0: 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77  d v $msg.} {1 {w
1200: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1210: 75 6c 64 20 62 65 20 22 64 62 20 74 6f 74 61 6c  uld be "db total
1220: 5f 63 68 61 6e 67 65 73 20 22 7d 7d 0a 64 6f 5f  _changes "}}.do_
1230: 74 65 73 74 20 74 63 6c 2d 31 2e 32 32 20 7b 0a  test tcl-1.22 {.
1240: 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b    set v [catch {
1250: 64 62 20 63 6f 70 79 7d 20 6d 73 67 5d 0a 20 20  db copy} msg].  
1260: 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d  lappend v $msg.}
1270: 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67   {1 {wrong # arg
1280: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62  s: should be "db
1290: 20 63 6f 70 79 20 43 4f 4e 46 4c 49 43 54 2d 41   copy CONFLICT-A
12a0: 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46  LGORITHM TABLE F
12b0: 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54  ILENAME ?SEPARAT
12c0: 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54  OR? ?NULLINDICAT
12d0: 4f 52 3f 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  OR?"}}.do_test t
12e0: 63 6c 2d 31 2e 32 33 20 7b 0a 20 20 73 65 74 20  cl-1.23 {.  set 
12f0: 76 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65  v [catch {sqlite
1300: 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76  3 db2 test.db -v
1310: 66 73 20 6e 6f 73 75 63 68 76 66 73 7d 20 6d 73  fs nosuchvfs} ms
1320: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24  g].  lappend v $
1330: 6d 73 67 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  msg.} {1 {no suc
1340: 68 20 76 66 73 3a 20 6e 6f 73 75 63 68 76 66 73  h vfs: nosuchvfs
1350: 7d 7d 0a 0a 63 61 74 63 68 20 7b 75 6e 73 65 74  }}..catch {unset
1360: 20 3a 3a 72 65 73 75 6c 74 7d 0a 64 6f 5f 74 65   ::result}.do_te
1370: 73 74 20 74 63 6c 2d 32 2e 31 20 7b 0a 20 20 65  st tcl-2.1 {.  e
1380: 78 65 63 73 71 6c 20 22 43 52 45 41 54 45 20 54  xecsql "CREATE T
1390: 41 42 4c 45 20 74 5c 75 30 31 32 33 78 28 61 20  ABLE t\u0123x(a 
13a0: 69 6e 74 2c 20 62 5c 75 31 32 33 35 20 66 6c 6f  int, b\u1235 flo
13b0: 61 74 29 22 0a 7d 20 7b 7d 0a 69 66 63 61 70 61  at)".} {}.ifcapa
13c0: 62 6c 65 20 73 63 68 65 6d 61 5f 70 72 61 67 6d  ble schema_pragm
13d0: 61 73 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74  as {.  do_test t
13e0: 63 6c 2d 32 2e 32 20 7b 0a 20 20 20 20 65 78 65  cl-2.2 {.    exe
13f0: 63 73 71 6c 20 22 50 52 41 47 4d 41 20 74 61 62  csql "PRAGMA tab
1400: 6c 65 5f 69 6e 66 6f 28 74 5c 75 30 31 32 33 78  le_info(t\u0123x
1410: 29 22 0a 20 20 7d 20 22 30 20 61 20 69 6e 74 20  )".  } "0 a int 
1420: 30 20 7b 7d 20 30 20 31 20 62 5c 75 31 32 33 35  0 {} 0 1 b\u1235
1430: 20 66 6c 6f 61 74 20 30 20 7b 7d 20 30 22 0a 7d   float 0 {} 0".}
1440: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 32 2e 33  .do_test tcl-2.3
1450: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 49 4e   {.  execsql "IN
1460: 53 45 52 54 20 49 4e 54 4f 20 74 5c 75 30 31 32  SERT INTO t\u012
1470: 33 78 20 56 41 4c 55 45 53 28 31 2c 32 2e 33 29  3x VALUES(1,2.3)
1480: 22 0a 20 20 64 62 20 65 76 61 6c 20 22 53 45 4c  ".  db eval "SEL
1490: 45 43 54 20 2a 20 46 52 4f 4d 20 74 5c 75 30 31  ECT * FROM t\u01
14a0: 32 33 78 22 20 72 65 73 75 6c 74 20 62 72 65 61  23x" result brea
14b0: 6b 0a 20 20 73 65 74 20 72 65 73 75 6c 74 28 2a  k.  set result(*
14c0: 29 0a 7d 20 22 61 20 62 5c 75 31 32 33 35 22 0a  ).} "a b\u1235".
14d0: 0a 0a 23 20 54 65 73 74 20 74 68 65 20 6f 6e 65  ..# Test the one
14e0: 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 0a 23 0a  column method.#.
14f0: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 33 2e 31 20  do_test tcl-3.1 
1500: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1510: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1520: 20 53 45 4c 45 43 54 20 61 2a 32 2c 20 62 2a 32   SELECT a*2, b*2
1530: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
1540: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1550: 45 43 54 20 61 2a 32 2b 31 2c 20 62 2a 32 2b 31  ECT a*2+1, b*2+1
1560: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
1570: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1580: 45 43 54 20 61 2a 32 2b 33 2c 20 62 2a 32 2b 33  ECT a*2+3, b*2+3
1590: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20   FROM t1;.  }.  
15a0: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 64  set rc [catch {d
15b0: 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 7b 53 45 4c  b onecolumn {SEL
15c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52  ECT * FROM t1 OR
15d0: 44 45 52 20 42 59 20 61 7d 7d 20 6d 73 67 5d 0a  DER BY a}} msg].
15e0: 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24 6d 73    lappend rc $ms
15f0: 67 0a 7d 20 7b 30 20 31 30 7d 0a 64 6f 5f 74 65  g.} {0 10}.do_te
1600: 73 74 20 74 63 6c 2d 33 2e 32 20 7b 0a 20 20 64  st tcl-3.2 {.  d
1610: 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 7b 53 45 4c  b onecolumn {SEL
1620: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1630: 45 52 45 20 61 3c 30 7d 0a 7d 20 7b 7d 0a 64 6f  ERE a<0}.} {}.do
1640: 5f 74 65 73 74 20 74 63 6c 2d 33 2e 33 20 7b 0a  _test tcl-3.3 {.
1650: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
1660: 7b 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 7d 20 65  {db onecolumn} e
1670: 72 72 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  rrmsg].  lappend
1680: 20 72 63 20 24 65 72 72 6d 73 67 0a 7d 20 7b 31   rc $errmsg.} {1
1690: 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   {wrong # args: 
16a0: 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20 6f 6e  should be "db on
16b0: 65 63 6f 6c 75 6d 6e 20 53 51 4c 22 7d 7d 0a 64  ecolumn SQL"}}.d
16c0: 6f 5f 74 65 73 74 20 74 63 6c 2d 33 2e 34 20 7b  o_test tcl-3.4 {
16d0: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
16e0: 20 7b 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 7b   {db onecolumn {
16f0: 53 45 4c 45 43 54 20 62 6f 67 75 73 7d 7d 20 65  SELECT bogus}} e
1700: 72 72 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  rrmsg].  lappend
1710: 20 72 63 20 24 65 72 72 6d 73 67 0a 7d 20 7b 31   rc $errmsg.} {1
1720: 20 7b 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   {no such column
1730: 3a 20 62 6f 67 75 73 7d 7d 0a 69 66 63 61 70 61  : bogus}}.ifcapa
1740: 62 6c 65 20 7b 74 63 6c 76 61 72 7d 20 7b 0a 20  ble {tclvar} {. 
1750: 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 33 2e 35   do_test tcl-3.5
1760: 20 7b 0a 20 20 20 20 73 65 74 20 62 20 35 30 0a   {.    set b 50.
1770: 20 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63      set rc [catc
1780: 68 20 7b 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  h {db one {SELEC
1790: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
17a0: 45 20 62 3e 24 62 7d 7d 20 6d 73 67 5d 0a 20 20  E b>$b}} msg].  
17b0: 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24 6d 73    lappend rc $ms
17c0: 67 0a 20 20 7d 20 7b 30 20 34 31 7d 0a 20 20 64  g.  } {0 41}.  d
17d0: 6f 5f 74 65 73 74 20 74 63 6c 2d 33 2e 36 20 7b  o_test tcl-3.6 {
17e0: 0a 20 20 20 20 73 65 74 20 62 20 35 30 30 0a 20  .    set b 500. 
17f0: 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68     set rc [catch
1800: 20 7b 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54   {db one {SELECT
1810: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1820: 20 62 3e 24 62 7d 7d 20 6d 73 67 5d 0a 20 20 20   b>$b}} msg].   
1830: 20 6c 61 70 70 65 6e 64 20 72 63 20 24 6d 73 67   lappend rc $msg
1840: 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f  .  } {0 {}}.  do
1850: 5f 74 65 73 74 20 74 63 6c 2d 33 2e 37 20 7b 0a  _test tcl-3.7 {.
1860: 20 20 20 20 73 65 74 20 62 20 35 30 30 0a 20 20      set b 500.  
1870: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
1880: 7b 64 62 20 6f 6e 65 20 7b 0a 20 20 20 20 20 20  {db one {.      
1890: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
18a0: 41 4c 55 45 53 28 39 39 2c 35 31 30 29 3b 0a 20  ALUES(99,510);. 
18b0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
18c0: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3e 24 62  OM t1 WHERE b>$b
18d0: 0a 20 20 20 20 7d 7d 20 6d 73 67 5d 0a 20 20 20  .    }} msg].   
18e0: 20 6c 61 70 70 65 6e 64 20 72 63 20 24 6d 73 67   lappend rc $msg
18f0: 0a 20 20 7d 20 7b 30 20 39 39 7d 0a 7d 0a 69 66  .  } {0 99}.}.if
1900: 63 61 70 61 62 6c 65 20 7b 21 74 63 6c 76 61 72  capable {!tclvar
1910: 7d 20 7b 0a 20 20 20 65 78 65 63 73 71 6c 20 7b  } {.   execsql {
1920: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1930: 41 4c 55 45 53 28 39 39 2c 35 31 30 29 7d 0a 7d  ALUES(99,510)}.}
1940: 0a 0a 23 20 54 75 72 6e 20 74 68 65 20 62 75 73  ..# Turn the bus
1950: 79 20 68 61 6e 64 6c 65 72 20 6f 6e 20 61 6e 64  y handler on and
1960: 20 6f 66 66 0a 23 0a 64 6f 5f 74 65 73 74 20 74   off.#.do_test t
1970: 63 6c 2d 34 2e 31 20 7b 0a 20 20 70 72 6f 63 20  cl-4.1 {.  proc 
1980: 62 75 73 79 5f 63 61 6c 6c 62 61 63 6b 20 7b 63  busy_callback {c
1990: 6e 74 7d 20 7b 0a 20 20 20 20 62 72 65 61 6b 0a  nt} {.    break.
19a0: 20 20 7d 0a 20 20 64 62 20 62 75 73 79 20 62 75    }.  db busy bu
19b0: 73 79 5f 63 61 6c 6c 62 61 63 6b 0a 20 20 64 62  sy_callback.  db
19c0: 20 62 75 73 79 0a 7d 20 7b 62 75 73 79 5f 63 61   busy.} {busy_ca
19d0: 6c 6c 62 61 63 6b 7d 0a 64 6f 5f 74 65 73 74 20  llback}.do_test 
19e0: 74 63 6c 2d 34 2e 32 20 7b 0a 20 20 64 62 20 62  tcl-4.2 {.  db b
19f0: 75 73 79 20 7b 7d 0a 20 20 64 62 20 62 75 73 79  usy {}.  db busy
1a00: 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c 65  .} {}..ifcapable
1a10: 20 7b 74 63 6c 76 61 72 7d 20 7b 0a 20 20 23 20   {tclvar} {.  # 
1a20: 50 61 72 73 69 6e 67 20 6f 66 20 54 43 4c 20 76  Parsing of TCL v
1a30: 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 77 69  ariable names wi
1a40: 74 68 69 6e 20 53 51 4c 20 69 6e 74 6f 20 62 6f  thin SQL into bo
1a50: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  und parameters..
1a60: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 74 63    #.  do_test tc
1a70: 6c 2d 35 2e 31 20 7b 0a 20 20 20 20 65 78 65 63  l-5.1 {.    exec
1a80: 73 71 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c  sql {CREATE TABL
1a90: 45 20 74 33 28 61 2c 62 2c 63 29 7d 0a 20 20 20  E t3(a,b,c)}.   
1aa0: 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 78 7d   catch {unset x}
1ab0: 0a 20 20 20 20 73 65 74 20 78 28 31 29 20 41 0a  .    set x(1) A.
1ac0: 20 20 20 20 73 65 74 20 78 28 32 29 20 42 0a 20      set x(2) B. 
1ad0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
1ae0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1af0: 33 20 56 41 4c 55 45 53 28 24 3a 3a 78 28 31 29  3 VALUES($::x(1)
1b00: 2c 24 3a 3a 78 28 32 29 2c 24 3a 3a 78 28 33 29  ,$::x(2),$::x(3)
1b10: 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  );.      SELECT 
1b20: 2a 20 46 52 4f 4d 20 74 33 0a 20 20 20 20 7d 0a  * FROM t3.    }.
1b30: 20 20 7d 20 7b 41 20 42 20 7b 7d 7d 0a 20 20 64    } {A B {}}.  d
1b40: 6f 5f 74 65 73 74 20 74 63 6c 2d 35 2e 32 20 7b  o_test tcl-5.2 {
1b50: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
1b60: 20 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65       SELECT type
1b70: 6f 66 28 61 29 2c 20 74 79 70 65 6f 66 28 62 29  of(a), typeof(b)
1b80: 2c 20 74 79 70 65 6f 66 28 63 29 20 46 52 4f 4d  , typeof(c) FROM
1b90: 20 74 33 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 74   t3.    }.  } {t
1ba0: 65 78 74 20 74 65 78 74 20 6e 75 6c 6c 7d 0a 20  ext text null}. 
1bb0: 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 35 2e 33   do_test tcl-5.3
1bc0: 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e   {.    catch {un
1bd0: 73 65 74 20 78 7d 0a 20 20 20 20 73 65 74 20 78  set x}.    set x
1be0: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
1bf0: 68 31 32 20 36 38 36 39 30 30 36 38 36 66 30 30  h12 686900686f00
1c00: 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  ].    execsql {.
1c10: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 33 20        UPDATE t3 
1c20: 53 45 54 20 61 3d 24 3a 3a 78 3b 0a 20 20 20 20  SET a=$::x;.    
1c30: 7d 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a  }.    db eval {.
1c40: 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46        SELECT a F
1c50: 52 4f 4d 20 74 33 0a 20 20 20 20 7d 20 62 72 65  ROM t3.    } bre
1c60: 61 6b 0a 20 20 20 20 62 69 6e 61 72 79 20 73 63  ak.    binary sc
1c70: 61 6e 20 24 61 20 68 31 32 20 61 64 61 74 61 0a  an $a h12 adata.
1c80: 20 20 20 20 73 65 74 20 61 64 61 74 61 0a 20 20      set adata.  
1c90: 7d 20 7b 36 38 36 39 30 30 36 38 36 66 30 30 7d  } {686900686f00}
1ca0: 0a 20 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 35  .  do_test tcl-5
1cb0: 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .4 {.    execsql
1cc0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
1cd0: 74 79 70 65 6f 66 28 61 29 2c 20 74 79 70 65 6f  typeof(a), typeo
1ce0: 66 28 62 29 2c 20 74 79 70 65 6f 66 28 63 29 20  f(b), typeof(c) 
1cf0: 46 52 4f 4d 20 74 33 0a 20 20 20 20 7d 0a 20 20  FROM t3.    }.  
1d00: 7d 20 7b 62 6c 6f 62 20 74 65 78 74 20 6e 75 6c  } {blob text nul
1d10: 6c 7d 0a 7d 0a 0a 23 20 4f 70 65 72 61 74 69 6f  l}.}..# Operatio
1d20: 6e 20 6f 66 20 22 62 72 65 61 6b 22 20 61 6e 64  n of "break" and
1d30: 20 22 63 6f 6e 74 69 6e 75 65 22 20 77 69 74 68   "continue" with
1d40: 69 6e 20 72 6f 77 20 73 63 72 69 70 74 73 0a 23  in row scripts.#
1d50: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 36 2e 31  .do_test tcl-6.1
1d60: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45   {.  db eval {SE
1d70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20  LECT * FROM t1} 
1d80: 7b 0a 20 20 20 20 62 72 65 61 6b 0a 20 20 7d 0a  {.    break.  }.
1d90: 20 20 6c 61 70 70 65 6e 64 20 61 20 24 62 0a 7d    lappend a $b.}
1da0: 20 7b 31 30 20 32 30 7d 0a 64 6f 5f 74 65 73 74   {10 20}.do_test
1db0: 20 74 63 6c 2d 36 2e 32 20 7b 0a 20 20 73 65 74   tcl-6.2 {.  set
1dc0: 20 63 6e 74 20 30 0a 20 20 64 62 20 65 76 61 6c   cnt 0.  db eval
1dd0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
1de0: 74 31 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24 61  t1} {.    if {$a
1df0: 3e 34 30 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20  >40} continue.  
1e00: 20 20 69 6e 63 72 20 63 6e 74 0a 20 20 7d 0a 20    incr cnt.  }. 
1e10: 20 73 65 74 20 63 6e 74 0a 7d 20 7b 34 7d 0a 64   set cnt.} {4}.d
1e20: 6f 5f 74 65 73 74 20 74 63 6c 2d 36 2e 33 20 7b  o_test tcl-6.3 {
1e30: 0a 20 20 73 65 74 20 63 6e 74 20 30 0a 20 20 64  .  set cnt 0.  d
1e40: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a  b eval {SELECT *
1e50: 20 46 52 4f 4d 20 74 31 7d 20 7b 0a 20 20 20 20   FROM t1} {.    
1e60: 69 66 20 7b 24 61 3c 34 30 7d 20 63 6f 6e 74 69  if {$a<40} conti
1e70: 6e 75 65 0a 20 20 20 20 69 6e 63 72 20 63 6e 74  nue.    incr cnt
1e80: 0a 20 20 7d 0a 20 20 73 65 74 20 63 6e 74 0a 7d  .  }.  set cnt.}
1e90: 20 7b 35 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c   {5}.do_test tcl
1ea0: 2d 36 2e 34 20 7b 0a 20 20 70 72 6f 63 20 72 65  -6.4 {.  proc re
1eb0: 74 75 72 6e 5f 74 65 73 74 20 7b 78 7d 20 7b 0a  turn_test {x} {.
1ec0: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c      db eval {SEL
1ed0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 7b  ECT * FROM t1} {
1ee0: 0a 20 20 20 20 20 20 69 66 20 7b 24 61 3d 3d 24  .      if {$a==$
1ef0: 78 7d 20 7b 72 65 74 75 72 6e 20 24 62 7d 0a 20  x} {return $b}. 
1f00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1f10: 6e 5f 74 65 73 74 20 31 30 0a 7d 20 32 30 0a 64  n_test 10.} 20.d
1f20: 6f 5f 74 65 73 74 20 74 63 6c 2d 36 2e 35 20 7b  o_test tcl-6.5 {
1f30: 0a 20 20 72 65 74 75 72 6e 5f 74 65 73 74 20 32  .  return_test 2
1f40: 30 0a 7d 20 34 30 0a 64 6f 5f 74 65 73 74 20 74  0.} 40.do_test t
1f50: 63 6c 2d 36 2e 36 20 7b 0a 20 20 72 65 74 75 72  cl-6.6 {.  retur
1f60: 6e 5f 74 65 73 74 20 39 39 0a 7d 20 35 31 30 0a  n_test 99.} 510.
1f70: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 36 2e 37 20  do_test tcl-6.7 
1f80: 7b 0a 20 20 72 65 74 75 72 6e 5f 74 65 73 74 20  {.  return_test 
1f90: 30 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  0.} {}..do_test 
1fa0: 74 63 6c 2d 37 2e 31 20 7b 0a 20 20 64 62 20 76  tcl-7.1 {.  db v
1fb0: 65 72 73 69 6f 6e 0a 20 20 65 78 70 72 20 30 0a  ersion.  expr 0.
1fc0: 7d 20 7b 30 7d 0a 0a 23 20 6d 6f 64 69 66 79 20  } {0}..# modify 
1fd0: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 4e 55  and reset the NU
1fe0: 4c 4c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  LL representatio
1ff0: 6e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d  n.#.do_test tcl-
2000: 38 2e 31 20 7b 0a 20 20 64 62 20 6e 75 6c 6c 76  8.1 {.  db nullv
2010: 61 6c 75 65 20 4e 61 4e 0a 20 20 65 78 65 63 73  alue NaN.  execs
2020: 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql {INSERT INTO 
2030: 74 31 20 56 41 4c 55 45 53 28 33 30 2c 4e 55 4c  t1 VALUES(30,NUL
2040: 4c 29 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 53  L)}.  db eval {S
2050: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2060: 57 48 45 52 45 20 62 20 49 53 20 4e 55 4c 4c 7d  WHERE b IS NULL}
2070: 0a 7d 20 7b 33 30 20 4e 61 4e 7d 0a 70 72 6f 63  .} {30 NaN}.proc
2080: 20 63 6f 6e 63 61 74 46 75 6e 63 20 61 72 67 73   concatFunc args
2090: 20 7b 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20 24   {return [join $
20a0: 61 72 67 73 20 7b 7d 5d 7d 0a 64 6f 5f 74 65 73  args {}]}.do_tes
20b0: 74 20 74 63 6c 2d 38 2e 32 20 7b 0a 20 20 64 62  t tcl-8.2 {.  db
20c0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 63 61 74   function concat
20d0: 20 63 6f 6e 63 61 74 46 75 6e 63 0a 20 20 64 62   concatFunc.  db
20e0: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f   eval {SELECT co
20f0: 6e 63 61 74 28 27 61 27 2c 20 62 2c 20 27 7a 27  ncat('a', b, 'z'
2100: 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
2110: 62 20 69 73 20 4e 55 4c 4c 7d 0a 7d 20 7b 61 4e  b is NULL}.} {aN
2120: 61 4e 7a 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  aNz}.do_test tcl
2130: 2d 38 2e 33 20 7b 0a 20 20 64 62 20 6e 75 6c 6c  -8.3 {.  db null
2140: 76 61 6c 75 65 20 4e 55 4c 4c 0a 20 20 64 62 20  value NULL.  db 
2150: 6e 75 6c 6c 76 61 6c 75 65 0a 7d 20 7b 4e 55 4c  nullvalue.} {NUL
2160: 4c 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 38  L}.do_test tcl-8
2170: 2e 34 20 7b 0a 20 20 64 62 20 6e 75 6c 6c 76 61  .4 {.  db nullva
2180: 6c 75 65 20 7b 7d 0a 20 20 64 62 20 65 76 61 6c  lue {}.  db eval
2190: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
21a0: 74 31 20 57 48 45 52 45 20 62 20 49 53 20 4e 55  t1 WHERE b IS NU
21b0: 4c 4c 7d 0a 7d 20 7b 33 30 20 7b 7d 7d 0a 64 6f  LL}.} {30 {}}.do
21c0: 5f 74 65 73 74 20 74 63 6c 2d 38 2e 35 20 7b 0a  _test tcl-8.5 {.
21d0: 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 63 6f    db function co
21e0: 6e 63 61 74 20 63 6f 6e 63 61 74 46 75 6e 63 0a  ncat concatFunc.
21f0: 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43    db eval {SELEC
2200: 54 20 63 6f 6e 63 61 74 28 27 61 27 2c 20 62 2c  T concat('a', b,
2210: 20 27 7a 27 29 20 46 52 4f 4d 20 74 31 20 57 48   'z') FROM t1 WH
2220: 45 52 45 20 62 20 69 73 20 4e 55 4c 4c 7d 0a 7d  ERE b is NULL}.}
2230: 20 7b 61 7a 7d 0a 0a 23 20 54 65 73 74 20 74 68   {az}..# Test th
2240: 65 20 72 65 74 75 72 6e 20 74 79 70 65 20 6f 66  e return type of
2250: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
2260: 6e 63 74 69 6f 6e 73 0a 23 0a 64 6f 5f 74 65 73  nctions.#.do_tes
2270: 74 20 74 63 6c 2d 39 2e 31 20 7b 0a 20 20 64 62  t tcl-9.1 {.  db
2280: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 5f 73 74   function ret_st
2290: 72 20 7b 72 65 74 75 72 6e 20 22 68 69 22 7d 0a  r {return "hi"}.
22a0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
22b0: 54 20 74 79 70 65 6f 66 28 72 65 74 5f 73 74 72  T typeof(ret_str
22c0: 28 29 29 7d 0a 7d 20 7b 74 65 78 74 7d 0a 64 6f  ())}.} {text}.do
22d0: 5f 74 65 73 74 20 74 63 6c 2d 39 2e 32 20 7b 0a  _test tcl-9.2 {.
22e0: 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 72 65    db function re
22f0: 74 5f 64 62 6c 20 7b 72 65 74 75 72 6e 20 5b 65  t_dbl {return [e
2300: 78 70 72 20 7b 72 61 6e 64 28 29 2a 30 2e 35 7d  xpr {rand()*0.5}
2310: 5d 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45  ]}.  execsql {SE
2320: 4c 45 43 54 20 74 79 70 65 6f 66 28 72 65 74 5f  LECT typeof(ret_
2330: 64 62 6c 28 29 29 7d 0a 7d 20 7b 72 65 61 6c 7d  dbl())}.} {real}
2340: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 39 2e 33  .do_test tcl-9.3
2350: 20 7b 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e   {.  db function
2360: 20 72 65 74 5f 69 6e 74 20 7b 72 65 74 75 72 6e   ret_int {return
2370: 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61 6e 64   [expr {int(rand
2380: 28 29 2a 32 30 30 29 7d 5d 7d 0a 20 20 65 78 65  ()*200)}]}.  exe
2390: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 79 70  csql {SELECT typ
23a0: 65 6f 66 28 72 65 74 5f 69 6e 74 28 29 29 7d 0a  eof(ret_int())}.
23b0: 7d 20 7b 69 6e 74 65 67 65 72 7d 0a 0a 23 20 52  } {integer}..# R
23c0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
23d0: 6f 20 74 68 65 20 73 61 6d 65 20 75 73 65 72 2d  o the same user-
23e0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
23f0: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 74 63 6c  .#.ifcapable tcl
2400: 76 61 72 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  var {.  do_test 
2410: 74 63 6c 2d 39 2e 31 30 20 7b 0a 20 20 20 20 70  tcl-9.10 {.    p
2420: 72 6f 63 20 75 73 65 72 66 75 6e 63 5f 72 31 20  roc userfunc_r1 
2430: 7b 6e 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b  {n} {.      if {
2440: 24 6e 3c 3d 30 7d 20 7b 72 65 74 75 72 6e 20 30  $n<=0} {return 0
2450: 7d 0a 20 20 20 20 20 20 73 65 74 20 6e 6d 31 20  }.      set nm1 
2460: 5b 65 78 70 72 20 7b 24 6e 2d 31 7d 5d 0a 20 20  [expr {$n-1}].  
2470: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
2480: 20 7b 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45   {[db eval {SELE
2490: 43 54 20 72 31 28 24 6e 6d 31 29 7d 5d 2b 24 6e  CT r1($nm1)}]+$n
24a0: 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 20  }].    }.    db 
24b0: 66 75 6e 63 74 69 6f 6e 20 72 31 20 75 73 65 72  function r1 user
24c0: 66 75 6e 63 5f 72 31 0a 20 20 20 20 65 78 65 63  func_r1.    exec
24d0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 31 28 31  sql {SELECT r1(1
24e0: 30 29 7d 0a 20 20 7d 20 7b 35 35 7d 0a 20 20 64  0)}.  } {55}.  d
24f0: 6f 5f 74 65 73 74 20 74 63 6c 2d 39 2e 31 31 20  o_test tcl-9.11 
2500: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53  {.    execsql {S
2510: 45 4c 45 43 54 20 72 31 28 31 30 30 29 7d 0a 20  ELECT r1(100)}. 
2520: 20 7d 20 7b 35 30 35 30 7d 0a 7d 0a 0a 23 20 54   } {5050}.}..# T
2530: 65 73 74 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ests for the new
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 74   transaction met
2550: 68 6f 64 0a 23 0a 64 6f 5f 74 65 73 74 20 74 63  hod.#.do_test tc
2560: 6c 2d 31 30 2e 31 20 7b 0a 20 20 64 62 20 74 72  l-10.1 {.  db tr
2570: 61 6e 73 61 63 74 69 6f 6e 20 7b 7d 0a 7d 20 7b  ansaction {}.} {
2580: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30  }.do_test tcl-10
2590: 2e 32 20 7b 0a 20 20 64 62 20 74 72 61 6e 73 61  .2 {.  db transa
25a0: 63 74 69 6f 6e 20 64 65 66 65 72 72 65 64 20 7b  ction deferred {
25b0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74  }.} {}.do_test t
25c0: 63 6c 2d 31 30 2e 33 20 7b 0a 20 20 64 62 20 74  cl-10.3 {.  db t
25d0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 6d 65 64  ransaction immed
25e0: 69 61 74 65 20 7b 7d 0a 7d 20 7b 7d 0a 64 6f 5f  iate {}.} {}.do_
25f0: 74 65 73 74 20 74 63 6c 2d 31 30 2e 34 20 7b 0a  test tcl-10.4 {.
2600: 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e    db transaction
2610: 20 65 78 63 6c 75 73 69 76 65 20 7b 7d 0a 7d 20   exclusive {}.} 
2620: 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31  {}.do_test tcl-1
2630: 30 2e 35 20 7b 0a 20 20 73 65 74 20 72 63 20 5b  0.5 {.  set rc [
2640: 63 61 74 63 68 20 7b 64 62 20 74 72 61 6e 73 61  catch {db transa
2650: 63 74 69 6f 6e 20 78 79 7a 7a 79 20 7b 7d 7d 20  ction xyzzy {}} 
2660: 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72  msg].  lappend r
2670: 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 62 61 64  c $msg.} {1 {bad
2680: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70   transaction typ
2690: 65 20 22 78 79 7a 7a 79 22 3a 20 6d 75 73 74 20  e "xyzzy": must 
26a0: 62 65 20 64 65 66 65 72 72 65 64 2c 20 65 78 63  be deferred, exc
26b0: 6c 75 73 69 76 65 2c 20 6f 72 20 69 6d 6d 65 64  lusive, or immed
26c0: 69 61 74 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  iate}}.do_test t
26d0: 63 6c 2d 31 30 2e 36 20 7b 0a 20 20 73 65 74 20  cl-10.6 {.  set 
26e0: 72 63 20 5b 63 61 74 63 68 20 7b 64 62 20 74 72  rc [catch {db tr
26f0: 61 6e 73 61 63 74 69 6f 6e 20 7b 65 72 72 6f 72  ansaction {error
2700: 20 74 65 73 74 2d 65 72 72 6f 72 7d 7d 20 6d 73   test-error}} ms
2710: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 63 20  g].  lappend rc 
2720: 24 6d 73 67 0a 7d 20 7b 31 20 74 65 73 74 2d 65  $msg.} {1 test-e
2730: 72 72 6f 72 7d 0a 64 6f 5f 74 65 73 74 20 74 63  rror}.do_test tc
2740: 6c 2d 31 30 2e 37 20 7b 0a 20 20 64 62 20 74 72  l-10.7 {.  db tr
2750: 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20  ansaction {.    
2760: 64 62 20 65 76 61 6c 20 7b 43 52 45 41 54 45 20  db eval {CREATE 
2770: 54 41 42 4c 45 20 74 34 28 78 29 7d 0a 20 20 20  TABLE t4(x)}.   
2780: 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   db transaction 
2790: 7b 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c 20  {.      db eval 
27a0: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20  {INSERT INTO t4 
27b0: 56 41 4c 55 45 53 28 31 29 7d 0a 20 20 20 20 7d  VALUES(1)}.    }
27c0: 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b  .  }.  db eval {
27d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34  SELECT * FROM t4
27e0: 7d 0a 7d 20 31 0a 64 6f 5f 74 65 73 74 20 74 63  }.} 1.do_test tc
27f0: 6c 2d 31 30 2e 38 20 7b 0a 20 20 63 61 74 63 68  l-10.8 {.  catch
2800: 20 7b 0a 20 20 20 20 64 62 20 74 72 61 6e 73 61   {.    db transa
2810: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 64 62  ction {.      db
2820: 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e   eval {INSERT IN
2830: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 32 29 7d  TO t4 VALUES(2)}
2840: 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b  .      db eval {
2850: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
2860: 41 4c 55 45 53 28 33 29 7d 0a 20 20 20 20 20 20  ALUES(3)}.      
2870: 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20  db eval {INSERT 
2880: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 34  INTO t4 VALUES(4
2890: 29 7d 0a 20 20 20 20 20 20 65 72 72 6f 72 20 74  )}.      error t
28a0: 65 73 74 2d 65 72 72 6f 72 0a 20 20 20 20 7d 0a  est-error.    }.
28b0: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 53    }.  db eval {S
28c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 7d  ELECT * FROM t4}
28d0: 0a 7d 20 31 0a 64 6f 5f 74 65 73 74 20 74 63 6c  .} 1.do_test tcl
28e0: 2d 31 30 2e 39 20 7b 0a 20 20 64 62 20 74 72 61  -10.9 {.  db tra
28f0: 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 64  nsaction {.    d
2900: 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49  b eval {INSERT I
2910: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 32 29  NTO t4 VALUES(2)
2920: 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 0a 20 20  }.    catch {.  
2930: 20 20 20 20 64 62 20 74 72 61 6e 73 61 63 74 69      db transacti
2940: 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 64 62 20  on {.        db 
2950: 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54  eval {INSERT INT
2960: 4f 20 74 34 20 56 41 4c 55 45 53 28 33 29 7d 0a  O t4 VALUES(3)}.
2970: 20 20 20 20 20 20 20 20 64 62 20 65 76 61 6c 20          db eval 
2980: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20  {INSERT INTO t4 
2990: 56 41 4c 55 45 53 28 34 29 7d 0a 20 20 20 20 20  VALUES(4)}.     
29a0: 20 20 20 65 72 72 6f 72 20 74 65 73 74 2d 65 72     error test-er
29b0: 72 6f 72 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ror.      }.    
29c0: 7d 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20  }.  }.  db eval 
29d0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
29e0: 34 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65  4}.} {1 2}.do_te
29f0: 73 74 20 74 63 6c 2d 31 30 2e 31 30 20 7b 0a 20  st tcl-10.10 {. 
2a00: 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b   for {set i 0} {
2a10: 24 69 3c 31 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  $i<1} {incr i} {
2a20: 0a 20 20 20 20 64 62 20 74 72 61 6e 73 61 63 74  .    db transact
2a30: 69 6f 6e 20 7b 0a 20 20 20 20 20 20 64 62 20 65  ion {.      db e
2a40: 76 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  val {INSERT INTO
2a50: 20 74 34 20 56 41 4c 55 45 53 28 35 29 7d 0a 20   t4 VALUES(5)}. 
2a60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20       continue.  
2a70: 20 20 7d 0a 20 20 20 20 65 72 72 6f 72 20 22 54    }.    error "T
2a80: 68 69 73 20 6c 69 6e 65 20 73 68 6f 75 6c 64 20  his line should 
2a90: 6e 6f 74 20 62 65 20 72 75 6e 22 0a 20 20 7d 0a  not be run".  }.
2aa0: 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43    db eval {SELEC
2ab0: 54 20 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d 20 7b  T * FROM t4}.} {
2ac0: 31 20 32 20 35 7d 0a 64 6f 5f 74 65 73 74 20 74  1 2 5}.do_test t
2ad0: 63 6c 2d 31 30 2e 31 31 20 7b 0a 20 20 66 6f 72  cl-10.11 {.  for
2ae0: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 31   {set i 0} {$i<1
2af0: 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  0} {incr i} {.  
2b00: 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e    db transaction
2b10: 20 7b 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c   {.      db eval
2b20: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34   {INSERT INTO t4
2b30: 20 56 41 4c 55 45 53 28 36 29 7d 0a 20 20 20 20   VALUES(6)}.    
2b40: 20 20 62 72 65 61 6b 0a 20 20 20 20 7d 0a 20 20    break.    }.  
2b50: 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c  }.  db eval {SEL
2b60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d  ECT * FROM t4}.}
2b70: 20 7b 31 20 32 20 35 20 36 7d 0a 64 6f 5f 74 65   {1 2 5 6}.do_te
2b80: 73 74 20 74 63 6c 2d 31 30 2e 31 32 20 7b 0a 20  st tcl-10.12 {. 
2b90: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
2ba0: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20  .    for {set i 
2bb0: 30 7d 20 7b 24 69 3c 31 30 7d 20 7b 69 6e 63 72  0} {$i<10} {incr
2bc0: 20 69 7d 20 7b 0a 20 20 20 20 20 20 64 62 20 74   i} {.      db t
2bd0: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20  ransaction {.   
2be0: 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e       db eval {IN
2bf0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
2c00: 55 45 53 28 37 29 7d 0a 20 20 20 20 20 20 20 20  UES(7)}.        
2c10: 72 65 74 75 72 6e 0a 20 20 20 20 20 20 7d 0a 20  return.      }. 
2c20: 20 20 20 7d 0a 20 20 7d 5d 0a 7d 20 7b 32 7d 0a     }.  }].} {2}.
2c30: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e 31  do_test tcl-10.1
2c40: 33 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53  3 {.  db eval {S
2c50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 7d  ELECT * FROM t4}
2c60: 0a 7d 20 7b 31 20 32 20 35 20 36 20 37 7d 0a 0a  .} {1 2 5 6 7}..
2c70: 23 20 4e 6f 77 20 74 65 73 74 20 74 68 61 74 20  # Now test that 
2c80: 5b 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 5d  [db transaction]
2c90: 20 63 6f 6d 6d 61 6e 64 73 20 6d 61 79 20 62 65   commands may be
2ca0: 20 6e 65 73 74 65 64 20 77 69 74 68 20 0a 23 20   nested with .# 
2cb0: 74 68 65 20 65 78 70 65 63 74 65 64 20 72 65 73  the expected res
2cc0: 75 6c 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ults..#.do_test 
2cd0: 74 63 6c 2d 31 30 2e 31 34 20 7b 0a 20 20 64 62  tcl-10.14 {.  db
2ce0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20   transaction {. 
2cf0: 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20     db eval {.   
2d00: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
2d10: 34 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  4;.      INSERT 
2d20: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27  INTO t4 VALUES('
2d30: 6f 6e 65 27 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  one');.    }..  
2d40: 20 20 63 61 74 63 68 20 7b 20 0a 20 20 20 20 20    catch { .     
2d50: 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   db transaction 
2d60: 7b 0a 20 20 20 20 20 20 20 20 64 62 20 65 76 61  {.        db eva
2d70: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
2d80: 74 34 20 56 41 4c 55 45 53 28 27 74 77 6f 27 29  t4 VALUES('two')
2d90: 20 7d 0a 20 20 20 20 20 20 20 20 64 62 20 74 72   }.        db tr
2da0: 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20  ansaction {.    
2db0: 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20        db eval { 
2dc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
2dd0: 41 4c 55 45 53 28 27 74 68 72 65 65 27 29 20 7d  ALUES('three') }
2de0: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72  .          error
2df0: 20 22 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72   "throw an error
2e00: 21 22 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  !".        }.   
2e10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2e20: 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43    db eval {SELEC
2e30: 54 20 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d 20 7b  T * FROM t4}.} {
2e40: 6f 6e 65 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  one}.do_test tcl
2e50: 2d 31 30 2e 31 35 20 7b 0a 20 20 23 20 4d 61 6b  -10.15 {.  # Mak
2e60: 65 20 73 75 72 65 20 61 20 74 72 61 6e 73 61 63  e sure a transac
2e70: 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  tion has not bee
2e80: 6e 20 6c 65 66 74 20 6f 70 65 6e 2e 0a 20 20 64  n left open..  d
2e90: 62 20 65 76 61 6c 20 7b 42 45 47 49 4e 20 3b 20  b eval {BEGIN ; 
2ea0: 43 4f 4d 4d 49 54 7d 0a 7d 20 7b 7d 0a 64 6f 5f  COMMIT}.} {}.do_
2eb0: 74 65 73 74 20 74 63 6c 2d 31 30 2e 31 36 20 7b  test tcl-10.16 {
2ec0: 0a 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f  .  db transactio
2ed0: 6e 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20  n {.    db eval 
2ee0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34  { INSERT INTO t4
2ef0: 20 56 41 4c 55 45 53 28 27 74 77 6f 27 29 3b 20   VALUES('two'); 
2f00: 7d 0a 20 20 20 20 64 62 20 74 72 61 6e 73 61 63  }.    db transac
2f10: 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 64 62 20  tion {.      db 
2f20: 65 76 61 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  eval { INSERT IN
2f30: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 74 68  TO t4 VALUES('th
2f40: 72 65 65 27 29 20 7d 0a 20 20 20 20 20 20 64 62  ree') }.      db
2f50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20   transaction {. 
2f60: 20 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b         db eval {
2f70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
2f80: 56 41 4c 55 45 53 28 27 66 6f 75 72 27 29 20 7d  VALUES('four') }
2f90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2fa0: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45   }.  db eval {SE
2fb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 7d 0a  LECT * FROM t4}.
2fc0: 7d 20 7b 6f 6e 65 20 74 77 6f 20 74 68 72 65 65  } {one two three
2fd0: 20 66 6f 75 72 7d 0a 64 6f 5f 74 65 73 74 20 74   four}.do_test t
2fe0: 63 6c 2d 31 30 2e 31 37 20 7b 0a 20 20 63 61 74  cl-10.17 {.  cat
2ff0: 63 68 20 7b 0a 20 20 20 20 64 62 20 74 72 61 6e  ch {.    db tran
3000: 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20  saction {.      
3010: 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45 52 54  db eval { INSERT
3020: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
3030: 27 41 27 29 3b 20 7d 0a 20 20 20 20 20 20 64 62  'A'); }.      db
3040: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20   transaction {. 
3050: 20 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b         db eval {
3060: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
3070: 56 41 4c 55 45 53 28 27 42 27 29 20 7d 0a 20 20  VALUES('B') }.  
3080: 20 20 20 20 20 20 64 62 20 74 72 61 6e 73 61 63        db transac
3090: 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 20  tion {.         
30a0: 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45 52   db eval { INSER
30b0: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
30c0: 28 27 43 27 29 20 7d 0a 20 20 20 20 20 20 20 20  ('C') }.        
30d0: 20 20 65 72 72 6f 72 20 22 74 68 72 6f 77 20 61    error "throw a
30e0: 6e 20 65 72 72 6f 72 21 22 0a 20 20 20 20 20 20  n error!".      
30f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3100: 7d 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20  }.  }.  db eval 
3110: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
3120: 34 7d 0a 7d 20 7b 6f 6e 65 20 74 77 6f 20 74 68  4}.} {one two th
3130: 72 65 65 20 66 6f 75 72 7d 0a 64 6f 5f 74 65 73  ree four}.do_tes
3140: 74 20 74 63 6c 2d 31 30 2e 31 38 20 7b 0a 20 20  t tcl-10.18 {.  
3150: 23 20 4d 61 6b 65 20 73 75 72 65 20 61 20 74 72  # Make sure a tr
3160: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
3170: 74 20 62 65 65 6e 20 6c 65 66 74 20 6f 70 65 6e  t been left open
3180: 2e 0a 20 20 64 62 20 65 76 61 6c 20 7b 42 45 47  ..  db eval {BEG
3190: 49 4e 20 3b 20 43 4f 4d 4d 49 54 7d 0a 7d 20 7b  IN ; COMMIT}.} {
31a0: 7d 0a 0a 23 20 4d 65 73 73 20 75 70 20 61 20 5b  }..# Mess up a [
31b0: 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 5d 20  db transaction] 
31c0: 63 6f 6d 6d 61 6e 64 20 62 79 20 6c 6f 63 6b 69  command by locki
31d0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
31e0: 75 73 69 6e 67 20 61 0a 23 20 73 65 63 6f 6e 64  using a.# second
31f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 68 65 6e   connection when
3200: 20 69 74 20 74 72 69 65 73 20 74 6f 20 63 6f 6d   it tries to com
3210: 6d 69 74 2e 20 4d 61 6b 65 20 73 75 72 65 20 74  mit. Make sure t
3220: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23  he transaction.#
3230: 20 69 73 20 6e 6f 74 20 73 74 69 6c 6c 20 6f 70   is not still op
3240: 65 6e 20 61 66 74 65 72 20 74 68 65 20 22 64 61  en after the "da
3250: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
3260: 22 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74  " exception is t
3270: 68 72 6f 77 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74  hrown..#.do_test
3280: 20 74 63 6c 2d 31 30 2e 31 38 20 7b 0a 20 20 73   tcl-10.18 {.  s
3290: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
32a0: 64 62 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 0a  db.  db2 eval {.
32b0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53      BEGIN;.    S
32c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
32d0: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a  ite_master;.  }.
32e0: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
32f0: 20 7b 0a 20 20 20 20 64 62 20 74 72 61 6e 73 61   {.    db transa
3300: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 64 62  ction {.      db
3310: 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e   eval {INSERT IN
3320: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 66 69  TO t4 VALUES('fi
3330: 76 65 27 29 7d 0a 20 20 20 20 7d 0a 20 20 7d 20  ve')}.    }.  } 
3340: 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24 72 63 20  msg].  list $rc 
3350: 24 6d 73 67 0a 7d 20 7b 31 20 7b 64 61 74 61 62  $msg.} {1 {datab
3360: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
3370: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e 31  do_test tcl-10.1
3380: 39 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 42  9 {.  db eval {B
3390: 45 47 49 4e 20 3b 20 43 4f 4d 4d 49 54 7d 0a 7d  EGIN ; COMMIT}.}
33a0: 20 7b 7d 0a 0a 23 20 54 68 77 61 72 74 20 61 20   {}..# Thwart a 
33b0: 5b 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 5d  [db transaction]
33c0: 20 63 6f 6d 6d 61 6e 64 20 62 79 20 6c 6f 63 6b   command by lock
33d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
33e0: 20 75 73 69 6e 67 20 61 0a 23 20 73 65 63 6f 6e   using a.# secon
33f0: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  d connection wit
3400: 68 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  h "BEGIN EXCLUSI
3410: 56 45 22 2e 20 4d 61 6b 65 20 73 75 72 65 20 6e  VE". Make sure n
3420: 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  o transaction is
3430: 20 0a 23 20 6f 70 65 6e 20 61 66 74 65 72 20 74   .# open after t
3440: 68 65 20 22 64 61 74 61 62 61 73 65 20 69 73 20  he "database is 
3450: 6c 6f 63 6b 65 64 22 20 65 78 63 65 70 74 69 6f  locked" exceptio
3460: 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 23 0a 64  n is thrown..#.d
3470: 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e 32 30  o_test tcl-10.20
3480: 20 7b 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 0a   {.  db2 eval {.
3490: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
34a0: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b  BEGIN EXCLUSIVE;
34b0: 0a 20 20 7d 0a 20 20 73 65 74 20 72 63 20 5b 63  .  }.  set rc [c
34c0: 61 74 63 68 20 7b 0a 20 20 20 20 64 62 20 74 72  atch {.    db tr
34d0: 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20  ansaction {.    
34e0: 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52    db eval {INSER
34f0: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
3500: 28 27 66 69 76 65 27 29 7d 0a 20 20 20 20 7d 0a  ('five')}.    }.
3510: 20 20 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20    } msg].  list 
3520: 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 64  $rc $msg.} {1 {d
3530: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
3540: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d  d}}.do_test tcl-
3550: 31 30 2e 32 31 20 7b 0a 20 20 64 62 32 20 63 6c  10.21 {.  db2 cl
3560: 6f 73 65 0a 20 20 64 62 20 65 76 61 6c 20 7b 42  ose.  db eval {B
3570: 45 47 49 4e 20 3b 20 43 4f 4d 4d 49 54 7d 0a 7d  EGIN ; COMMIT}.}
3580: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d   {}.do_test tcl-
3590: 31 30 2e 32 32 20 7b 0a 20 20 73 71 6c 69 74 65  10.22 {.  sqlite
35a0: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
35b0: 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 65  db transaction e
35c0: 78 63 6c 75 73 69 76 65 20 7b 0a 20 20 20 20 63  xclusive {.    c
35d0: 61 74 63 68 20 7b 20 64 62 32 20 65 76 61 6c 20  atch { db2 eval 
35e0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  {SELECT * FROM s
35f0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 20 7d 20  qlite_master} } 
3600: 6d 73 67 0a 20 20 20 20 73 65 74 20 6d 73 67 20  msg.    set msg 
3610: 22 64 62 32 3a 20 24 6d 73 67 22 0a 20 20 7d 0a  "db2: $msg".  }.
3620: 20 20 73 65 74 20 6d 73 67 0a 7d 20 7b 64 62 32    set msg.} {db2
3630: 3a 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  : database is lo
3640: 63 6b 65 64 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  cked}.db2 close.
3650: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 31 2e  .do_test tcl-11.
3660: 31 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 49  1 {.  db eval {I
3670: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
3680: 4c 55 45 53 28 36 29 7d 0a 20 20 64 62 20 65 78  LUES(6)}.  db ex
3690: 69 73 74 73 20 7b 53 45 4c 45 43 54 20 78 2c 78  ists {SELECT x,x
36a0: 2a 32 2c 78 2b 78 20 46 52 4f 4d 20 74 34 20 57  *2,x+x FROM t4 W
36b0: 48 45 52 45 20 78 3d 3d 36 7d 0a 7d 20 7b 31 7d  HERE x==6}.} {1}
36c0: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 31 2e  .do_test tcl-11.
36d0: 32 20 7b 0a 20 20 64 62 20 65 78 69 73 74 73 20  2 {.  db exists 
36e0: 7b 53 45 4c 45 43 54 20 30 20 46 52 4f 4d 20 74  {SELECT 0 FROM t
36f0: 34 20 57 48 45 52 45 20 78 3d 3d 36 7d 0a 7d 20  4 WHERE x==6}.} 
3700: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d  {1}.do_test tcl-
3710: 31 31 2e 33 20 7b 0a 20 20 64 62 20 65 78 69 73  11.3 {.  db exis
3720: 74 73 20 7b 53 45 4c 45 43 54 20 31 20 46 52 4f  ts {SELECT 1 FRO
3730: 4d 20 74 34 20 57 48 45 52 45 20 78 3d 3d 38 7d  M t4 WHERE x==8}
3740: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 74  .} {0}.do_test t
3750: 63 6c 2d 31 31 2e 33 2e 31 20 7b 0a 20 20 74 63  cl-11.3.1 {.  tc
3760: 6c 5f 6f 62 6a 70 72 6f 63 20 64 62 20 65 78 69  l_objproc db exi
3770: 73 74 73 20 7b 53 45 4c 45 43 54 20 31 20 46 52  sts {SELECT 1 FR
3780: 4f 4d 20 74 34 20 57 48 45 52 45 20 78 3d 3d 38  OM t4 WHERE x==8
3790: 7d 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74  }.} {0}..do_test
37a0: 20 74 63 6c 2d 31 32 2e 31 20 7b 0a 20 20 75 6e   tcl-12.1 {.  un
37b0: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
37c0: 61 20 62 20 63 20 76 65 72 73 69 6f 6e 0a 20 20  a b c version.  
37d0: 73 65 74 20 76 65 72 73 69 6f 6e 20 5b 64 62 20  set version [db 
37e0: 76 65 72 73 69 6f 6e 5d 0a 20 20 73 63 61 6e 20  version].  scan 
37f0: 24 76 65 72 73 69 6f 6e 20 22 25 64 2e 25 64 2e  $version "%d.%d.
3800: 25 64 22 20 61 20 62 20 63 0a 20 20 65 78 70 72  %d" a b c.  expr
3810: 20 24 61 2a 31 30 30 30 30 30 30 20 2b 20 24 62   $a*1000000 + $b
3820: 2a 31 30 30 30 20 2b 20 24 63 0a 7d 20 5b 73 71  *1000 + $c.} [sq
3830: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
3840: 5f 6e 75 6d 62 65 72 5d 0a 0a 0a 23 20 43 68 65  _number]...# Che
3850: 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 77  ck to see that w
3860: 68 65 6e 20 62 69 6e 64 69 6e 67 73 20 6f 66 20  hen bindings of 
3870: 74 68 65 20 66 6f 72 6d 20 40 61 61 61 20 61 72  the form @aaa ar
3880: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 0a 23  e used instead.#
3890: 20 6f 66 20 24 61 61 61 2c 20 74 68 61 74 20 6f   of $aaa, that o
38a0: 62 6a 65 63 74 73 20 61 72 65 20 74 72 65 61 74  bjects are treat
38b0: 65 64 20 61 73 20 62 79 74 65 61 72 72 61 79 20  ed as bytearray 
38c0: 61 6e 64 20 61 72 65 20 69 6e 73 65 72 74 65 64  and are inserted
38d0: 0a 23 20 61 73 20 42 4c 4f 42 73 2e 0a 23 0a 69  .# as BLOBs..#.i
38e0: 66 63 61 70 61 62 6c 65 20 74 63 6c 76 61 72 20  fcapable tclvar 
38f0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d  {.  do_test tcl-
3900: 31 33 2e 31 20 7b 0a 20 20 20 20 64 62 20 65 76  13.1 {.    db ev
3910: 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45  al {CREATE TABLE
3920: 20 74 35 28 78 20 42 4c 4f 42 29 7d 0a 20 20 20   t5(x BLOB)}.   
3930: 20 73 65 74 20 78 20 61 62 63 31 32 33 0a 20 20   set x abc123.  
3940: 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52    db eval {INSER
3950: 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53  T INTO t5 VALUES
3960: 28 24 78 29 7d 0a 20 20 20 20 64 62 20 65 76 61  ($x)}.    db eva
3970: 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65 6f 66  l {SELECT typeof
3980: 28 78 29 20 46 52 4f 4d 20 74 35 7d 0a 20 20 7d  (x) FROM t5}.  }
3990: 20 7b 74 65 78 74 7d 0a 20 20 64 6f 5f 74 65 73   {text}.  do_tes
39a0: 74 20 74 63 6c 2d 31 33 2e 32 20 7b 0a 20 20 20  t tcl-13.2 {.   
39b0: 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 78 20   binary scan $x 
39c0: 48 20 6e 6f 74 55 73 65 64 0a 20 20 20 20 64 62  H notUsed.    db
39d0: 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 44 45   eval {.      DE
39e0: 4c 45 54 45 20 46 52 4f 4d 20 74 35 3b 0a 20 20  LETE FROM t5;.  
39f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3a00: 74 35 20 56 41 4c 55 45 53 28 24 78 29 3b 0a 20  t5 VALUES($x);. 
3a10: 20 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65       SELECT type
3a20: 6f 66 28 78 29 20 46 52 4f 4d 20 74 35 3b 0a 20  of(x) FROM t5;. 
3a30: 20 20 20 7d 0a 20 20 7d 20 7b 74 65 78 74 7d 0a     }.  } {text}.
3a40: 20 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 33    do_test tcl-13
3a50: 2e 33 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c  .3 {.    db eval
3a60: 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20   {.      DELETE 
3a70: 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 20 20 49  FROM t5;.      I
3a80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41  NSERT INTO t5 VA
3a90: 4c 55 45 53 28 40 78 29 3b 0a 20 20 20 20 20 20  LUES(@x);.      
3aa0: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 78 29  SELECT typeof(x)
3ab0: 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 7d 0a   FROM t5;.    }.
3ac0: 20 20 7d 20 7b 62 6c 6f 62 7d 0a 20 20 64 6f 5f    } {blob}.  do_
3ad0: 74 65 73 74 20 74 63 6c 2d 31 33 2e 34 20 7b 0a  test tcl-13.4 {.
3ae0: 20 20 20 20 73 65 74 20 79 20 31 32 33 34 0a 20      set y 1234. 
3af0: 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20     db eval {.   
3b00: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
3b10: 35 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  5;.      INSERT 
3b20: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 40  INTO t5 VALUES(@
3b30: 79 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  y);.      SELECT
3b40: 20 68 65 78 28 78 29 2c 20 74 79 70 65 6f 66 28   hex(x), typeof(
3b50: 78 29 20 46 52 4f 4d 20 74 35 0a 20 20 20 20 7d  x) FROM t5.    }
3b60: 0a 20 20 7d 20 7b 33 31 33 32 33 33 33 34 20 62  .  } {31323334 b
3b70: 6c 6f 62 7d 0a 7d 0a 0a 64 62 20 66 75 6e 63 20  lob}.}..db func 
3b80: 78 43 61 6c 6c 20 78 43 61 6c 6c 0a 70 72 6f 63  xCall xCall.proc
3b90: 20 78 43 61 6c 6c 20 7b 7d 20 7b 20 72 65 74 75   xCall {} { retu
3ba0: 72 6e 20 22 76 61 6c 75 65 22 20 7d 0a 64 6f 5f  rn "value" }.do_
3bb0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 74 63 6c  execsql_test tcl
3bc0: 2d 31 34 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  -14.1 {.  CREATE
3bd0: 20 54 41 42 4c 45 20 74 36 28 78 29 3b 0a 20 20   TABLE t6(x);.  
3be0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56  INSERT INTO t6 V
3bf0: 41 4c 55 45 53 28 31 29 3b 0a 7d 0a 64 6f 5f 74  ALUES(1);.}.do_t
3c00: 65 73 74 20 74 63 6c 2d 31 34 2e 32 20 7b 0a 20  est tcl-14.2 {. 
3c10: 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20   db one {SELECT 
3c20: 78 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20  x FROM t6 WHERE 
3c30: 78 43 61 6c 6c 28 29 21 3d 27 76 61 6c 75 65 27  xCall()!='value'
3c40: 7d 0a 7d 20 7b 7d 0a 0a 0a 0a 66 69 6e 69 73 68  }.} {}....finish
3c50: 5f 74 65 73 74 0a                                _test.