System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 0814bb6a96fa89eca4f725c2b03835ceae32b071:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 73 74 72 65 73 73 2e 65 61 67  .#..# stress.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 70 61 63 6b 61 67 65 20 72 65  ##....package re
0120: 71 75 69 72 65 20 45 61 67 6c 65 0d 0a 70 61 63  quire Eagle..pac
0130: 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
0140: 6c 65 2e 4c 69 62 72 61 72 79 0d 0a 70 61 63 6b  le.Library..pack
0150: 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
0160: 65 2e 54 65 73 74 0d 0a 0d 0a 72 75 6e 54 65 73  e.Test....runTes
0170: 74 50 72 6f 6c 6f 67 75 65 0d 0a 0d 0a 23 23 23  tPrologue....###
0180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01c0: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
01d0: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
01e0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
01f0: 74 65 2e 54 65 73 74 0d 0a 72 75 6e 53 51 4c 69  te.Test..runSQLi
0200: 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 0d 0a  teTestPrologue..
0210: 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
0220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 0d 0a 0d 0a 72 75 6e 54 65 73 74 20 7b 74 65  #....runTest {te
0270: 73 74 20 73 74 72 65 73 73 2d 31 2e 31 20 7b 6d  st stress-1.1 {m
0280: 75 6c 74 69 74 68 72 65 61 64 65 64 20 73 74 72  ultithreaded str
0290: 65 73 73 20 74 65 73 74 69 6e 67 7d 20 2d 73 65  ess testing} -se
02a0: 74 75 70 20 7b 0d 0a 20 20 75 6e 73 65 74 20 2d  tup {..  unset -
02b0: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 68 72 65 61  nocomplain threa
02c0: 64 20 69 6e 64 65 78 20 77 6f 72 6b 6c 6f 61 64  d index workload
02d0: 20 73 72 63 44 62 20 64 62 20 66 69 6c 65 4e 61   srcDb db fileNa
02e0: 6d 65 20 63 6f 6d 70 69 6c 65 64 20 6f 70 74 69  me compiled opti
02f0: 6f 6e 73 20 5c 0d 0a 20 20 20 20 20 20 63 6f 75  ons \..      cou
0300: 6e 74 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23  nt....  ########
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0350: 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20  #####....  proc 
0360: 65 78 70 65 63 74 65 64 45 72 72 6f 72 20 7b 20  expectedError { 
0370: 65 72 72 6f 72 20 7d 20 7b 0d 0a 20 20 20 20 72  error } {..    r
0380: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 72 65  eturn [expr {[re
0390: 67 65 78 70 20 2d 2d 20 7b 5c 73 6e 6f 20 73 75  gexp -- {\sno su
03a0: 63 68 20 74 61 62 6c 65 3a 20 74 31 5c 73 7d 20  ch table: t1\s} 
03b0: 24 65 72 72 6f 72 5d 20 7c 7c 20 5c 0d 0a 20 20  $error] || \..  
03c0: 20 20 20 20 20 20 5b 72 65 67 65 78 70 20 2d 2d        [regexp --
03d0: 20 7b 5c 73 64 61 74 61 62 61 73 65 20 69 73 20   {\sdatabase is 
03e0: 6c 6f 63 6b 65 64 5c 73 7d 20 24 65 72 72 6f 72  locked\s} $error
03f0: 5d 7d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23  ]}]..  }....  ##
0400: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0410: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0440: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
0450: 20 70 72 6f 63 20 73 68 6f 77 54 65 73 74 20 7b   proc showTest {
0460: 20 69 6e 64 69 63 61 74 6f 72 20 7d 20 7b 0d 0a   indicator } {..
0470: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
0480: 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 64 69 63  t_channel $indic
0490: 61 74 6f 72 0d 0a 20 20 20 20 61 66 74 65 72 20  ator..    after 
04a0: 5b 65 78 70 72 20 7b 69 6e 74 28 72 61 6e 64 28  [expr {int(rand(
04b0: 29 20 2a 20 31 30 30 30 29 7d 5d 0d 0a 20 20 7d  ) * 1000)}]..  }
04c0: 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23  ....  ##########
04d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0500: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0510: 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20 66 61  ###....  proc fa
0520: 69 6c 54 65 73 74 20 7b 20 65 72 72 6f 72 20 7d  ilTest { error }
0530: 20 7b 0d 0a 20 20 20 20 73 65 74 20 6c 65 76 65   {..    set leve
0540: 6c 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 6c  l [expr {[info l
0550: 65 76 65 6c 5d 20 2d 20 31 7d 5d 0d 0a 0d 0a 20  evel] - 1}].... 
0560: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
0570: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
0580: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
0590: 5c 6e 20 5b 69 6e 66 6f 20 6c 65 76 65 6c 20 24  \n [info level $
05a0: 6c 65 76 65 6c 5d 20 22 3a 20 22 20 24 65 72 72  level] ": " $err
05b0: 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 65 78  or \n]....    ex
05c0: 69 74 20 46 61 69 6c 75 72 65 3b 20 23 20 68 61  it Failure; # ha
05d0: 6c 74 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 6e  lt all testing n
05e0: 6f 77 2e 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23  ow...  }....  ##
05f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0600: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0610: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0620: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0630: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
0640: 20 73 65 74 20 63 6f 75 6e 74 28 30 29 20 31 0d   set count(0) 1.
0650: 0a 20 20 73 65 74 20 63 6f 75 6e 74 28 31 29 20  .  set count(1) 
0660: 35 0d 0a 0d 0a 20 20 69 66 20 7b 5b 69 6e 66 6f  5....  if {[info
0670: 20 65 78 69 73 74 73 20 61 72 67 76 5d 20 26 26   exists argv] &&
0680: 20 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 76 5d   [llength $argv]
0690: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
06a0: 20 20 70 61 72 73 65 20 6f 70 74 69 6f 6e 73 20    parse options 
06b0: 2d 66 6c 61 67 73 20 5c 0d 0a 20 20 20 20 20 20  -flags \..      
06c0: 20 20 7b 2d 53 74 6f 70 4f 6e 55 6e 6b 6e 6f 77    {-StopOnUnknow
06d0: 6e 20 2b 49 67 6e 6f 72 65 4f 6e 55 6e 6b 6e 6f  n +IgnoreOnUnkno
06e0: 77 6e 20 53 6b 69 70 4f 6e 55 6e 6b 6e 6f 77 6e  wn SkipOnUnknown
06f0: 7d 20 2d 2d 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  } -- [list \..  
0700: 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c        [list null
0710: 20 4d 75 73 74 48 61 76 65 49 6e 74 65 67 65 72   MustHaveInteger
0720: 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 63 6f 75  Value -1 -1 -cou
0730: 6e 74 30 20 24 63 6f 75 6e 74 28 30 29 5d 20 5c  nt0 $count(0)] \
0740: 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20  ..        [list 
0750: 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 49 6e 74  null MustHaveInt
0760: 65 67 65 72 56 61 6c 75 65 20 2d 31 20 2d 31 20  egerValue -1 -1 
0770: 2d 63 6f 75 6e 74 31 20 24 63 6f 75 6e 74 28 31  -count1 $count(1
0780: 29 5d 5d 20 24 61 72 67 76 0d 0a 0d 0a 20 20 20  )]] $argv....   
0790: 20 73 65 74 20 63 6f 75 6e 74 28 30 29 20 24 6f   set count(0) $o
07a0: 70 74 69 6f 6e 73 28 2d 63 6f 75 6e 74 30 2c 76  ptions(-count0,v
07b0: 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74 20 63  alue)..    set c
07c0: 6f 75 6e 74 28 31 29 20 24 6f 70 74 69 6f 6e 73  ount(1) $options
07d0: 28 2d 63 6f 75 6e 74 31 2c 76 61 6c 75 65 29 0d  (-count1,value).
07e0: 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23  .  }....  ######
07f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0800: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0810: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0820: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0830: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 74 70 75  #######....  tpu
0840: 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  ts $test_channel
0850: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
0860: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77 6f 72 6b        "---- work
0870: 6c 6f 61 64 73 20 77 69 6c 6c 20 72 65 70 65 61  loads will repea
0880: 74 20 22 20 24 63 6f 75 6e 74 28 30 29 20 22 20  t " $count(0) " 
0890: 74 69 6d 65 28 73 29 2e 2e 2e 5c 6e 22 5d 0d 0a  time(s)...\n"]..
08a0: 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f  ..  tputs $test_
08b0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
08c0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d  rgs \..      "--
08d0: 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20 77 69 6c  -- workloads wil
08e0: 6c 20 68 61 76 65 20 22 20 24 63 6f 75 6e 74 28  l have " $count(
08f0: 31 29 20 22 20 69 74 65 72 61 74 69 6f 6e 28 73  1) " iteration(s
0900: 29 2e 2e 2e 5c 6e 22 5d 0d 0a 0d 0a 20 20 23 23  )...\n"]....  ##
0910: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0920: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0930: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0940: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0950: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
0960: 20 73 65 74 20 63 6f 6d 70 69 6c 65 64 28 31 32   set compiled(12
0970: 29 20 22 22 0d 0a 20 20 73 65 74 20 63 6f 6d 70  ) ""..  set comp
0980: 69 6c 65 64 28 31 33 29 20 22 22 0d 0a 0d 0a 20  iled(13) "".... 
0990: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
09a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
09b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
09c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
09d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
09e0: 0d 0a 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65  ..  set fileName
09f0: 28 31 29 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72  (1) "file::memor
0a00: 79 3a 3f 63 61 63 68 65 3d 73 68 61 72 65 64 22  y:?cache=shared"
0a10: 0d 0a 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65  ..  set fileName
0a20: 28 32 29 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  (2) [file join [
0a30: 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
0a40: 74 6f 72 79 5d 20 73 74 72 65 73 73 2e 64 62 5d  tory] stress.db]
0a50: 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23  ....  ##########
0a60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0a80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0a90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0aa0: 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20  ###....  #..  # 
0ab0: 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
0ac0: 74 6f 20 72 65 6d 6f 76 65 20 61 6e 79 20 73 74  to remove any st
0ad0: 61 6c 65 20 64 61 74 61 62 61 73 65 20 66 72 6f  ale database fro
0ae0: 6d 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 20  m previous test 
0af0: 72 75 6e 73 2e 0d 0a 20 20 23 0d 0a 20 20 63 6c  runs...  #..  cl
0b00: 65 61 6e 75 70 46 69 6c 65 20 24 66 69 6c 65 4e  eanupFile $fileN
0b10: 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 23 23 23 23  ame(2)....  ####
0b20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b60: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73  #########....  s
0b70: 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  etupDb $fileName
0b80: 28 31 29 20 22 22 20 22 22 20 22 22 20 22 22 20  (1) "" "" "" "" 
0b90: 22 22 20 66 61 6c 73 65 20 66 61 6c 73 65 20 74  "" false false t
0ba0: 72 75 65 20 73 72 63 44 62 0d 0a 20 20 73 65 74  rue srcDb..  set
0bb0: 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 28 32  upDb $fileName(2
0bc0: 29 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  )....  #########
0bd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0be0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0bf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0c00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0c10: 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f  ####....  set wo
0c20: 72 6b 6c 6f 61 64 28 31 29 20 5b 6c 69 73 74 20  rkload(1) [list 
0c30: 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d  [list srcFileNam
0c40: 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61  e dstFileName ta
0c50: 62 6c 65 20 63 6f 75 6e 74 5d 20 7b 0d 0a 20 20  ble count] {..  
0c60: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
0c70: 20 57 6f 72 6b 6c 6f 61 64 20 23 31 2c 20 43 52   Workload #1, CR
0c80: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
0c90: 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20  ments...    #.. 
0ca0: 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d     lappend ::tim
0cb0: 65 73 28 31 29 20 5b 6c 69 6e 64 65 78 20 5b 74  es(1) [lindex [t
0cc0: 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  ime {..      set
0cd0: 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d  upDb $dstFileNam
0ce0: 65 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22  e "" "" "" "" ""
0cf0: 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20   true false..   
0d00: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
0d10: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65  .        for {se
0d20: 74 20 69 6e 64 65 78 20 32 7d 20 7b 24 69 6e 64  t index 2} {$ind
0d30: 65 78 20 3c 3d 20 24 63 6f 75 6e 74 7d 20 7b 69  ex <= $count} {i
0d40: 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
0d50: 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
0d60: 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41  ute $db [appendA
0d70: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
0d80: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
0d90: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
0da0: 20 74 22 20 24 69 6e 64 65 78 20 22 28 78 20 50   t" $index "(x P
0db0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 2c 20 7a  RIMARY KEY, y, z
0dc0: 29 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  );"]..          
0dd0: 73 68 6f 77 54 65 73 74 20 31 0d 0a 20 20 20 20  showTest 1..    
0de0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
0df0: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
0e00: 20 20 20 20 20 20 20 69 66 20 7b 5b 65 78 70 65         if {[expe
0e10: 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72  ctedError $error
0e20: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
0e30: 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 2a 0d       showTest *.
0e40: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
0e50: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 61 69  {..          fai
0e60: 6c 54 65 73 74 20 24 65 72 72 6f 72 0d 0a 20 20  lTest $error..  
0e70: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
0e80: 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44  ..      cleanupD
0e90: 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64  b $dstFileName d
0ea0: 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c  b false true fal
0eb0: 73 65 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20  se..    }] 0].. 
0ec0: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
0ed0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0ee0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0ef0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0f00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0f10: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20  ######....  set 
0f20: 77 6f 72 6b 6c 6f 61 64 28 32 29 20 5b 6c 69 73  workload(2) [lis
0f30: 74 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e  t [list srcFileN
0f40: 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20  ame dstFileName 
0f50: 74 61 62 6c 65 20 63 6f 75 6e 74 5d 20 7b 0d 0a  table count] {..
0f60: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
0f70: 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 32 2c 20  E: Workload #2, 
0f80: 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65  DROP TABLE state
0f90: 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20  ments...    #.. 
0fa0: 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d     lappend ::tim
0fb0: 65 73 28 32 29 20 5b 6c 69 6e 64 65 78 20 5b 74  es(2) [lindex [t
0fc0: 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  ime {..      set
0fd0: 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d  upDb $dstFileNam
0fe0: 65 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22  e "" "" "" "" ""
0ff0: 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20   true false..   
1000: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1010: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65  .        for {se
1020: 74 20 69 6e 64 65 78 20 32 7d 20 7b 24 69 6e 64  t index 2} {$ind
1030: 65 78 20 3c 3d 20 24 63 6f 75 6e 74 7d 20 7b 69  ex <= $count} {i
1040: 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
1050: 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
1060: 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41  ute $db [appendA
1070: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1080: 20 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45       "DROP TABLE
1090: 20 49 46 20 45 58 49 53 54 53 20 74 22 20 24 69   IF EXISTS t" $i
10a0: 6e 64 65 78 20 5c 3b 5d 0d 0a 20 20 20 20 20 20  ndex \;]..      
10b0: 20 20 20 20 73 68 6f 77 54 65 73 74 20 32 0d 0a      showTest 2..
10c0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10d0: 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
10e0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
10f0: 65 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65  expectedError $e
1100: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
1110: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
1120: 74 20 2a 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  t *..        } e
1130: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1140: 20 66 61 69 6c 54 65 73 74 20 24 65 72 72 6f 72   failTest $error
1150: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1160: 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61     }..      clea
1170: 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61  nupDb $dstFileNa
1180: 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72 75 65  me db false true
1190: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 5d 20 30   false..    }] 0
11a0: 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23  ]..  }]....  ###
11b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11f0: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
1200: 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 33 29 20  set workload(3) 
1210: 5b 6c 69 73 74 20 5b 6c 69 73 74 20 73 72 63 46  [list [list srcF
1220: 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e  ileName dstFileN
1230: 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 5d  ame table count]
1240: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
1250: 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20   NOTE: Workload 
1260: 23 33 2c 20 22 73 6d 61 6c 6c 22 20 53 45 4c 45  #3, "small" SELE
1270: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a  CT statements...
1280: 20 20 20 20 23 0d 0a 20 20 20 20 6c 61 70 70 65      #..    lappe
1290: 6e 64 20 3a 3a 74 69 6d 65 73 28 33 29 20 5b 6c  nd ::times(3) [l
12a0: 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20  index [time {.. 
12b0: 20 20 20 20 20 73 65 74 75 70 44 62 20 24 64 73       setupDb $ds
12c0: 74 46 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20  tFileName "" "" 
12d0: 22 22 20 22 22 20 22 22 20 74 72 75 65 20 66 61  "" "" "" true fa
12e0: 6c 73 65 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  lse..      if {[
12f0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1300: 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
1310: 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63  1} {$index <= $c
1320: 6f 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65  ount} {incr inde
1330: 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  x} {..          
1340: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
1350: 63 75 74 65 20 72 65 61 64 65 72 20 24 64 62 20  cute reader $db 
1360: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
1380: 4c 45 43 54 20 78 2c 20 79 20 46 52 4f 4d 20 22  LECT x, y FROM "
1390: 20 24 74 61 62 6c 65 20 22 20 57 48 45 52 45 20   $table " WHERE 
13a0: 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b 22 5d 0d 0a  z = 'small';"]..
13b0: 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65            showTe
13c0: 73 74 20 33 0d 0a 20 20 20 20 20 20 20 20 7d 0d  st 3..        }.
13d0: 0a 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d  .      } error]}
13e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13f0: 20 69 66 20 7b 5b 65 78 70 65 63 74 65 64 45 72   if {[expectedEr
1400: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
1410: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
1420: 68 6f 77 54 65 73 74 20 2a 0d 0a 20 20 20 20 20  howTest *..     
1430: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1440: 20 20 20 20 20 20 20 66 61 69 6c 54 65 73 74 20         failTest 
1450: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
1460: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
1470: 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64 73 74    cleanupDb $dst
1480: 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73  FileName db fals
1490: 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20  e true false..  
14a0: 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d    }] 0]..  }]...
14b0: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
14c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1500: 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f  ....  set worklo
1510: 61 64 28 34 29 20 5b 6c 69 73 74 20 5b 6c 69 73  ad(4) [list [lis
1520: 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73  t srcFileName ds
1530: 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20  tFileName table 
1540: 63 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 23 0d  count] {..    #.
1550: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
1560: 6b 6c 6f 61 64 20 23 34 2c 20 22 62 69 67 22 20  kload #4, "big" 
1570: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1580: 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 6c  s...    #..    l
1590: 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 34  append ::times(4
15a0: 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20  ) [lindex [time 
15b0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62  {..      setupDb
15c0: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 22 22   $dstFileName ""
15d0: 20 22 22 20 22 22 20 22 22 20 22 22 20 74 72 75   "" "" "" "" tru
15e0: 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 69  e false..      i
15f0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1600: 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e       for {set in
1610: 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c  dex 1} {$index <
1620: 3d 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63 72 20  = $count} {incr 
1630: 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
1640: 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
1650: 2d 65 78 65 63 75 74 65 20 72 65 61 64 65 72 20  -execute reader 
1660: 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20  $db [appendArgs 
1670: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1680: 20 22 53 45 4c 45 43 54 20 78 2c 20 79 20 46 52   "SELECT x, y FR
1690: 4f 4d 20 22 20 24 74 61 62 6c 65 20 22 20 57 48  OM " $table " WH
16a0: 45 52 45 20 7a 20 3d 20 27 62 69 67 27 3b 22 5d  ERE z = 'big';"]
16b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77  ..          show
16c0: 54 65 73 74 20 34 0d 0a 20 20 20 20 20 20 20 20  Test 4..        
16d0: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72 6f 72  }..      } error
16e0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16f0: 20 20 20 69 66 20 7b 5b 65 78 70 65 63 74 65 64     if {[expected
1700: 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74  Error $error]} t
1710: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1720: 20 73 68 6f 77 54 65 73 74 20 2a 0d 0a 20 20 20   showTest *..   
1730: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1740: 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65 73           failTes
1750: 74 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  t $error..      
1760: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
1770: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64      cleanupDb $d
1780: 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61  stFileName db fa
1790: 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a  lse true false..
17a0: 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d      }] 0]..  }].
17b0: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
17c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1800: 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b  ##....  set work
1810: 6c 6f 61 64 28 35 29 20 5b 6c 69 73 74 20 5b 6c  load(5) [list [l
1820: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
1830: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
1840: 65 20 63 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20  e count] {..    
1850: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  #..    # NOTE: W
1860: 6f 72 6b 6c 6f 61 64 20 23 35 2c 20 22 73 6d 61  orkload #5, "sma
1870: 6c 6c 22 20 49 4e 53 45 52 54 20 73 74 61 74 65  ll" INSERT state
1880: 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20  ments...    #.. 
1890: 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d     lappend ::tim
18a0: 65 73 28 35 29 20 5b 6c 69 6e 64 65 78 20 5b 74  es(5) [lindex [t
18b0: 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  ime {..      set
18c0: 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d  upDb $dstFileNam
18d0: 65 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22  e "" "" "" "" ""
18e0: 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20   true false..   
18f0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1900: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65  .        for {se
1910: 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64  t index 1} {$ind
1920: 65 78 20 3c 3d 20 24 63 6f 75 6e 74 7d 20 7b 69  ex <= $count} {i
1930: 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
1940: 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
1950: 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41  ute $db [appendA
1960: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1970: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
1980: 4f 20 22 20 24 74 61 62 6c 65 20 22 28 78 2c 20  O " $table "(x, 
1990: 79 2c 20 7a 29 20 56 41 4c 55 45 53 28 27 22 20  y, z) VALUES('" 
19a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19b0: 20 5b 66 6f 72 6d 61 74 20 25 6c 58 20 5b 65 78   [format %lX [ex
19c0: 70 72 20 7b 72 61 6e 64 6f 6d 28 29 7d 5d 5d 20  pr {random()}]] 
19d0: 22 27 2c 20 27 22 20 5c 0d 0a 20 20 20 20 20 20  "', '" \..      
19e0: 20 20 20 20 20 20 20 20 5b 62 61 73 65 36 34 20          [base64 
19f0: 65 6e 63 6f 64 65 20 2d 2d 20 5b 65 78 70 72 20  encode -- [expr 
1a00: 7b 72 61 6e 64 73 74 72 28 31 30 30 30 30 29 7d  {randstr(10000)}
1a10: 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] \..          
1a20: 20 20 20 20 22 27 2c 20 27 73 6d 61 6c 6c 27 29      "', 'small')
1a30: 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ;"]..          s
1a40: 68 6f 77 54 65 73 74 20 35 0d 0a 20 20 20 20 20  howTest 5..     
1a50: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72     }..      } er
1a60: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
1a70: 20 20 20 20 20 20 69 66 20 7b 5b 65 78 70 65 63        if {[expec
1a80: 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d  tedError $error]
1a90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1aa0: 20 20 20 20 73 68 6f 77 54 65 73 74 20 2a 0d 0a      showTest *..
1ab0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1ac0: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 61 69 6c  ..          fail
1ad0: 54 65 73 74 20 24 65 72 72 6f 72 0d 0a 20 20 20  Test $error..   
1ae0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1af0: 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62  .      cleanupDb
1b00: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62   $dstFileName db
1b10: 20 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73   false true fals
1b20: 65 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20  e..    }] 0]..  
1b30: 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23  }]....  ########
1b40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b80: 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77  #####....  set w
1b90: 6f 72 6b 6c 6f 61 64 28 36 29 20 5b 6c 69 73 74  orkload(6) [list
1ba0: 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61   [list srcFileNa
1bb0: 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74  me dstFileName t
1bc0: 61 62 6c 65 20 63 6f 75 6e 74 5d 20 7b 0d 0a 20  able count] {.. 
1bd0: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
1be0: 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 36 2c 20 22  : Workload #6, "
1bf0: 62 69 67 22 20 49 4e 53 45 52 54 20 73 74 61 74  big" INSERT stat
1c00: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a  ements...    #..
1c10: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69      lappend ::ti
1c20: 6d 65 73 28 36 29 20 5b 6c 69 6e 64 65 78 20 5b  mes(6) [lindex [
1c30: 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 73 65  time {..      se
1c40: 74 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61  tupDb $dstFileNa
1c50: 6d 65 20 22 22 20 22 22 20 22 22 20 22 22 20 22  me "" "" "" "" "
1c60: 22 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20  " true false..  
1c70: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1c80: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73  ..        for {s
1c90: 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e  et index 1} {$in
1ca0: 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 7d 20 7b  dex <= $count} {
1cb0: 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
1cc0: 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65           sql exe
1cd0: 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64  cute $db [append
1ce0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1cf0: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1d00: 54 4f 20 22 20 24 74 61 62 6c 65 20 22 28 78 2c  TO " $table "(x,
1d10: 20 79 2c 20 7a 29 20 56 41 4c 55 45 53 28 27 22   y, z) VALUES('"
1d20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d30: 20 20 5b 66 6f 72 6d 61 74 20 25 6c 58 20 5b 65    [format %lX [e
1d40: 78 70 72 20 7b 72 61 6e 64 6f 6d 28 29 7d 5d 5d  xpr {random()}]]
1d50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d60: 20 20 22 27 2c 20 52 41 4e 44 4f 4d 42 4c 4f 42    "', RANDOMBLOB
1d70: 28 31 30 30 30 30 30 30 30 29 2c 20 27 62 69 67  (10000000), 'big
1d80: 27 29 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  ');"]..         
1d90: 20 73 68 6f 77 54 65 73 74 20 36 0d 0a 20 20 20   showTest 6..   
1da0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
1db0: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
1dc0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 65 78 70          if {[exp
1dd0: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
1de0: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
1df0: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 2a        showTest *
1e00: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1e10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 61   {..          fa
1e20: 69 6c 54 65 73 74 20 24 65 72 72 6f 72 0d 0a 20  ilTest $error.. 
1e30: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e40: 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70  }..      cleanup
1e50: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
1e60: 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61  db false true fa
1e70: 6c 73 65 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a  lse..    }] 0]..
1e80: 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23    }]....  ######
1e90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ea0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1eb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ec0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ed0: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
1ee0: 20 77 6f 72 6b 6c 6f 61 64 28 37 29 20 5b 6c 69   workload(7) [li
1ef0: 73 74 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65  st [list srcFile
1f00: 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65  Name dstFileName
1f10: 20 74 61 62 6c 65 20 63 6f 75 6e 74 5d 20 7b 0d   table count] {.
1f20: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
1f30: 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 37 2c  TE: Workload #7,
1f40: 20 22 73 6d 61 6c 6c 22 20 55 50 44 41 54 45 20   "small" UPDATE 
1f50: 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20  statements...   
1f60: 20 23 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20   #..    lappend 
1f70: 3a 3a 74 69 6d 65 73 28 37 29 20 5b 6c 69 6e 64  ::times(7) [lind
1f80: 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20  ex [time {..    
1f90: 20 20 73 65 74 75 70 44 62 20 24 64 73 74 46 69    setupDb $dstFi
1fa0: 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20  leName "" "" "" 
1fb0: 22 22 20 22 22 20 74 72 75 65 20 66 61 6c 73 65  "" "" true false
1fc0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
1fd0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f  ch {..        fo
1fe0: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
1ff0: 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e  {$index <= $coun
2000: 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  t} {incr index} 
2010: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  {..          sql
2020: 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70   execute $db [ap
2030: 70 65 6e 64 41 72 67 73 20 22 55 50 44 41 54 45  pendArgs "UPDATE
2040: 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20   " $table \..   
2050: 20 20 20 20 20 20 20 20 20 20 20 22 20 53 45 54             " SET
2060: 20 79 20 3d 20 27 22 20 5b 62 61 73 65 36 34 20   y = '" [base64 
2070: 65 6e 63 6f 64 65 20 2d 2d 20 5b 65 78 70 72 20  encode -- [expr 
2080: 7b 72 61 6e 64 73 74 72 28 31 30 30 30 30 29 7d  {randstr(10000)}
2090: 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] \..          
20a0: 20 20 20 20 22 27 20 57 48 45 52 45 20 78 20 4c      "' WHERE x L
20b0: 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74 20 25  IKE '" [format %
20c0: 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20 41 4e  X $index] "%' AN
20d0: 44 20 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b 22 5d  D z = 'small';"]
20e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77  ..          show
20f0: 54 65 73 74 20 37 0d 0a 20 20 20 20 20 20 20 20  Test 7..        
2100: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72 6f 72  }..      } error
2110: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2120: 20 20 20 69 66 20 7b 5b 65 78 70 65 63 74 65 64     if {[expected
2130: 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74  Error $error]} t
2140: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2150: 20 73 68 6f 77 54 65 73 74 20 2a 0d 0a 20 20 20   showTest *..   
2160: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
2170: 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65 73           failTes
2180: 74 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  t $error..      
2190: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
21a0: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64      cleanupDb $d
21b0: 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61  stFileName db fa
21c0: 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a  lse true false..
21d0: 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d      }] 0]..  }].
21e0: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
21f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2200: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2210: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2230: 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b  ##....  set work
2240: 6c 6f 61 64 28 38 29 20 5b 6c 69 73 74 20 5b 6c  load(8) [list [l
2250: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
2260: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
2270: 65 20 63 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20  e count] {..    
2280: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  #..    # NOTE: W
2290: 6f 72 6b 6c 6f 61 64 20 23 38 2c 20 22 62 69 67  orkload #8, "big
22a0: 22 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  " UPDATE stateme
22b0: 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  nts...    #..   
22c0: 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73   lappend ::times
22d0: 28 38 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d  (8) [lindex [tim
22e0: 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 75 70  e {..      setup
22f0: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
2300: 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20 74  "" "" "" "" "" t
2310: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
2320: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
2330: 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20         for {set 
2340: 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78  index 1} {$index
2350: 20 3c 3d 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63   <= $count} {inc
2360: 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
2370: 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
2380: 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67  e $db [appendArg
2390: 73 20 22 55 50 44 41 54 45 20 22 20 24 74 61 62  s "UPDATE " $tab
23a0: 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
23b0: 20 20 20 20 22 20 53 45 54 20 79 20 3d 20 52 41      " SET y = RA
23c0: 4e 44 4f 4d 42 4c 4f 42 28 31 30 30 30 30 30 30  NDOMBLOB(1000000
23d0: 30 29 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  0) WHERE x LIKE 
23e0: 27 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  '" \..          
23f0: 20 20 20 20 5b 66 6f 72 6d 61 74 20 25 58 20 24      [format %X $
2400: 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44 20 7a  index] "%' AND z
2410: 20 3d 20 27 62 69 67 27 3b 22 5d 0d 0a 20 20 20   = 'big';"]..   
2420: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
2430: 38 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  8..        }..  
2440: 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
2450: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
2460: 20 7b 5b 65 78 70 65 63 74 65 64 45 72 72 6f 72   {[expectedError
2470: 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b   $error]} then {
2480: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77  ..          show
2490: 54 65 73 74 20 2a 0d 0a 20 20 20 20 20 20 20 20  Test *..        
24a0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
24b0: 20 20 20 20 66 61 69 6c 54 65 73 74 20 24 65 72      failTest $er
24c0: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ror..        }..
24d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63        }..      c
24e0: 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c  leanupDb $dstFil
24f0: 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74  eName db false t
2500: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  rue false..    }
2510: 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20  ] 0]..  }]....  
2520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2560: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
2570: 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28  .  set workload(
2580: 39 29 20 5b 6c 69 73 74 20 5b 6c 69 73 74 20 73  9) [list [list s
2590: 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69  rcFileName dstFi
25a0: 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75  leName table cou
25b0: 6e 74 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  nt] {..    #..  
25c0: 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f    # NOTE: Worklo
25d0: 61 64 20 23 39 2c 20 22 73 6d 61 6c 6c 22 20 44  ad #9, "small" D
25e0: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73  ELETE statements
25f0: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 6c 61  ...    #..    la
2600: 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 39 29  ppend ::times(9)
2610: 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b   [lindex [time {
2620: 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20  ..      setupDb 
2630: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 22 22 20  $dstFileName "" 
2640: 22 22 20 22 22 20 22 22 20 22 22 20 74 72 75 65  "" "" "" "" true
2650: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 69 66   false..      if
2660: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
2670: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64      for {set ind
2680: 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d  ex 1} {$index <=
2690: 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63 72 20 69   $count} {incr i
26a0: 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ndex} {..       
26b0: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
26c0: 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  db [appendArgs "
26d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 22 20 24 74  DELETE FROM " $t
26e0: 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  able \..        
26f0: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 78 20        " WHERE x 
2700: 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74 20  LIKE '" [format 
2710: 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20 41  %X $index] "%' A
2720: 4e 44 20 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b 22  ND z = 'small';"
2730: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f  ]..          sho
2740: 77 54 65 73 74 20 39 0d 0a 20 20 20 20 20 20 20  wTest 9..       
2750: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72 6f   }..      } erro
2760: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
2770: 20 20 20 20 69 66 20 7b 5b 65 78 70 65 63 74 65      if {[expecte
2780: 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20  dError $error]} 
2790: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
27a0: 20 20 73 68 6f 77 54 65 73 74 20 2a 0d 0a 20 20    showTest *..  
27b0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
27c0: 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65            failTe
27d0: 73 74 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20  st $error..     
27e0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
27f0: 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24       cleanupDb $
2800: 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66  dstFileName db f
2810: 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d  alse true false.
2820: 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d  .    }] 0]..  }]
2830: 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23  ....  ##########
2840: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2860: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2870: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2880: 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72  ###....  set wor
2890: 6b 6c 6f 61 64 28 31 30 29 20 5b 6c 69 73 74 20  kload(10) [list 
28a0: 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d  [list srcFileNam
28b0: 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61  e dstFileName ta
28c0: 62 6c 65 20 63 6f 75 6e 74 5d 20 7b 0d 0a 20 20  ble count] {..  
28d0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
28e0: 20 57 6f 72 6b 6c 6f 61 64 20 23 31 30 2c 20 22   Workload #10, "
28f0: 62 69 67 22 20 44 45 4c 45 54 45 20 73 74 61 74  big" DELETE stat
2900: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a  ements...    #..
2910: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69      lappend ::ti
2920: 6d 65 73 28 31 30 29 20 5b 6c 69 6e 64 65 78 20  mes(10) [lindex 
2930: 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 73  [time {..      s
2940: 65 74 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e  etupDb $dstFileN
2950: 61 6d 65 20 22 22 20 22 22 20 22 22 20 22 22 20  ame "" "" "" "" 
2960: 22 22 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20  "" true false.. 
2970: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
2980: 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b  {..        for {
2990: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
29a0: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 7d 20  ndex <= $count} 
29b0: 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
29c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78            sql ex
29d0: 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e  ecute $db [appen
29e0: 64 41 72 67 73 20 22 44 45 4c 45 54 45 20 46 52  dArgs "DELETE FR
29f0: 4f 4d 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20  OM " $table \.. 
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
2a10: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 22 20 5b  HERE x LIKE '" [
2a20: 66 6f 72 6d 61 74 20 25 58 20 24 69 6e 64 65 78  format %X $index
2a30: 5d 20 22 25 27 20 41 4e 44 20 7a 20 3d 20 27 62  ] "%' AND z = 'b
2a40: 69 67 27 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20  ig';"]..        
2a50: 20 20 73 68 6f 77 54 65 73 74 20 41 0d 0a 20 20    showTest A..  
2a60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
2a70: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
2a80: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 65 78  .        if {[ex
2a90: 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72  pectedError $err
2aa0: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
2ab0: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
2ac0: 2a 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  *..        } els
2ad0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  e {..          f
2ae0: 61 69 6c 54 65 73 74 20 24 65 72 72 6f 72 0d 0a  ailTest $error..
2af0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2b00: 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75   }..      cleanu
2b10: 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65  pDb $dstFileName
2b20: 20 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66   db false true f
2b30: 61 6c 73 65 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d  alse..    }] 0].
2b40: 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23  .  }]....  #####
2b50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2b60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2b80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2b90: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
2ba0: 74 20 77 6f 72 6b 6c 6f 61 64 28 31 31 29 20 5b  t workload(11) [
2bb0: 6c 69 73 74 20 5b 6c 69 73 74 20 73 72 63 46 69  list [list srcFi
2bc0: 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61  leName dstFileNa
2bd0: 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 5d 20  me table count] 
2be0: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
2bf0: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
2c00: 31 31 2c 20 56 41 43 55 55 4d 20 73 74 61 74 65  11, VACUUM state
2c10: 6d 65 6e 74 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  ment...    #..  
2c20: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65    lappend ::time
2c30: 73 28 31 31 29 20 5b 6c 69 6e 64 65 78 20 5b 74  s(11) [lindex [t
2c40: 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  ime {..      set
2c50: 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d  upDb $dstFileNam
2c60: 65 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22  e "" "" "" "" ""
2c70: 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20   true false..   
2c80: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
2c90: 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65  .        sql exe
2ca0: 63 75 74 65 20 24 64 62 20 22 56 41 43 55 55 4d  cute $db "VACUUM
2cb0: 3b 22 0d 0a 20 20 20 20 20 20 20 20 73 68 6f 77  ;"..        show
2cc0: 54 65 73 74 20 42 0d 0a 20 20 20 20 20 20 7d 20  Test B..      } 
2cd0: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
2ce0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 65 78 70          if {[exp
2cf0: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
2d00: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
2d10: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 2a        showTest *
2d20: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
2d30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 61   {..          fa
2d40: 69 6c 54 65 73 74 20 24 65 72 72 6f 72 0d 0a 20  ilTest $error.. 
2d50: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2d60: 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70  }..      cleanup
2d70: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
2d80: 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61  db false true fa
2d90: 6c 73 65 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a  lse..    }] 0]..
2da0: 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23    }]....  ######
2db0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2dc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2de0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2df0: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
2e00: 20 77 6f 72 6b 6c 6f 61 64 28 31 32 29 20 5b 6c   workload(12) [l
2e10: 69 73 74 20 5b 6c 69 73 74 20 73 72 63 46 69 6c  ist [list srcFil
2e20: 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d  eName dstFileNam
2e30: 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 5d 20 7b  e table count] {
2e40: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
2e50: 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31  OTE: Workload #1
2e60: 32 2c 20 62 61 63 6b 75 70 20 74 6f 20 69 6e 2d  2, backup to in-
2e70: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2e80: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 6c 61 70  ..    #..    lap
2e90: 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 32 29  pend ::times(12)
2ea0: 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b   [lindex [time {
2eb0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
2ec0: 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d  ing is integer -
2ed0: 73 74 72 69 63 74 20 24 3a 3a 63 6f 6d 70 69 6c  strict $::compil
2ee0: 65 64 28 31 32 29 5d 7d 20 74 68 65 6e 20 7b 0d  ed(12)]} then {.
2ef0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 64 20  .        set id 
2f00: 24 3a 3a 63 6f 6d 70 69 6c 65 64 28 31 32 29 3b  $::compiled(12);
2f10: 20 23 20 4e 4f 54 45 3a 20 41 6c 72 65 61 64 79   # NOTE: Already
2f20: 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20   compiled...    
2f30: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
2f40: 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d 2e  e _Dynamic${id}.
2f50: 54 65 73 74 24 7b 69 64 7d 20 42 61 63 6b 75 70  Test${id} Backup
2f60: 41 6e 64 47 65 74 44 61 74 61 0d 0a 20 20 20 20  AndGetData..    
2f70: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2f80: 20 20 20 20 73 65 74 20 69 64 20 5b 6f 62 6a 65      set id [obje
2f90: 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
2fa0: 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
2fb0: 4e 65 78 74 49 64 5d 0d 0a 20 20 20 20 20 20 20  NextId]..       
2fc0: 20 73 65 74 20 63 6f 64 65 20 5b 63 6f 6d 70 69   set code [compi
2fd0: 6c 65 43 53 68 61 72 70 57 69 74 68 20 5b 73 75  leCSharpWith [su
2fe0: 62 73 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  bst {..         
2ff0: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 3b 0d 0a   using System;..
3000: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
3010: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
3020: 74 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 75  te;..          u
3030: 73 69 6e 67 20 53 79 73 74 65 6d 2e 54 65 78 74  sing System.Text
3040: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6e  ;....          n
3050: 61 6d 65 73 70 61 63 65 20 5f 44 79 6e 61 6d 69  amespace _Dynami
3060: 63 24 7b 69 64 7d 0d 0a 20 20 20 20 20 20 20 20  c${id}..        
3070: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
3080: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 63   public static c
3090: 6c 61 73 73 20 54 65 73 74 24 7b 69 64 7d 0d 0a  lass Test${id}..
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62               pub
30c0: 6c 69 63 20 73 74 61 74 69 63 20 76 6f 69 64 20  lic static void 
30d0: 42 61 63 6b 75 70 41 6e 64 47 65 74 44 61 74 61  BackupAndGetData
30e0: 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ()..            
30f0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
3100: 20 20 20 20 20 75 73 69 6e 67 20 28 53 51 4c 69       using (SQLi
3110: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f 75  teConnection sou
3120: 72 63 65 20 3d 20 6e 65 77 20 53 51 4c 69 74 65  rce = new SQLite
3130: 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d 0a 20 20 20  Connection(..   
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 20 22 46 75 6c 6c 55 72 69 3d 24 7b 64 73 74 46   "FullUri=${dstF
3160: 69 6c 65 4e 61 6d 65 7d 3b 22 29 29 0d 0a 20 20  ileName};"))..  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
3180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3190: 20 20 20 73 6f 75 72 63 65 2e 4f 70 65 6e 28 29     source.Open()
31a0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
31b0: 20 20 20 20 20 75 73 69 6e 67 20 28 53 51 4c 69       using (SQLi
31c0: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 64 65 73  teConnection des
31d0: 74 69 6e 61 74 69 6f 6e 20 3d 20 6e 65 77 20 53  tination = new S
31e0: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 28  QLiteConnection(
31f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3200: 20 20 20 20 20 20 20 20 22 46 75 6c 6c 55 72 69          "FullUri
3210: 3d 24 7b 73 72 63 46 69 6c 65 4e 61 6d 65 7d 3b  =${srcFileName};
3220: 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "))..           
3230: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
3250: 73 74 69 6e 61 74 69 6f 6e 2e 4f 70 65 6e 28 29  stination.Open()
3260: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
3270: 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65 2e           source.
3280: 42 61 63 6b 75 70 44 61 74 61 62 61 73 65 28 0d  BackupDatabase(.
3290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32a0: 20 20 20 20 20 20 20 20 20 64 65 73 74 69 6e 61           destina
32b0: 74 69 6f 6e 2c 20 22 6d 61 69 6e 22 2c 20 22 6d  tion, "main", "m
32c0: 61 69 6e 22 2c 20 2d 31 2c 20 6e 75 6c 6c 2c 20  ain", -1, null, 
32d0: 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  0);..           
32e0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
32f0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
3300: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
3320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
3360: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
3370: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 76   public static v
3380: 6f 69 64 20 4d 61 69 6e 28 29 0d 0a 20 20 20 20  oid Main()..    
3390: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
33b0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20  do nothing...   
33c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
33d0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
33e0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
33f0: 20 20 7d 5d 20 74 72 75 65 20 74 72 75 65 20 74    }] true true t
3400: 72 75 65 20 72 65 73 75 6c 74 73 20 65 72 72 6f  rue results erro
3410: 72 73 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  rs System.Data.S
3420: 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 20 20 20 20  QLite.dll]..    
3430: 20 20 20 20 69 66 20 7b 24 63 6f 64 65 20 65 71      if {$code eq
3440: 20 22 4f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20   "Ok"} then {.. 
3450: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 63           set ::c
3460: 6f 6d 70 69 6c 65 64 28 31 32 29 20 24 69 64 3b  ompiled(12) $id;
3470: 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 70 69 6c 65   # NOTE: Compile
3480: 64 20 4f 4b 2e 0d 0a 20 20 20 20 20 20 20 20 20  d OK...         
3490: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5f   object invoke _
34a0: 44 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54 65 73  Dynamic${id}.Tes
34b0: 74 24 7b 69 64 7d 20 42 61 63 6b 75 70 41 6e 64  t${id} BackupAnd
34c0: 47 65 74 44 61 74 61 0d 0a 20 20 20 20 20 20 20  GetData..       
34d0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
34e0: 20 20 20 20 20 65 72 72 6f 72 20 24 65 72 72 6f       error $erro
34f0: 72 73 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  rs..        }.. 
3500: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 73 68       }..      sh
3510: 6f 77 54 65 73 74 20 43 0d 0a 20 20 20 20 7d 5d  owTest C..    }]
3520: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23   0]..  }]....  #
3530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3560: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3570: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
3580: 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 31    set workload(1
3590: 33 29 20 5b 6c 69 73 74 20 5b 6c 69 73 74 20 73  3) [list [list s
35a0: 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69  rcFileName dstFi
35b0: 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75  leName table cou
35c0: 6e 74 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  nt] {..    #..  
35d0: 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f    # NOTE: Worklo
35e0: 61 64 20 23 31 33 2c 20 62 61 63 6b 75 70 20 66  ad #13, backup f
35f0: 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  rom an in-memory
3600: 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
3610: 23 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a  #..    lappend :
3620: 3a 74 69 6d 65 73 28 31 33 29 20 5b 6c 69 6e 64  :times(13) [lind
3630: 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20  ex [time {..    
3640: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73    if {[string is
3650: 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74   integer -strict
3660: 20 24 3a 3a 63 6f 6d 70 69 6c 65 64 28 31 33 29   $::compiled(13)
3670: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3680: 20 20 20 73 65 74 20 69 64 20 24 3a 3a 63 6f 6d     set id $::com
3690: 70 69 6c 65 64 28 31 33 29 3b 20 23 20 4e 4f 54  piled(13); # NOT
36a0: 45 3a 20 41 6c 72 65 61 64 79 20 63 6f 6d 70 69  E: Already compi
36b0: 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 6f 62  led...        ob
36c0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5f 44 79 6e  ject invoke _Dyn
36d0: 61 6d 69 63 24 7b 69 64 7d 2e 54 65 73 74 24 7b  amic${id}.Test${
36e0: 69 64 7d 20 42 61 63 6b 75 70 41 6e 64 47 65 74  id} BackupAndGet
36f0: 44 61 74 61 0d 0a 20 20 20 20 20 20 7d 20 65 6c  Data..      } el
3700: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
3710: 74 20 69 64 20 5b 6f 62 6a 65 63 74 20 69 6e 76  t id [object inv
3720: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
3730: 47 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64  GetActive NextId
3740: 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ]..        set c
3750: 6f 64 65 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61  ode [compileCSha
3760: 72 70 57 69 74 68 20 5b 73 75 62 73 74 20 7b 0d  rpWith [subst {.
3770: 0a 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67  .          using
3780: 20 53 79 73 74 65 6d 3b 0d 0a 20 20 20 20 20 20   System;..      
3790: 20 20 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d      using System
37a0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 3b 0d 0a 20  .Data.SQLite;.. 
37b0: 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 53           using S
37c0: 79 73 74 65 6d 2e 54 65 78 74 3b 0d 0a 0d 0a 20  ystem.Text;.... 
37d0: 20 20 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61           namespa
37e0: 63 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d  ce _Dynamic${id}
37f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
3800: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
3810: 63 20 73 74 61 74 69 63 20 63 6c 61 73 73 20 54  c static class T
3820: 65 73 74 24 7b 69 64 7d 0d 0a 20 20 20 20 20 20  est${id}..      
3830: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3840: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74         public st
3850: 61 74 69 63 20 76 6f 69 64 20 42 61 63 6b 75 70  atic void Backup
3860: 41 6e 64 47 65 74 44 61 74 61 28 29 0d 0a 20 20  AndGetData()..  
3870: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
3890: 73 69 6e 67 20 28 53 51 4c 69 74 65 43 6f 6e 6e  sing (SQLiteConn
38a0: 65 63 74 69 6f 6e 20 73 6f 75 72 63 65 20 3d 20  ection source = 
38b0: 6e 65 77 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  new SQLiteConnec
38c0: 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20  tion(..         
38d0: 20 20 20 20 20 20 20 20 20 20 20 22 46 75 6c 6c             "Full
38e0: 55 72 69 3d 24 7b 73 72 63 46 69 6c 65 4e 61 6d  Uri=${srcFileNam
38f0: 65 7d 3b 22 29 29 0d 0a 20 20 20 20 20 20 20 20  e};"))..        
3900: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
3920: 72 63 65 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20  rce.Open();..   
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
3940: 73 69 6e 67 20 28 53 51 4c 69 74 65 43 6f 6e 6e  sing (SQLiteConn
3950: 65 63 74 69 6f 6e 20 64 65 73 74 69 6e 61 74 69  ection destinati
3960: 6f 6e 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 43  on = new SQLiteC
3970: 6f 6e 6e 65 63 74 69 6f 6e 28 0d 0a 20 20 20 20  onnection(..    
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 22 46 75 6c 6c 55 72 69 3d 24 7b 64 73 74    "FullUri=${dst
39a0: 46 69 6c 65 4e 61 6d 65 7d 3b 22 29 29 0d 0a 20  FileName};")).. 
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
39d0: 20 20 20 20 20 20 20 20 64 65 73 74 69 6e 61 74          destinat
39e0: 69 6f 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20  ion.Open();.... 
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a00: 20 20 20 73 6f 75 72 63 65 2e 42 61 63 6b 75 70     source.Backup
3a10: 44 61 74 61 62 61 73 65 28 0d 0a 20 20 20 20 20  Database(..     
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 20     destination, 
3a40: 22 6d 61 69 6e 22 2c 20 22 6d 61 69 6e 22 2c 20  "main", "main", 
3a50: 2d 31 2c 20 6e 75 6c 6c 2c 20 30 29 3b 0d 0a 20  -1, null, 0);.. 
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a70: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
3a80: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
3a90: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
3aa0: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
3ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
3af0: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
3b00: 63 20 73 74 61 74 69 63 20 76 6f 69 64 20 4d 61  c static void Ma
3b10: 69 6e 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20  in()..          
3b20: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3b30: 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74         // do not
3b40: 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  hing...         
3b50: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
3b60: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
3b70: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 5d 20 74   }..        }] t
3b80: 72 75 65 20 74 72 75 65 20 74 72 75 65 20 72 65  rue true true re
3b90: 73 75 6c 74 73 20 65 72 72 6f 72 73 20 53 79 73  sults errors Sys
3ba0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
3bb0: 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 20 20 69 66  dll]..        if
3bc0: 20 7b 24 63 6f 64 65 20 65 71 20 22 4f 6b 22 7d   {$code eq "Ok"}
3bd0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3be0: 20 20 20 73 65 74 20 3a 3a 63 6f 6d 70 69 6c 65     set ::compile
3bf0: 64 28 31 33 29 20 24 69 64 3b 20 23 20 4e 4f 54  d(13) $id; # NOT
3c00: 45 3a 20 43 6f 6d 70 69 6c 65 64 20 4f 4b 2e 0d  E: Compiled OK..
3c10: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
3c20: 74 20 69 6e 76 6f 6b 65 20 5f 44 79 6e 61 6d 69  t invoke _Dynami
3c30: 63 24 7b 69 64 7d 2e 54 65 73 74 24 7b 69 64 7d  c${id}.Test${id}
3c40: 20 42 61 63 6b 75 70 41 6e 64 47 65 74 44 61 74   BackupAndGetDat
3c50: 61 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  a..        } els
3c60: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65  e {..          e
3c70: 72 72 6f 72 20 24 65 72 72 6f 72 73 0d 0a 20 20  rror $errors..  
3c80: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
3c90: 0d 0a 20 20 20 20 20 20 73 68 6f 77 54 65 73 74  ..      showTest
3ca0: 20 44 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   D..    }] 0].. 
3cb0: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
3cc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3cf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d00: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20  ######....  set 
3d10: 77 6f 72 6b 6c 6f 61 64 28 31 34 29 20 5b 6c 69  workload(14) [li
3d20: 73 74 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65  st [list srcFile
3d30: 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65  Name dstFileName
3d40: 20 74 61 62 6c 65 20 63 6f 75 6e 74 5d 20 7b 0d   table count] {.
3d50: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
3d60: 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 34  TE: Workload #14
3d70: 2c 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  , PRAGMA integri
3d80: 74 79 20 63 68 65 63 6b 20 73 74 61 74 65 6d 65  ty check stateme
3d90: 6e 74 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  nt...    #..    
3da0: 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28  lappend ::times(
3db0: 31 34 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d  14) [lindex [tim
3dc0: 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 75 70  e {..      setup
3dd0: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
3de0: 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20 74  "" "" "" "" "" t
3df0: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
3e00: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
3e10: 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20         for {set 
3e20: 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78  index 1} {$index
3e30: 20 3c 3d 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63   <= $count} {inc
3e40: 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
3e50: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
3e60: 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65   [sql execute -e
3e70: 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64  xecute scalar $d
3e80: 62 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  b \..           
3e90: 20 20 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67     "PRAGMA integ
3ea0: 72 69 74 79 5f 63 68 65 63 6b 3b 22 5d 0d 0a 20  rity_check;"].. 
3eb0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65           if {$re
3ec0: 73 75 6c 74 20 65 71 20 22 6f 6b 22 7d 20 74 68  sult eq "ok"} th
3ed0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
3ee0: 20 20 73 68 6f 77 54 65 73 74 20 45 0d 0a 20 20    showTest E..  
3ef0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
3f00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72  ..            er
3f10: 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ror [appendArgs 
3f20: 22 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b  "integrity check
3f30: 20 66 61 69 6c 65 64 3a 20 22 20 24 72 65 73 75   failed: " $resu
3f40: 6c 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lt]..          }
3f50: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
3f60: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
3f70: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
3f80: 7b 5b 65 78 70 65 63 74 65 64 45 72 72 6f 72 20  {[expectedError 
3f90: 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d  $error]} then {.
3fa0: 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54  .          showT
3fb0: 65 73 74 20 2a 0d 0a 20 20 20 20 20 20 20 20 7d  est *..        }
3fc0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
3fd0: 20 20 20 66 61 69 6c 54 65 73 74 20 24 65 72 72     failTest $err
3fe0: 6f 72 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  or..        }.. 
3ff0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c       }..      cl
4000: 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65  eanupDb $dstFile
4010: 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72  Name db false tr
4020: 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 5d  ue false..    }]
4030: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 7d 20 2d 62 6f   0]..  }]..} -bo
4040: 64 79 20 7b 0d 0a 20 20 66 6f 72 20 7b 73 65 74  dy {..  for {set
4050: 20 69 6e 64 65 78 28 30 29 20 30 7d 20 7b 24 69   index(0) 0} {$i
4060: 6e 64 65 78 28 30 29 20 3c 20 24 63 6f 75 6e 74  ndex(0) < $count
4070: 28 30 29 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  (0)} {incr index
4080: 28 30 29 7d 20 7b 0d 0a 20 20 20 20 73 71 6c 20  (0)} {..    sql 
4090: 65 78 65 63 75 74 65 20 24 64 62 20 22 43 52 45  execute $db "CRE
40a0: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
40b0: 20 45 58 49 53 54 53 20 74 31 28 78 20 50 52 49   EXISTS t1(x PRI
40c0: 4d 41 52 59 20 4b 45 59 2c 20 79 2c 20 7a 29 3b  MARY KEY, y, z);
40d0: 22 0d 0a 0d 0a 20 20 20 20 75 6e 73 65 74 20 2d  "....    unset -
40e0: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 68 72 65 61  nocomplain threa
40f0: 64 0d 0a 0d 0a 20 20 20 20 66 6f 72 65 61 63 68  d....    foreach
4100: 20 69 6e 64 65 78 28 31 29 20 5b 6c 73 6f 72 74   index(1) [lsort
4110: 20 2d 69 6e 74 65 67 65 72 20 5b 61 72 72 61 79   -integer [array
4120: 20 6e 61 6d 65 73 20 77 6f 72 6b 6c 6f 61 64 5d   names workload]
4130: 5d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 74  ] {..      set t
4140: 68 72 65 61 64 28 24 69 6e 64 65 78 28 31 29 29  hread($index(1))
4150: 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20   [object create 
4160: 2d 61 6c 69 61 73 20 53 79 73 74 65 6d 2e 54 68  -alias System.Th
4170: 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64 20 5c  reading.Thread \
4180: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73  ..          [lis
4190: 74 20 61 70 70 6c 79 20 24 77 6f 72 6b 6c 6f 61  t apply $workloa
41a0: 64 28 24 69 6e 64 65 78 28 31 29 29 20 24 66 69  d($index(1)) $fi
41b0: 6c 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e  leName(1) $fileN
41c0: 61 6d 65 28 32 29 20 74 31 20 5c 0d 0a 20 20 20  ame(2) t1 \..   
41d0: 20 20 20 20 20 20 20 24 63 6f 75 6e 74 28 31 29         $count(1)
41e0: 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ]]..    }....   
41f0: 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78 28 31   foreach index(1
4200: 29 20 5b 6c 69 73 74 20 53 74 61 72 74 20 4a 6f  ) [list Start Jo
4210: 69 6e 5d 20 7b 0d 0a 20 20 20 20 20 20 66 6f 72  in] {..      for
4220: 65 61 63 68 20 69 6e 64 65 78 28 32 29 20 5b 61  each index(2) [a
4230: 72 72 61 79 20 6e 61 6d 65 73 20 74 68 72 65 61  rray names threa
4240: 64 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 24 74  d] {..        $t
4250: 68 72 65 61 64 28 24 69 6e 64 65 78 28 32 29 29  hread($index(2))
4260: 20 24 69 6e 64 65 78 28 31 29 0d 0a 20 20 20 20   $index(1)..    
4270: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
4280: 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
4290: 61 69 6e 20 74 68 72 65 61 64 0d 0a 20 20 7d 0d  ain thread..  }.
42a0: 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74  ...  tputs $test
42b0: 5f 63 68 61 6e 6e 65 6c 20 5c 6e 0d 0a 0d 0a 20  _channel \n.... 
42c0: 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78 28 30   foreach index(0
42d0: 29 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65  ) [lsort -intege
42e0: 72 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 74  r [array names t
42f0: 69 6d 65 73 5d 5d 20 7b 0d 0a 20 20 20 20 73 65  imes]] {..    se
4300: 74 20 74 69 6d 65 73 28 6c 65 6e 67 74 68 29 20  t times(length) 
4310: 5b 6c 6c 65 6e 67 74 68 20 24 74 69 6d 65 73 28  [llength $times(
4320: 24 69 6e 64 65 78 28 30 29 29 5d 0d 0a 0d 0a 20  $index(0))].... 
4330: 20 20 20 69 66 20 7b 24 74 69 6d 65 73 28 6c 65     if {$times(le
4340: 6e 67 74 68 29 20 3e 20 30 7d 20 74 68 65 6e 20  ngth) > 0} then 
4350: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
4360: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
4370: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
4380: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 76 65 72        "---- aver
4390: 61 67 65 20 74 69 6d 65 20 66 6f 72 20 77 6f 72  age time for wor
43a0: 6b 6c 6f 61 64 20 28 22 20 24 69 6e 64 65 78 28  kload (" $index(
43b0: 30 29 20 22 29 20 69 73 20 61 62 6f 75 74 20 22  0) ") is about "
43c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 65   \..          [e
43d0: 78 70 72 20 69 6e 74 28 28 5b 6a 6f 69 6e 20 24  xpr int(([join $
43e0: 74 69 6d 65 73 28 24 69 6e 64 65 78 28 30 29 29  times($index(0))
43f0: 20 2b 5d 29 2f 24 74 69 6d 65 73 28 6c 65 6e 67   +])/$times(leng
4400: 74 68 29 2f 31 30 30 30 2e 30 29 5d 20 5c 0d 0a  th)/1000.0)] \..
4410: 20 20 20 20 20 20 20 20 20 20 22 20 6d 69 6c 6c            " mill
4420: 69 73 65 63 6f 6e 64 73 5c 6e 22 5d 0d 0a 20 20  iseconds\n"]..  
4430: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
4440: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
4450: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
4460: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
4470: 2d 2d 2d 2d 20 6e 6f 20 74 69 6d 65 73 20 66 6f  ---- no times fo
4480: 72 20 77 6f 72 6b 6c 6f 61 64 20 28 22 20 24 69  r workload (" $i
4490: 6e 64 65 78 28 30 29 20 22 29 5c 6e 22 5d 0d 0a  ndex(0) ")\n"]..
44a0: 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
44b0: 73 65 74 20 72 65 73 75 6c 74 20 5b 73 71 6c 20  set result [sql 
44c0: 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
44d0: 20 73 63 61 6c 61 72 20 24 73 72 63 44 62 20 22   scalar $srcDb "
44e0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
44f0: 5f 63 68 65 63 6b 3b 22 5d 0d 0a 0d 0a 20 20 69  _check;"]....  i
4500: 66 20 7b 24 72 65 73 75 6c 74 20 65 71 20 22 6f  f {$result eq "o
4510: 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  k"} then {..    
4520: 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e  tputs $test_chan
4530: 6e 65 6c 20 22 2d 2d 2d 2d 20 69 6e 74 65 67 72  nel "---- integr
4540: 69 74 79 20 63 68 65 63 6b 20 6f 6b 20 28 73 72  ity check ok (sr
4550: 63 44 62 29 5c 6e 22 0d 0a 20 20 7d 20 65 6c 73  cDb)\n"..  } els
4560: 65 20 7b 0d 0a 20 20 20 20 65 72 72 6f 72 20 5b  e {..    error [
4570: 61 70 70 65 6e 64 41 72 67 73 20 22 69 6e 74 65  appendArgs "inte
4580: 67 72 69 74 79 20 63 68 65 63 6b 20 66 61 69 6c  grity check fail
4590: 65 64 20 28 73 72 63 44 62 29 3a 20 22 20 24 72  ed (srcDb): " $r
45a0: 65 73 75 6c 74 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20  esult]..  }.... 
45b0: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 73 71 6c   set result [sql
45c0: 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74   execute -execut
45d0: 65 20 73 63 61 6c 61 72 20 24 64 62 20 22 50 52  e scalar $db "PR
45e0: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
45f0: 68 65 63 6b 3b 22 5d 0d 0a 0d 0a 20 20 69 66 20  heck;"]....  if 
4600: 7b 24 72 65 73 75 6c 74 20 65 71 20 22 6f 6b 22  {$result eq "ok"
4610: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 74 70  } then {..    tp
4620: 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  uts $test_channe
4630: 6c 20 22 2d 2d 2d 2d 20 69 6e 74 65 67 72 69 74  l "---- integrit
4640: 79 20 63 68 65 63 6b 20 6f 6b 20 28 64 62 29 5c  y check ok (db)\
4650: 6e 22 0d 0a 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  n"..  } else {..
4660: 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e      error [appen
4670: 64 41 72 67 73 20 22 69 6e 74 65 67 72 69 74 79  dArgs "integrity
4680: 20 63 68 65 63 6b 20 66 61 69 6c 65 64 20 28 64   check failed (d
4690: 62 29 3a 20 22 20 24 72 65 73 75 6c 74 5d 0d 0a  b): " $result]..
46a0: 20 20 7d 0d 0a 7d 20 2d 63 6c 65 61 6e 75 70 20    }..} -cleanup 
46b0: 7b 0d 0a 20 20 72 65 6e 61 6d 65 20 66 61 69 6c  {..  rename fail
46c0: 54 65 73 74 20 22 22 0d 0a 20 20 72 65 6e 61 6d  Test ""..  renam
46d0: 65 20 73 68 6f 77 54 65 73 74 20 22 22 0d 0a 20  e showTest "".. 
46e0: 20 72 65 6e 61 6d 65 20 65 78 70 65 63 74 65 64   rename expected
46f0: 45 72 72 6f 72 20 22 22 0d 0a 0d 0a 20 20 63 6c  Error ""....  cl
4700: 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d  eanupDb $fileNam
4710: 65 28 32 29 0d 0a 20 20 63 6c 65 61 6e 75 70 44  e(2)..  cleanupD
4720: 62 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 73  b $fileName(1) s
4730: 72 63 44 62 0d 0a 0d 0a 20 20 66 6f 72 65 61 63  rcDb....  foreac
4740: 68 20 69 6e 64 65 78 28 30 29 20 5b 61 72 72 61  h index(0) [arra
4750: 79 20 6e 61 6d 65 73 20 77 6f 72 6b 6c 6f 61 64  y names workload
4760: 5d 20 7b 0d 0a 20 20 20 20 63 61 74 63 68 20 7b  ] {..    catch {
4770: 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 72  ..      object r
4780: 65 6d 6f 76 65 63 61 6c 6c 62 61 63 6b 20 5b 6c  emovecallback [l
4790: 69 73 74 20 61 70 70 6c 79 20 24 77 6f 72 6b 6c  ist apply $workl
47a0: 6f 61 64 28 24 69 6e 64 65 78 28 30 29 29 20 24  oad($index(0)) $
47b0: 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c 0d 0a 20  fileName(1) \.. 
47c0: 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
47d0: 6d 65 28 32 29 20 74 31 20 24 63 6f 75 6e 74 28  me(2) t1 $count(
47e0: 31 29 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  1)]..    }..  }.
47f0: 0a 0d 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f  ...  unset -noco
4800: 6d 70 6c 61 69 6e 20 72 65 73 75 6c 74 20 74 68  mplain result th
4810: 72 65 61 64 20 69 6e 64 65 78 20 77 6f 72 6b 6c  read index workl
4820: 6f 61 64 20 73 72 63 44 62 20 64 62 20 66 69 6c  oad srcDb db fil
4830: 65 4e 61 6d 65 20 63 6f 6d 70 69 6c 65 64 20 5c  eName compiled \
4840: 0d 0a 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 20  ..      options 
4850: 63 6f 75 6e 74 20 74 69 6d 65 73 0d 0a 7d 20 2d  count times..} -
4860: 63 6f 6e 73 74 72 61 69 6e 74 73 20 5c 0d 0a 7b  constraints \..{
4870: 65 61 67 6c 65 20 6d 6f 6e 6f 42 75 67 32 38 20  eagle monoBug28 
4880: 63 6f 6d 6d 61 6e 64 2e 73 71 6c 20 63 6f 6d 70  command.sql comp
4890: 69 6c 65 2e 44 41 54 41 20 53 51 4c 69 74 65 20  ile.DATA SQLite 
48a0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
48b0: 74 65 7d 20 2d 72 65 73 75 6c 74 20 7b 7d 7d 0d  te} -result {}}.
48c0: 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  ...#############
48d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
48e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
48f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4900: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4910: 23 23 0d 0a 0d 0a 72 75 6e 53 51 4c 69 74 65 54  ##....runSQLiteT
4920: 65 73 74 45 70 69 6c 6f 67 75 65 0d 0a 72 75 6e  estEpilogue..run
4930: 54 65 73 74 45 70 69 6c 6f 67 75 65 0d 0a        TestEpilogue..