/ Hex Artifact Content
Login

Artifact 2f3f7f2e9637f93ccf609df48ef5b27a50278b6b1cd752b445d52262e5841413:


0000: 23 20 32 30 31 30 20 41 70 72 69 6c 20 31 34 0a  # 2010 April 14.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 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 0a 23 20 54 68 69 73 20 66 69 6c  *****.# This fil
0170: 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  e contains code 
0180: 75 73 65 64 20 62 79 20 73 65 76 65 72 61 6c 20  used by several 
0190: 64 69 66 66 65 72 65 6e 74 20 74 65 73 74 20 73  different test s
01a0: 63 72 69 70 74 73 2e 20 54 68 65 0a 23 20 63 6f  cripts. The.# co
01b0: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
01c0: 61 6c 6c 6f 77 73 20 74 65 73 74 66 69 78 74 75  allows testfixtu
01d0: 72 65 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 6e  re to control an
01e0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 6f  other process (o
01f0: 72 0a 23 20 70 72 6f 63 65 73 73 65 73 29 20 74  r.# processes) t
0200: 6f 20 74 65 73 74 20 6c 6f 63 6b 69 6e 67 2e 0a  o test locking..
0210: 23 0a 0a 70 72 6f 63 20 64 6f 5f 6d 75 6c 74 69  #..proc do_multi
0220: 63 6c 69 65 6e 74 5f 74 65 73 74 20 7b 76 61 72  client_test {var
0230: 6e 61 6d 65 20 73 63 72 69 70 74 7d 20 7b 0a 0a  name script} {..
0240: 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 6f    foreach {tn co
0250: 64 65 7d 20 5b 6c 69 73 74 20 31 20 7b 0a 20 20  de} [list 1 {.  
0260: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0270: 74 73 20 3a 3a 47 28 76 61 6c 67 72 69 6e 64 29  ts ::G(valgrind)
0280: 5d 7d 20 7b 20 64 62 20 63 6c 6f 73 65 20 3b 20  ]} { db close ; 
0290: 63 6f 6e 74 69 6e 75 65 20 7d 0a 20 20 20 20 73  continue }.    s
02a0: 65 74 20 3a 3a 63 6f 64 65 32 5f 63 68 61 6e 20  et ::code2_chan 
02b0: 5b 6c 61 75 6e 63 68 5f 74 65 73 74 66 69 78 74  [launch_testfixt
02c0: 75 72 65 5d 0a 20 20 20 20 73 65 74 20 3a 3a 63  ure].    set ::c
02d0: 6f 64 65 33 5f 63 68 61 6e 20 5b 6c 61 75 6e 63  ode3_chan [launc
02e0: 68 5f 74 65 73 74 66 69 78 74 75 72 65 5d 0a 20  h_testfixture]. 
02f0: 20 20 20 70 72 6f 63 20 63 6f 64 65 32 20 7b 74     proc code2 {t
0300: 63 6c 7d 20 7b 20 74 65 73 74 66 69 78 74 75 72  cl} { testfixtur
0310: 65 20 24 3a 3a 63 6f 64 65 32 5f 63 68 61 6e 20  e $::code2_chan 
0320: 24 74 63 6c 20 7d 0a 20 20 20 20 70 72 6f 63 20  $tcl }.    proc 
0330: 63 6f 64 65 33 20 7b 74 63 6c 7d 20 7b 20 74 65  code3 {tcl} { te
0340: 73 74 66 69 78 74 75 72 65 20 24 3a 3a 63 6f 64  stfixture $::cod
0350: 65 33 5f 63 68 61 6e 20 24 74 63 6c 20 7d 0a 20  e3_chan $tcl }. 
0360: 20 7d 20 32 20 7b 0a 20 20 20 20 70 72 6f 63 20   } 2 {.    proc 
0370: 63 6f 64 65 32 20 7b 74 63 6c 7d 20 7b 20 75 70  code2 {tcl} { up
0380: 6c 65 76 65 6c 20 23 30 20 24 74 63 6c 20 7d 0a  level #0 $tcl }.
0390: 20 20 20 20 70 72 6f 63 20 63 6f 64 65 33 20 7b      proc code3 {
03a0: 74 63 6c 7d 20 7b 20 75 70 6c 65 76 65 6c 20 23  tcl} { uplevel #
03b0: 30 20 24 74 63 6c 20 7d 0a 20 20 7d 5d 20 7b 0a  0 $tcl }.  }] {.
03c0: 20 20 20 20 23 20 44 6f 20 6e 6f 74 20 72 75 6e      # Do not run
03d0: 20 6d 75 6c 74 69 2d 70 72 6f 63 65 73 73 20 74   multi-process t
03e0: 65 73 74 73 20 77 69 74 68 20 74 68 65 20 75 6e  ests with the un
03f0: 69 78 2d 65 78 63 6c 20 56 46 53 2e 0a 20 20 20  ix-excl VFS..   
0400: 20 23 0a 20 20 20 20 69 66 20 7b 24 74 6e 3d 3d   #.    if {$tn==
0410: 31 20 26 26 20 5b 70 65 72 6d 75 74 61 74 69 6f  1 && [permutatio
0420: 6e 5d 3d 3d 22 75 6e 69 78 2d 65 78 63 6c 22 7d  n]=="unix-excl"}
0430: 20 63 6f 6e 74 69 6e 75 65 0a 0a 20 20 20 20 66   continue..    f
0440: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
0450: 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 20 20 70  nd_reopen..    p
0460: 72 6f 63 20 63 6f 64 65 31 20 7b 74 63 6c 7d 20  roc code1 {tcl} 
0470: 7b 20 75 70 6c 65 76 65 6c 20 23 30 20 24 74 63  { uplevel #0 $tc
0480: 6c 20 7d 0a 20 20 0a 20 20 20 20 23 20 4f 70 65  l }.  .    # Ope
0490: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64  n connections [d
04a0: 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 2e 20 44  b2] and [db3]. D
04b0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63  epending on whic
04c0: 68 20 69 74 65 72 61 74 69 6f 6e 20 74 68 69 73  h iteration this
04d0: 0a 20 20 20 20 23 20 69 73 2c 20 74 68 65 20 63  .    # is, the c
04e0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6d 61 79 20 62  onnections may b
04f0: 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69  e created in thi
0500: 73 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 6f  s interpreter, o
0510: 72 20 69 6e 20 0a 20 20 20 20 23 20 69 6e 74 65  r in .    # inte
0520: 72 70 72 65 74 65 72 73 20 72 75 6e 6e 69 6e 67  rpreters running
0530: 20 69 6e 20 6f 74 68 65 72 20 4f 53 20 70 72 6f   in other OS pro
0540: 63 65 73 73 65 73 2e 20 41 73 20 73 75 63 68 2c  cesses. As such,
0550: 20 74 68 65 20 5b 64 62 32 5d 20 61 6e 64 20 5b   the [db2] and [
0560: 64 62 33 5d 0a 20 20 20 20 23 20 63 6f 6d 6d 61  db3].    # comma
0570: 6e 64 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  nds should only 
0580: 62 65 20 61 63 63 65 73 73 65 64 20 77 69 74 68  be accessed with
0590: 69 6e 20 5b 63 6f 64 65 32 5d 20 61 6e 64 20 5b  in [code2] and [
05a0: 63 6f 64 65 33 5d 20 62 6c 6f 63 6b 73 2c 0a 20  code3] blocks,. 
05b0: 20 20 20 23 20 72 65 73 70 65 63 74 69 76 65 6c     # respectivel
05c0: 79 2e 0a 20 20 20 20 23 0a 20 20 20 20 65 76 61  y..    #.    eva
05d0: 6c 20 24 63 6f 64 65 0a 20 20 20 20 63 6f 64 65  l $code.    code
05e0: 32 20 7b 20 73 71 6c 69 74 65 33 20 64 62 32 20  2 { sqlite3 db2 
05f0: 74 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 63 6f  test.db }.    co
0600: 64 65 33 20 7b 20 73 71 6c 69 74 65 33 20 64 62  de3 { sqlite3 db
0610: 33 20 74 65 73 74 2e 64 62 20 7d 0a 20 20 20 20  3 test.db }.    
0620: 0a 20 20 20 20 23 20 53 68 6f 72 74 68 61 6e 64  .    # Shorthand
0630: 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 78 65 63 75   commands. Execu
0640: 74 65 20 53 51 4c 20 75 73 69 6e 67 20 64 61 74  te SQL using dat
0650: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
0660: 20 5b 64 62 32 5d 20 6f 72 20 0a 20 20 20 20 23   [db2] or .    #
0670: 20 5b 64 62 33 5d 2e 20 52 65 74 75 72 6e 20 74   [db3]. Return t
0680: 68 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  he results..    
0690: 23 0a 20 20 20 20 70 72 6f 63 20 73 71 6c 31 20  #.    proc sql1 
06a0: 7b 73 71 6c 7d 20 7b 20 64 62 20 65 76 61 6c 20  {sql} { db eval 
06b0: 24 73 71 6c 20 7d 0a 20 20 20 20 70 72 6f 63 20  $sql }.    proc 
06c0: 73 71 6c 32 20 7b 73 71 6c 7d 20 7b 20 63 6f 64  sql2 {sql} { cod
06d0: 65 32 20 5b 6c 69 73 74 20 64 62 32 20 65 76 61  e2 [list db2 eva
06e0: 6c 20 24 73 71 6c 5d 20 7d 0a 20 20 20 20 70 72  l $sql] }.    pr
06f0: 6f 63 20 73 71 6c 33 20 7b 73 71 6c 7d 20 7b 20  oc sql3 {sql} { 
0700: 63 6f 64 65 33 20 5b 6c 69 73 74 20 64 62 33 20  code3 [list db3 
0710: 65 76 61 6c 20 24 73 71 6c 5d 20 7d 0a 20 20 0a  eval $sql] }.  .
0720: 20 20 20 20 70 72 6f 63 20 63 73 71 6c 31 20 7b      proc csql1 {
0730: 73 71 6c 7d 20 7b 20 6c 69 73 74 20 5b 63 61 74  sql} { list [cat
0740: 63 68 20 7b 20 73 71 6c 31 20 24 73 71 6c 20 7d  ch { sql1 $sql }
0750: 20 6d 73 67 5d 20 24 6d 73 67 20 7d 0a 20 20 20   msg] $msg }.   
0760: 20 70 72 6f 63 20 63 73 71 6c 32 20 7b 73 71 6c   proc csql2 {sql
0770: 7d 20 7b 20 6c 69 73 74 20 5b 63 61 74 63 68 20  } { list [catch 
0780: 7b 20 73 71 6c 32 20 24 73 71 6c 20 7d 20 6d 73  { sql2 $sql } ms
0790: 67 5d 20 24 6d 73 67 20 7d 0a 20 20 20 20 70 72  g] $msg }.    pr
07a0: 6f 63 20 63 73 71 6c 33 20 7b 73 71 6c 7d 20 7b  oc csql3 {sql} {
07b0: 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73   list [catch { s
07c0: 71 6c 33 20 24 73 71 6c 20 7d 20 6d 73 67 5d 20  ql3 $sql } msg] 
07d0: 24 6d 73 67 20 7d 0a 0a 20 20 20 20 75 70 6c 65  $msg }..    uple
07e0: 76 65 6c 20 73 65 74 20 24 76 61 72 6e 61 6d 65  vel set $varname
07f0: 20 24 74 6e 0a 20 20 20 20 75 70 6c 65 76 65 6c   $tn.    uplevel
0800: 20 24 73 63 72 69 70 74 0a 0a 20 20 20 20 63 61   $script..    ca
0810: 74 63 68 20 7b 20 63 6f 64 65 32 20 7b 20 64 62  tch { code2 { db
0820: 32 20 63 6c 6f 73 65 20 7d 20 7d 0a 20 20 20 20  2 close } }.    
0830: 63 61 74 63 68 20 7b 20 63 6f 64 65 33 20 7b 20  catch { code3 { 
0840: 64 62 33 20 63 6c 6f 73 65 20 7d 20 7d 0a 20 20  db3 close } }.  
0850: 20 20 63 61 74 63 68 20 7b 20 63 6c 6f 73 65 20    catch { close 
0860: 24 3a 3a 63 6f 64 65 32 5f 63 68 61 6e 20 7d 0a  $::code2_chan }.
0870: 20 20 20 20 63 61 74 63 68 20 7b 20 63 6c 6f 73      catch { clos
0880: 65 20 24 3a 3a 63 6f 64 65 33 5f 63 68 61 6e 20  e $::code3_chan 
0890: 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20 64 62  }.    catch { db
08a0: 20 63 6c 6f 73 65 20 7d 0a 20 20 7d 0a 7d 0a 0a   close }.  }.}..
08b0: 23 20 4c 61 75 6e 63 68 20 61 6e 6f 74 68 65 72  # Launch another
08c0: 20 74 65 73 74 66 69 78 74 75 72 65 20 70 72 6f   testfixture pro
08d0: 63 65 73 73 20 74 6f 20 62 65 20 63 6f 6e 74 72  cess to be contr
08e0: 6f 6c 6c 65 64 20 62 79 20 74 68 69 73 20 6f 6e  olled by this on
08f0: 65 2e 20 41 0a 23 20 63 68 61 6e 6e 65 6c 20 6e  e. A.# channel n
0900: 61 6d 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ame is returned 
0910: 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73  that may be pass
0920: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
0930: 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 72 6f 63  argument to proc
0940: 0a 23 20 27 74 65 73 74 66 69 78 74 75 72 65 27  .# 'testfixture'
0950: 20 74 6f 20 65 78 65 63 75 74 65 20 61 20 63 6f   to execute a co
0960: 6d 6d 61 6e 64 2e 20 54 68 65 20 63 68 69 6c 64  mmand. The child
0970: 20 74 65 73 74 66 69 78 74 75 72 65 20 70 72 6f   testfixture pro
0980: 63 65 73 73 20 69 73 20 73 68 75 74 0a 23 20 64  cess is shut.# d
0990: 6f 77 6e 20 62 79 20 63 6c 6f 73 69 6e 67 20 74  own by closing t
09a0: 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 70 72 6f 63  he channel..proc
09b0: 20 6c 61 75 6e 63 68 5f 74 65 73 74 66 69 78 74   launch_testfixt
09c0: 75 72 65 20 7b 7b 70 72 67 20 22 22 7d 7d 20 7b  ure {{prg ""}} {
09d0: 0a 20 20 77 72 69 74 65 5f 6d 61 69 6e 5f 6c 6f  .  write_main_lo
09e0: 6f 70 0a 20 20 69 66 20 7b 24 70 72 67 20 65 71  op.  if {$prg eq
09f0: 20 22 22 7d 20 7b 20 73 65 74 20 70 72 67 20 5b   ""} { set prg [
0a00: 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65 63 5d  info nameofexec]
0a10: 20 7d 0a 20 20 69 66 20 7b 24 70 72 67 20 65 71   }.  if {$prg eq
0a20: 20 22 22 7d 20 7b 20 73 65 74 20 70 72 67 20 74   ""} { set prg t
0a30: 65 73 74 66 69 78 74 75 72 65 20 7d 0a 20 20 69  estfixture }.  i
0a40: 66 20 7b 5b 66 69 6c 65 20 74 61 69 6c 20 24 70  f {[file tail $p
0a50: 72 67 5d 3d 3d 24 70 72 67 7d 20 7b 20 73 65 74  rg]==$prg} { set
0a60: 20 70 72 67 20 5b 66 69 6c 65 20 6a 6f 69 6e 20   prg [file join 
0a70: 2e 20 24 70 72 67 5d 20 7d 0a 20 20 73 65 74 20  . $prg] }.  set 
0a80: 63 68 61 6e 20 5b 6f 70 65 6e 20 22 7c 24 70 72  chan [open "|$pr
0a90: 67 20 74 66 5f 6d 61 69 6e 2e 74 63 6c 22 20 72  g tf_main.tcl" r
0aa0: 2b 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72 65 20  +].  fconfigure 
0ab0: 24 63 68 61 6e 20 2d 62 75 66 66 65 72 69 6e 67  $chan -buffering
0ac0: 20 6c 69 6e 65 0a 20 20 73 65 74 20 72 63 20 5b   line.  set rc [
0ad0: 63 61 74 63 68 20 7b 20 0a 20 20 20 20 74 65 73  catch { .    tes
0ae0: 74 66 69 78 74 75 72 65 20 24 63 68 61 6e 20 22  tfixture $chan "
0af0: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
0b00: 74 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79 74  trol_pending_byt
0b10: 65 20 24 3a 3a 73 71 6c 69 74 65 5f 70 65 6e 64  e $::sqlite_pend
0b20: 69 6e 67 5f 62 79 74 65 22 0a 20 20 7d 5d 0a 20  ing_byte".  }]. 
0b30: 20 69 66 20 7b 24 72 63 7d 20 7b 0a 20 20 20 20   if {$rc} {.    
0b40: 74 65 73 74 66 69 78 74 75 72 65 20 24 63 68 61  testfixture $cha
0b50: 6e 20 22 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f  n "set ::sqlite_
0b60: 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 24 3a 3a  pending_byte $::
0b70: 73 71 6c 69 74 65 5f 70 65 6e 64 69 6e 67 5f 62  sqlite_pending_b
0b80: 79 74 65 22 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte".  }.  retur
0b90: 6e 20 24 63 68 61 6e 0a 7d 0a 0a 23 20 45 78 65  n $chan.}..# Exe
0ba0: 63 75 74 65 20 61 20 63 6f 6d 6d 61 6e 64 20 69  cute a command i
0bb0: 6e 20 61 20 63 68 69 6c 64 20 74 65 73 74 66 69  n a child testfi
0bc0: 78 74 75 72 65 20 70 72 6f 63 65 73 73 2c 20 63  xture process, c
0bd0: 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 77 6f 2d  onnected by two-
0be0: 77 61 79 0a 23 20 63 68 61 6e 6e 65 6c 20 24 63  way.# channel $c
0bf0: 68 61 6e 2e 20 52 65 74 75 72 6e 20 74 68 65 20  han. Return the 
0c00: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  result of the co
0c10: 6d 6d 61 6e 64 2c 20 6f 72 20 61 6e 20 65 72 72  mmand, or an err
0c20: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 23 0a 70 72  or message..#.pr
0c30: 6f 63 20 74 65 73 74 66 69 78 74 75 72 65 20 7b  oc testfixture {
0c40: 63 68 61 6e 20 63 6d 64 20 61 72 67 73 7d 20 7b  chan cmd args} {
0c50: 0a 0a 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68  ..  if {[llength
0c60: 20 24 61 72 67 73 5d 20 3d 3d 20 30 7d 20 7b 0a   $args] == 0} {.
0c70: 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24      fconfigure $
0c80: 63 68 61 6e 20 2d 62 6c 6f 63 6b 69 6e 67 20 31  chan -blocking 1
0c90: 0a 20 20 20 20 70 75 74 73 20 24 63 68 61 6e 20  .    puts $chan 
0ca0: 24 63 6d 64 0a 20 20 20 20 70 75 74 73 20 24 63  $cmd.    puts $c
0cb0: 68 61 6e 20 4f 56 45 52 0a 0a 20 20 20 20 73 65  han OVER..    se
0cc0: 74 20 72 20 22 22 0a 20 20 20 20 77 68 69 6c 65  t r "".    while
0cd0: 20 7b 20 31 20 7d 20 7b 0a 20 20 20 20 20 20 73   { 1 } {.      s
0ce0: 65 74 20 6c 69 6e 65 20 5b 67 65 74 73 20 24 63  et line [gets $c
0cf0: 68 61 6e 5d 0a 20 20 20 20 20 20 69 66 20 7b 20  han].      if { 
0d00: 24 6c 69 6e 65 20 3d 3d 20 22 4f 56 45 52 22 20  $line == "OVER" 
0d10: 7d 20 7b 20 0a 20 20 20 20 20 20 20 20 73 65 74  } { .        set
0d20: 20 72 65 73 20 5b 6c 69 6e 64 65 78 20 24 72 20   res [lindex $r 
0d30: 31 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20  1].        if { 
0d40: 5b 6c 69 6e 64 65 78 20 24 72 20 30 5d 20 7d 20  [lindex $r 0] } 
0d50: 7b 20 65 72 72 6f 72 20 24 72 65 73 20 7d 0a 20  { error $res }. 
0d60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72         return $r
0d70: 65 73 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  es.      }.     
0d80: 20 69 66 20 7b 5b 65 6f 66 20 24 63 68 61 6e 5d   if {[eof $chan]
0d90: 7d 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  } {.        retu
0da0: 72 6e 20 22 45 52 52 4f 52 3a 20 43 68 69 6c 64  rn "ERROR: Child
0db0: 20 70 72 6f 63 65 73 73 20 68 75 6e 67 20 75 70   process hung up
0dc0: 22 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ".      }.      
0dd0: 61 70 70 65 6e 64 20 72 20 24 6c 69 6e 65 0a 20  append r $line. 
0de0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
0df0: 24 72 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  $r.  } else {.  
0e00: 20 20 73 65 74 20 3a 3a 74 66 6e 62 28 24 63 68    set ::tfnb($ch
0e10: 61 6e 29 20 22 22 0a 20 20 20 20 66 63 6f 6e 66  an) "".    fconf
0e20: 69 67 75 72 65 20 24 63 68 61 6e 20 2d 62 6c 6f  igure $chan -blo
0e30: 63 6b 69 6e 67 20 30 20 2d 62 75 66 66 65 72 69  cking 0 -bufferi
0e40: 6e 67 20 6e 6f 6e 65 0a 20 20 20 20 70 75 74 73  ng none.    puts
0e50: 20 24 63 68 61 6e 20 24 63 6d 64 0a 20 20 20 20   $chan $cmd.    
0e60: 70 75 74 73 20 24 63 68 61 6e 20 4f 56 45 52 0a  puts $chan OVER.
0e70: 20 20 20 20 66 69 6c 65 65 76 65 6e 74 20 24 63      fileevent $c
0e80: 68 61 6e 20 72 65 61 64 61 62 6c 65 20 5b 6c 69  han readable [li
0e90: 73 74 20 74 65 73 74 66 69 78 74 75 72 65 5f 73  st testfixture_s
0ea0: 63 72 69 70 74 5f 63 62 20 24 63 68 61 6e 20 5b  cript_cb $chan [
0eb0: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 5d  lindex $args 0]]
0ec0: 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a 20  .    return "". 
0ed0: 20 7d 0a 7d 0a 0a 70 72 6f 63 20 74 65 73 74 66   }.}..proc testf
0ee0: 69 78 74 75 72 65 5f 73 63 72 69 70 74 5f 63 62  ixture_script_cb
0ef0: 20 7b 63 68 61 6e 20 73 63 72 69 70 74 7d 20 7b   {chan script} {
0f00: 0a 20 20 69 66 20 7b 5b 65 6f 66 20 24 63 68 61  .  if {[eof $cha
0f10: 6e 5d 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64  n]} {.    append
0f20: 20 3a 3a 74 66 6e 62 28 24 63 68 61 6e 29 20 22   ::tfnb($chan) "
0f30: 45 52 52 4f 52 3a 20 43 68 69 6c 64 20 70 72 6f  ERROR: Child pro
0f40: 63 65 73 73 20 68 75 6e 67 20 75 70 22 0a 20 20  cess hung up".  
0f50: 20 20 73 65 74 20 6c 69 6e 65 20 22 4f 56 45 52    set line "OVER
0f60: 22 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ".  } else {.   
0f70: 20 73 65 74 20 6c 69 6e 65 20 5b 67 65 74 73 20   set line [gets 
0f80: 24 63 68 61 6e 5d 0a 20 20 7d 0a 0a 20 20 69 66  $chan].  }..  if
0f90: 20 7b 20 24 6c 69 6e 65 20 3d 3d 20 22 4f 56 45   { $line == "OVE
0fa0: 52 22 20 7d 20 7b 0a 20 20 20 20 75 70 6c 65 76  R" } {.    uplev
0fb0: 65 6c 20 23 30 20 24 73 63 72 69 70 74 20 5b 6c  el #0 $script [l
0fc0: 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 3a 3a 74  ist [lindex $::t
0fd0: 66 6e 62 28 24 63 68 61 6e 29 20 31 5d 5d 0a 20  fnb($chan) 1]]. 
0fe0: 20 20 20 75 6e 73 65 74 20 3a 3a 74 66 6e 62 28     unset ::tfnb(
0ff0: 24 63 68 61 6e 29 0a 20 20 20 20 66 69 6c 65 65  $chan).    filee
1000: 76 65 6e 74 20 24 63 68 61 6e 20 72 65 61 64 61  vent $chan reada
1010: 62 6c 65 20 22 22 0a 20 20 7d 20 65 6c 73 65 20  ble "".  } else 
1020: 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 3a 3a 74  {.    append ::t
1030: 66 6e 62 28 24 63 68 61 6e 29 20 24 6c 69 6e 65  fnb($chan) $line
1040: 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 74 65 73  .  }.}..proc tes
1050: 74 66 69 78 74 75 72 65 5f 6e 62 5f 63 62 20 7b  tfixture_nb_cb {
1060: 76 61 72 6e 61 6d 65 20 63 68 61 6e 7d 20 7b 0a  varname chan} {.
1070: 20 20 69 66 20 7b 5b 65 6f 66 20 24 63 68 61 6e    if {[eof $chan
1080: 5d 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20  ]} {.    append 
1090: 3a 3a 74 66 6e 62 28 24 63 68 61 6e 29 20 22 45  ::tfnb($chan) "E
10a0: 52 52 4f 52 3a 20 43 68 69 6c 64 20 70 72 6f 63  RROR: Child proc
10b0: 65 73 73 20 68 75 6e 67 20 75 70 22 0a 20 20 20  ess hung up".   
10c0: 20 73 65 74 20 6c 69 6e 65 20 22 4f 56 45 52 22   set line "OVER"
10d0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
10e0: 73 65 74 20 6c 69 6e 65 20 5b 67 65 74 73 20 24  set line [gets $
10f0: 63 68 61 6e 5d 0a 20 20 7d 0a 0a 20 20 69 66 20  chan].  }..  if 
1100: 7b 20 24 6c 69 6e 65 20 3d 3d 20 22 4f 56 45 52  { $line == "OVER
1110: 22 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 24 76  " } {.    set $v
1120: 61 72 6e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24  arname [lindex $
1130: 3a 3a 74 66 6e 62 28 24 63 68 61 6e 29 20 31 5d  ::tfnb($chan) 1]
1140: 0a 20 20 20 20 75 6e 73 65 74 20 3a 3a 74 66 6e  .    unset ::tfn
1150: 62 28 24 63 68 61 6e 29 0a 20 20 20 20 63 6c 6f  b($chan).    clo
1160: 73 65 20 24 63 68 61 6e 0a 20 20 7d 20 65 6c 73  se $chan.  } els
1170: 65 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 3a  e {.    append :
1180: 3a 74 66 6e 62 28 24 63 68 61 6e 29 20 24 6c 69  :tfnb($chan) $li
1190: 6e 65 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 74  ne.  }.}..proc t
11a0: 65 73 74 66 69 78 74 75 72 65 5f 6e 62 20 7b 76  estfixture_nb {v
11b0: 61 72 6e 61 6d 65 20 63 6d 64 7d 20 7b 0a 20 20  arname cmd} {.  
11c0: 73 65 74 20 63 68 61 6e 20 5b 6c 61 75 6e 63 68  set chan [launch
11d0: 5f 74 65 73 74 66 69 78 74 75 72 65 5d 0a 20 20  _testfixture].  
11e0: 73 65 74 20 3a 3a 74 66 6e 62 28 24 63 68 61 6e  set ::tfnb($chan
11f0: 29 20 22 22 0a 20 20 66 63 6f 6e 66 69 67 75 72  ) "".  fconfigur
1200: 65 20 24 63 68 61 6e 20 2d 62 6c 6f 63 6b 69 6e  e $chan -blockin
1210: 67 20 30 20 2d 62 75 66 66 65 72 69 6e 67 20 6e  g 0 -buffering n
1220: 6f 6e 65 0a 20 20 70 75 74 73 20 24 63 68 61 6e  one.  puts $chan
1230: 20 24 63 6d 64 0a 20 20 70 75 74 73 20 24 63 68   $cmd.  puts $ch
1240: 61 6e 20 4f 56 45 52 0a 20 20 66 69 6c 65 65 76  an OVER.  fileev
1250: 65 6e 74 20 24 63 68 61 6e 20 72 65 61 64 61 62  ent $chan readab
1260: 6c 65 20 5b 6c 69 73 74 20 74 65 73 74 66 69 78  le [list testfix
1270: 74 75 72 65 5f 6e 62 5f 63 62 20 24 76 61 72 6e  ture_nb_cb $varn
1280: 61 6d 65 20 24 63 68 61 6e 5d 0a 20 20 72 65 74  ame $chan].  ret
1290: 75 72 6e 20 22 22 0a 7d 0a 0a 23 20 57 72 69 74  urn "".}..# Writ
12a0: 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20  e the main loop 
12b0: 66 6f 72 20 74 68 65 20 63 68 69 6c 64 20 74 65  for the child te
12c0: 73 74 66 69 78 74 75 72 65 20 70 72 6f 63 65 73  stfixture proces
12d0: 73 65 73 20 69 6e 74 6f 20 66 69 6c 65 0a 23 20  ses into file.# 
12e0: 74 66 5f 6d 61 69 6e 2e 74 63 6c 2e 20 54 68 65  tf_main.tcl. The
12f0: 20 70 61 72 65 6e 74 20 28 74 68 69 73 20 73 63   parent (this sc
1300: 72 69 70 74 29 20 69 6e 74 65 72 61 63 74 73 20  ript) interacts 
1310: 77 69 74 68 20 74 68 65 20 63 68 69 6c 64 20 70  with the child p
1320: 72 6f 63 65 73 73 65 73 0a 23 20 76 69 61 20 61  rocesses.# via a
1330: 20 74 77 6f 20 77 61 79 20 70 69 70 65 2e 20 54   two way pipe. T
1340: 68 65 20 70 61 72 65 6e 74 20 77 72 69 74 65 73  he parent writes
1350: 20 61 20 73 63 72 69 70 74 20 74 6f 20 74 68 65   a script to the
1360: 20 73 74 64 69 6e 20 6f 66 20 74 68 65 20 63 68   stdin of the ch
1370: 69 6c 64 0a 23 20 70 72 6f 63 65 73 73 2c 20 66  ild.# process, f
1380: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 77  ollowed by the w
1390: 6f 72 64 20 22 4f 56 45 52 22 20 6f 6e 20 61 20  ord "OVER" on a 
13a0: 6c 69 6e 65 20 6f 66 20 69 74 73 20 6f 77 6e 2e  line of its own.
13b0: 20 54 68 65 20 63 68 69 6c 64 0a 23 20 70 72 6f   The child.# pro
13c0: 63 65 73 73 20 65 76 61 6c 75 61 74 65 73 20 74  cess evaluates t
13d0: 68 65 20 73 63 72 69 70 74 20 61 6e 64 20 77 72  he script and wr
13e0: 69 74 65 73 20 74 68 65 20 72 65 73 75 6c 74 73  ites the results
13f0: 20 74 6f 20 73 74 64 6f 75 74 2c 20 66 6f 6c 6c   to stdout, foll
1400: 6f 77 65 64 0a 23 20 62 79 20 61 6e 20 22 4f 56  owed.# by an "OV
1410: 45 52 22 20 6f 66 20 69 74 73 20 6f 77 6e 2e 0a  ER" of its own..
1420: 23 0a 73 65 74 20 6d 61 69 6e 5f 6c 6f 6f 70 5f  #.set main_loop_
1430: 77 72 69 74 74 65 6e 20 30 0a 70 72 6f 63 20 77  written 0.proc w
1440: 72 69 74 65 5f 6d 61 69 6e 5f 6c 6f 6f 70 20 7b  rite_main_loop {
1450: 7d 20 7b 0a 20 20 69 66 20 7b 24 3a 3a 6d 61 69  } {.  if {$::mai
1460: 6e 5f 6c 6f 6f 70 5f 77 72 69 74 74 65 6e 7d 20  n_loop_written} 
1470: 72 65 74 75 72 6e 0a 20 20 73 65 74 20 77 72 61  return.  set wra
1480: 70 70 65 72 20 22 22 0a 20 20 69 66 20 7b 5b 73  pper "".  if {[s
1490: 71 6c 69 74 65 33 20 2d 68 61 73 2d 63 6f 64 65  qlite3 -has-code
14a0: 63 5d 20 26 26 20 5b 69 6e 66 6f 20 65 78 69 73  c] && [info exis
14b0: 74 73 20 3a 3a 64 6f 5f 6e 6f 74 5f 75 73 65 5f  ts ::do_not_use_
14c0: 63 6f 64 65 63 5d 3d 3d 30 7d 20 7b 0a 20 20 20  codec]==0} {.   
14d0: 20 73 65 74 20 77 72 61 70 70 65 72 20 22 0a 20   set wrapper ". 
14e0: 20 20 20 20 20 72 65 6e 61 6d 65 20 73 71 6c 69       rename sqli
14f0: 74 65 33 20 73 71 6c 69 74 65 5f 6f 72 69 67 0a  te3 sqlite_orig.
1500: 20 20 20 20 20 20 70 72 6f 63 20 73 71 6c 69 74        proc sqlit
1510: 65 33 20 7b 61 72 67 73 7d 20 7b 5b 69 6e 66 6f  e3 {args} {[info
1520: 20 62 6f 64 79 20 73 71 6c 69 74 65 33 5d 7d 0a   body sqlite3]}.
1530: 20 20 20 20 22 0a 20 20 7d 0a 0a 20 20 73 65 74      ".  }..  set
1540: 20 66 64 20 5b 6f 70 65 6e 20 74 66 5f 6d 61 69   fd [open tf_mai
1550: 6e 2e 74 63 6c 20 77 5d 0a 20 20 70 75 74 73 20  n.tcl w].  puts 
1560: 24 66 64 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  $fd [string map 
1570: 5b 6c 69 73 74 20 25 57 52 41 50 50 45 52 25 20  [list %WRAPPER% 
1580: 24 77 72 61 70 70 65 72 5d 20 7b 0a 20 20 20 20  $wrapper] {.    
1590: 25 57 52 41 50 50 45 52 25 0a 20 20 20 20 73 65  %WRAPPER%.    se
15a0: 74 20 73 63 72 69 70 74 20 22 22 0a 20 20 20 20  t script "".    
15b0: 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64  while {![eof std
15c0: 69 6e 5d 7d 20 7b 0a 20 20 20 20 20 20 66 6c 75  in]} {.      flu
15d0: 73 68 20 73 74 64 6f 75 74 0a 20 20 20 20 20 20  sh stdout.      
15e0: 73 65 74 20 6c 69 6e 65 20 5b 67 65 74 73 20 73  set line [gets s
15f0: 74 64 69 6e 5d 0a 20 20 20 20 20 20 69 66 20 7b  tdin].      if {
1600: 20 24 6c 69 6e 65 20 3d 3d 20 22 4f 56 45 52 22   $line == "OVER"
1610: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74   } {.        set
1620: 20 72 63 20 5b 63 61 74 63 68 20 7b 65 76 61 6c   rc [catch {eval
1630: 20 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74   $script} result
1640: 5d 0a 20 20 20 20 20 20 20 20 70 75 74 73 20 5b  ].        puts [
1650: 6c 69 73 74 20 24 72 63 20 24 72 65 73 75 6c 74  list $rc $result
1660: 5d 0a 20 20 20 20 20 20 20 20 70 75 74 73 20 4f  ].        puts O
1670: 56 45 52 0a 20 20 20 20 20 20 20 20 66 6c 75 73  VER.        flus
1680: 68 20 73 74 64 6f 75 74 0a 20 20 20 20 20 20 20  h stdout.       
1690: 20 73 65 74 20 73 63 72 69 70 74 20 22 22 0a 20   set script "". 
16a0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
16b0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 73 63 72        append scr
16c0: 69 70 74 20 24 6c 69 6e 65 0a 20 20 20 20 20 20  ipt $line.      
16d0: 20 20 61 70 70 65 6e 64 20 73 63 72 69 70 74 20    append script 
16e0: 22 5c 6e 22 0a 20 20 20 20 20 20 7d 0a 20 20 20  "\n".      }.   
16f0: 20 7d 0a 20 20 7d 5d 0a 20 20 63 6c 6f 73 65 20   }.  }].  close 
1700: 24 66 64 0a 20 20 73 65 74 20 6d 61 69 6e 5f 6c  $fd.  set main_l
1710: 6f 6f 70 5f 77 72 69 74 74 65 6e 20 31 0a 7d 0a  oop_written 1.}.
1720: 0a                                               .