/ Hex Artifact Content
Login

Artifact 8c154101e704170c2be10f137a5499ac2c6da8d3:


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