/ Hex Artifact Content
Login

Artifact 5a06962d8f18edf4703931f6b7dacd83678d02fa5c8ced9a7958c007ad58626a:


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: 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33 7d 0a  catch {sqlite3}.
02e0: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
02f0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0300: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0310: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 65  ir/tester.tcl.se
0320: 74 20 74 65 73 74 70 72 65 66 69 78 20 74 63 6c  t testprefix tcl
0330: 0a 0a 23 20 43 68 65 63 6b 20 74 68 65 20 65 72  ..# Check the er
0340: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 67 65 6e  ror messages gen
0350: 65 72 61 74 65 64 20 62 79 20 74 63 6c 73 71 6c  erated by tclsql
0360: 69 74 65 0a 23 0a 73 65 74 20 72 20 22 73 71 6c  ite.#.set r "sql
0370: 69 74 65 5f 6f 72 69 67 20 48 41 4e 44 4c 45 20  ite_orig HANDLE 
0380: 3f 46 49 4c 45 4e 41 4d 45 3f 20 3f 2d 76 66 73  ?FILENAME? ?-vfs
0390: 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64   VFSNAME? ?-read
03a0: 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  only BOOLEAN? ?-
03b0: 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20  create BOOLEAN? 
03c0: 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41  ?-nomutex BOOLEA
03d0: 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42  N? ?-fullmutex B
03e0: 4f 4f 4c 45 41 4e 3f 20 3f 2d 75 72 69 20 42 4f  OOLEAN? ?-uri BO
03f0: 4f 4c 45 41 4e 3f 22 0a 69 66 20 7b 5b 73 71 6c  OLEAN?".if {[sql
0400: 69 74 65 33 20 2d 68 61 73 2d 63 6f 64 65 63 5d  ite3 -has-codec]
0410: 7d 20 7b 0a 20 20 61 70 70 65 6e 64 20 72 20 22  } {.  append r "
0420: 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f   ?-key CODECKEY?
0430: 22 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d  ".}.do_test tcl-
0440: 31 2e 31 20 7b 0a 20 20 73 65 74 20 76 20 5b 63  1.1 {.  set v [c
0450: 61 74 63 68 20 7b 73 71 6c 69 74 65 33 20 2d 62  atch {sqlite3 -b
0460: 6f 67 75 73 7d 20 6d 73 67 5d 0a 20 20 72 65 67  ogus} msg].  reg
0470: 73 75 62 20 7b 72 65 61 6c 6c 79 5f 73 71 6c 69  sub {really_sqli
0480: 74 65 33 7d 20 24 6d 73 67 20 7b 73 71 6c 69 74  te3} $msg {sqlit
0490: 65 33 7d 20 6d 73 67 0a 20 20 6c 61 70 70 65 6e  e3} msg.  lappen
04a0: 64 20 76 20 24 6d 73 67 0a 7d 20 5b 6c 69 73 74  d v $msg.} [list
04b0: 20 31 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73   1 "wrong # args
04c0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 24 72  : should be \"$r
04d0: 5c 22 22 5d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  \""].do_test tcl
04e0: 2d 31 2e 31 2e 31 20 7b 0a 20 20 73 65 74 20 76  -1.1.1 {.  set v
04f0: 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33   [catch {sqlite3
0500: 7d 20 6d 73 67 5d 0a 20 20 72 65 67 73 75 62 20  } msg].  regsub 
0510: 7b 72 65 61 6c 6c 79 5f 73 71 6c 69 74 65 33 7d  {really_sqlite3}
0520: 20 24 6d 73 67 20 7b 73 71 6c 69 74 65 33 7d 20   $msg {sqlite3} 
0530: 6d 73 67 0a 20 20 6c 61 70 70 65 6e 64 20 76 20  msg.  lappend v 
0540: 24 6d 73 67 0a 7d 20 5b 6c 69 73 74 20 31 20 22  $msg.} [list 1 "
0550: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
0560: 6f 75 6c 64 20 62 65 20 5c 22 24 72 5c 22 22 5d  ould be \"$r\""]
0570: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 32  .do_test tcl-1.2
0580: 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63   {.  set v [catc
0590: 68 20 7b 64 62 20 62 6f 67 75 73 7d 20 6d 73 67  h {db bogus} msg
05a0: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d  ].  lappend v $m
05b0: 73 67 0a 7d 20 7b 31 20 7b 62 61 64 20 6f 70 74  sg.} {1 {bad opt
05c0: 69 6f 6e 20 22 62 6f 67 75 73 22 3a 20 6d 75 73  ion "bogus": mus
05d0: 74 20 62 65 20 61 75 74 68 6f 72 69 7a 65 72 2c  t be authorizer,
05e0: 20 62 61 63 6b 75 70 2c 20 62 69 6e 64 5f 66 61   backup, bind_fa
05f0: 6c 6c 62 61 63 6b 2c 20 62 75 73 79 2c 20 63 61  llback, busy, ca
0600: 63 68 65 2c 20 63 68 61 6e 67 65 73 2c 20 63 6c  che, changes, cl
0610: 6f 73 65 2c 20 63 6f 6c 6c 61 74 65 2c 20 63 6f  ose, collate, co
0620: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 2c 20  llation_needed, 
0630: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 2c 20 63 6f 6d  commit_hook, com
0640: 70 6c 65 74 65 2c 20 63 6f 70 79 2c 20 64 65 73  plete, copy, des
0650: 65 72 69 61 6c 69 7a 65 2c 20 65 6e 61 62 6c 65  erialize, enable
0660: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c  _load_extension,
0670: 20 65 72 72 6f 72 63 6f 64 65 2c 20 65 76 61 6c   errorcode, eval
0680: 2c 20 65 78 69 73 74 73 2c 20 66 75 6e 63 74 69  , exists, functi
0690: 6f 6e 2c 20 69 6e 63 72 62 6c 6f 62 2c 20 69 6e  on, incrblob, in
06a0: 74 65 72 72 75 70 74 2c 20 6c 61 73 74 5f 69 6e  terrupt, last_in
06b0: 73 65 72 74 5f 72 6f 77 69 64 2c 20 6e 75 6c 6c  sert_rowid, null
06c0: 76 61 6c 75 65 2c 20 6f 6e 65 63 6f 6c 75 6d 6e  value, onecolumn
06d0: 2c 20 70 72 65 75 70 64 61 74 65 2c 20 70 72 6f  , preupdate, pro
06e0: 66 69 6c 65 2c 20 70 72 6f 67 72 65 73 73 2c 20  file, progress, 
06f0: 72 65 6b 65 79 2c 20 72 65 73 74 6f 72 65 2c 20  rekey, restore, 
0700: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 2c 20 73  rollback_hook, s
0710: 65 72 69 61 6c 69 7a 65 2c 20 73 74 61 74 75 73  erialize, status
0720: 2c 20 74 69 6d 65 6f 75 74 2c 20 74 6f 74 61 6c  , timeout, total
0730: 5f 63 68 61 6e 67 65 73 2c 20 74 72 61 63 65 2c  _changes, trace,
0740: 20 74 72 61 63 65 5f 76 32 2c 20 74 72 61 6e 73   trace_v2, trans
0750: 61 63 74 69 6f 6e 2c 20 75 6e 6c 6f 63 6b 5f 6e  action, unlock_n
0760: 6f 74 69 66 79 2c 20 75 70 64 61 74 65 5f 68 6f  otify, update_ho
0770: 6f 6b 2c 20 76 65 72 73 69 6f 6e 2c 20 6f 72 20  ok, version, or 
0780: 77 61 6c 5f 68 6f 6f 6b 7d 7d 0a 64 6f 5f 74 65  wal_hook}}.do_te
0790: 73 74 20 74 63 6c 2d 31 2e 32 2e 31 20 7b 0a 20  st tcl-1.2.1 {. 
07a0: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64   set v [catch {d
07b0: 62 20 63 61 63 68 65 20 62 6f 67 75 73 7d 20 6d  b cache bogus} m
07c0: 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20  sg].  lappend v 
07d0: 24 6d 73 67 0a 7d 20 7b 31 20 7b 62 61 64 20 6f  $msg.} {1 {bad o
07e0: 70 74 69 6f 6e 20 22 62 6f 67 75 73 22 3a 20 6d  ption "bogus": m
07f0: 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20  ust be flush or 
0800: 73 69 7a 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  size}}.do_test t
0810: 63 6c 2d 31 2e 32 2e 32 20 7b 0a 20 20 73 65 74  cl-1.2.2 {.  set
0820: 20 76 20 5b 63 61 74 63 68 20 7b 64 62 20 63 61   v [catch {db ca
0830: 63 68 65 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70  che} msg].  lapp
0840: 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20  end v $msg.} {1 
0850: 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  {wrong # args: s
0860: 68 6f 75 6c 64 20 62 65 20 22 64 62 20 63 61 63  hould be "db cac
0870: 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22  he option ?arg?"
0880: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31  }}.do_test tcl-1
0890: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
08a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
08b0: 61 20 69 6e 74 2c 20 62 20 69 6e 74 29 7d 0a 20  a int, b int)}. 
08c0: 20 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54   execsql {INSERT
08d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
08e0: 31 30 2c 32 30 29 7d 0a 20 20 73 65 74 20 76 20  10,20)}.  set v 
08f0: 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 64 62 20  [catch {.    db 
0900: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  eval {SELECT * F
0910: 52 4f 4d 20 74 31 7d 20 64 61 74 61 20 7b 0a 20  ROM t1} data {. 
0920: 20 20 20 20 20 65 72 72 6f 72 20 22 54 68 65 20       error "The 
0930: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 22 0a 20  error message". 
0940: 20 20 20 7d 0a 20 20 7d 20 6d 73 67 5d 0a 20 20     }.  } msg].  
0950: 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d  lappend v $msg.}
0960: 20 7b 31 20 7b 54 68 65 20 65 72 72 6f 72 20 6d   {1 {The error m
0970: 65 73 73 61 67 65 7d 7d 0a 64 6f 5f 74 65 73 74  essage}}.do_test
0980: 20 74 63 6c 2d 31 2e 34 20 7b 0a 20 20 73 65 74   tcl-1.4 {.  set
0990: 20 76 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20   v [catch {.    
09a0: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
09b0: 2a 20 46 52 4f 4d 20 74 32 7d 20 64 61 74 61 20  * FROM t2} data 
09c0: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 22 54  {.      error "T
09d0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
09e0: 22 0a 20 20 20 20 7d 0a 20 20 7d 20 6d 73 67 5d  ".    }.  } msg]
09f0: 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73  .  lappend v $ms
0a00: 67 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  g.} {1 {no such 
0a10: 74 61 62 6c 65 3a 20 74 32 7d 7d 0a 64 6f 5f 74  table: t2}}.do_t
0a20: 65 73 74 20 74 63 6c 2d 31 2e 35 20 7b 0a 20 20  est tcl-1.5 {.  
0a30: 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 0a 20  set v [catch {. 
0a40: 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45     db eval {SELE
0a50: 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 64 61  CT * FROM t1} da
0a60: 74 61 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  ta {.      break
0a70: 0a 20 20 20 20 7d 0a 20 20 7d 20 6d 73 67 5d 0a  .    }.  } msg].
0a80: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
0a90: 0a 7d 20 7b 30 20 7b 7d 7d 0a 63 61 74 63 68 20  .} {0 {}}.catch 
0aa0: 7b 65 78 70 72 20 78 2a 7d 20 6d 73 67 0a 64 6f  {expr x*} msg.do
0ab0: 5f 74 65 73 74 20 74 63 6c 2d 31 2e 36 20 7b 0a  _test tcl-1.6 {.
0ac0: 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b    set v [catch {
0ad0: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45  .    db eval {SE
0ae0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20  LECT * FROM t1} 
0af0: 64 61 74 61 20 7b 0a 20 20 20 20 20 20 65 78 70  data {.      exp
0b00: 72 20 78 2a 0a 20 20 20 20 7d 0a 20 20 7d 20 6d  r x*.    }.  } m
0b10: 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20  sg].  lappend v 
0b20: 24 6d 73 67 0a 7d 20 5b 6c 69 73 74 20 31 20 24  $msg.} [list 1 $
0b30: 6d 73 67 5d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  msg].do_test tcl
0b40: 2d 31 2e 37 20 7b 0a 20 20 73 65 74 20 76 20 5b  -1.7 {.  set v [
0b50: 63 61 74 63 68 20 7b 64 62 7d 20 6d 73 67 5d 0a  catch {db} msg].
0b60: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
0b70: 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61  .} {1 {wrong # a
0b80: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22  rgs: should be "
0b90: 64 62 20 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e  db SUBCOMMAND ..
0ba0: 2e 22 7d 7d 0a 69 66 20 7b 5b 63 61 74 63 68 20  ."}}.if {[catch 
0bb0: 7b 64 62 20 61 75 74 68 20 7b 7d 7d 5d 3d 3d 30  {db auth {}}]==0
0bc0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74 63  } {.  do_test tc
0bd0: 6c 2d 31 2e 38 20 7b 0a 20 20 20 20 73 65 74 20  l-1.8 {.    set 
0be0: 76 20 5b 63 61 74 63 68 20 7b 64 62 20 61 75 74  v [catch {db aut
0bf0: 68 6f 72 69 7a 65 72 20 31 20 32 20 33 7d 20 6d  horizer 1 2 3} m
0c00: 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  sg].    lappend 
0c10: 76 20 24 6d 73 67 0a 20 20 7d 20 7b 31 20 7b 77  v $msg.  } {1 {w
0c20: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
0c30: 75 6c 64 20 62 65 20 22 64 62 20 61 75 74 68 6f  uld be "db autho
0c40: 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f  rizer ?CALLBACK?
0c50: 22 7d 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 63  "}}.}.do_test tc
0c60: 6c 2d 31 2e 39 20 7b 0a 20 20 73 65 74 20 76 20  l-1.9 {.  set v 
0c70: 5b 63 61 74 63 68 20 7b 64 62 20 62 75 73 79 20  [catch {db busy 
0c80: 31 20 32 20 33 7d 20 6d 73 67 5d 0a 20 20 6c 61  1 2 3} msg].  la
0c90: 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b  ppend v $msg.} {
0ca0: 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  1 {wrong # args:
0cb0: 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20 62   should be "db b
0cc0: 75 73 79 20 43 41 4c 4c 42 41 43 4b 22 7d 7d 0a  usy CALLBACK"}}.
0cd0: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 31 30  do_test tcl-1.10
0ce0: 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63   {.  set v [catc
0cf0: 68 20 7b 64 62 20 70 72 6f 67 72 65 73 73 20 31  h {db progress 1
0d00: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
0d10: 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72   v $msg.} {1 {wr
0d20: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
0d30: 6c 64 20 62 65 20 22 64 62 20 70 72 6f 67 72 65  ld be "db progre
0d40: 73 73 20 4e 20 43 41 4c 4c 42 41 43 4b 22 7d 7d  ss N CALLBACK"}}
0d50: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 31  .do_test tcl-1.1
0d60: 31 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74  1 {.  set v [cat
0d70: 63 68 20 7b 64 62 20 63 68 61 6e 67 65 73 20 78  ch {db changes x
0d80: 79 7a 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65  yz} msg].  lappe
0d90: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b  nd v $msg.} {1 {
0da0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
0db0: 6f 75 6c 64 20 62 65 20 22 64 62 20 63 68 61 6e  ould be "db chan
0dc0: 67 65 73 20 22 7d 7d 0a 64 6f 5f 74 65 73 74 20  ges "}}.do_test 
0dd0: 74 63 6c 2d 31 2e 31 32 20 7b 0a 20 20 73 65 74  tcl-1.12 {.  set
0de0: 20 76 20 5b 63 61 74 63 68 20 7b 64 62 20 63 6f   v [catch {db co
0df0: 6d 6d 69 74 5f 68 6f 6f 6b 20 61 20 62 20 63 7d  mmit_hook a b c}
0e00: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
0e10: 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f  v $msg.} {1 {wro
0e20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
0e30: 64 20 62 65 20 22 64 62 20 63 6f 6d 6d 69 74 5f  d be "db commit_
0e40: 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 22  hook ?CALLBACK?"
0e50: 7d 7d 0a 69 66 63 61 70 61 62 6c 65 20 7b 63 6f  }}.ifcapable {co
0e60: 6d 70 6c 65 74 65 7d 20 7b 0a 20 20 64 6f 5f 74  mplete} {.  do_t
0e70: 65 73 74 20 74 63 6c 2d 31 2e 31 33 20 7b 0a 20  est tcl-1.13 {. 
0e80: 20 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20     set v [catch 
0e90: 7b 64 62 20 63 6f 6d 70 6c 65 74 65 7d 20 6d 73  {db complete} ms
0ea0: 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 76  g].    lappend v
0eb0: 20 24 6d 73 67 0a 20 20 7d 20 7b 31 20 7b 77 72   $msg.  } {1 {wr
0ec0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
0ed0: 6c 64 20 62 65 20 22 64 62 20 63 6f 6d 70 6c 65  ld be "db comple
0ee0: 74 65 20 53 51 4c 22 7d 7d 0a 7d 0a 64 6f 5f 74  te SQL"}}.}.do_t
0ef0: 65 73 74 20 74 63 6c 2d 31 2e 31 34 20 7b 0a 20  est tcl-1.14 {. 
0f00: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64   set v [catch {d
0f10: 62 20 65 76 61 6c 7d 20 6d 73 67 5d 0a 20 20 6c  b eval} msg].  l
0f20: 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20  append v $msg.} 
0f30: 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73  {1 {wrong # args
0f40: 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20  : should be "db 
0f50: 65 76 61 6c 20 3f 4f 50 54 49 4f 4e 53 3f 20 53  eval ?OPTIONS? S
0f60: 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20  QL ?ARRAY-NAME? 
0f70: 3f 53 43 52 49 50 54 3f 22 7d 7d 0a 64 6f 5f 74  ?SCRIPT?"}}.do_t
0f80: 65 73 74 20 74 63 6c 2d 31 2e 31 35 20 7b 0a 20  est tcl-1.15 {. 
0f90: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64   set v [catch {d
0fa0: 62 20 66 75 6e 63 74 69 6f 6e 7d 20 6d 73 67 5d  b function} msg]
0fb0: 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73  .  lappend v $ms
0fc0: 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20  g.} {1 {wrong # 
0fd0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
0fe0: 22 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d  "db function NAM
0ff0: 45 20 3f 53 57 49 54 43 48 45 53 3f 20 53 43 52  E ?SWITCHES? SCR
1000: 49 50 54 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  IPT"}}.do_test t
1010: 63 6c 2d 31 2e 31 36 20 7b 0a 20 20 73 65 74 20  cl-1.16 {.  set 
1020: 76 20 5b 63 61 74 63 68 20 7b 64 62 20 6c 61 73  v [catch {db las
1030: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 78  t_insert_rowid x
1040: 79 7a 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65  yz} msg].  lappe
1050: 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b  nd v $msg.} {1 {
1060: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1070: 6f 75 6c 64 20 62 65 20 22 64 62 20 6c 61 73 74  ould be "db last
1080: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 22 7d  _insert_rowid "}
1090: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e  }.do_test tcl-1.
10a0: 31 37 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61  17 {.  set v [ca
10b0: 74 63 68 20 7b 64 62 20 72 65 6b 65 79 7d 20 6d  tch {db rekey} m
10c0: 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76 20  sg].  lappend v 
10d0: 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67  $msg.} {1 {wrong
10e0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
10f0: 62 65 20 22 64 62 20 72 65 6b 65 79 20 4b 45 59  be "db rekey KEY
1100: 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d  "}}.do_test tcl-
1110: 31 2e 31 38 20 7b 0a 20 20 73 65 74 20 76 20 5b  1.18 {.  set v [
1120: 63 61 74 63 68 20 7b 64 62 20 74 69 6d 65 6f 75  catch {db timeou
1130: 74 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  t} msg].  lappen
1140: 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77  d v $msg.} {1 {w
1150: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1160: 75 6c 64 20 62 65 20 22 64 62 20 74 69 6d 65 6f  uld be "db timeo
1170: 75 74 20 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22  ut MILLISECONDS"
1180: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31  }}.do_test tcl-1
1190: 2e 31 39 20 7b 0a 20 20 73 65 74 20 76 20 5b 63  .19 {.  set v [c
11a0: 61 74 63 68 20 7b 64 62 20 63 6f 6c 6c 61 74 65  atch {db collate
11b0: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
11c0: 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72   v $msg.} {1 {wr
11d0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
11e0: 6c 64 20 62 65 20 22 64 62 20 63 6f 6c 6c 61 74  ld be "db collat
11f0: 65 20 4e 41 4d 45 20 53 43 52 49 50 54 22 7d 7d  e NAME SCRIPT"}}
1200: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 32  .do_test tcl-1.2
1210: 30 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74  0 {.  set v [cat
1220: 63 68 20 7b 64 62 20 63 6f 6c 6c 61 74 69 6f 6e  ch {db collation
1230: 5f 6e 65 65 64 65 64 7d 20 6d 73 67 5d 0a 20 20  _needed} msg].  
1240: 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d  lappend v $msg.}
1250: 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67   {1 {wrong # arg
1260: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62  s: should be "db
1270: 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65   collation_neede
1280: 64 20 53 43 52 49 50 54 22 7d 7d 0a 64 6f 5f 74  d SCRIPT"}}.do_t
1290: 65 73 74 20 74 63 6c 2d 31 2e 32 31 20 7b 0a 20  est tcl-1.21 {. 
12a0: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 64   set v [catch {d
12b0: 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20  b total_changes 
12c0: 78 79 7a 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70  xyz} msg].  lapp
12d0: 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20 7b 31 20  end v $msg.} {1 
12e0: 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  {wrong # args: s
12f0: 68 6f 75 6c 64 20 62 65 20 22 64 62 20 74 6f 74  hould be "db tot
1300: 61 6c 5f 63 68 61 6e 67 65 73 20 22 7d 7d 0a 64  al_changes "}}.d
1310: 6f 5f 74 65 73 74 20 74 63 6c 2d 31 2e 32 32 20  o_test tcl-1.22 
1320: 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63 68  {.  set v [catch
1330: 20 7b 64 62 20 63 6f 70 79 7d 20 6d 73 67 5d 0a   {db copy} msg].
1340: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
1350: 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61  .} {1 {wrong # a
1360: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22  rgs: should be "
1370: 64 62 20 63 6f 70 79 20 43 4f 4e 46 4c 49 43 54  db copy CONFLICT
1380: 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c 45  -ALGORITHM TABLE
1390: 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52   FILENAME ?SEPAR
13a0: 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43  ATOR? ?NULLINDIC
13b0: 41 54 4f 52 3f 22 7d 7d 0a 64 6f 5f 74 65 73 74  ATOR?"}}.do_test
13c0: 20 74 63 6c 2d 31 2e 32 33 20 7b 0a 20 20 73 65   tcl-1.23 {.  se
13d0: 74 20 76 20 5b 63 61 74 63 68 20 7b 73 71 6c 69  t v [catch {sqli
13e0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20  te3 db2 test.db 
13f0: 2d 76 66 73 20 6e 6f 73 75 63 68 76 66 73 7d 20  -vfs nosuchvfs} 
1400: 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 76  msg].  lappend v
1410: 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 6e 6f 20 73   $msg.} {1 {no s
1420: 75 63 68 20 76 66 73 3a 20 6e 6f 73 75 63 68 76  uch vfs: nosuchv
1430: 66 73 7d 7d 0a 0a 63 61 74 63 68 20 7b 75 6e 73  fs}}..catch {uns
1440: 65 74 20 3a 3a 72 65 73 75 6c 74 7d 0a 64 6f 5f  et ::result}.do_
1450: 74 65 73 74 20 74 63 6c 2d 32 2e 31 20 7b 0a 20  test tcl-2.1 {. 
1460: 20 65 78 65 63 73 71 6c 20 22 43 52 45 41 54 45   execsql "CREATE
1470: 20 54 41 42 4c 45 20 74 5c 75 30 31 32 33 78 28   TABLE t\u0123x(
1480: 61 20 69 6e 74 2c 20 62 5c 75 31 32 33 35 20 66  a int, b\u1235 f
1490: 6c 6f 61 74 29 22 0a 7d 20 7b 7d 0a 69 66 63 61  loat)".} {}.ifca
14a0: 70 61 62 6c 65 20 73 63 68 65 6d 61 5f 70 72 61  pable schema_pra
14b0: 67 6d 61 73 20 7b 0a 20 20 64 6f 5f 74 65 73 74  gmas {.  do_test
14c0: 20 74 63 6c 2d 32 2e 32 20 7b 0a 20 20 20 20 65   tcl-2.2 {.    e
14d0: 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 74  xecsql "PRAGMA t
14e0: 61 62 6c 65 5f 69 6e 66 6f 28 74 5c 75 30 31 32  able_info(t\u012
14f0: 33 78 29 22 0a 20 20 7d 20 22 30 20 61 20 69 6e  3x)".  } "0 a in
1500: 74 20 30 20 7b 7d 20 30 20 31 20 62 5c 75 31 32  t 0 {} 0 1 b\u12
1510: 33 35 20 66 6c 6f 61 74 20 30 20 7b 7d 20 30 22  35 float 0 {} 0"
1520: 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 32  .}.do_test tcl-2
1530: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 22  .3 {.  execsql "
1540: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 5c 75 30  INSERT INTO t\u0
1550: 31 32 33 78 20 56 41 4c 55 45 53 28 31 2c 32 2e  123x VALUES(1,2.
1560: 33 29 22 0a 20 20 64 62 20 65 76 61 6c 20 22 53  3)".  db eval "S
1570: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 5c 75  ELECT * FROM t\u
1580: 30 31 32 33 78 22 20 72 65 73 75 6c 74 20 62 72  0123x" result br
1590: 65 61 6b 0a 20 20 73 65 74 20 72 65 73 75 6c 74  eak.  set result
15a0: 28 2a 29 0a 7d 20 22 61 20 62 5c 75 31 32 33 35  (*).} "a b\u1235
15b0: 22 0a 0a 0a 23 20 54 65 73 74 20 74 68 65 20 6f  "...# Test the o
15c0: 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 0a  necolumn method.
15d0: 23 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 33 2e  #.do_test tcl-3.
15e0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
15f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1600: 74 31 20 53 45 4c 45 43 54 20 61 2a 32 2c 20 62  t1 SELECT a*2, b
1610: 2a 32 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *2 FROM t1;.    
1620: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1630: 45 4c 45 43 54 20 61 2a 32 2b 31 2c 20 62 2a 32  ELECT a*2+1, b*2
1640: 2b 31 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  +1 FROM t1;.    
1650: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1660: 45 4c 45 43 54 20 61 2a 32 2b 33 2c 20 62 2a 32  ELECT a*2+3, b*2
1670: 2b 33 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  +3 FROM t1;.  }.
1680: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
1690: 7b 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 7b 53  {db onecolumn {S
16a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
16b0: 4f 52 44 45 52 20 42 59 20 61 7d 7d 20 6d 73 67  ORDER BY a}} msg
16c0: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24  ].  lappend rc $
16d0: 6d 73 67 0a 7d 20 7b 30 20 31 30 7d 0a 64 6f 5f  msg.} {0 10}.do_
16e0: 74 65 73 74 20 74 63 6c 2d 33 2e 32 20 7b 0a 20  test tcl-3.2 {. 
16f0: 20 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 7b 53   db onecolumn {S
1700: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1710: 57 48 45 52 45 20 61 3c 30 7d 0a 7d 20 7b 7d 0a  WHERE a<0}.} {}.
1720: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 33 2e 33 20  do_test tcl-3.3 
1730: 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63  {.  set rc [catc
1740: 68 20 7b 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 7d  h {db onecolumn}
1750: 20 65 72 72 6d 73 67 5d 0a 20 20 6c 61 70 70 65   errmsg].  lappe
1760: 6e 64 20 72 63 20 24 65 72 72 6d 73 67 0a 7d 20  nd rc $errmsg.} 
1770: 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73  {1 {wrong # args
1780: 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 64 62 20  : should be "db 
1790: 6f 6e 65 63 6f 6c 75 6d 6e 20 53 51 4c 22 7d 7d  onecolumn SQL"}}
17a0: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 33 2e 34  .do_test tcl-3.4
17b0: 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74   {.  set rc [cat
17c0: 63 68 20 7b 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e  ch {db onecolumn
17d0: 20 7b 53 45 4c 45 43 54 20 62 6f 67 75 73 7d 7d   {SELECT bogus}}
17e0: 20 65 72 72 6d 73 67 5d 0a 20 20 6c 61 70 70 65   errmsg].  lappe
17f0: 6e 64 20 72 63 20 24 65 72 72 6d 73 67 0a 7d 20  nd rc $errmsg.} 
1800: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 63 6f 6c 75  {1 {no such colu
1810: 6d 6e 3a 20 62 6f 67 75 73 7d 7d 0a 69 66 63 61  mn: bogus}}.ifca
1820: 70 61 62 6c 65 20 7b 74 63 6c 76 61 72 7d 20 7b  pable {tclvar} {
1830: 0a 20 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 33  .  do_test tcl-3
1840: 2e 35 20 7b 0a 20 20 20 20 73 65 74 20 62 20 35  .5 {.    set b 5
1850: 30 0a 20 20 20 20 73 65 74 20 72 63 20 5b 63 61  0.    set rc [ca
1860: 74 63 68 20 7b 64 62 20 6f 6e 65 20 7b 53 45 4c  tch {db one {SEL
1870: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1880: 45 52 45 20 62 3e 24 62 7d 7d 20 6d 73 67 5d 0a  ERE b>$b}} msg].
1890: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24      lappend rc $
18a0: 6d 73 67 0a 20 20 7d 20 7b 30 20 34 31 7d 0a 20  msg.  } {0 41}. 
18b0: 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 33 2e 36   do_test tcl-3.6
18c0: 20 7b 0a 20 20 20 20 73 65 74 20 62 20 35 30 30   {.    set b 500
18d0: 0a 20 20 20 20 73 65 74 20 72 63 20 5b 63 61 74  .    set rc [cat
18e0: 63 68 20 7b 64 62 20 6f 6e 65 20 7b 53 45 4c 45  ch {db one {SELE
18f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1900: 52 45 20 62 3e 24 62 7d 7d 20 6d 73 67 5d 0a 20  RE b>$b}} msg]. 
1910: 20 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24 6d     lappend rc $m
1920: 73 67 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20  sg.  } {0 {}}.  
1930: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 33 2e 37 20  do_test tcl-3.7 
1940: 7b 0a 20 20 20 20 73 65 74 20 62 20 35 30 30 0a  {.    set b 500.
1950: 20 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63      set rc [catc
1960: 68 20 7b 64 62 20 6f 6e 65 20 7b 0a 20 20 20 20  h {db one {.    
1970: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1980: 20 56 41 4c 55 45 53 28 39 39 2c 35 31 30 29 3b   VALUES(99,510);
1990: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
19a0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3e  FROM t1 WHERE b>
19b0: 24 62 0a 20 20 20 20 7d 7d 20 6d 73 67 5d 0a 20  $b.    }} msg]. 
19c0: 20 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24 6d     lappend rc $m
19d0: 73 67 0a 20 20 7d 20 7b 30 20 39 39 7d 0a 7d 0a  sg.  } {0 99}.}.
19e0: 69 66 63 61 70 61 62 6c 65 20 7b 21 74 63 6c 76  ifcapable {!tclv
19f0: 61 72 7d 20 7b 0a 20 20 20 65 78 65 63 73 71 6c  ar} {.   execsql
1a00: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31   {INSERT INTO t1
1a10: 20 56 41 4c 55 45 53 28 39 39 2c 35 31 30 29 7d   VALUES(99,510)}
1a20: 0a 7d 0a 0a 23 20 54 75 72 6e 20 74 68 65 20 62  .}..# Turn the b
1a30: 75 73 79 20 68 61 6e 64 6c 65 72 20 6f 6e 20 61  usy handler on a
1a40: 6e 64 20 6f 66 66 0a 23 0a 64 6f 5f 74 65 73 74  nd off.#.do_test
1a50: 20 74 63 6c 2d 34 2e 31 20 7b 0a 20 20 70 72 6f   tcl-4.1 {.  pro
1a60: 63 20 62 75 73 79 5f 63 61 6c 6c 62 61 63 6b 20  c busy_callback 
1a70: 7b 63 6e 74 7d 20 7b 0a 20 20 20 20 62 72 65 61  {cnt} {.    brea
1a80: 6b 0a 20 20 7d 0a 20 20 64 62 20 62 75 73 79 20  k.  }.  db busy 
1a90: 62 75 73 79 5f 63 61 6c 6c 62 61 63 6b 0a 20 20  busy_callback.  
1aa0: 64 62 20 62 75 73 79 0a 7d 20 7b 62 75 73 79 5f  db busy.} {busy_
1ab0: 63 61 6c 6c 62 61 63 6b 7d 0a 64 6f 5f 74 65 73  callback}.do_tes
1ac0: 74 20 74 63 6c 2d 34 2e 32 20 7b 0a 20 20 64 62  t tcl-4.2 {.  db
1ad0: 20 62 75 73 79 20 7b 7d 0a 20 20 64 62 20 62 75   busy {}.  db bu
1ae0: 73 79 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62  sy.} {}..ifcapab
1af0: 6c 65 20 7b 74 63 6c 76 61 72 7d 20 7b 0a 20 20  le {tclvar} {.  
1b00: 23 20 50 61 72 73 69 6e 67 20 6f 66 20 54 43 4c  # Parsing of TCL
1b10: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 20   variable names 
1b20: 77 69 74 68 69 6e 20 53 51 4c 20 69 6e 74 6f 20  within SQL into 
1b30: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73  bound parameters
1b40: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
1b50: 74 63 6c 2d 35 2e 31 20 7b 0a 20 20 20 20 65 78  tcl-5.1 {.    ex
1b60: 65 63 73 71 6c 20 7b 43 52 45 41 54 45 20 54 41  ecsql {CREATE TA
1b70: 42 4c 45 20 74 33 28 61 2c 62 2c 63 29 7d 0a 20  BLE t3(a,b,c)}. 
1b80: 20 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20     catch {unset 
1b90: 78 7d 0a 20 20 20 20 73 65 74 20 78 28 31 29 20  x}.    set x(1) 
1ba0: 41 0a 20 20 20 20 73 65 74 20 78 28 32 29 20 42  A.    set x(2) B
1bb0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
1bc0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1bd0: 20 74 33 20 56 41 4c 55 45 53 28 24 3a 3a 78 28   t3 VALUES($::x(
1be0: 31 29 2c 24 3a 3a 78 28 32 29 2c 24 3a 3a 78 28  1),$::x(2),$::x(
1bf0: 33 29 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  3));.      SELEC
1c00: 54 20 2a 20 46 52 4f 4d 20 74 33 0a 20 20 20 20  T * FROM t3.    
1c10: 7d 0a 20 20 7d 20 7b 41 20 42 20 7b 7d 7d 0a 20  }.  } {A B {}}. 
1c20: 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 35 2e 32   do_test tcl-5.2
1c30: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
1c40: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 79  .      SELECT ty
1c50: 70 65 6f 66 28 61 29 2c 20 74 79 70 65 6f 66 28  peof(a), typeof(
1c60: 62 29 2c 20 74 79 70 65 6f 66 28 63 29 20 46 52  b), typeof(c) FR
1c70: 4f 4d 20 74 33 0a 20 20 20 20 7d 0a 20 20 7d 20  OM t3.    }.  } 
1c80: 7b 74 65 78 74 20 74 65 78 74 20 6e 75 6c 6c 7d  {text text null}
1c90: 0a 20 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 35  .  do_test tcl-5
1ca0: 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b  .3 {.    catch {
1cb0: 75 6e 73 65 74 20 78 7d 0a 20 20 20 20 73 65 74  unset x}.    set
1cc0: 20 78 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61   x [binary forma
1cd0: 74 20 68 31 32 20 36 38 36 39 30 30 36 38 36 66  t h12 686900686f
1ce0: 30 30 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  00].    execsql 
1cf0: 7b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  {.      UPDATE t
1d00: 33 20 53 45 54 20 61 3d 24 3a 3a 78 3b 0a 20 20  3 SET a=$::x;.  
1d10: 20 20 7d 0a 20 20 20 20 64 62 20 65 76 61 6c 20    }.    db eval 
1d20: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61  {.      SELECT a
1d30: 20 46 52 4f 4d 20 74 33 0a 20 20 20 20 7d 20 62   FROM t3.    } b
1d40: 72 65 61 6b 0a 20 20 20 20 62 69 6e 61 72 79 20  reak.    binary 
1d50: 73 63 61 6e 20 24 61 20 68 31 32 20 61 64 61 74  scan $a h12 adat
1d60: 61 0a 20 20 20 20 73 65 74 20 61 64 61 74 61 0a  a.    set adata.
1d70: 20 20 7d 20 7b 36 38 36 39 30 30 36 38 36 66 30    } {686900686f0
1d80: 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 63 6c  0}.  do_test tcl
1d90: 2d 35 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  -5.4 {.    execs
1da0: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
1db0: 54 20 74 79 70 65 6f 66 28 61 29 2c 20 74 79 70  T typeof(a), typ
1dc0: 65 6f 66 28 62 29 2c 20 74 79 70 65 6f 66 28 63  eof(b), typeof(c
1dd0: 29 20 46 52 4f 4d 20 74 33 0a 20 20 20 20 7d 0a  ) FROM t3.    }.
1de0: 20 20 7d 20 7b 62 6c 6f 62 20 74 65 78 74 20 6e    } {blob text n
1df0: 75 6c 6c 7d 0a 7d 0a 0a 23 20 4f 70 65 72 61 74  ull}.}..# Operat
1e00: 69 6f 6e 20 6f 66 20 22 62 72 65 61 6b 22 20 61  ion of "break" a
1e10: 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 77 69  nd "continue" wi
1e20: 74 68 69 6e 20 72 6f 77 20 73 63 72 69 70 74 73  thin row scripts
1e30: 0a 23 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 36  .#.do_test tcl-6
1e40: 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  .1 {.  db eval {
1e50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1e60: 7d 20 7b 0a 20 20 20 20 62 72 65 61 6b 0a 20 20  } {.    break.  
1e70: 7d 0a 20 20 6c 61 70 70 65 6e 64 20 61 20 24 62  }.  lappend a $b
1e80: 0a 7d 20 7b 31 30 20 32 30 7d 0a 64 6f 5f 74 65  .} {10 20}.do_te
1e90: 73 74 20 74 63 6c 2d 36 2e 32 20 7b 0a 20 20 73  st tcl-6.2 {.  s
1ea0: 65 74 20 63 6e 74 20 30 0a 20 20 64 62 20 65 76  et cnt 0.  db ev
1eb0: 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  al {SELECT * FRO
1ec0: 4d 20 74 31 7d 20 7b 0a 20 20 20 20 69 66 20 7b  M t1} {.    if {
1ed0: 24 61 3e 34 30 7d 20 63 6f 6e 74 69 6e 75 65 0a  $a>40} continue.
1ee0: 20 20 20 20 69 6e 63 72 20 63 6e 74 0a 20 20 7d      incr cnt.  }
1ef0: 0a 20 20 73 65 74 20 63 6e 74 0a 7d 20 7b 34 7d  .  set cnt.} {4}
1f00: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 36 2e 33  .do_test tcl-6.3
1f10: 20 7b 0a 20 20 73 65 74 20 63 6e 74 20 30 0a 20   {.  set cnt 0. 
1f20: 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54   db eval {SELECT
1f30: 20 2a 20 46 52 4f 4d 20 74 31 7d 20 7b 0a 20 20   * FROM t1} {.  
1f40: 20 20 69 66 20 7b 24 61 3c 34 30 7d 20 63 6f 6e    if {$a<40} con
1f50: 74 69 6e 75 65 0a 20 20 20 20 69 6e 63 72 20 63  tinue.    incr c
1f60: 6e 74 0a 20 20 7d 0a 20 20 73 65 74 20 63 6e 74  nt.  }.  set cnt
1f70: 0a 7d 20 7b 35 7d 0a 64 6f 5f 74 65 73 74 20 74  .} {5}.do_test t
1f80: 63 6c 2d 36 2e 34 20 7b 0a 20 20 70 72 6f 63 20  cl-6.4 {.  proc 
1f90: 72 65 74 75 72 6e 5f 74 65 73 74 20 7b 78 7d 20  return_test {x} 
1fa0: 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53  {.    db eval {S
1fb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d  ELECT * FROM t1}
1fc0: 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24 61 3d   {.      if {$a=
1fd0: 3d 24 78 7d 20 7b 72 65 74 75 72 6e 20 24 62 7d  =$x} {return $b}
1fe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ff0: 75 72 6e 5f 74 65 73 74 20 31 30 0a 7d 20 32 30  urn_test 10.} 20
2000: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 36 2e 35  .do_test tcl-6.5
2010: 20 7b 0a 20 20 72 65 74 75 72 6e 5f 74 65 73 74   {.  return_test
2020: 20 32 30 0a 7d 20 34 30 0a 64 6f 5f 74 65 73 74   20.} 40.do_test
2030: 20 74 63 6c 2d 36 2e 36 20 7b 0a 20 20 72 65 74   tcl-6.6 {.  ret
2040: 75 72 6e 5f 74 65 73 74 20 39 39 0a 7d 20 35 31  urn_test 99.} 51
2050: 30 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 36 2e  0.do_test tcl-6.
2060: 37 20 7b 0a 20 20 72 65 74 75 72 6e 5f 74 65 73  7 {.  return_tes
2070: 74 20 30 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  t 0.} {}..do_tes
2080: 74 20 74 63 6c 2d 37 2e 31 20 7b 0a 20 20 64 62  t tcl-7.1 {.  db
2090: 20 76 65 72 73 69 6f 6e 0a 20 20 65 78 70 72 20   version.  expr 
20a0: 30 0a 7d 20 7b 30 7d 0a 0a 23 20 6d 6f 64 69 66  0.} {0}..# modif
20b0: 79 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  y and reset the 
20c0: 4e 55 4c 4c 20 72 65 70 72 65 73 65 6e 74 61 74  NULL representat
20d0: 69 6f 6e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 63  ion.#.do_test tc
20e0: 6c 2d 38 2e 31 20 7b 0a 20 20 64 62 20 6e 75 6c  l-8.1 {.  db nul
20f0: 6c 76 61 6c 75 65 20 4e 61 4e 0a 20 20 65 78 65  lvalue NaN.  exe
2100: 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54  csql {INSERT INT
2110: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 30 2c 4e  O t1 VALUES(30,N
2120: 55 4c 4c 29 7d 0a 20 20 64 62 20 65 76 61 6c 20  ULL)}.  db eval 
2130: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
2140: 31 20 57 48 45 52 45 20 62 20 49 53 20 4e 55 4c  1 WHERE b IS NUL
2150: 4c 7d 0a 7d 20 7b 33 30 20 4e 61 4e 7d 0a 70 72  L}.} {30 NaN}.pr
2160: 6f 63 20 63 6f 6e 63 61 74 46 75 6e 63 20 61 72  oc concatFunc ar
2170: 67 73 20 7b 72 65 74 75 72 6e 20 5b 6a 6f 69 6e  gs {return [join
2180: 20 24 61 72 67 73 20 7b 7d 5d 7d 0a 64 6f 5f 74   $args {}]}.do_t
2190: 65 73 74 20 74 63 6c 2d 38 2e 32 20 7b 0a 20 20  est tcl-8.2 {.  
21a0: 64 62 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 63  db function conc
21b0: 61 74 20 63 6f 6e 63 61 74 46 75 6e 63 0a 20 20  at concatFunc.  
21c0: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
21d0: 63 6f 6e 63 61 74 28 27 61 27 2c 20 62 2c 20 27  concat('a', b, '
21e0: 7a 27 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  z') FROM t1 WHER
21f0: 45 20 62 20 69 73 20 4e 55 4c 4c 7d 0a 7d 20 7b  E b is NULL}.} {
2200: 61 4e 61 4e 7a 7d 0a 64 6f 5f 74 65 73 74 20 74  aNaNz}.do_test t
2210: 63 6c 2d 38 2e 33 20 7b 0a 20 20 64 62 20 6e 75  cl-8.3 {.  db nu
2220: 6c 6c 76 61 6c 75 65 20 4e 55 4c 4c 0a 20 20 64  llvalue NULL.  d
2230: 62 20 6e 75 6c 6c 76 61 6c 75 65 0a 7d 20 7b 4e  b nullvalue.} {N
2240: 55 4c 4c 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  ULL}.do_test tcl
2250: 2d 38 2e 34 20 7b 0a 20 20 64 62 20 6e 75 6c 6c  -8.4 {.  db null
2260: 76 61 6c 75 65 20 7b 7d 0a 20 20 64 62 20 65 76  value {}.  db ev
2270: 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  al {SELECT * FRO
2280: 4d 20 74 31 20 57 48 45 52 45 20 62 20 49 53 20  M t1 WHERE b IS 
2290: 4e 55 4c 4c 7d 0a 7d 20 7b 33 30 20 7b 7d 7d 0a  NULL}.} {30 {}}.
22a0: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 38 2e 35 20  do_test tcl-8.5 
22b0: 7b 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20  {.  db function 
22c0: 63 6f 6e 63 61 74 20 63 6f 6e 63 61 74 46 75 6e  concat concatFun
22d0: 63 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c  c.  db eval {SEL
22e0: 45 43 54 20 63 6f 6e 63 61 74 28 27 61 27 2c 20  ECT concat('a', 
22f0: 62 2c 20 27 7a 27 29 20 46 52 4f 4d 20 74 31 20  b, 'z') FROM t1 
2300: 57 48 45 52 45 20 62 20 69 73 20 4e 55 4c 4c 7d  WHERE b is NULL}
2310: 0a 7d 20 7b 61 7a 7d 0a 0a 23 20 54 65 73 74 20  .} {az}..# Test 
2320: 74 68 65 20 72 65 74 75 72 6e 20 74 79 70 65 20  the return type 
2330: 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
2340: 66 75 6e 63 74 69 6f 6e 73 0a 23 0a 64 6f 5f 74  functions.#.do_t
2350: 65 73 74 20 74 63 6c 2d 39 2e 31 20 7b 0a 20 20  est tcl-9.1 {.  
2360: 64 62 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 5f  db function ret_
2370: 73 74 72 20 7b 72 65 74 75 72 6e 20 22 68 69 22  str {return "hi"
2380: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  }.  execsql {SEL
2390: 45 43 54 20 74 79 70 65 6f 66 28 72 65 74 5f 73  ECT typeof(ret_s
23a0: 74 72 28 29 29 7d 0a 7d 20 7b 74 65 78 74 7d 0a  tr())}.} {text}.
23b0: 64 6f 5f 74 65 73 74 20 74 63 6c 2d 39 2e 32 20  do_test tcl-9.2 
23c0: 7b 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20  {.  db function 
23d0: 72 65 74 5f 64 62 6c 20 7b 72 65 74 75 72 6e 20  ret_dbl {return 
23e0: 5b 65 78 70 72 20 7b 72 61 6e 64 28 29 2a 30 2e  [expr {rand()*0.
23f0: 35 7d 5d 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  5}]}.  execsql {
2400: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 72 65  SELECT typeof(re
2410: 74 5f 64 62 6c 28 29 29 7d 0a 7d 20 7b 72 65 61  t_dbl())}.} {rea
2420: 6c 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 39  l}.do_test tcl-9
2430: 2e 33 20 7b 0a 20 20 64 62 20 66 75 6e 63 74 69  .3 {.  db functi
2440: 6f 6e 20 72 65 74 5f 69 6e 74 20 7b 72 65 74 75  on ret_int {retu
2450: 72 6e 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61  rn [expr {int(ra
2460: 6e 64 28 29 2a 32 30 30 29 7d 5d 7d 0a 20 20 65  nd()*200)}]}.  e
2470: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74  xecsql {SELECT t
2480: 79 70 65 6f 66 28 72 65 74 5f 69 6e 74 28 29 29  ypeof(ret_int())
2490: 7d 0a 7d 20 7b 69 6e 74 65 67 65 72 7d 0a 0a 23  }.} {integer}..#
24a0: 20 52 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   Recursive calls
24b0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 75 73 65   to the same use
24c0: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
24d0: 6f 6e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 74  on.#.ifcapable t
24e0: 63 6c 76 61 72 20 7b 0a 20 20 64 6f 5f 74 65 73  clvar {.  do_tes
24f0: 74 20 74 63 6c 2d 39 2e 31 30 20 7b 0a 20 20 20  t tcl-9.10 {.   
2500: 20 70 72 6f 63 20 75 73 65 72 66 75 6e 63 5f 72   proc userfunc_r
2510: 31 20 7b 6e 7d 20 7b 0a 20 20 20 20 20 20 69 66  1 {n} {.      if
2520: 20 7b 24 6e 3c 3d 30 7d 20 7b 72 65 74 75 72 6e   {$n<=0} {return
2530: 20 30 7d 0a 20 20 20 20 20 20 73 65 74 20 6e 6d   0}.      set nm
2540: 31 20 5b 65 78 70 72 20 7b 24 6e 2d 31 7d 5d 0a  1 [expr {$n-1}].
2550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
2560: 70 72 20 7b 5b 64 62 20 65 76 61 6c 20 7b 53 45  pr {[db eval {SE
2570: 4c 45 43 54 20 72 31 28 24 6e 6d 31 29 7d 5d 2b  LECT r1($nm1)}]+
2580: 24 6e 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20 64  $n}].    }.    d
2590: 62 20 66 75 6e 63 74 69 6f 6e 20 72 31 20 75 73  b function r1 us
25a0: 65 72 66 75 6e 63 5f 72 31 0a 20 20 20 20 65 78  erfunc_r1.    ex
25b0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 31  ecsql {SELECT r1
25c0: 28 31 30 29 7d 0a 20 20 7d 20 7b 35 35 7d 0a 20  (10)}.  } {55}. 
25d0: 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d 39 2e 31   do_test tcl-9.1
25e0: 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  1 {.    execsql 
25f0: 7b 53 45 4c 45 43 54 20 72 31 28 31 30 30 29 7d  {SELECT r1(100)}
2600: 0a 20 20 7d 20 7b 35 30 35 30 7d 0a 7d 0a 0a 23  .  } {5050}.}..#
2610: 20 54 65 73 74 73 20 66 6f 72 20 74 68 65 20 6e   Tests for the n
2620: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ew transaction m
2630: 65 74 68 6f 64 0a 23 0a 64 6f 5f 74 65 73 74 20  ethod.#.do_test 
2640: 74 63 6c 2d 31 30 2e 31 20 7b 0a 20 20 64 62 20  tcl-10.1 {.  db 
2650: 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 7d 0a 7d  transaction {}.}
2660: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d   {}.do_test tcl-
2670: 31 30 2e 32 20 7b 0a 20 20 64 62 20 74 72 61 6e  10.2 {.  db tran
2680: 73 61 63 74 69 6f 6e 20 64 65 66 65 72 72 65 64  saction deferred
2690: 20 7b 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74   {}.} {}.do_test
26a0: 20 74 63 6c 2d 31 30 2e 33 20 7b 0a 20 20 64 62   tcl-10.3 {.  db
26b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 6d   transaction imm
26c0: 65 64 69 61 74 65 20 7b 7d 0a 7d 20 7b 7d 0a 64  ediate {}.} {}.d
26d0: 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e 34 20  o_test tcl-10.4 
26e0: 7b 0a 20 20 64 62 20 74 72 61 6e 73 61 63 74 69  {.  db transacti
26f0: 6f 6e 20 65 78 63 6c 75 73 69 76 65 20 7b 7d 0a  on exclusive {}.
2700: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c  } {}.do_test tcl
2710: 2d 31 30 2e 35 20 7b 0a 20 20 73 65 74 20 72 63  -10.5 {.  set rc
2720: 20 5b 63 61 74 63 68 20 7b 64 62 20 74 72 61 6e   [catch {db tran
2730: 73 61 63 74 69 6f 6e 20 78 79 7a 7a 79 20 7b 7d  saction xyzzy {}
2740: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
2750: 20 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 62   rc $msg.} {1 {b
2760: 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ad transaction t
2770: 79 70 65 20 22 78 79 7a 7a 79 22 3a 20 6d 75 73  ype "xyzzy": mus
2780: 74 20 62 65 20 64 65 66 65 72 72 65 64 2c 20 65  t be deferred, e
2790: 78 63 6c 75 73 69 76 65 2c 20 6f 72 20 69 6d 6d  xclusive, or imm
27a0: 65 64 69 61 74 65 7d 7d 0a 64 6f 5f 74 65 73 74  ediate}}.do_test
27b0: 20 74 63 6c 2d 31 30 2e 36 20 7b 0a 20 20 73 65   tcl-10.6 {.  se
27c0: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 64 62 20  t rc [catch {db 
27d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 65 72 72  transaction {err
27e0: 6f 72 20 74 65 73 74 2d 65 72 72 6f 72 7d 7d 20  or test-error}} 
27f0: 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72  msg].  lappend r
2800: 63 20 24 6d 73 67 0a 7d 20 7b 31 20 74 65 73 74  c $msg.} {1 test
2810: 2d 65 72 72 6f 72 7d 0a 64 6f 5f 74 65 73 74 20  -error}.do_test 
2820: 74 63 6c 2d 31 30 2e 37 20 7b 0a 20 20 64 62 20  tcl-10.7 {.  db 
2830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20  transaction {.  
2840: 20 20 64 62 20 65 76 61 6c 20 7b 43 52 45 41 54    db eval {CREAT
2850: 45 20 54 41 42 4c 45 20 74 34 28 78 29 7d 0a 20  E TABLE t4(x)}. 
2860: 20 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f     db transactio
2870: 6e 20 7b 0a 20 20 20 20 20 20 64 62 20 65 76 61  n {.      db eva
2880: 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l {INSERT INTO t
2890: 34 20 56 41 4c 55 45 53 28 31 29 7d 0a 20 20 20  4 VALUES(1)}.   
28a0: 20 7d 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c   }.  }.  db eval
28b0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
28c0: 74 34 7d 0a 7d 20 31 0a 64 6f 5f 74 65 73 74 20  t4}.} 1.do_test 
28d0: 74 63 6c 2d 31 30 2e 38 20 7b 0a 20 20 63 61 74  tcl-10.8 {.  cat
28e0: 63 68 20 7b 0a 20 20 20 20 64 62 20 74 72 61 6e  ch {.    db tran
28f0: 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20  saction {.      
2900: 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20  db eval {INSERT 
2910: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 32  INTO t4 VALUES(2
2920: 29 7d 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c  )}.      db eval
2930: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34   {INSERT INTO t4
2940: 20 56 41 4c 55 45 53 28 33 29 7d 0a 20 20 20 20   VALUES(3)}.    
2950: 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52    db eval {INSER
2960: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
2970: 28 34 29 7d 0a 20 20 20 20 20 20 65 72 72 6f 72  (4)}.      error
2980: 20 74 65 73 74 2d 65 72 72 6f 72 0a 20 20 20 20   test-error.    
2990: 7d 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20  }.  }.  db eval 
29a0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
29b0: 34 7d 0a 7d 20 31 0a 64 6f 5f 74 65 73 74 20 74  4}.} 1.do_test t
29c0: 63 6c 2d 31 30 2e 39 20 7b 0a 20 20 64 62 20 74  cl-10.9 {.  db t
29d0: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20  ransaction {.   
29e0: 20 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54   db eval {INSERT
29f0: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
2a00: 32 29 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 0a  2)}.    catch {.
2a10: 20 20 20 20 20 20 64 62 20 74 72 61 6e 73 61 63        db transac
2a20: 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 64  tion {.        d
2a30: 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49  b eval {INSERT I
2a40: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 33 29  NTO t4 VALUES(3)
2a50: 7d 0a 20 20 20 20 20 20 20 20 64 62 20 65 76 61  }.        db eva
2a60: 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l {INSERT INTO t
2a70: 34 20 56 41 4c 55 45 53 28 34 29 7d 0a 20 20 20  4 VALUES(4)}.   
2a80: 20 20 20 20 20 65 72 72 6f 72 20 74 65 73 74 2d       error test-
2a90: 65 72 72 6f 72 0a 20 20 20 20 20 20 7d 0a 20 20  error.      }.  
2aa0: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 20 65 76 61    }.  }.  db eva
2ab0: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
2ac0: 20 74 34 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f   t4}.} {1 2}.do_
2ad0: 74 65 73 74 20 74 63 6c 2d 31 30 2e 31 30 20 7b  test tcl-10.10 {
2ae0: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
2af0: 20 7b 24 69 3c 31 7d 20 7b 69 6e 63 72 20 69 7d   {$i<1} {incr i}
2b00: 20 7b 0a 20 20 20 20 64 62 20 74 72 61 6e 73 61   {.    db transa
2b10: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 64 62  ction {.      db
2b20: 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e   eval {INSERT IN
2b30: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 35 29 7d  TO t4 VALUES(5)}
2b40: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a  .      continue.
2b50: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 6f 72 20      }.    error 
2b60: 22 54 68 69 73 20 6c 69 6e 65 20 73 68 6f 75 6c  "This line shoul
2b70: 64 20 6e 6f 74 20 62 65 20 72 75 6e 22 0a 20 20  d not be run".  
2b80: 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c  }.  db eval {SEL
2b90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d  ECT * FROM t4}.}
2ba0: 20 7b 31 20 32 20 35 7d 0a 64 6f 5f 74 65 73 74   {1 2 5}.do_test
2bb0: 20 74 63 6c 2d 31 30 2e 31 31 20 7b 0a 20 20 66   tcl-10.11 {.  f
2bc0: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
2bd0: 3c 31 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  <10} {incr i} {.
2be0: 20 20 20 20 64 62 20 74 72 61 6e 73 61 63 74 69      db transacti
2bf0: 6f 6e 20 7b 0a 20 20 20 20 20 20 64 62 20 65 76  on {.      db ev
2c00: 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  al {INSERT INTO 
2c10: 74 34 20 56 41 4c 55 45 53 28 36 29 7d 0a 20 20  t4 VALUES(6)}.  
2c20: 20 20 20 20 62 72 65 61 6b 0a 20 20 20 20 7d 0a      break.    }.
2c30: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 53    }.  db eval {S
2c40: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 7d  ELECT * FROM t4}
2c50: 0a 7d 20 7b 31 20 32 20 35 20 36 7d 0a 64 6f 5f  .} {1 2 5 6}.do_
2c60: 74 65 73 74 20 74 63 6c 2d 31 30 2e 31 32 20 7b  test tcl-10.12 {
2c70: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
2c80: 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20   {.    for {set 
2c90: 69 20 30 7d 20 7b 24 69 3c 31 30 7d 20 7b 69 6e  i 0} {$i<10} {in
2ca0: 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 64 62  cr i} {.      db
2cb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20   transaction {. 
2cc0: 20 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b         db eval {
2cd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
2ce0: 41 4c 55 45 53 28 37 29 7d 0a 20 20 20 20 20 20  ALUES(7)}.      
2cf0: 20 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 7d    return.      }
2d00: 0a 20 20 20 20 7d 0a 20 20 7d 5d 0a 7d 20 7b 32  .    }.  }].} {2
2d10: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30  }.do_test tcl-10
2d20: 2e 31 33 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  .13 {.  db eval 
2d30: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
2d40: 34 7d 0a 7d 20 7b 31 20 32 20 35 20 36 20 37 7d  4}.} {1 2 5 6 7}
2d50: 0a 0a 23 20 4e 6f 77 20 74 65 73 74 20 74 68 61  ..# Now test tha
2d60: 74 20 5b 64 62 20 74 72 61 6e 73 61 63 74 69 6f  t [db transactio
2d70: 6e 5d 20 63 6f 6d 6d 61 6e 64 73 20 6d 61 79 20  n] commands may 
2d80: 62 65 20 6e 65 73 74 65 64 20 77 69 74 68 20 0a  be nested with .
2d90: 23 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72  # the expected r
2da0: 65 73 75 6c 74 73 2e 0a 23 0a 64 6f 5f 74 65 73  esults..#.do_tes
2db0: 74 20 74 63 6c 2d 31 30 2e 31 34 20 7b 0a 20 20  t tcl-10.14 {.  
2dc0: 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b  db transaction {
2dd0: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20  .    db eval {. 
2de0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
2df0: 20 74 34 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t4;.      INSER
2e00: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
2e10: 28 27 6f 6e 65 27 29 3b 0a 20 20 20 20 7d 0a 0a  ('one');.    }..
2e20: 20 20 20 20 63 61 74 63 68 20 7b 20 0a 20 20 20      catch { .   
2e30: 20 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f     db transactio
2e40: 6e 20 7b 0a 20 20 20 20 20 20 20 20 64 62 20 65  n {.        db e
2e50: 76 61 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  val { INSERT INT
2e60: 4f 20 74 34 20 56 41 4c 55 45 53 28 27 74 77 6f  O t4 VALUES('two
2e70: 27 29 20 7d 0a 20 20 20 20 20 20 20 20 64 62 20  ') }.        db 
2e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20  transaction {.  
2e90: 20 20 20 20 20 20 20 20 64 62 20 65 76 61 6c 20          db eval 
2ea0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34  { INSERT INTO t4
2eb0: 20 56 41 4c 55 45 53 28 27 74 68 72 65 65 27 29   VALUES('three')
2ec0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72   }.          err
2ed0: 6f 72 20 22 74 68 72 6f 77 20 61 6e 20 65 72 72  or "throw an err
2ee0: 6f 72 21 22 0a 20 20 20 20 20 20 20 20 7d 0a 20  or!".        }. 
2ef0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2f00: 0a 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c  ..  db eval {SEL
2f10: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d  ECT * FROM t4}.}
2f20: 20 7b 6f 6e 65 7d 0a 64 6f 5f 74 65 73 74 20 74   {one}.do_test t
2f30: 63 6c 2d 31 30 2e 31 35 20 7b 0a 20 20 23 20 4d  cl-10.15 {.  # M
2f40: 61 6b 65 20 73 75 72 65 20 61 20 74 72 61 6e 73  ake sure a trans
2f50: 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  action has not b
2f60: 65 65 6e 20 6c 65 66 74 20 6f 70 65 6e 2e 0a 20  een left open.. 
2f70: 20 64 62 20 65 76 61 6c 20 7b 42 45 47 49 4e 20   db eval {BEGIN 
2f80: 3b 20 43 4f 4d 4d 49 54 7d 0a 7d 20 7b 7d 0a 64  ; COMMIT}.} {}.d
2f90: 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e 31 36  o_test tcl-10.16
2fa0: 20 7b 0a 20 20 64 62 20 74 72 61 6e 73 61 63 74   {.  db transact
2fb0: 69 6f 6e 20 7b 0a 20 20 20 20 64 62 20 65 76 61  ion {.    db eva
2fc0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
2fd0: 74 34 20 56 41 4c 55 45 53 28 27 74 77 6f 27 29  t4 VALUES('two')
2fe0: 3b 20 7d 0a 20 20 20 20 64 62 20 74 72 61 6e 73  ; }.    db trans
2ff0: 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 64  action {.      d
3000: 62 20 65 76 61 6c 20 7b 20 49 4e 53 45 52 54 20  b eval { INSERT 
3010: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27  INTO t4 VALUES('
3020: 74 68 72 65 65 27 29 20 7d 0a 20 20 20 20 20 20  three') }.      
3030: 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b  db transaction {
3040: 0a 20 20 20 20 20 20 20 20 64 62 20 65 76 61 6c  .        db eval
3050: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3060: 34 20 56 41 4c 55 45 53 28 27 66 6f 75 72 27 29  4 VALUES('four')
3070: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3080: 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b  .  }.  db eval {
3090: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34  SELECT * FROM t4
30a0: 7d 0a 7d 20 7b 6f 6e 65 20 74 77 6f 20 74 68 72  }.} {one two thr
30b0: 65 65 20 66 6f 75 72 7d 0a 64 6f 5f 74 65 73 74  ee four}.do_test
30c0: 20 74 63 6c 2d 31 30 2e 31 37 20 7b 0a 20 20 63   tcl-10.17 {.  c
30d0: 61 74 63 68 20 7b 0a 20 20 20 20 64 62 20 74 72  atch {.    db tr
30e0: 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20  ansaction {.    
30f0: 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45    db eval { INSE
3100: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
3110: 53 28 27 41 27 29 3b 20 7d 0a 20 20 20 20 20 20  S('A'); }.      
3120: 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b  db transaction {
3130: 0a 20 20 20 20 20 20 20 20 64 62 20 65 76 61 6c  .        db eval
3140: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3150: 34 20 56 41 4c 55 45 53 28 27 42 27 29 20 7d 0a  4 VALUES('B') }.
3160: 20 20 20 20 20 20 20 20 64 62 20 74 72 61 6e 73          db trans
3170: 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20  action {.       
3180: 20 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53     db eval { INS
3190: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
31a0: 45 53 28 27 43 27 29 20 7d 0a 20 20 20 20 20 20  ES('C') }.      
31b0: 20 20 20 20 65 72 72 6f 72 20 22 74 68 72 6f 77      error "throw
31c0: 20 61 6e 20 65 72 72 6f 72 21 22 0a 20 20 20 20   an error!".    
31d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31e0: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 20 65 76 61    }.  }.  db eva
31f0: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
3200: 20 74 34 7d 0a 7d 20 7b 6f 6e 65 20 74 77 6f 20   t4}.} {one two 
3210: 74 68 72 65 65 20 66 6f 75 72 7d 0a 64 6f 5f 74  three four}.do_t
3220: 65 73 74 20 74 63 6c 2d 31 30 2e 31 38 20 7b 0a  est tcl-10.18 {.
3230: 20 20 23 20 4d 61 6b 65 20 73 75 72 65 20 61 20    # Make sure a 
3240: 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
3250: 6e 6f 74 20 62 65 65 6e 20 6c 65 66 74 20 6f 70  not been left op
3260: 65 6e 2e 0a 20 20 64 62 20 65 76 61 6c 20 7b 42  en..  db eval {B
3270: 45 47 49 4e 20 3b 20 43 4f 4d 4d 49 54 7d 0a 7d  EGIN ; COMMIT}.}
3280: 20 7b 7d 0a 0a 23 20 4d 65 73 73 20 75 70 20 61   {}..# Mess up a
3290: 20 5b 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e   [db transaction
32a0: 5d 20 63 6f 6d 6d 61 6e 64 20 62 79 20 6c 6f 63  ] command by loc
32b0: 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  king the databas
32c0: 65 20 75 73 69 6e 67 20 61 0a 23 20 73 65 63 6f  e using a.# seco
32d0: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 68  nd connection wh
32e0: 65 6e 20 69 74 20 74 72 69 65 73 20 74 6f 20 63  en it tries to c
32f0: 6f 6d 6d 69 74 2e 20 4d 61 6b 65 20 73 75 72 65  ommit. Make sure
3300: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
3310: 0a 23 20 69 73 20 6e 6f 74 20 73 74 69 6c 6c 20  .# is not still 
3320: 6f 70 65 6e 20 61 66 74 65 72 20 74 68 65 20 22  open after the "
3330: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
3340: 65 64 22 20 65 78 63 65 70 74 69 6f 6e 20 69 73  ed" exception is
3350: 20 74 68 72 6f 77 6e 2e 0a 23 0a 64 6f 5f 74 65   thrown..#.do_te
3360: 73 74 20 74 63 6c 2d 31 30 2e 31 38 20 7b 0a 20  st tcl-10.18 {. 
3370: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
3380: 74 2e 64 62 0a 20 20 64 62 32 20 65 76 61 6c 20  t.db.  db2 eval 
3390: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
33a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
33b0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
33c0: 7d 0a 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74  }..  set rc [cat
33d0: 63 68 20 7b 0a 20 20 20 20 64 62 20 74 72 61 6e  ch {.    db tran
33e0: 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20  saction {.      
33f0: 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20  db eval {INSERT 
3400: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27  INTO t4 VALUES('
3410: 66 69 76 65 27 29 7d 0a 20 20 20 20 7d 0a 20 20  five')}.    }.  
3420: 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24 72  } msg].  list $r
3430: 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 64 61 74  c $msg.} {1 {dat
3440: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
3450: 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30  }.do_test tcl-10
3460: 2e 31 39 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  .19 {.  db eval 
3470: 7b 42 45 47 49 4e 20 3b 20 43 4f 4d 4d 49 54 7d  {BEGIN ; COMMIT}
3480: 0a 7d 20 7b 7d 0a 0a 23 20 54 68 77 61 72 74 20  .} {}..# Thwart 
3490: 61 20 5b 64 62 20 74 72 61 6e 73 61 63 74 69 6f  a [db transactio
34a0: 6e 5d 20 63 6f 6d 6d 61 6e 64 20 62 79 20 6c 6f  n] command by lo
34b0: 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
34c0: 73 65 20 75 73 69 6e 67 20 61 0a 23 20 73 65 63  se using a.# sec
34d0: 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ond connection w
34e0: 69 74 68 20 22 42 45 47 49 4e 20 45 58 43 4c 55  ith "BEGIN EXCLU
34f0: 53 49 56 45 22 2e 20 4d 61 6b 65 20 73 75 72 65  SIVE". Make sure
3500: 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   no transaction 
3510: 69 73 20 0a 23 20 6f 70 65 6e 20 61 66 74 65 72  is .# open after
3520: 20 74 68 65 20 22 64 61 74 61 62 61 73 65 20 69   the "database i
3530: 73 20 6c 6f 63 6b 65 64 22 20 65 78 63 65 70 74  s locked" except
3540: 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 23  ion is thrown..#
3550: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 30 2e  .do_test tcl-10.
3560: 32 30 20 7b 0a 20 20 64 62 32 20 65 76 61 6c 20  20 {.  db2 eval 
3570: 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  {.    COMMIT;.  
3580: 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56    BEGIN EXCLUSIV
3590: 45 3b 0a 20 20 7d 0a 20 20 73 65 74 20 72 63 20  E;.  }.  set rc 
35a0: 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 64 62 20  [catch {.    db 
35b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20  transaction {.  
35c0: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53      db eval {INS
35d0: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
35e0: 45 53 28 27 66 69 76 65 27 29 7d 0a 20 20 20 20  ES('five')}.    
35f0: 7d 0a 20 20 7d 20 6d 73 67 5d 0a 20 20 6c 69 73  }.  } msg].  lis
3600: 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20  t $rc $msg.} {1 
3610: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
3620: 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 63  ked}}.do_test tc
3630: 6c 2d 31 30 2e 32 31 20 7b 0a 20 20 64 62 32 20  l-10.21 {.  db2 
3640: 63 6c 6f 73 65 0a 20 20 64 62 20 65 76 61 6c 20  close.  db eval 
3650: 7b 42 45 47 49 4e 20 3b 20 43 4f 4d 4d 49 54 7d  {BEGIN ; COMMIT}
3660: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 63  .} {}.do_test tc
3670: 6c 2d 31 30 2e 32 32 20 7b 0a 20 20 73 71 6c 69  l-10.22 {.  sqli
3680: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
3690: 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e    db transaction
36a0: 20 65 78 63 6c 75 73 69 76 65 20 7b 0a 20 20 20   exclusive {.   
36b0: 20 63 61 74 63 68 20 7b 20 64 62 32 20 65 76 61   catch { db2 eva
36c0: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
36d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 20   sqlite_master} 
36e0: 7d 20 6d 73 67 0a 20 20 20 20 73 65 74 20 6d 73  } msg.    set ms
36f0: 67 20 22 64 62 32 3a 20 24 6d 73 67 22 0a 20 20  g "db2: $msg".  
3700: 7d 0a 20 20 73 65 74 20 6d 73 67 0a 7d 20 7b 64  }.  set msg.} {d
3710: 62 32 3a 20 64 61 74 61 62 61 73 65 20 69 73 20  b2: database is 
3720: 6c 6f 63 6b 65 64 7d 0a 64 62 32 20 63 6c 6f 73  locked}.db2 clos
3730: 65 0a 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31  e..do_test tcl-1
3740: 31 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  1.1 {.  db eval 
3750: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20  {INSERT INTO t4 
3760: 56 41 4c 55 45 53 28 36 29 7d 0a 20 20 64 62 20  VALUES(6)}.  db 
3770: 65 78 69 73 74 73 20 7b 53 45 4c 45 43 54 20 78  exists {SELECT x
3780: 2c 78 2a 32 2c 78 2b 78 20 46 52 4f 4d 20 74 34  ,x*2,x+x FROM t4
3790: 20 57 48 45 52 45 20 78 3d 3d 36 7d 0a 7d 20 7b   WHERE x==6}.} {
37a0: 31 7d 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31  1}.do_test tcl-1
37b0: 31 2e 32 20 7b 0a 20 20 64 62 20 65 78 69 73 74  1.2 {.  db exist
37c0: 73 20 7b 53 45 4c 45 43 54 20 30 20 46 52 4f 4d  s {SELECT 0 FROM
37d0: 20 74 34 20 57 48 45 52 45 20 78 3d 3d 36 7d 0a   t4 WHERE x==6}.
37e0: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 74 63  } {1}.do_test tc
37f0: 6c 2d 31 31 2e 33 20 7b 0a 20 20 64 62 20 65 78  l-11.3 {.  db ex
3800: 69 73 74 73 20 7b 53 45 4c 45 43 54 20 31 20 46  ists {SELECT 1 F
3810: 52 4f 4d 20 74 34 20 57 48 45 52 45 20 78 3d 3d  ROM t4 WHERE x==
3820: 38 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74  8}.} {0}.do_test
3830: 20 74 63 6c 2d 31 31 2e 33 2e 31 20 7b 0a 20 20   tcl-11.3.1 {.  
3840: 74 63 6c 5f 6f 62 6a 70 72 6f 63 20 64 62 20 65  tcl_objproc db e
3850: 78 69 73 74 73 20 7b 53 45 4c 45 43 54 20 31 20  xists {SELECT 1 
3860: 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 78 3d  FROM t4 WHERE x=
3870: 3d 38 7d 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65  =8}.} {0}..do_te
3880: 73 74 20 74 63 6c 2d 31 32 2e 31 20 7b 0a 20 20  st tcl-12.1 {.  
3890: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
38a0: 6e 20 61 20 62 20 63 20 76 65 72 73 69 6f 6e 0a  n a b c version.
38b0: 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 5b 64    set version [d
38c0: 62 20 76 65 72 73 69 6f 6e 5d 0a 20 20 73 63 61  b version].  sca
38d0: 6e 20 24 76 65 72 73 69 6f 6e 20 22 25 64 2e 25  n $version "%d.%
38e0: 64 2e 25 64 22 20 61 20 62 20 63 0a 20 20 65 78  d.%d" a b c.  ex
38f0: 70 72 20 24 61 2a 31 30 30 30 30 30 30 20 2b 20  pr $a*1000000 + 
3900: 24 62 2a 31 30 30 30 20 2b 20 24 63 0a 7d 20 5b  $b*1000 + $c.} [
3910: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
3920: 6f 6e 5f 6e 75 6d 62 65 72 5d 0a 0a 0a 23 20 43  on_number]...# C
3930: 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
3940: 20 77 68 65 6e 20 62 69 6e 64 69 6e 67 73 20 6f   when bindings o
3950: 66 20 74 68 65 20 66 6f 72 6d 20 40 61 61 61 20  f the form @aaa 
3960: 61 72 65 20 75 73 65 64 20 69 6e 73 74 65 61 64  are used instead
3970: 0a 23 20 6f 66 20 24 61 61 61 2c 20 74 68 61 74  .# of $aaa, that
3980: 20 6f 62 6a 65 63 74 73 20 61 72 65 20 74 72 65   objects are tre
3990: 61 74 65 64 20 61 73 20 62 79 74 65 61 72 72 61  ated as bytearra
39a0: 79 20 61 6e 64 20 61 72 65 20 69 6e 73 65 72 74  y and are insert
39b0: 65 64 0a 23 20 61 73 20 42 4c 4f 42 73 2e 0a 23  ed.# as BLOBs..#
39c0: 0a 69 66 63 61 70 61 62 6c 65 20 74 63 6c 76 61  .ifcapable tclva
39d0: 72 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74 63  r {.  do_test tc
39e0: 6c 2d 31 33 2e 31 20 7b 0a 20 20 20 20 64 62 20  l-13.1 {.    db 
39f0: 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42  eval {CREATE TAB
3a00: 4c 45 20 74 35 28 78 20 42 4c 4f 42 29 7d 0a 20  LE t5(x BLOB)}. 
3a10: 20 20 20 73 65 74 20 78 20 61 62 63 31 32 33 0a     set x abc123.
3a20: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53      db eval {INS
3a30: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
3a40: 45 53 28 24 78 29 7d 0a 20 20 20 20 64 62 20 65  ES($x)}.    db e
3a50: 76 61 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65  val {SELECT type
3a60: 6f 66 28 78 29 20 46 52 4f 4d 20 74 35 7d 0a 20  of(x) FROM t5}. 
3a70: 20 7d 20 7b 74 65 78 74 7d 0a 20 20 64 6f 5f 74   } {text}.  do_t
3a80: 65 73 74 20 74 63 6c 2d 31 33 2e 32 20 7b 0a 20  est tcl-13.2 {. 
3a90: 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24     binary scan $
3aa0: 78 20 48 20 6e 6f 74 55 73 65 64 0a 20 20 20 20  x H notUsed.    
3ab0: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20  db eval {.      
3ac0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 35 3b 0a  DELETE FROM t5;.
3ad0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3ae0: 4f 20 74 35 20 56 41 4c 55 45 53 28 24 78 29 3b  O t5 VALUES($x);
3af0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 79  .      SELECT ty
3b00: 70 65 6f 66 28 78 29 20 46 52 4f 4d 20 74 35 3b  peof(x) FROM t5;
3b10: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 74 65 78 74  .    }.  } {text
3b20: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 63 6c 2d  }.  do_test tcl-
3b30: 31 33 2e 33 20 7b 0a 20 20 20 20 64 62 20 65 76  13.3 {.    db ev
3b40: 61 6c 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54  al {.      DELET
3b50: 45 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 20  E FROM t5;.     
3b60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20   INSERT INTO t5 
3b70: 56 41 4c 55 45 53 28 40 78 29 3b 0a 20 20 20 20  VALUES(@x);.    
3b80: 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28    SELECT typeof(
3b90: 78 29 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20  x) FROM t5;.    
3ba0: 7d 0a 20 20 7d 20 7b 62 6c 6f 62 7d 0a 20 20 64  }.  } {blob}.  d
3bb0: 6f 5f 74 65 73 74 20 74 63 6c 2d 31 33 2e 34 20  o_test tcl-13.4 
3bc0: 7b 0a 20 20 20 20 73 65 74 20 79 20 31 32 33 34  {.    set y 1234
3bd0: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20  .    db eval {. 
3be0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
3bf0: 20 74 35 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t5;.      INSER
3c00: 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53  T INTO t5 VALUES
3c10: 28 40 79 29 3b 0a 20 20 20 20 20 20 53 45 4c 45  (@y);.      SELE
3c20: 43 54 20 68 65 78 28 78 29 2c 20 74 79 70 65 6f  CT hex(x), typeo
3c30: 66 28 78 29 20 46 52 4f 4d 20 74 35 0a 20 20 20  f(x) FROM t5.   
3c40: 20 7d 0a 20 20 7d 20 7b 33 31 33 32 33 33 33 34   }.  } {31323334
3c50: 20 62 6c 6f 62 7d 0a 7d 0a 0a 64 62 20 66 75 6e   blob}.}..db fun
3c60: 63 20 78 43 61 6c 6c 20 78 43 61 6c 6c 0a 70 72  c xCall xCall.pr
3c70: 6f 63 20 78 43 61 6c 6c 20 7b 7d 20 7b 20 72 65  oc xCall {} { re
3c80: 74 75 72 6e 20 22 76 61 6c 75 65 22 20 7d 0a 64  turn "value" }.d
3c90: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 74  o_execsql_test t
3ca0: 63 6c 2d 31 34 2e 31 20 7b 0a 20 20 43 52 45 41  cl-14.1 {.  CREA
3cb0: 54 45 20 54 41 42 4c 45 20 74 36 28 78 29 3b 0a  TE TABLE t6(x);.
3cc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36    INSERT INTO t6
3cd0: 20 56 41 4c 55 45 53 28 31 29 3b 0a 7d 0a 64 6f   VALUES(1);.}.do
3ce0: 5f 74 65 73 74 20 74 63 6c 2d 31 34 2e 32 20 7b  _test tcl-14.2 {
3cf0: 0a 20 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  .  db one {SELEC
3d00: 54 20 78 20 46 52 4f 4d 20 74 36 20 57 48 45 52  T x FROM t6 WHER
3d10: 45 20 78 43 61 6c 6c 28 29 21 3d 27 76 61 6c 75  E xCall()!='valu
3d20: 65 27 7d 0a 7d 20 7b 7d 0a 0a 23 20 56 65 72 69  e'}.} {}..# Veri
3d30: 66 79 20 74 68 61 74 20 74 68 65 20 22 65 78 69  fy that the "exi
3d40: 73 74 73 22 20 61 6e 64 20 22 6f 6e 65 63 6f 6c  sts" and "onecol
3d50: 75 6d 6e 22 20 6d 65 74 68 6f 64 73 20 77 6f 72  umn" methods wor
3d60: 6b 20 77 68 65 6e 0a 23 20 61 20 22 70 72 6f 66  k when.# a "prof
3d70: 69 6c 65 22 20 69 73 20 72 65 67 69 73 74 65 72  ile" is register
3d80: 65 64 2e 0a 23 0a 63 61 74 63 68 20 7b 64 62 20  ed..#.catch {db 
3d90: 63 6c 6f 73 65 7d 0a 73 71 6c 69 74 65 33 20 64  close}.sqlite3 d
3da0: 62 20 3a 6d 65 6d 6f 72 79 3a 0a 70 72 6f 63 20  b :memory:.proc 
3db0: 6e 6f 6f 70 2d 70 72 6f 66 69 6c 65 20 7b 61 72  noop-profile {ar
3dc0: 67 73 7d 20 7b 0a 20 20 72 65 74 75 72 6e 0a 7d  gs} {.  return.}
3dd0: 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d 31 35 2e  .do_test tcl-15.
3de0: 30 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 43  0 {.  db eval {C
3df0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
3e00: 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  ); INSERT INTO t
3e10: 31 20 56 41 4c 55 45 53 28 31 29 2c 28 32 29 2c  1 VALUES(1),(2),
3e20: 28 33 29 3b 7d 0a 20 20 64 62 20 6f 6e 65 63 6f  (3);}.  db oneco
3e30: 6c 75 6d 6e 20 7b 53 45 4c 45 43 54 20 61 20 46  lumn {SELECT a F
3e40: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3e 32  ROM t1 WHERE a>2
3e50: 7d 0a 7d 20 7b 33 7d 0a 64 6f 5f 74 65 73 74 20  }.} {3}.do_test 
3e60: 74 63 6c 2d 31 35 2e 31 20 7b 0a 20 20 64 62 20  tcl-15.1 {.  db 
3e70: 65 78 69 73 74 73 20 7b 53 45 4c 45 43 54 20 61  exists {SELECT a
3e80: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
3e90: 3e 32 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  >2}.} {1}.do_tes
3ea0: 74 20 74 63 6c 2d 31 35 2e 32 20 7b 0a 20 20 64  t tcl-15.2 {.  d
3eb0: 62 20 65 78 69 73 74 73 20 7b 53 45 4c 45 43 54  b exists {SELECT
3ec0: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
3ed0: 20 61 3e 33 7d 0a 7d 20 7b 30 7d 0a 64 62 20 70   a>3}.} {0}.db p
3ee0: 72 6f 66 69 6c 65 20 6e 6f 6f 70 2d 70 72 6f 66  rofile noop-prof
3ef0: 69 6c 65 0a 64 6f 5f 74 65 73 74 20 74 63 6c 2d  ile.do_test tcl-
3f00: 31 35 2e 33 20 7b 0a 20 20 64 62 20 6f 6e 65 63  15.3 {.  db onec
3f10: 6f 6c 75 6d 6e 20 7b 53 45 4c 45 43 54 20 61 20  olumn {SELECT a 
3f20: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3e  FROM t1 WHERE a>
3f30: 32 7d 0a 7d 20 7b 33 7d 0a 64 6f 5f 74 65 73 74  2}.} {3}.do_test
3f40: 20 74 63 6c 2d 31 35 2e 34 20 7b 0a 20 20 64 62   tcl-15.4 {.  db
3f50: 20 65 78 69 73 74 73 20 7b 53 45 4c 45 43 54 20   exists {SELECT 
3f60: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
3f70: 61 3e 32 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  a>2}.} {1}.do_te
3f80: 73 74 20 74 63 6c 2d 31 35 2e 35 20 7b 0a 20 20  st tcl-15.5 {.  
3f90: 64 62 20 65 78 69 73 74 73 20 7b 53 45 4c 45 43  db exists {SELEC
3fa0: 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T a FROM t1 WHER
3fb0: 45 20 61 3e 33 7d 0a 7d 20 7b 30 7d 0a 0a 0a 23  E a>3}.} {0}...#
3fc0: 20 32 30 31 37 2d 30 36 2d 32 36 3a 20 54 68 65   2017-06-26: The
3fd0: 20 2d 2d 77 69 74 68 6f 75 74 6e 75 6c 6c 73 20   --withoutnulls 
3fe0: 66 6c 61 67 20 74 6f 20 22 64 62 20 65 76 61 6c  flag to "db eval
3ff0: 22 2e 0a 23 0a 23 20 49 6e 20 74 68 65 20 22 64  "..#.# In the "d
4000: 62 20 65 76 61 6c 20 2d 2d 77 69 74 68 6f 75 74  b eval --without
4010: 6e 75 6c 6c 73 20 53 51 4c 20 41 52 52 41 59 22  nulls SQL ARRAY"
4020: 20 66 6f 72 6d 2c 20 4e 55 4c 4c 20 72 65 73 75   form, NULL resu
4030: 6c 74 73 20 63 61 75 73 65 20 74 68 65 0a 23 20  lts cause the.# 
4040: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 72  corresponding ar
4050: 72 61 79 20 65 6e 74 72 79 20 74 6f 20 62 65 20  ray entry to be 
4060: 75 6e 73 65 74 2e 20 20 54 68 65 20 64 65 66 61  unset.  The defa
4070: 75 6c 74 20 62 65 68 61 76 69 6f 72 20 28 77 69  ult behavior (wi
4080: 74 68 6f 75 74 0a 23 20 74 68 65 20 2d 77 69 74  thout.# the -wit
4090: 68 6f 75 74 6e 75 6c 6c 73 20 66 6c 61 67 73 29  houtnulls flags)
40a0: 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 72 72   is for the corr
40b0: 65 73 70 6f 6e 64 69 6e 67 20 61 72 72 61 79 20  esponding array 
40c0: 76 61 6c 75 65 20 74 6f 20 67 65 74 0a 23 20 74  value to get.# t
40d0: 68 65 20 5b 64 62 20 6e 75 6c 6c 76 61 6c 75 65  he [db nullvalue
40e0: 5d 20 73 74 72 69 6e 67 2e 0a 23 0a 63 61 74 63  ] string..#.catc
40f0: 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72  h {db close}.for
4100: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
4110: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
4120: 2e 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .db.do_execsql_t
4130: 65 73 74 20 74 63 6c 2d 31 36 2e 31 30 30 20 7b  est tcl-16.100 {
4140: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
4150: 74 31 28 61 2c 62 29 3b 0a 20 20 49 4e 53 45 52  t1(a,b);.  INSER
4160: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4170: 28 31 2c 32 29 2c 28 32 2c 4e 55 4c 4c 29 2c 28  (1,2),(2,NULL),(
4180: 33 2c 27 78 79 7a 27 29 3b 0a 7d 0a 64 6f 5f 74  3,'xyz');.}.do_t
4190: 65 73 74 20 74 63 6c 2d 31 36 2e 31 30 31 20 7b  est tcl-16.101 {
41a0: 0a 20 20 73 65 74 20 72 65 73 20 7b 7d 0a 20 20  .  set res {}.  
41b0: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
41c0: 6e 20 78 0a 20 20 64 62 20 65 76 61 6c 20 7b 53  n x.  db eval {S
41d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d  ELECT * FROM t1}
41e0: 20 78 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64   x {.    lappend
41f0: 20 72 65 73 20 24 78 28 61 29 20 5b 61 72 72 61   res $x(a) [arra
4200: 79 20 6e 61 6d 65 73 20 78 5d 0a 20 20 7d 0a 20  y names x].  }. 
4210: 20 73 65 74 20 72 65 73 0a 7d 20 7b 31 20 7b 61   set res.} {1 {a
4220: 20 62 20 2a 7d 20 32 20 7b 61 20 62 20 2a 7d 20   b *} 2 {a b *} 
4230: 33 20 7b 61 20 62 20 2a 7d 7d 0a 64 6f 5f 74 65  3 {a b *}}.do_te
4240: 73 74 20 74 63 6c 2d 31 36 2e 31 30 32 20 7b 0a  st tcl-16.102 {.
4250: 20 20 73 65 74 20 72 65 73 20 5b 63 61 74 63 68    set res [catch
4260: 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 2d   {.    db eval -
4270: 75 6e 6b 6e 6f 77 6e 20 7b 53 45 4c 45 43 54 20  unknown {SELECT 
4280: 2a 20 46 52 4f 4d 20 74 31 7d 20 78 20 7b 0a 20  * FROM t1} x {. 
4290: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
42a0: 20 24 78 28 61 29 20 5b 61 72 72 61 79 20 6e 61   $x(a) [array na
42b0: 6d 65 73 20 78 5d 0a 20 20 20 20 7d 0a 20 20 7d  mes x].    }.  }
42c0: 20 72 63 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72   rc].  lappend r
42d0: 65 73 20 24 72 63 0a 7d 20 7b 31 20 7b 75 6e 6b  es $rc.} {1 {unk
42e0: 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2d 75  nown option: "-u
42f0: 6e 6b 6e 6f 77 6e 22 7d 7d 0a 64 6f 5f 74 65 73  nknown"}}.do_tes
4300: 74 20 74 63 6c 2d 31 36 2e 31 30 33 20 7b 0a 20  t tcl-16.103 {. 
4310: 20 73 65 74 20 72 65 73 20 7b 7d 0a 20 20 75 6e   set res {}.  un
4320: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
4330: 78 0a 20 20 64 62 20 65 76 61 6c 20 2d 77 69 74  x.  db eval -wit
4340: 68 6f 75 74 6e 75 6c 6c 73 20 7b 53 45 4c 45 43  houtnulls {SELEC
4350: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 20 78 20 7b  T * FROM t1} x {
4360: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73  .    lappend res
4370: 20 24 78 28 61 29 20 5b 61 72 72 61 79 20 6e 61   $x(a) [array na
4380: 6d 65 73 20 78 5d 0a 20 20 7d 0a 20 20 73 65 74  mes x].  }.  set
4390: 20 72 65 73 0a 7d 20 7b 31 20 7b 61 20 62 20 2a   res.} {1 {a b *
43a0: 7d 20 32 20 7b 61 20 2a 7d 20 33 20 7b 61 20 62  } 2 {a *} 3 {a b
43b0: 20 2a 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   *}}..#---------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4400: 0a 23 20 54 65 73 74 20 74 68 65 20 2d 74 79 70  .# Test the -typ
4410: 65 20 6f 70 74 69 6f 6e 20 74 6f 20 5b 64 62 20  e option to [db 
4420: 66 75 6e 63 74 69 6f 6e 5d 2e 0a 23 0a 72 65 73  function]..#.res
4430: 65 74 5f 64 62 0a 70 72 6f 63 20 61 64 64 20 7b  et_db.proc add {
4440: 61 20 62 7d 20 7b 20 72 65 74 75 72 6e 20 5b 65  a b} { return [e
4450: 78 70 72 20 24 61 20 2b 20 24 62 5d 20 7d 0a 70  xpr $a + $b] }.p
4460: 72 6f 63 20 72 65 74 20 7b 61 7d 20 7b 20 72 65  roc ret {a} { re
4470: 74 75 72 6e 20 24 61 20 7d 0a 0a 64 62 20 66 75  turn $a }..db fu
4480: 6e 63 74 69 6f 6e 20 61 64 64 5f 69 20 2d 72 65  nction add_i -re
4490: 74 75 72 6e 74 79 70 65 20 69 6e 74 65 67 65 72  turntype integer
44a0: 20 61 64 64 20 0a 64 62 20 66 75 6e 63 74 69 6f   add .db functio
44b0: 6e 20 61 64 64 5f 72 20 2d 72 65 74 20 20 20 20  n add_r -ret    
44c0: 20 20 20 20 72 65 61 6c 20 20 20 20 61 64 64 0a      real    add.
44d0: 64 62 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 5f  db function add_
44e0: 74 20 2d 72 65 74 75 72 6e 20 20 20 20 20 74 65  t -return     te
44f0: 78 74 20 20 20 20 61 64 64 20 0a 64 62 20 66 75  xt    add .db fu
4500: 6e 63 74 69 6f 6e 20 61 64 64 5f 62 20 2d 72 65  nction add_b -re
4510: 74 75 72 6e 74 79 70 65 20 62 6c 6f 62 20 20 20  turntype blob   
4520: 20 61 64 64 20 0a 64 62 20 66 75 6e 63 74 69 6f   add .db functio
4530: 6e 20 61 64 64 5f 61 20 2d 72 65 74 75 72 6e 74  n add_a -returnt
4540: 79 70 65 20 61 6e 79 20 20 20 20 20 61 64 64 20  ype any     add 
4550: 0a 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20 72 65  ..db function re
4560: 74 5f 69 20 2d 72 65 74 75 72 6e 74 79 70 65 20  t_i -returntype 
4570: 69 6e 74 20 20 20 20 20 72 65 74 20 0a 64 62 20  int     ret .db 
4580: 66 75 6e 63 74 69 6f 6e 20 72 65 74 5f 72 20 2d  function ret_r -
4590: 72 65 74 75 72 6e 74 79 70 65 20 72 65 61 6c 20  returntype real 
45a0: 20 20 20 72 65 74 0a 64 62 20 66 75 6e 63 74 69     ret.db functi
45b0: 6f 6e 20 72 65 74 5f 74 20 2d 72 65 74 75 72 6e  on ret_t -return
45c0: 74 79 70 65 20 74 65 78 74 20 20 20 20 72 65 74  type text    ret
45d0: 20 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20 72 65   .db function re
45e0: 74 5f 62 20 2d 72 65 74 75 72 6e 74 79 70 65 20  t_b -returntype 
45f0: 62 6c 6f 62 20 20 20 20 72 65 74 20 0a 64 62 20  blob    ret .db 
4600: 66 75 6e 63 74 69 6f 6e 20 72 65 74 5f 61 20 2d  function ret_a -
4610: 72 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20  r          any  
4620: 20 20 20 72 65 74 20 0a 0a 64 6f 5f 65 78 65 63     ret ..do_exec
4630: 73 71 6c 5f 74 65 73 74 20 31 37 2e 30 20 7b 0a  sql_test 17.0 {.
4640: 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 20    SELECT quote( 
4650: 61 64 64 5f 69 28 32 2c 20 33 29 20 29 3b 0a 20  add_i(2, 3) );. 
4660: 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 20 61   SELECT quote( a
4670: 64 64 5f 72 28 32 2c 20 33 29 20 29 3b 20 0a 20  dd_r(2, 3) ); . 
4680: 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 20 61   SELECT quote( a
4690: 64 64 5f 74 28 32 2c 20 33 29 20 29 3b 20 0a 20  dd_t(2, 3) ); . 
46a0: 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 20 61   SELECT quote( a
46b0: 64 64 5f 62 28 32 2c 20 33 29 20 29 3b 20 0a 20  dd_b(2, 3) ); . 
46c0: 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 20 61   SELECT quote( a
46d0: 64 64 5f 61 28 32 2c 20 33 29 20 29 3b 20 0a 7d  dd_a(2, 3) ); .}
46e0: 20 7b 35 20 35 2e 30 20 27 35 27 20 58 27 33 35   {5 5.0 '5' X'35
46f0: 27 20 35 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  ' 5}..do_execsql
4700: 5f 74 65 73 74 20 31 37 2e 31 20 7b 0a 20 20 53  _test 17.1 {.  S
4710: 45 4c 45 43 54 20 71 75 6f 74 65 28 20 61 64 64  ELECT quote( add
4720: 5f 69 28 32 2e 32 2c 20 33 2e 33 29 20 29 3b 0a  _i(2.2, 3.3) );.
4730: 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 20    SELECT quote( 
4740: 61 64 64 5f 72 28 32 2e 32 2c 20 33 2e 33 29 20  add_r(2.2, 3.3) 
4750: 29 3b 20 0a 20 20 53 45 4c 45 43 54 20 71 75 6f  ); .  SELECT quo
4760: 74 65 28 20 61 64 64 5f 74 28 32 2e 32 2c 20 33  te( add_t(2.2, 3
4770: 2e 33 29 20 29 3b 20 0a 20 20 53 45 4c 45 43 54  .3) ); .  SELECT
4780: 20 71 75 6f 74 65 28 20 61 64 64 5f 62 28 32 2e   quote( add_b(2.
4790: 32 2c 20 33 2e 33 29 20 29 3b 20 0a 20 20 53 45  2, 3.3) ); .  SE
47a0: 4c 45 43 54 20 71 75 6f 74 65 28 20 61 64 64 5f  LECT quote( add_
47b0: 61 28 32 2e 32 2c 20 33 2e 33 29 20 29 3b 20 0a  a(2.2, 3.3) ); .
47c0: 7d 20 7b 35 2e 35 20 35 2e 35 20 27 35 2e 35 27  } {5.5 5.5 '5.5'
47d0: 20 58 27 33 35 32 45 33 35 27 20 35 2e 35 7d 0a   X'352E35' 5.5}.
47e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
47f0: 20 31 37 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54   17.2 {.  SELECT
4800: 20 71 75 6f 74 65 28 20 72 65 74 5f 69 28 32 2e   quote( ret_i(2.
4810: 35 29 20 29 3b 0a 20 20 53 45 4c 45 43 54 20 71  5) );.  SELECT q
4820: 75 6f 74 65 28 20 72 65 74 5f 72 28 32 2e 35 29  uote( ret_r(2.5)
4830: 20 29 3b 20 0a 20 20 53 45 4c 45 43 54 20 71 75   ); .  SELECT qu
4840: 6f 74 65 28 20 72 65 74 5f 74 28 32 2e 35 29 20  ote( ret_t(2.5) 
4850: 29 3b 20 0a 20 20 53 45 4c 45 43 54 20 71 75 6f  ); .  SELECT quo
4860: 74 65 28 20 72 65 74 5f 62 28 32 2e 35 29 20 29  te( ret_b(2.5) )
4870: 3b 20 0a 20 20 53 45 4c 45 43 54 20 71 75 6f 74  ; .  SELECT quot
4880: 65 28 20 72 65 74 5f 61 28 32 2e 35 29 20 29 3b  e( ret_a(2.5) );
4890: 20 0a 7d 20 7b 32 2e 35 20 32 2e 35 20 27 32 2e   .} {2.5 2.5 '2.
48a0: 35 27 20 58 27 33 32 32 45 33 35 27 20 32 2e 35  5' X'322E35' 2.5
48b0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
48c0: 73 74 20 31 37 2e 33 20 7b 0a 20 20 53 45 4c 45  st 17.3 {.  SELE
48d0: 43 54 20 71 75 6f 74 65 28 20 72 65 74 5f 69 28  CT quote( ret_i(
48e0: 27 32 2e 35 27 29 20 29 3b 0a 20 20 53 45 4c 45  '2.5') );.  SELE
48f0: 43 54 20 71 75 6f 74 65 28 20 72 65 74 5f 72 28  CT quote( ret_r(
4900: 27 32 2e 35 27 29 20 29 3b 20 0a 20 20 53 45 4c  '2.5') ); .  SEL
4910: 45 43 54 20 71 75 6f 74 65 28 20 72 65 74 5f 74  ECT quote( ret_t
4920: 28 27 32 2e 35 27 29 20 29 3b 20 0a 20 20 53 45  ('2.5') ); .  SE
4930: 4c 45 43 54 20 71 75 6f 74 65 28 20 72 65 74 5f  LECT quote( ret_
4940: 62 28 27 32 2e 35 27 29 20 29 3b 20 0a 20 20 53  b('2.5') ); .  S
4950: 45 4c 45 43 54 20 71 75 6f 74 65 28 20 72 65 74  ELECT quote( ret
4960: 5f 61 28 27 32 2e 35 27 29 20 29 3b 20 0a 7d 20  _a('2.5') ); .} 
4970: 7b 32 2e 35 20 32 2e 35 20 27 32 2e 35 27 20 58  {2.5 2.5 '2.5' X
4980: 27 33 32 32 45 33 35 27 20 27 32 2e 35 27 7d 0a  '322E35' '2.5'}.
4990: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
49a0: 20 31 37 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54   17.4 {.  SELECT
49b0: 20 71 75 6f 74 65 28 20 72 65 74 5f 69 28 27 61   quote( ret_i('a
49c0: 62 63 27 29 20 29 3b 0a 20 20 53 45 4c 45 43 54  bc') );.  SELECT
49d0: 20 71 75 6f 74 65 28 20 72 65 74 5f 72 28 27 61   quote( ret_r('a
49e0: 62 63 27 29 20 29 3b 20 0a 20 20 53 45 4c 45 43  bc') ); .  SELEC
49f0: 54 20 71 75 6f 74 65 28 20 72 65 74 5f 74 28 27  T quote( ret_t('
4a00: 61 62 63 27 29 20 29 3b 20 0a 20 20 53 45 4c 45  abc') ); .  SELE
4a10: 43 54 20 71 75 6f 74 65 28 20 72 65 74 5f 62 28  CT quote( ret_b(
4a20: 27 61 62 63 27 29 20 29 3b 20 0a 20 20 53 45 4c  'abc') ); .  SEL
4a30: 45 43 54 20 71 75 6f 74 65 28 20 72 65 74 5f 61  ECT quote( ret_a
4a40: 28 27 61 62 63 27 29 20 29 3b 20 0a 7d 20 7b 27  ('abc') ); .} {'
4a50: 61 62 63 27 20 27 61 62 63 27 20 27 61 62 63 27  abc' 'abc' 'abc'
4a60: 20 58 27 36 31 36 32 36 33 27 20 27 61 62 63 27   X'616263' 'abc'
4a70: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
4a80: 73 74 20 31 37 2e 35 20 7b 0a 20 20 53 45 4c 45  st 17.5 {.  SELE
4a90: 43 54 20 71 75 6f 74 65 28 20 72 65 74 5f 69 28  CT quote( ret_i(
4aa0: 58 27 36 31 36 32 36 33 27 29 20 29 3b 0a 20 20  X'616263') );.  
4ab0: 53 45 4c 45 43 54 20 71 75 6f 74 65 28 20 72 65  SELECT quote( re
4ac0: 74 5f 72 28 58 27 36 31 36 32 36 33 27 29 20 29  t_r(X'616263') )
4ad0: 3b 20 0a 20 20 53 45 4c 45 43 54 20 71 75 6f 74  ; .  SELECT quot
4ae0: 65 28 20 72 65 74 5f 74 28 58 27 36 31 36 32 36  e( ret_t(X'61626
4af0: 33 27 29 20 29 3b 20 0a 20 20 53 45 4c 45 43 54  3') ); .  SELECT
4b00: 20 71 75 6f 74 65 28 20 72 65 74 5f 62 28 58 27   quote( ret_b(X'
4b10: 36 31 36 32 36 33 27 29 20 29 3b 20 0a 20 20 53  616263') ); .  S
4b20: 45 4c 45 43 54 20 71 75 6f 74 65 28 20 72 65 74  ELECT quote( ret
4b30: 5f 61 28 58 27 36 31 36 32 36 33 27 29 20 29 3b  _a(X'616263') );
4b40: 20 0a 7d 20 7b 27 61 62 63 27 20 27 61 62 63 27   .} {'abc' 'abc'
4b50: 20 27 61 62 63 27 20 58 27 36 31 36 32 36 33 27   'abc' X'616263'
4b60: 20 58 27 36 31 36 32 36 33 27 7d 0a 0a 64 6f 5f   X'616263'}..do_
4b70: 74 65 73 74 20 31 37 2e 36 2e 31 20 7b 0a 20 20  test 17.6.1 {.  
4b80: 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20 64 62  list [catch { db
4b90: 20 66 75 6e 63 74 69 6f 6e 20 78 79 7a 20 2d 72   function xyz -r
4ba0: 65 74 75 72 6e 20 6f 62 6a 65 63 74 20 72 65 74  eturn object ret
4bb0: 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b   } msg] $msg.} {
4bc0: 31 20 7b 62 61 64 20 74 79 70 65 20 22 6f 62 6a  1 {bad type "obj
4bd0: 65 63 74 22 3a 20 6d 75 73 74 20 62 65 20 69 6e  ect": must be in
4be0: 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 74 65 78  teger, real, tex
4bf0: 74 2c 20 62 6c 6f 62 2c 20 6f 72 20 61 6e 79 7d  t, blob, or any}
4c00: 7d 0a 0a 64 6f 5f 74 65 73 74 20 31 37 2e 36 2e  }..do_test 17.6.
4c10: 32 20 7b 0a 20 20 6c 69 73 74 20 5b 63 61 74 63  2 {.  list [catc
4c20: 68 20 7b 20 64 62 20 66 75 6e 63 74 69 6f 6e 20  h { db function 
4c30: 78 79 7a 20 2d 72 65 74 75 72 6e 20 72 65 74 20  xyz -return ret 
4c40: 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31  } msg] $msg.} {1
4c50: 20 7b 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65   {option require
4c60: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 2d  s an argument: -
4c70: 72 65 74 75 72 6e 7d 7d 0a 0a 64 6f 5f 74 65 73  return}}..do_tes
4c80: 74 20 31 37 2e 36 2e 33 20 7b 0a 20 20 6c 69 73  t 17.6.3 {.  lis
4c90: 74 20 5b 63 61 74 63 68 20 7b 20 64 62 20 66 75  t [catch { db fu
4ca0: 6e 63 74 69 6f 6e 20 78 79 7a 20 2d 6e 20 6f 62  nction xyz -n ob
4cb0: 6a 65 63 74 20 72 65 74 20 7d 20 6d 73 67 5d 20  ject ret } msg] 
4cc0: 24 6d 73 67 0a 7d 20 7b 31 20 7b 62 61 64 20 6f  $msg.} {1 {bad o
4cd0: 70 74 69 6f 6e 20 22 2d 6e 22 3a 20 6d 75 73 74  ption "-n": must
4ce0: 20 62 65 20 2d 61 72 67 63 6f 75 6e 74 2c 20 2d   be -argcount, -
4cf0: 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 6f 72  deterministic or
4d00: 20 2d 72 65 74 75 72 6e 74 79 70 65 7d 7d 0a 0a   -returntype}}..
4d10: 23 20 32 30 31 39 2d 30 32 2d 32 38 3a 20 54 68  # 2019-02-28: Th
4d20: 65 20 22 62 69 6e 64 5f 66 61 6c 6c 62 61 63 6b  e "bind_fallback
4d30: 22 20 63 6f 6d 6d 61 6e 64 2e 0a 23 0a 64 6f 5f  " command..#.do_
4d40: 74 65 73 74 20 31 38 2e 31 30 30 20 7b 0a 20 20  test 18.100 {.  
4d50: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
4d60: 6e 20 62 69 6e 64 69 6e 67 73 20 61 62 63 20 64  n bindings abc d
4d70: 65 66 20 67 68 69 20 6a 6b 6c 20 6d 6e 6f 20 65  ef ghi jkl mno e
4d80: 30 31 20 65 30 32 0a 20 20 73 65 74 20 62 69 6e  01 e02.  set bin
4d90: 64 69 6e 67 73 28 61 62 63 29 20 5b 65 78 70 72  dings(abc) [expr
4da0: 20 7b 31 2b 32 7d 5d 0a 20 20 73 65 74 20 62 69   {1+2}].  set bi
4db0: 6e 64 69 6e 67 73 28 64 65 66 29 20 7b 68 65 6c  ndings(def) {hel
4dc0: 6c 6f 7d 0a 20 20 73 65 74 20 62 69 6e 64 69 6e  lo}.  set bindin
4dd0: 67 73 28 67 68 69 29 20 5b 65 78 70 72 20 7b 33  gs(ghi) [expr {3
4de0: 2e 31 34 31 35 39 32 36 2a 31 2e 30 7d 5d 0a 20  .1415926*1.0}]. 
4df0: 20 70 72 6f 63 20 62 69 6e 64 5f 63 61 6c 6c 62   proc bind_callb
4e00: 61 63 6b 20 7b 6e 6d 7d 20 7b 0a 20 20 20 20 67  ack {nm} {.    g
4e10: 6c 6f 62 61 6c 20 62 69 6e 64 69 6e 67 73 0a 20  lobal bindings. 
4e20: 20 20 20 73 65 74 20 6e 32 20 5b 73 74 72 69 6e     set n2 [strin
4e30: 67 20 72 61 6e 67 65 20 24 6e 6d 20 31 20 65 6e  g range $nm 1 en
4e40: 64 5d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  d].    if {[info
4e50: 20 65 78 69 73 74 73 20 62 69 6e 64 69 6e 67 73   exists bindings
4e60: 28 24 6e 32 29 5d 7d 20 7b 0a 20 20 20 20 20 20  ($n2)]} {.      
4e70: 72 65 74 75 72 6e 20 24 62 69 6e 64 69 6e 67 73  return $bindings
4e80: 28 24 6e 32 29 0a 20 20 20 20 7d 0a 20 20 20 20  ($n2).    }.    
4e90: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
4ea0: 68 20 65 2a 20 24 6e 32 5d 7d 20 7b 0a 20 20 20  h e* $n2]} {.   
4eb0: 20 20 20 65 72 72 6f 72 20 22 6e 6f 20 73 75 63     error "no suc
4ec0: 68 20 76 61 72 69 61 62 6c 65 3a 20 24 6e 6d 22  h variable: $nm"
4ed0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4ee0: 6e 20 2d 63 6f 64 65 20 72 65 74 75 72 6e 20 7b  n -code return {
4ef0: 7d 0a 20 20 7d 0a 20 20 64 62 20 62 69 6e 64 5f  }.  }.  db bind_
4f00: 66 61 6c 6c 62 61 63 6b 20 62 69 6e 64 5f 63 61  fallback bind_ca
4f10: 6c 6c 62 61 63 6b 0a 20 20 64 62 20 65 76 61 6c  llback.  db eval
4f20: 20 7b 53 45 4c 45 43 54 20 24 61 62 63 2c 20 74   {SELECT $abc, t
4f30: 79 70 65 6f 66 28 24 61 62 63 29 2c 20 24 64 65  ypeof($abc), $de
4f40: 66 2c 20 74 79 70 65 6f 66 28 24 64 65 66 29 2c  f, typeof($def),
4f50: 20 24 67 68 69 2c 20 74 79 70 65 6f 66 28 24 67   $ghi, typeof($g
4f60: 68 69 29 7d 0a 7d 20 7b 33 20 69 6e 74 65 67 65  hi)}.} {3 intege
4f70: 72 20 68 65 6c 6c 6f 20 74 65 78 74 20 33 2e 31  r hello text 3.1
4f80: 34 31 35 39 32 36 20 72 65 61 6c 7d 0a 64 6f 5f  415926 real}.do_
4f90: 74 65 73 74 20 31 38 2e 31 31 30 20 7b 0a 20 20  test 18.110 {.  
4fa0: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
4fb0: 71 75 6f 74 65 28 40 64 65 66 29 2c 20 74 79 70  quote(@def), typ
4fc0: 65 6f 66 28 40 64 65 66 29 7d 0a 7d 20 7b 58 27  eof(@def)}.} {X'
4fd0: 36 38 36 35 36 43 36 43 36 46 27 20 62 6c 6f 62  68656C6C6F' blob
4fe0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
4ff0: 74 20 31 38 2e 31 32 30 20 7b 0a 20 20 53 45 4c  t 18.120 {.  SEL
5000: 45 43 54 20 74 79 70 65 6f 66 28 24 6d 6e 6f 29  ECT typeof($mno)
5010: 3b 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 6f 5f 63 61  ;.} {null}.do_ca
5020: 74 63 68 73 71 6c 5f 74 65 73 74 20 31 38 2e 31  tchsql_test 18.1
5030: 33 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 24 65  30 {.  SELECT $e
5040: 30 31 3b 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  01;.} {1 {no suc
5050: 68 20 76 61 72 69 61 62 6c 65 3a 20 24 65 30 31  h variable: $e01
5060: 7d 7d 0a 64 6f 5f 74 65 73 74 20 31 38 2e 31 34  }}.do_test 18.14
5070: 30 20 7b 0a 20 20 64 62 20 62 69 6e 64 5f 66 61  0 {.  db bind_fa
5080: 6c 6c 62 61 63 6b 0a 7d 20 7b 62 69 6e 64 5f 63  llback.} {bind_c
5090: 61 6c 6c 62 61 63 6b 7d 0a 64 6f 5f 74 65 73 74  allback}.do_test
50a0: 20 31 38 2e 32 30 30 20 7b 0a 20 20 64 62 20 62   18.200 {.  db b
50b0: 69 6e 64 5f 66 61 6c 6c 62 61 63 6b 20 7b 7d 0a  ind_fallback {}.
50c0: 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43    db eval {SELEC
50d0: 54 20 24 61 62 63 2c 20 74 79 70 65 6f 66 28 24  T $abc, typeof($
50e0: 61 62 63 29 2c 20 24 64 65 66 2c 20 74 79 70 65  abc), $def, type
50f0: 6f 66 28 24 64 65 66 29 2c 20 24 67 68 69 2c 20  of($def), $ghi, 
5100: 74 79 70 65 6f 66 28 24 67 68 69 29 7d 0a 7d 20  typeof($ghi)}.} 
5110: 7b 7b 7d 20 6e 75 6c 6c 20 7b 7d 20 6e 75 6c 6c  {{} null {} null
5120: 20 7b 7d 20 6e 75 6c 6c 7d 0a 64 6f 5f 74 65 73   {} null}.do_tes
5130: 74 20 31 38 2e 33 30 30 20 7b 0a 20 20 75 6e 73  t 18.300 {.  uns
5140: 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 62  et -nocomplain b
5150: 69 6e 64 69 6e 67 73 0a 20 20 70 72 6f 63 20 62  indings.  proc b
5160: 69 6e 64 5f 63 61 6c 6c 62 61 63 6b 20 7b 6e 6d  ind_callback {nm
5170: 7d 20 7b 6c 61 70 70 65 6e 64 20 3a 3a 62 69 6e  } {lappend ::bin
5180: 64 69 6e 67 73 20 24 6e 6d 7d 0a 20 20 64 62 20  dings $nm}.  db 
5190: 62 69 6e 64 5f 66 61 6c 6c 62 61 63 6b 20 62 69  bind_fallback bi
51a0: 6e 64 5f 63 61 6c 6c 62 61 63 6b 0a 20 20 64 62  nd_callback.  db
51b0: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 24 61   eval {SELECT $a
51c0: 62 63 2c 20 40 64 65 66 2c 20 24 67 68 69 28 31  bc, @def, $ghi(1
51d0: 32 33 29 2c 20 3a 6d 6e 6f 7d 0a 20 20 73 65 74  23), :mno}.  set
51e0: 20 62 69 6e 64 69 6e 67 73 0a 7d 20 7b 7b 24 61   bindings.} {{$a
51f0: 62 63 7d 20 40 64 65 66 20 7b 24 67 68 69 28 31  bc} @def {$ghi(1
5200: 32 33 29 7d 20 3a 6d 6e 6f 7d 0a 64 6f 5f 74 65  23)} :mno}.do_te
5210: 73 74 20 31 38 2e 39 30 30 20 7b 0a 20 20 73 65  st 18.900 {.  se
5220: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 64 62 20  t rc [catch {db 
5230: 62 69 6e 64 5f 66 61 6c 6c 62 61 63 6b 20 61 20  bind_fallback a 
5240: 62 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  b} msg].  lappen
5250: 64 20 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b  d rc $msg.} {1 {
5260: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
5270: 6f 75 6c 64 20 62 65 20 22 64 62 20 62 69 6e 64  ould be "db bind
5280: 5f 66 61 6c 6c 62 61 63 6b 20 3f 43 41 4c 4c 42  _fallback ?CALLB
5290: 41 43 4b 3f 22 7d 7d 0a 64 6f 5f 74 65 73 74 20  ACK?"}}.do_test 
52a0: 31 38 2e 39 31 30 20 7b 0a 20 20 64 62 20 62 69  18.910 {.  db bi
52b0: 6e 64 5f 66 61 6c 6c 62 61 63 6b 20 62 69 6e 64  nd_fallback bind
52c0: 5f 66 61 6c 6c 62 61 63 6b 5f 64 6f 65 73 5f 6e  _fallback_does_n
52d0: 6f 74 5f 65 78 69 73 74 0a 7d 20 7b 7d 0a 64 6f  ot_exist.} {}.do
52e0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31  _catchsql_test 1
52f0: 39 2e 39 31 31 20 7b 0a 20 20 53 45 4c 45 43 54  9.911 {.  SELECT
5300: 20 24 61 62 63 2c 20 74 79 70 65 6f 66 28 24 61   $abc, typeof($a
5310: 62 63 29 2c 20 24 64 65 66 2c 20 74 79 70 65 6f  bc), $def, typeo
5320: 66 28 24 64 65 66 29 2c 20 24 67 68 69 2c 20 74  f($def), $ghi, t
5330: 79 70 65 6f 66 28 24 67 68 69 29 3b 0a 7d 20 7b  ypeof($ghi);.} {
5340: 31 20 7b 69 6e 76 61 6c 69 64 20 63 6f 6d 6d 61  1 {invalid comma
5350: 6e 64 20 6e 61 6d 65 20 22 62 69 6e 64 5f 66 61  nd name "bind_fa
5360: 6c 6c 62 61 63 6b 5f 64 6f 65 73 5f 6e 6f 74 5f  llback_does_not_
5370: 65 78 69 73 74 22 7d 7d 0a 64 62 20 62 69 6e 64  exist"}}.db bind
5380: 5f 66 61 6c 6c 62 61 63 6b 20 7b 7d 0a 0a 66 69  _fallback {}..fi
5390: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.