System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact c8c6d9966bc3780a7432f88864b0f70515d347b9:


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 23 0d 0a 23 20 4e 4f 54 45 3a 20  #....#..# NOTE: 
0270: 52 65 70 6f 72 74 20 62 65 66 6f 72 65 20 74 65  Report before te
0280: 73 74 2c 20 62 65 66 6f 72 65 20 73 68 75 74 64  st, before shutd
0290: 6f 77 6e 2e 0d 0a 23 0d 0a 63 68 65 63 6b 46 6f  own...#..checkFo
02a0: 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69  rSQLiteDirectori
02b0: 65 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  es $test_channel
02c0: 0d 0a 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c  ..getSQLiteHandl
02d0: 65 43 6f 75 6e 74 73 20 24 74 65 73 74 5f 63 68  eCounts $test_ch
02e0: 61 6e 6e 65 6c 0d 0a 72 65 70 6f 72 74 53 51 4c  annel..reportSQL
02f0: 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 74 65  iteResources $te
0300: 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 23 23  st_channel....##
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 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
0360: 0a 23 0d 0a 23 20 4e 4f 54 45 3a 20 4d 61 6b 65  .#..# NOTE: Make
0370: 20 73 75 72 65 20 74 68 61 74 20 53 51 4c 69 74   sure that SQLit
0380: 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
0390: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75  s completely shu
03a0: 74 64 6f 77 6e 20 70 72 69 6f 72 20 74 6f 0d 0a  tdown prior to..
03b0: 23 20 20 20 20 20 20 20 73 74 61 72 74 69 6e 67  #       starting
03c0: 20 61 6e 79 20 6f 66 20 74 68 65 20 74 65 73 74   any of the test
03d0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d  s in this file..
03e0: 0a 23 0d 0a 73 68 75 74 64 6f 77 6e 53 51 4c 69  .#..shutdownSQLi
03f0: 74 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  te $test_channel
0400: 0d 0a 0d 0a 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 23 23 23 23 23  ################
0450: 23 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45  ###....#..# NOTE
0460: 3a 20 52 65 70 6f 72 74 20 62 65 66 6f 72 65 20  : Report before 
0470: 74 65 73 74 2c 20 61 66 74 65 72 20 73 68 75 74  test, after shut
0480: 64 6f 77 6e 2e 0d 0a 23 0d 0a 63 68 65 63 6b 46  down...#..checkF
0490: 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
04a0: 69 65 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ies $test_channe
04b0: 6c 0d 0a 67 65 74 53 51 4c 69 74 65 48 61 6e 64  l..getSQLiteHand
04c0: 6c 65 43 6f 75 6e 74 73 20 24 74 65 73 74 5f 63  leCounts $test_c
04d0: 68 61 6e 6e 65 6c 0d 0a 72 65 70 6f 72 74 53 51  hannel..reportSQ
04e0: 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 74  LiteResources $t
04f0: 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 23  est_channel....#
0500: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
0550: 0d 0a 72 75 6e 54 65 73 74 20 7b 74 65 73 74 20  ..runTest {test 
0560: 73 74 72 65 73 73 2d 31 2e 31 20 7b 6d 75 6c 74  stress-1.1 {mult
0570: 69 74 68 72 65 61 64 65 64 20 73 74 72 65 73 73  ithreaded stress
0580: 20 74 65 73 74 69 6e 67 7d 20 2d 73 65 74 75 70   testing} -setup
0590: 20 7b 0d 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63   {..  unset -noc
05a0: 6f 6d 70 6c 61 69 6e 20 72 65 73 75 6c 74 20 74  omplain result t
05b0: 68 72 65 61 64 20 69 6e 64 65 78 20 77 6f 72 6b  hread index work
05c0: 6c 6f 61 64 20 70 72 69 6f 72 69 74 79 20 6e 6f  load priority no
05d0: 57 6f 72 6b 6c 6f 61 64 20 5c 0d 0a 20 20 20 20  Workload \..    
05e0: 20 20 70 72 69 6f 72 69 74 69 65 73 20 73 72 63    priorities src
05f0: 44 62 20 64 62 20 66 69 6c 65 4e 61 6d 65 20 63  Db db fileName c
0600: 6f 6d 70 69 6c 65 64 20 6f 70 74 69 6f 6e 73 20  ompiled options 
0610: 63 6f 75 6e 74 20 74 69 6d 65 73 20 6c 6f 67 46  count times logF
0620: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
0630: 20 6c 6f 67 4c 69 73 74 65 6e 65 72 20 65 76 65   logListener eve
0640: 6e 74 20 74 69 6d 65 6f 75 74 20 63 6f 6e 6e 65  nt timeout conne
0650: 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 6f 72 73  ction indicators
0660: 20 69 74 65 72 61 74 69 6f 6e 73 20 65 78 69 74   iterations exit
0670: 4f 6e 46 61 69 6c 20 5c 0d 0a 20 20 20 20 20 20  OnFail \..      
0680: 63 6f 54 61 73 6b 4d 65 6d 20 6e 6f 54 72 61 63  coTaskMem noTrac
0690: 65 20 66 61 69 6c 75 72 65 73 20 73 74 61 74 75  e failures statu
06a0: 73 20 77 6f 72 6b 6c 6f 61 64 4e 61 6d 65 73 20  s workloadNames 
06b0: 77 6f 72 6b 6c 6f 61 64 43 61 6c 6c 62 61 63 6b  workloadCallback
06c0: 73 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  s....  #########
06d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0700: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0710: 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20 73  ####....  proc s
0720: 65 74 75 70 57 6f 72 6b 6c 6f 61 64 4d 65 6d 44  etupWorkloadMemD
0730: 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 76 61 72  b { fileName var
0740: 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 23 0d  Name } {..    #.
0750: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  .    # NOTE: Thi
0760: 73 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  s should be an i
0770: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
0780: 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 73 6b  e; therefore, sk
0790: 69 70 20 61 74 74 65 6d 70 74 69 6e 67 0d 0a 20  ip attempting.. 
07a0: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 64 65     #       to de
07b0: 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
07c0: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
07d0: 65 20 61 73 20 74 68 61 74 20 77 6f 75 6c 64 20  e as that would 
07e0: 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 0d 0a 20 20  not make any..  
07f0: 20 20 23 20 20 20 20 20 20 20 73 65 6e 73 65 2e    #       sense.
0800: 20 20 41 6c 73 6f 2c 20 64 69 73 61 62 6c 65 20    Also, disable 
0810: 75 73 65 20 6f 66 20 22 50 52 41 47 4d 41 20 74  use of "PRAGMA t
0820: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
0830: 6f 72 79 22 20 77 68 65 6e 0d 0a 20 20 20 20 23  ory" when..    #
0840: 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 20 75         setting u
0850: 70 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  p the new connec
0860: 74 69 6f 6e 20 62 65 63 61 75 73 65 20 69 74 20  tion because it 
0870: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61  is not thread-sa
0880: 66 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  fe...    #..    
0890: 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
08a0: 73 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d  setupDb $fileNam
08b0: 65 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22  e "" "" "" "" ""
08c0: 20 66 61 6c 73 65 20 66 61 6c 73 65 20 74 72 75   false false tru
08d0: 65 20 66 61 6c 73 65 20 5c 0d 0a 20 20 20 20 20  e false \..     
08e0: 20 20 20 24 76 61 72 4e 61 6d 65 20 74 72 75 65     $varName true
08f0: 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23  ]..  }....  ####
0900: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
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 0d 0a 0d 0a 20 20 70  #########....  p
0950: 72 6f 63 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61  roc setupWorkloa
0960: 64 46 69 6c 65 44 62 20 7b 20 66 69 6c 65 4e 61  dFileDb { fileNa
0970: 6d 65 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a  me varName } {..
0980: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
0990: 45 3a 20 53 6b 69 70 20 61 74 74 65 6d 70 74 69  E: Skip attempti
09a0: 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ng to delete the
09b0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
09c0: 62 61 73 65 20 66 69 6c 65 2e 20 20 41 6c 73 6f  base file.  Also
09d0: 2c 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 64  ,..    #       d
09e0: 69 73 61 62 6c 65 20 75 73 65 20 6f 66 20 22 50  isable use of "P
09f0: 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
0a00: 5f 64 69 72 65 63 74 6f 72 79 22 20 77 68 65 6e  _directory" when
0a10: 20 73 65 74 74 69 6e 67 20 75 70 0d 0a 20 20 20   setting up..   
0a20: 20 23 20 20 20 20 20 20 20 74 68 65 20 6e 65 77   #       the new
0a30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62 65 63 61   connection beca
0a40: 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 74 68  use it is not th
0a50: 72 65 61 64 2d 73 61 66 65 2e 0d 0a 20 20 20 20  read-safe...    
0a60: 23 0d 0a 20 20 20 20 75 70 6c 65 76 65 6c 20 31  #..    uplevel 1
0a70: 20 5b 6c 69 73 74 20 73 65 74 75 70 44 62 20 24   [list setupDb $
0a80: 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22  fileName "" "" "
0a90: 22 20 22 22 20 22 22 20 74 72 75 65 20 66 61 6c  " "" "" true fal
0aa0: 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20 5c  se false false \
0ab0: 0d 0a 20 20 20 20 20 20 20 20 24 76 61 72 4e 61  ..        $varNa
0ac0: 6d 65 20 74 72 75 65 5d 0d 0a 20 20 7d 0d 0a 0d  me true]..  }...
0ad0: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
0ae0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0af0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b20: 0d 0a 0d 0a 20 20 70 72 6f 63 20 66 6f 72 6d 61  ....  proc forma
0b30: 74 57 6f 72 6b 6c 6f 61 64 52 65 73 75 6c 74 20  tWorkloadResult 
0b40: 7b 20 69 6e 64 65 78 20 7d 20 7b 0d 0a 20 20 20  { index } {..   
0b50: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 61 70 70   set result [app
0b60: 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 69 74  endArgs "---- it
0b70: 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 77 6f 72  erations for wor
0b80: 6b 6c 6f 61 64 20 28 22 20 24 69 6e 64 65 78 20  kload (" $index 
0b90: 22 29 3a 20 22 5d 0d 0a 0d 0a 20 20 20 20 61 70  "): "]....    ap
0ba0: 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 65 78 70  pend result [exp
0bb0: 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  r {[info exists 
0bc0: 3a 3a 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e  ::iterations($in
0bd0: 64 65 78 2c 74 6f 74 61 6c 29 5d 20 3f 20 5c 0d  dex,total)] ? \.
0be0: 0a 20 20 20 20 20 20 20 20 24 3a 3a 69 74 65 72  .        $::iter
0bf0: 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 2c 74 6f  ations($index,to
0c00: 74 61 6c 29 20 3a 20 30 7d 5d 20 22 20 74 6f 74  tal) : 0}] " tot
0c10: 61 6c 2c 20 22 0d 0a 0d 0a 20 20 20 20 61 70 70  al, "....    app
0c20: 65 6e 64 20 72 65 73 75 6c 74 20 5b 65 78 70 72  end result [expr
0c30: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
0c40: 3a 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e 64  :iterations($ind
0c50: 65 78 2c 6f 6b 29 5d 20 3f 20 5c 0d 0a 20 20 20  ex,ok)] ? \..   
0c60: 20 20 20 20 20 24 3a 3a 69 74 65 72 61 74 69 6f       $::iteratio
0c70: 6e 73 28 24 69 6e 64 65 78 2c 6f 6b 29 20 3a 20  ns($index,ok) : 
0c80: 30 7d 5d 20 22 20 6f 6b 2c 20 22 0d 0a 0d 0a 20  0}] " ok, ".... 
0c90: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
0ca0: 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78   [expr {[info ex
0cb0: 69 73 74 73 20 3a 3a 69 74 65 72 61 74 69 6f 6e  ists ::iteration
0cc0: 73 28 24 69 6e 64 65 78 2c 65 72 72 6f 72 29 5d  s($index,error)]
0cd0: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 3a   ? \..        $:
0ce0: 3a 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e 64  :iterations($ind
0cf0: 65 78 2c 65 72 72 6f 72 29 20 3a 20 30 7d 5d 20  ex,error) : 0}] 
0d00: 22 20 65 72 72 6f 72 2c 20 22 0d 0a 0d 0a 20 20  " error, "....  
0d10: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
0d20: 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 77   Translate the w
0d30: 6f 72 6b 6c 6f 61 64 20 69 6e 64 65 78 20 74 6f  orkload index to
0d40: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
0d50: 6e 67 20 69 74 65 72 61 74 69 6f 6e 0d 0a 20 20  ng iteration..  
0d60: 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20    #       error 
0d70: 69 6e 64 69 63 61 74 6f 72 20 73 6f 20 74 68 61  indicator so tha
0d80: 74 20 77 65 20 63 61 6e 20 65 61 73 69 6c 79 20  t we can easily 
0d90: 6c 6f 6f 6b 75 70 20 74 68 65 20 6e 75 6d 62 65  lookup the numbe
0da0: 72 20 6f 66 0d 0a 20 20 20 20 23 20 20 20 20 20  r of..    #     
0db0: 20 20 66 61 69 6c 75 72 65 73 20 28 69 2e 65 2e    failures (i.e.
0dc0: 20 22 75 6e 65 78 70 65 63 74 65 64 20 65 72 72   "unexpected err
0dd0: 6f 72 73 22 29 20 66 6f 72 20 74 68 65 20 77 6f  ors") for the wo
0de0: 72 6b 6c 6f 61 64 2e 0d 0a 20 20 20 20 23 0d 0a  rkload...    #..
0df0: 20 20 20 20 73 65 74 20 69 6e 64 69 63 61 74 6f      set indicato
0e00: 72 20 5b 73 74 72 69 6e 67 20 63 68 61 72 61 63  r [string charac
0e10: 74 65 72 20 5b 65 78 70 72 20 7b 5b 73 74 72 69  ter [expr {[stri
0e20: 6e 67 20 6f 72 64 69 6e 61 6c 20 61 20 30 5d 20  ng ordinal a 0] 
0e30: 2b 20 24 69 6e 64 65 78 20 2d 20 31 7d 5d 5d 0d  + $index - 1}]].
0e40: 0a 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 72 65  ...    append re
0e50: 73 75 6c 74 20 5b 65 78 70 72 20 7b 5b 69 6e 66  sult [expr {[inf
0e60: 6f 20 65 78 69 73 74 73 20 3a 3a 66 61 69 6c 75  o exists ::failu
0e70: 72 65 73 28 24 69 6e 64 69 63 61 74 6f 72 29 5d  res($indicator)]
0e80: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 3a   ? \..        $:
0e90: 3a 66 61 69 6c 75 72 65 73 28 24 69 6e 64 69 63  :failures($indic
0ea0: 61 74 6f 72 29 20 3a 20 30 7d 5d 20 22 20 66 61  ator) : 0}] " fa
0eb0: 69 6c 65 64 5c 6e 22 0d 0a 0d 0a 20 20 20 20 72  iled\n"....    r
0ec0: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
0ed0: 20 7d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23  ################
0f20: 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20  #####....  proc 
0f30: 66 6f 72 6d 61 74 57 6f 72 6b 6c 6f 61 64 54 69  formatWorkloadTi
0f40: 6d 65 20 7b 20 69 6e 64 65 78 20 7d 20 7b 0d 0a  me { index } {..
0f50: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0f60: 69 73 74 73 20 3a 3a 74 69 6d 65 73 28 24 69 6e  ists ::times($in
0f70: 64 65 78 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  dex)]} then {.. 
0f80: 20 20 20 20 20 73 65 74 20 6c 65 6e 67 74 68 20       set length 
0f90: 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 69 6d 65  [llength $::time
0fa0: 73 28 24 69 6e 64 65 78 29 5d 0d 0a 0d 0a 20 20  s($index)]....  
0fb0: 20 20 20 20 69 66 20 7b 24 6c 65 6e 67 74 68 20      if {$length 
0fc0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
0fd0: 20 20 20 20 20 73 65 74 20 73 75 6d 20 5b 65 78       set sum [ex
0fe0: 70 72 20 5b 6a 6f 69 6e 20 24 3a 3a 74 69 6d 65  pr [join $::time
0ff0: 73 28 24 69 6e 64 65 78 29 20 2b 5d 5d 0d 0a 0d  s($index) +]]...
1000: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1010: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d  [appendArgs "---
1020: 2d 20 61 76 65 72 61 67 65 20 74 69 6d 65 20 66  - average time f
1030: 6f 72 20 77 6f 72 6b 6c 6f 61 64 20 28 22 20 24  or workload (" $
1040: 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20  index \..       
1050: 20 20 20 20 20 22 29 20 69 73 20 61 62 6f 75 74       ") is about
1060: 20 22 20 5b 65 78 70 72 20 7b 69 6e 74 28 24 73   " [expr {int($s
1070: 75 6d 20 2f 20 24 6c 65 6e 67 74 68 20 2f 20 31  um / $length / 1
1080: 30 30 30 2e 30 29 7d 5d 20 5c 0d 0a 20 20 20 20  000.0)}] \..    
1090: 20 20 20 20 20 20 20 20 22 20 6d 69 6c 6c 69 73          " millis
10a0: 65 63 6f 6e 64 73 20 28 22 20 5b 65 78 70 72 20  econds (" [expr 
10b0: 7b 69 6e 74 28 24 73 75 6d 20 2f 20 28 5b 69 6e  {int($sum / ([in
10c0: 66 6f 20 65 78 69 73 74 73 20 5c 0d 0a 20 20 20  fo exists \..   
10d0: 20 20 20 20 20 20 20 20 20 3a 3a 69 74 65 72 61           ::itera
10e0: 74 69 6f 6e 73 28 24 69 6e 64 65 78 2c 74 6f 74  tions($index,tot
10f0: 61 6c 29 5d 20 3f 20 24 3a 3a 69 74 65 72 61 74  al)] ? $::iterat
1100: 69 6f 6e 73 28 24 69 6e 64 65 78 2c 74 6f 74 61  ions($index,tota
1110: 6c 29 20 3a 20 5c 0d 0a 20 20 20 20 20 20 20 20  l) : \..        
1120: 20 20 20 20 24 6c 65 6e 67 74 68 29 20 2f 20 31      $length) / 1
1130: 30 30 30 2e 30 29 7d 5d 20 22 20 6d 69 6c 6c 69  000.0)}] " milli
1140: 73 65 63 6f 6e 64 73 20 70 65 72 20 69 74 65 72  seconds per iter
1150: 61 74 69 6f 6e 29 5c 6e 22 5d 0d 0a 20 20 20 20  ation)\n"]..    
1160: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
1170: 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64    return [append
1180: 41 72 67 73 20 22 2d 2d 2d 2d 20 6e 6f 20 74 69  Args "---- no ti
1190: 6d 65 73 20 66 6f 72 20 77 6f 72 6b 6c 6f 61 64  mes for workload
11a0: 20 28 22 20 24 69 6e 64 65 78 20 29 5c 6e 5d 0d   (" $index )\n].
11b0: 0a 20 20 7d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23  ################
1200: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f  #######....  pro
1210: 63 20 69 73 45 78 70 65 63 74 65 64 45 72 72 6f  c isExpectedErro
1220: 72 20 7b 20 65 72 72 6f 72 20 7d 20 7b 0d 0a 20  r { error } {.. 
1230: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
1240: 7b 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5c 73 6e  {[regexp -- {\sn
1250: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 74 31  o such table: t1
1260: 5c 73 7d 20 24 65 72 72 6f 72 5d 20 7c 7c 20 5c  \s} $error] || \
1270: 0d 0a 20 20 20 20 20 20 20 20 5b 72 65 67 65 78  ..        [regex
1280: 70 20 2d 2d 20 7b 5c 73 64 61 74 61 62 61 73 65  p -- {\sdatabase
1290: 20 69 73 20 6c 6f 63 6b 65 64 5c 73 7d 20 24 65   is locked\s} $e
12a0: 72 72 6f 72 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20  rror] || \..    
12b0: 20 20 20 20 5b 72 65 67 65 78 70 20 2d 2d 20 7b      [regexp -- {
12c0: 5c 73 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  \sdatabase table
12d0: 20 69 73 20 6c 6f 63 6b 65 64 5c 73 7d 20 24 65   is locked\s} $e
12e0: 72 72 6f 72 5d 7d 5d 0d 0a 20 20 7d 0d 0a 0d 0a  rror]}]..  }....
12f0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
1300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
1340: 0a 0d 0a 20 20 70 72 6f 63 20 69 6e 69 74 54 65  ...  proc initTe
1350: 73 74 20 7b 20 69 6e 64 69 63 61 74 6f 72 20 7d  st { indicator }
1360: 20 7b 0d 0a 20 20 20 20 73 65 74 20 3a 3a 65 61   {..    set ::ea
1370: 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e 73 74 72  gle_tests(constr
1380: 61 69 6e 74 73 29 20 24 3a 3a 74 65 73 74 5f 63  aints) $::test_c
1390: 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20 7d 0d  onstraints..  }.
13a0: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
13b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13f0: 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20 64 65 6c  ##....  proc del
1400: 61 79 54 65 73 74 20 7b 20 7b 65 78 74 72 61 20  ayTest { {extra 
1410: 30 7d 20 7d 20 7b 0d 0a 20 20 20 20 61 66 74 65  0} } {..    afte
1420: 72 20 5b 65 78 70 72 20 7b 69 6e 74 28 28 72 61  r [expr {int((ra
1430: 6e 64 28 29 20 2a 20 31 30 30 30 29 20 2b 20 24  nd() * 1000) + $
1440: 65 78 74 72 61 29 7d 5d 0d 0a 20 20 7d 0d 0a 0d  extra)}]..  }...
1450: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
1460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1470: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1480: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14a0: 0d 0a 0d 0a 20 20 70 72 6f 63 20 77 61 69 74 54  ....  proc waitT
14b0: 65 73 74 20 7b 20 69 6e 64 69 63 61 74 6f 72 20  est { indicator 
14c0: 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 21 5b 24  } {..    if {![$
14d0: 3a 3a 65 76 65 6e 74 20 57 61 69 74 4f 6e 65 20  ::event WaitOne 
14e0: 24 3a 3a 74 69 6d 65 6f 75 74 5d 7d 20 74 68 65  $::timeout]} the
14f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 65 72 72 6f 72  n {..      error
1500: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 74 69   [appendArgs "ti
1510: 6d 65 6f 75 74 20 77 68 69 6c 65 20 73 74 61 72  meout while star
1520: 74 69 6e 67 20 77 6f 72 6b 6c 6f 61 64 20 23 22  ting workload #"
1530: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 65   \..          [e
1540: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6f 72 64  xpr {[string ord
1550: 69 6e 61 6c 20 24 69 6e 64 69 63 61 74 6f 72 20  inal $indicator 
1560: 30 5d 20 2d 20 5b 73 74 72 69 6e 67 20 6f 72 64  0] - [string ord
1570: 69 6e 61 6c 20 41 20 30 5d 20 2b 20 31 7d 5d 5d  inal A 0] + 1}]]
1580: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
1590: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
15a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
15e0: 0a 0d 0a 20 20 70 72 6f 63 20 73 68 6f 77 54 65  ...  proc showTe
15f0: 73 74 20 7b 20 69 6e 64 69 63 61 74 6f 72 20 7d  st { indicator }
1600: 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 3a   {..    tputs $:
1610: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69  :test_channel $i
1620: 6e 64 69 63 61 74 6f 72 0d 0a 20 20 20 20 61 70  ndicator..    ap
1630: 70 65 6e 64 20 3a 3a 69 6e 64 69 63 61 74 6f 72  pend ::indicator
1640: 73 20 24 69 6e 64 69 63 61 74 6f 72 0d 0a 20 20  s $indicator..  
1650: 20 20 64 65 6c 61 79 54 65 73 74 20 24 3a 3a 63    delayTest $::c
1660: 6f 75 6e 74 28 32 29 0d 0a 20 20 7d 0d 0a 0d 0a  ount(2)..  }....
1670: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
1680: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1690: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
16c0: 0a 0d 0a 20 20 70 72 6f 63 20 64 6f 6e 65 54 65  ...  proc doneTe
16d0: 73 74 20 7b 20 7b 69 6e 64 69 63 61 74 6f 72 20  st { {indicator 
16e0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20  ""} } {..    if 
16f0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1700: 24 69 6e 64 69 63 61 74 6f 72 5d 20 3e 20 30 7d  $indicator] > 0}
1710: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 6c   then {..      l
1720: 61 70 70 65 6e 64 20 3a 3a 73 74 61 74 75 73 28  append ::status(
1730: 64 6f 6e 65 29 20 24 69 6e 64 69 63 61 74 6f 72  done) $indicator
1740: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 20  ..    }..    if 
1750: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1760: 73 74 61 74 75 73 28 64 6f 6e 65 29 5d 7d 20 74  status(done)]} t
1770: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 68 6f 73  hen {..      hos
1780: 74 20 74 69 74 6c 65 20 24 3a 3a 73 74 61 74 75  t title $::statu
1790: 73 28 64 6f 6e 65 29 0d 0a 20 20 20 20 7d 20 65  s(done)..    } e
17a0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 68 6f 73  lse {..      hos
17b0: 74 20 74 69 74 6c 65 20 22 22 0d 0a 20 20 20 20  t title ""..    
17c0: 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1810: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70  #########....  p
1820: 72 6f 63 20 66 61 69 6c 54 65 73 74 20 7b 20 69  roc failTest { i
1830: 6e 64 69 63 61 74 6f 72 20 65 72 72 6f 72 20 7d  ndicator error }
1840: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
1850: 20 4e 4f 54 45 3a 20 48 61 6c 74 20 61 6c 6c 20   NOTE: Halt all 
1860: 74 65 73 74 69 6e 67 20 61 6e 64 20 65 78 69 74  testing and exit
1870: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6e 6f 77   the process now
1880: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 2d 4f  ..    #       -O
1890: 52 2d 20 6a 75 73 74 20 72 65 63 6f 72 64 20 74  R- just record t
18a0: 68 65 20 66 61 69 6c 75 72 65 20 61 6e 64 20 63  he failure and c
18b0: 6f 6e 74 69 6e 75 65 3f 0d 0a 20 20 20 20 23 0d  ontinue?..    #.
18c0: 0a 20 20 20 20 73 65 74 20 6c 65 76 65 6c 20 5b  .    set level [
18d0: 65 78 70 72 20 7b 5b 69 6e 66 6f 20 6c 65 76 65  expr {[info leve
18e0: 6c 5d 20 2d 20 31 7d 5d 0d 0a 0d 0a 20 20 20 20  l] - 1}]....    
18f0: 69 66 20 7b 24 3a 3a 65 78 69 74 4f 6e 46 61 69  if {$::exitOnFai
1900: 6c 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  l} then {..     
1910: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1920: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1930: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1940: 5c 6e 20 5b 69 6e 66 6f 20 6c 65 76 65 6c 20 24  \n [info level $
1950: 6c 65 76 65 6c 5d 20 22 3a 20 22 20 5c 6e 5c 74  level] ": " \n\t
1960: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20   $error \n].... 
1970: 20 20 20 20 20 65 78 69 74 20 66 61 69 6c 75 72       exit failur
1980: 65 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  e..    } else {.
1990: 0a 20 20 20 20 20 20 74 6c 6f 67 20 5b 61 70 70  .      tlog [app
19a0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
19b0: 20 20 20 20 20 22 5c 6e 2d 2d 2d 2d 20 42 45 47       "\n---- BEG
19c0: 49 4e 20 54 45 53 54 20 46 41 49 4c 55 52 45 20  IN TEST FAILURE 
19d0: 4f 55 54 50 55 54 5c 6e 22 20 5c 0d 0a 20 20 20  OUTPUT\n" \..   
19e0: 20 20 20 20 20 20 20 5c 6e 20 5b 69 6e 66 6f 20         \n [info 
19f0: 6c 65 76 65 6c 20 24 6c 65 76 65 6c 5d 20 22 3a  level $level] ":
1a00: 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
1a10: 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  n \..          "
1a20: 5c 6e 2d 2d 2d 2d 20 45 4e 44 20 54 45 53 54 20  \n---- END TEST 
1a30: 46 41 49 4c 55 52 45 20 4f 55 54 50 55 54 5c 6e  FAILURE OUTPUT\n
1a40: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74  "]....      tput
1a50: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1a60: 6c 20 24 69 6e 64 69 63 61 74 6f 72 0d 0a 0d 0a  l $indicator....
1a70: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1a80: 20 65 78 69 73 74 73 20 3a 3a 66 61 69 6c 75 72   exists ::failur
1a90: 65 73 28 24 69 6e 64 69 63 61 74 6f 72 29 5d 7d  es($indicator)]}
1aa0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ab0: 20 73 65 74 20 3a 3a 66 61 69 6c 75 72 65 73 28   set ::failures(
1ac0: 24 69 6e 64 69 63 61 74 6f 72 29 20 30 0d 0a 20  $indicator) 0.. 
1ad0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1ae0: 69 6e 63 72 20 3a 3a 66 61 69 6c 75 72 65 73 28  incr ::failures(
1af0: 24 69 6e 64 69 63 61 74 6f 72 29 0d 0a 20 20 20  $indicator)..   
1b00: 20 20 20 64 65 6c 61 79 54 65 73 74 20 24 3a 3a     delayTest $::
1b10: 63 6f 75 6e 74 28 32 29 0d 0a 20 20 20 20 7d 0d  count(2)..    }.
1b20: 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23  .  }....  ######
1b30: 23 23 23 23 23 23 23 23 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 0d 0a 0d 0a 20 20 70 72 6f  #######....  pro
1b80: 63 20 61 6c 6c 6f 63 4d 65 6d 20 7b 20 73 69 7a  c allocMem { siz
1b90: 65 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 24  e } {..    if {$
1ba0: 3a 3a 63 6f 54 61 73 6b 4d 65 6d 7d 20 74 68 65  ::coTaskMem} the
1bb0: 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  n {..      retur
1bc0: 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  n [object invoke
1bd0: 20 2d 63 72 65 61 74 65 20 5c 0d 0a 20 20 20 20   -create \..    
1be0: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 52 75 6e        System.Run
1bf0: 74 69 6d 65 2e 49 6e 74 65 72 6f 70 53 65 72 76  time.InteropServ
1c00: 69 63 65 73 2e 4d 61 72 73 68 61 6c 20 5c 0d 0a  ices.Marshal \..
1c10: 20 20 20 20 20 20 20 20 20 20 41 6c 6c 6f 63 43            AllocC
1c20: 6f 54 61 73 6b 4d 65 6d 20 24 73 69 7a 65 5d 3b  oTaskMem $size];
1c30: 20 23 20 74 68 72 6f 77 0d 0a 20 20 20 20 7d 20   # throw..    } 
1c40: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 73 65  else {..      se
1c50: 74 20 70 74 72 20 5b 6f 62 6a 65 63 74 20 69 6e  t ptr [object in
1c60: 76 6f 6b 65 20 2d 63 72 65 61 74 65 20 2d 66 6c  voke -create -fl
1c70: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79 73 74  ..          Syst
1c90: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
1ca0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
1cb0: 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
1cc0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 24  sqlite3_malloc $
1cd0: 73 69 7a 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  size]....      i
1ce0: 66 20 7b 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  f {[object invok
1cf0: 65 20 24 70 74 72 20 54 6f 49 6e 74 36 34 5d 20  e $ptr ToInt64] 
1d00: 21 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  != 0} then {..  
1d10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 70 74        return $pt
1d20: 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  r..      } else 
1d30: 7b 0d 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72  {..        error
1d40: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 73 71   [appendArgs "sq
1d50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 22 20 24  lite3_malloc(" $
1d60: 73 69 7a 65 20 22 29 20 66 61 69 6c 65 64 22 5d  size ") failed"]
1d70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1d80: 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23  ..  }....  #####
1d90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1da0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1db0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dd0: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72  ########....  pr
1de0: 6f 63 20 75 73 65 4d 65 6d 20 7b 20 70 74 72 20  oc useMem { ptr 
1df0: 73 69 7a 65 20 7d 20 7b 0d 0a 20 20 20 20 69 66  size } {..    if
1e00: 20 7b 21 5b 69 73 4d 6f 6e 6f 5d 7d 20 74 68 65   {![isMono]} the
1e10: 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n {..      #..  
1e20: 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68 65 20      # HACK: The 
1e30: 74 79 70 65 20 73 69 67 6e 61 74 75 72 65 20 6f  type signature o
1e40: 66 20 74 68 65 20 5a 65 72 6f 4d 65 6d 6f 72 79  f the ZeroMemory
1e50: 20 6d 65 74 68 6f 64 20 63 68 61 6e 67 65 64 20   method changed 
1e60: 61 73 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  as of the..     
1e70: 20 23 20 20 20 20 20 20 20 2e 4e 45 54 20 46 72   #       .NET Fr
1e80: 61 6d 65 77 6f 72 6b 20 34 2e 35 2e 20 20 54 68  amework 4.5.  Th
1e90: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1ea0: 74 20 77 65 6e 74 20 66 72 6f 6d 20 62 65 69 6e  t went from bein
1eb0: 67 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  g of..      #   
1ec0: 20 20 20 20 74 79 70 65 20 55 49 6e 74 20 74 6f      type UInt to
1ed0: 20 74 79 70 65 20 55 49 6e 74 50 74 72 2e 0d 0a   type UIntPtr...
1ee0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1ef0: 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  f {[haveConstrai
1f00: 6e 74 20 64 6f 74 4e 65 74 34 30 5d 20 26 26 20  nt dotNet40] && 
1f10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61  \..          [ha
1f20: 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74  veConstraint dot
1f30: 4e 65 74 34 35 4f 72 48 69 67 68 65 72 5d 7d 20  Net45OrHigher]} 
1f40: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f50: 73 65 74 20 6e 65 77 53 69 7a 65 20 5b 6f 62 6a  set newSize [obj
1f60: 65 63 74 20 63 72 65 61 74 65 20 55 49 6e 74 50  ect create UIntP
1f70: 74 72 20 24 73 69 7a 65 5d 0d 0a 20 20 20 20 20  tr $size]..     
1f80: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1f90: 20 20 20 73 65 74 20 6e 65 77 53 69 7a 65 20 24     set newSize $
1fa0: 73 69 7a 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  size..      }...
1fb0: 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e  .      object in
1fc0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1fd0: 50 75 62 6c 69 63 20 4d 69 63 72 6f 73 6f 66 74  Public Microsoft
1fe0: 2e 57 69 6e 33 32 2e 57 69 6e 33 32 4e 61 74 69  .Win32.Win32Nati
1ff0: 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ve \..          
2000: 5a 65 72 6f 4d 65 6d 6f 72 79 20 24 70 74 72 20  ZeroMemory $ptr 
2010: 24 6e 65 77 53 69 7a 65 0d 0a 20 20 20 20 7d 0d  $newSize..    }.
2020: 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23  .  }....  ######
2030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2070: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f  #######....  pro
2080: 63 20 66 72 65 65 4d 65 6d 20 7b 20 70 74 72 20  c freeMem { ptr 
2090: 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 24 3a 3a  } {..    if {$::
20a0: 63 6f 54 61 73 6b 4d 65 6d 7d 20 74 68 65 6e 20  coTaskMem} then 
20b0: 7b 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  {..      object 
20c0: 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e 52 75  invoke System.Ru
20d0: 6e 74 69 6d 65 2e 49 6e 74 65 72 6f 70 53 65 72  ntime.InteropSer
20e0: 76 69 63 65 73 2e 4d 61 72 73 68 61 6c 20 5c 0d  vices.Marshal \.
20f0: 0a 20 20 20 20 20 20 20 20 20 20 46 72 65 65 43  .          FreeC
2100: 6f 54 61 73 6b 4d 65 6d 20 24 70 74 72 0d 0a 20  oTaskMem $ptr.. 
2110: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
2120: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
2130: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
2140: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
2150: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2160: 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
2170: 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
2180: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2190: 20 24 70 74 72 0d 0a 20 20 20 20 7d 0d 0a 0d 0a   $ptr..    }....
21a0: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
21b0: 45 3a 20 46 72 65 65 20 65 78 74 72 61 20 6f 70  E: Free extra op
21c0: 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
21d0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 61 64 64  le reference add
21e0: 65 64 20 62 79 20 74 68 65 0d 0a 20 20 20 20 23  ed by the..    #
21f0: 20 20 20 20 20 20 20 5b 72 65 74 75 72 6e 5d 20         [return] 
2200: 63 6f 6d 6d 61 6e 64 20 69 6e 20 5b 61 6c 6c 6f  command in [allo
2210: 63 4d 65 6d 5d 2e 0d 0a 20 20 20 20 23 0d 0a 20  cMem]...    #.. 
2220: 20 20 20 6f 62 6a 65 63 74 20 64 69 73 70 6f 73     object dispos
2230: 65 20 24 70 74 72 0d 0a 20 20 7d 0d 0a 0d 0a 20  e $ptr..  }.... 
2240: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
2250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
2290: 0d 0a 20 20 70 72 6f 63 20 73 65 74 75 70 4c 6f  ..  proc setupLo
22a0: 67 67 69 6e 67 20 7b 20 66 69 6c 65 4e 61 6d 65  gging { fileName
22b0: 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 21 5b   } {..    if {![
22c0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6c 6f  info exists ::lo
22d0: 67 4c 69 73 74 65 6e 65 72 5d 7d 20 74 68 65 6e  gListener]} then
22e0: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 3a 3a   {..      set ::
22f0: 6c 6f 67 4c 69 73 74 65 6e 65 72 20 5b 6f 62 6a  logListener [obj
2300: 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61  ect create -alia
2310: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  s \..          S
2320: 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63  ystem.Diagnostic
2330: 73 2e 54 65 78 74 57 72 69 74 65 72 54 72 61 63  s.TextWriterTrac
2340: 65 4c 69 73 74 65 6e 65 72 20 24 66 69 6c 65 4e  eListener $fileN
2350: 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  ame]..    }.... 
2360: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
2370: 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
2380: 69 63 73 2e 54 72 61 63 65 2e 4c 69 73 74 65 6e  ics.Trace.Listen
2390: 65 72 73 20 41 64 64 20 24 3a 3a 6c 6f 67 4c 69  ers Add $::logLi
23a0: 73 74 65 6e 65 72 0d 0a 20 20 20 20 6f 62 6a 65  stener..    obje
23b0: 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d  ct invoke System
23c0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
23d0: 69 74 65 4c 6f 67 20 49 6e 69 74 69 61 6c 69 7a  iteLog Initializ
23e0: 65 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24  e....    tputs $
23f0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
2400: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
2410: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 6e 61 62        "---- enab
2420: 6c 65 64 20 53 51 4c 69 74 65 20 74 72 61 63 65  led SQLite trace
2430: 20 6c 6f 67 67 69 6e 67 20 74 6f 20 66 69 6c 65   logging to file
2440: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
2450: 22 5c 6e 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  "\n]..  }....  #
2460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2470: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2480: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24a0: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
24b0: 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 4c 6f    proc cleanupLo
24c0: 67 67 69 6e 67 20 7b 20 66 69 6c 65 4e 61 6d 65  gging { fileName
24d0: 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69   } {..    if {[i
24e0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6c 6f 67  nfo exists ::log
24f0: 4c 69 73 74 65 6e 65 72 5d 7d 20 74 68 65 6e 20  Listener]} then 
2500: 7b 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  {..      object 
2510: 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44 69  invoke System.Di
2520: 61 67 6e 6f 73 74 69 63 73 2e 54 72 61 63 65 2e  agnostics.Trace.
2530: 4c 69 73 74 65 6e 65 72 73 20 52 65 6d 6f 76 65  Listeners Remove
2540: 20 24 3a 3a 6c 6f 67 4c 69 73 74 65 6e 65 72 0d   $::logListener.
2550: 0a 20 20 20 20 20 20 24 3a 3a 6c 6f 67 4c 69 73  .      $::logLis
2560: 74 65 6e 65 72 20 43 6c 6f 73 65 0d 0a 20 20 20  tener Close..   
2570: 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20   }....    #..   
2580: 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
2590: 65 20 74 72 61 63 65 20 6c 69 73 74 65 6e 65 72  e trace listener
25a0: 20 6c 6f 67 20 66 69 6c 65 20 74 6f 20 74 68 65   log file to the
25b0: 20 6d 61 69 6e 20 74 65 73 74 20 6c 6f 67 20 66   main test log f
25c0: 69 6c 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  ile...    #..   
25d0: 20 74 6c 6f 67 20 22 2d 2d 2d 2d 20 42 45 47 49   tlog "---- BEGI
25e0: 4e 20 54 52 41 43 45 20 4c 49 53 54 45 4e 45 52  N TRACE LISTENER
25f0: 20 4f 55 54 50 55 54 5c 6e 22 0d 0a 20 20 20 20   OUTPUT\n"..    
2600: 74 6c 6f 67 20 5b 72 65 61 64 46 69 6c 65 20 24  tlog [readFile $
2610: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 74  fileName]..    t
2620: 6c 6f 67 20 22 5c 6e 2d 2d 2d 2d 20 45 4e 44 20  log "\n---- END 
2630: 54 52 41 43 45 20 4c 49 53 54 45 4e 45 52 20 4f  TRACE LISTENER O
2640: 55 54 50 55 54 5c 6e 22 0d 0a 0d 0a 20 20 20 20  UTPUT\n"....    
2650: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 44  #..    # NOTE: D
2660: 65 6c 65 74 65 20 74 68 65 20 74 72 61 63 65 20  elete the trace 
2670: 6c 69 73 74 65 6e 65 72 20 6c 6f 67 20 66 69 6c  listener log fil
2680: 65 20 62 65 63 61 75 73 65 20 69 74 73 20 63 6f  e because its co
2690: 6e 74 65 6e 74 73 20 68 61 76 65 0d 0a 20 20 20  ntents have..   
26a0: 20 23 20 20 20 20 20 20 20 62 65 65 6e 20 63 6f   #       been co
26b0: 70 69 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e  pied to the main
26c0: 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d   test log file..
26d0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 63 6c 65 61  .    #..    clea
26e0: 6e 75 70 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  nupFile $fileNam
26f0: 65 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24  e....    tputs $
2700: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
2710: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
2720: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 69 73 61        "---- disa
2730: 62 6c 65 64 20 53 51 4c 69 74 65 20 74 72 61 63  bled SQLite trac
2740: 65 20 6c 6f 67 67 69 6e 67 20 74 6f 20 66 69 6c  e logging to fil
2750: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
2760: 5c 22 5c 6e 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  \"\n]..  }....  
2770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2780: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2790: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
27c0: 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20  .  #..  # NOTE: 
27d0: 53 65 74 75 70 20 74 68 65 20 64 65 66 61 75 6c  Setup the defaul
27e0: 74 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  t values for the
27f0: 20 74 75 6e 61 62 6c 65 20 77 6f 72 6b 6c 6f 61   tunable workloa
2800: 64 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 41  d parameters.  A
2810: 6e 79 2c 0d 0a 20 20 23 20 20 20 20 20 20 20 61  ny,..  #       a
2820: 6c 6c 2c 20 6f 72 20 6e 6f 6e 65 20 6f 66 20 74  ll, or none of t
2830: 68 65 73 65 20 6d 61 79 20 62 65 20 6f 76 65 72  hese may be over
2840: 72 69 64 65 6e 20 76 69 61 20 74 68 65 20 63 6f  riden via the co
2850: 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0d 0a 20 20 23  mmand line...  #
2860: 0d 0a 20 20 73 65 74 20 63 6f 75 6e 74 28 30 29  ..  set count(0)
2870: 20 33 3b 20 20 20 20 20 20 20 20 20 23 20 57 6f   3;         # Wo
2880: 72 6b 6c 6f 61 64 20 72 65 70 65 61 74 20 63 6f  rkload repeat co
2890: 75 6e 74 20 28 69 2e 65 2e 20 74 6f 74 61 6c 20  unt (i.e. total 
28a0: 66 75 6c 6c 20 72 75 6e 73 29 2e 0d 0a 20 20 73  full runs)...  s
28b0: 65 74 20 63 6f 75 6e 74 28 31 29 20 35 3b 20 20  et count(1) 5;  
28c0: 20 20 20 20 20 20 20 23 20 57 6f 72 6b 6c 6f 61         # Workloa
28d0: 64 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 75 6e  d iteration coun
28e0: 74 20 28 69 2e 65 2e 20 77 69 74 68 69 6e 20 61  t (i.e. within a
28f0: 20 72 75 6e 29 2e 0d 0a 20 20 73 65 74 20 63 6f   run)...  set co
2900: 75 6e 74 28 32 29 20 32 30 30 3b 20 20 20 20 20  unt(2) 200;     
2910: 20 20 23 20 57 6f 72 6b 6c 6f 61 64 20 69 74 65    # Workload ite
2920: 72 61 74 69 6f 6e 20 64 65 6c 61 79 2c 20 69 6e  ration delay, in
2930: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0d 0a   milliseconds...
2940: 20 20 73 65 74 20 63 6f 75 6e 74 28 33 29 20 35    set count(3) 5
2950: 37 3b 20 20 20 20 20 20 20 20 23 20 57 6f 72 6b  7;        # Work
2960: 6c 6f 61 64 20 22 73 6d 61 6c 6c 22 20 64 61 74  load "small" dat
2970: 61 20 63 68 75 6e 6b 20 73 69 7a 65 2c 20 69 6e  a chunk size, in
2980: 20 62 79 74 65 73 2e 0d 0a 20 20 73 65 74 20 63   bytes...  set c
2990: 6f 75 6e 74 28 34 29 20 31 30 30 30 30 3b 20 20  ount(4) 10000;  
29a0: 20 20 20 23 20 57 6f 72 6b 6c 6f 61 64 20 22 62     # Workload "b
29b0: 69 67 22 20 64 61 74 61 20 63 68 75 6e 6b 20 73  ig" data chunk s
29c0: 69 7a 65 2c 20 69 6e 20 62 79 74 65 73 2e 0d 0a  ize, in bytes...
29d0: 20 20 73 65 74 20 63 6f 75 6e 74 28 35 29 20 32    set count(5) 2
29e0: 30 39 37 31 35 32 30 30 3b 20 23 20 4d 61 78 69  09715200; # Maxi
29f0: 6d 75 6d 20 68 65 61 70 20 6d 65 6d 6f 72 79 20  mum heap memory 
2a00: 74 6f 20 65 78 63 6c 75 64 65 20 61 74 20 6f 6e  to exclude at on
2a10: 65 20 74 69 6d 65 2e 0d 0a 20 20 73 65 74 20 6e  e time...  set n
2a20: 6f 57 6f 72 6b 6c 6f 61 64 20 5b 6c 69 73 74 5d  oWorkload [list]
2a30: 3b 20 20 23 20 57 6f 72 6b 6c 6f 61 64 73 20 74  ;  # Workloads t
2a40: 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f  o be omitted fro
2a50: 6d 20 74 68 65 20 72 75 6e 2c 20 62 79 20 69 6e  m the run, by in
2a60: 64 65 78 2e 0d 0a 20 20 73 65 74 20 70 72 69 6f  dex...  set prio
2a70: 72 69 74 69 65 73 20 5b 6c 69 73 74 5d 3b 20 20  rities [list];  
2a80: 23 20 44 69 63 74 69 6f 6e 61 72 79 20 6f 66 20  # Dictionary of 
2a90: 77 6f 72 6b 6c 6f 61 64 20 74 68 72 65 61 64 20  workload thread 
2aa0: 70 72 69 6f 72 69 74 69 65 73 2e 0d 0a 20 20 73  priorities...  s
2ab0: 65 74 20 65 78 69 74 4f 6e 46 61 69 6c 20 66 61  et exitOnFail fa
2ac0: 6c 73 65 3b 20 20 20 23 20 48 61 6c 74 20 74 65  lse;   # Halt te
2ad0: 73 74 69 6e 67 20 61 6e 64 20 65 78 69 74 20 70  sting and exit p
2ae0: 72 6f 63 65 73 73 20 6f 6e 20 74 65 73 74 20 66  rocess on test f
2af0: 61 69 6c 75 72 65 3f 0d 0a 20 20 73 65 74 20 63  ailure?..  set c
2b00: 6f 54 61 73 6b 4d 65 6d 20 74 72 75 65 3b 20 20  oTaskMem true;  
2b10: 20 20 20 23 20 55 73 65 20 41 6c 6c 6f 63 43 6f     # Use AllocCo
2b20: 54 61 73 6b 4d 65 6d 2f 46 72 65 65 43 6f 54 61  TaskMem/FreeCoTa
2b30: 73 6b 4d 65 6d 20 66 6f 72 20 6d 65 6d 6f 72 79  skMem for memory
2b40: 3f 0d 0a 20 20 73 65 74 20 6e 6f 54 72 61 63 65  ?..  set noTrace
2b50: 20 66 61 6c 73 65 3b 20 20 20 20 20 20 23 20 44   false;      # D
2b60: 69 73 61 62 6c 65 20 53 51 4c 69 74 65 20 74 72  isable SQLite tr
2b70: 61 63 65 20 6c 6f 67 67 69 6e 67 20 74 6f 20 61  ace logging to a
2b80: 20 66 69 6c 65 3f 0d 0a 0d 0a 20 20 23 23 23 23   file?....  ####
2b90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ba0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2bb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2bc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2bd0: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23  #########....  #
2be0: 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 63  ..  # NOTE: If c
2bf0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75  ommand line argu
2c00: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 74 65 73  ments to the tes
2c10: 74 20 73 75 69 74 65 20 61 72 65 20 61 76 61 69  t suite are avai
2c20: 6c 61 62 6c 65 2c 20 70 72 6f 63 65 73 73 0d 0a  lable, process..
2c30: 20 20 23 20 20 20 20 20 20 20 74 68 65 6d 20 66    #       them f
2c40: 6f 72 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 74  or any options t
2c50: 68 61 74 20 61 72 65 20 61 70 70 6c 69 63 61 62  hat are applicab
2c60: 6c 65 20 74 6f 20 74 68 69 73 20 74 65 73 74 20  le to this test 
2c70: 28 69 2e 65 2e 20 61 6e 79 20 6f 66 0d 0a 20 20  (i.e. any of..  
2c80: 23 20 20 20 20 20 20 20 74 68 65 20 74 75 6e 61  #       the tuna
2c90: 62 6c 65 20 77 6f 72 6b 6c 6f 61 64 20 70 61 72  ble workload par
2ca0: 61 6d 65 74 65 72 73 20 6c 69 73 74 65 64 20 61  ameters listed a
2cb0: 62 6f 76 65 29 2e 0d 0a 20 20 23 0d 0a 20 20 69  bove)...  #..  i
2cc0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2cd0: 61 72 67 76 5d 20 26 26 20 5b 6c 6c 65 6e 67 74  argv] && [llengt
2ce0: 68 20 24 61 72 67 76 5d 20 3e 20 30 7d 20 74 68  h $argv] > 0} th
2cf0: 65 6e 20 7b 0d 0a 20 20 20 20 70 61 72 73 65 20  en {..    parse 
2d00: 6f 70 74 69 6f 6e 73 20 2d 66 6c 61 67 73 20 5c  options -flags \
2d10: 0d 0a 20 20 20 20 20 20 20 20 7b 2d 53 74 6f 70  ..        {-Stop
2d20: 4f 6e 55 6e 6b 6e 6f 77 6e 4f 70 74 69 6f 6e 20  OnUnknownOption 
2d30: 2b 49 67 6e 6f 72 65 4f 6e 55 6e 6b 6e 6f 77 6e  +IgnoreOnUnknown
2d40: 4f 70 74 69 6f 6e 20 53 6b 69 70 4f 6e 55 6e 6b  Option SkipOnUnk
2d50: 6e 6f 77 6e 4f 70 74 69 6f 6e 7d 20 2d 2d 20 5c  nownOption} -- \
2d60: 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20  ..        [list 
2d70: 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48  [list null MustH
2d80: 61 76 65 49 6e 74 65 67 65 72 56 61 6c 75 65 20  aveIntegerValue 
2d90: 2d 31 20 2d 31 20 2d 63 6f 75 6e 74 30 20 24 63  -1 -1 -count0 $c
2da0: 6f 75 6e 74 28 30 29 5d 20 5c 0d 0a 20 20 20 20  ount(0)] \..    
2db0: 20 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d      [list null M
2dc0: 75 73 74 48 61 76 65 49 6e 74 65 67 65 72 56 61  ustHaveIntegerVa
2dd0: 6c 75 65 20 2d 31 20 2d 31 20 2d 63 6f 75 6e 74  lue -1 -1 -count
2de0: 31 20 24 63 6f 75 6e 74 28 31 29 5d 20 5c 0d 0a  1 $count(1)] \..
2df0: 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75          [list nu
2e00: 6c 6c 20 4d 75 73 74 48 61 76 65 49 6e 74 65 67  ll MustHaveInteg
2e10: 65 72 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 63  erValue -1 -1 -c
2e20: 6f 75 6e 74 32 20 24 63 6f 75 6e 74 28 32 29 5d  ount2 $count(2)]
2e30: 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73   \..        [lis
2e40: 74 20 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 49  t null MustHaveI
2e50: 6e 74 65 67 65 72 56 61 6c 75 65 20 2d 31 20 2d  ntegerValue -1 -
2e60: 31 20 2d 63 6f 75 6e 74 33 20 24 63 6f 75 6e 74  1 -count3 $count
2e70: 28 33 29 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  (3)] \..        
2e80: 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48  [list null MustH
2e90: 61 76 65 49 6e 74 65 67 65 72 56 61 6c 75 65 20  aveIntegerValue 
2ea0: 2d 31 20 2d 31 20 2d 63 6f 75 6e 74 34 20 24 63  -1 -1 -count4 $c
2eb0: 6f 75 6e 74 28 34 29 5d 20 5c 0d 0a 20 20 20 20  ount(4)] \..    
2ec0: 20 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d      [list null M
2ed0: 75 73 74 48 61 76 65 49 6e 74 65 67 65 72 56 61  ustHaveIntegerVa
2ee0: 6c 75 65 20 2d 31 20 2d 31 20 2d 63 6f 75 6e 74  lue -1 -1 -count
2ef0: 35 20 24 63 6f 75 6e 74 28 35 29 5d 20 5c 0d 0a  5 $count(5)] \..
2f00: 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75          [list nu
2f10: 6c 6c 20 4d 75 73 74 48 61 76 65 4c 69 73 74 56  ll MustHaveListV
2f20: 61 6c 75 65 20 2d 31 20 2d 31 20 2d 6e 6f 57 6f  alue -1 -1 -noWo
2f30: 72 6b 6c 6f 61 64 20 24 6e 6f 57 6f 72 6b 6c 6f  rkload $noWorklo
2f40: 61 64 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b  ad] \..        [
2f50: 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48 61  list null MustHa
2f60: 76 65 4c 69 73 74 56 61 6c 75 65 20 2d 31 20 2d  veListValue -1 -
2f70: 31 20 2d 70 72 69 6f 72 69 74 69 65 73 20 24 70  1 -priorities $p
2f80: 72 69 6f 72 69 74 69 65 73 5d 20 5c 0d 0a 20 20  riorities] \..  
2f90: 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c        [list null
2fa0: 20 4d 75 73 74 48 61 76 65 42 6f 6f 6c 65 61 6e   MustHaveBoolean
2fb0: 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 65 78 69  Value -1 -1 -exi
2fc0: 74 4f 6e 46 61 69 6c 20 24 65 78 69 74 4f 6e 46  tOnFail $exitOnF
2fd0: 61 69 6c 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ail] \..        
2fe0: 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48  [list null MustH
2ff0: 61 76 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65 20  aveBooleanValue 
3000: 2d 31 20 2d 31 20 2d 63 6f 54 61 73 6b 4d 65 6d  -1 -1 -coTaskMem
3010: 20 24 63 6f 54 61 73 6b 4d 65 6d 5d 20 5c 0d 0a   $coTaskMem] \..
3020: 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75          [list nu
3030: 6c 6c 20 4d 75 73 74 48 61 76 65 42 6f 6f 6c 65  ll MustHaveBoole
3040: 61 6e 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 6e  anValue -1 -1 -n
3050: 6f 54 72 61 63 65 20 24 6e 6f 54 72 61 63 65 5d  oTrace $noTrace]
3060: 5d 20 24 61 72 67 76 0d 0a 0d 0a 20 20 20 20 73  ] $argv....    s
3070: 65 74 20 63 6f 75 6e 74 28 30 29 20 24 6f 70 74  et count(0) $opt
3080: 69 6f 6e 73 28 2d 63 6f 75 6e 74 30 2c 76 61 6c  ions(-count0,val
3090: 75 65 29 0d 0a 20 20 20 20 73 65 74 20 63 6f 75  ue)..    set cou
30a0: 6e 74 28 31 29 20 24 6f 70 74 69 6f 6e 73 28 2d  nt(1) $options(-
30b0: 63 6f 75 6e 74 31 2c 76 61 6c 75 65 29 0d 0a 20  count1,value).. 
30c0: 20 20 20 73 65 74 20 63 6f 75 6e 74 28 32 29 20     set count(2) 
30d0: 24 6f 70 74 69 6f 6e 73 28 2d 63 6f 75 6e 74 32  $options(-count2
30e0: 2c 76 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74  ,value)..    set
30f0: 20 63 6f 75 6e 74 28 33 29 20 24 6f 70 74 69 6f   count(3) $optio
3100: 6e 73 28 2d 63 6f 75 6e 74 33 2c 76 61 6c 75 65  ns(-count3,value
3110: 29 0d 0a 20 20 20 20 73 65 74 20 63 6f 75 6e 74  )..    set count
3120: 28 34 29 20 24 6f 70 74 69 6f 6e 73 28 2d 63 6f  (4) $options(-co
3130: 75 6e 74 34 2c 76 61 6c 75 65 29 0d 0a 20 20 20  unt4,value)..   
3140: 20 73 65 74 20 63 6f 75 6e 74 28 35 29 20 24 6f   set count(5) $o
3150: 70 74 69 6f 6e 73 28 2d 63 6f 75 6e 74 35 2c 76  ptions(-count5,v
3160: 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74 20 6e  alue)..    set n
3170: 6f 57 6f 72 6b 6c 6f 61 64 20 24 6f 70 74 69 6f  oWorkload $optio
3180: 6e 73 28 2d 6e 6f 57 6f 72 6b 6c 6f 61 64 2c 76  ns(-noWorkload,v
3190: 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74 20 70  alue)..    set p
31a0: 72 69 6f 72 69 74 69 65 73 20 24 6f 70 74 69 6f  riorities $optio
31b0: 6e 73 28 2d 70 72 69 6f 72 69 74 69 65 73 2c 76  ns(-priorities,v
31c0: 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74 20 65  alue)..    set e
31d0: 78 69 74 4f 6e 46 61 69 6c 20 24 6f 70 74 69 6f  xitOnFail $optio
31e0: 6e 73 28 2d 65 78 69 74 4f 6e 46 61 69 6c 2c 76  ns(-exitOnFail,v
31f0: 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74 20 63  alue)..    set c
3200: 6f 54 61 73 6b 4d 65 6d 20 24 6f 70 74 69 6f 6e  oTaskMem $option
3210: 73 28 2d 63 6f 54 61 73 6b 4d 65 6d 2c 76 61 6c  s(-coTaskMem,val
3220: 75 65 29 0d 0a 20 20 20 20 73 65 74 20 6e 6f 54  ue)..    set noT
3230: 72 61 63 65 20 24 6f 70 74 69 6f 6e 73 28 2d 6e  race $options(-n
3240: 6f 54 72 61 63 65 2c 76 61 6c 75 65 29 0d 0a 20  oTrace,value).. 
3250: 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23   }....  ########
3260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32a0: 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20  #####....  #..  
32b0: 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73  # NOTE: Load cus
32c0: 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
32d0: 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73  /or per-host tes
32e0: 74 20 73 65 74 74 69 6e 67 73 2e 20 20 43 75 72  t settings.  Cur
32f0: 72 65 6e 74 6c 79 2c 20 74 68 69 73 0d 0a 20 20  rently, this..  
3300: 23 20 20 20 20 20 20 20 69 73 20 64 6f 6e 65 20  #       is done 
3310: 61 66 74 65 72 20 70 72 6f 63 65 73 73 69 6e 67  after processing
3320: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
3330: 65 20 6f 70 74 69 6f 6e 73 2e 20 20 54 68 65 20  e options.  The 
3340: 73 65 74 74 69 6e 67 73 20 66 69 6c 65 0d 0a 20  settings file.. 
3350: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
3360: 74 61 6b 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e  take into accoun
3370: 74 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 77  t the existing w
3380: 6f 72 6b 6c 6f 61 64 20 70 61 72 61 6d 65 74 65  orkload paramete
3390: 72 73 20 61 6e 64 20 61 76 6f 69 64 0d 0a 20 20  rs and avoid..  
33a0: 23 20 20 20 20 20 20 20 63 68 61 6e 67 69 6e 67  #       changing
33b0: 20 61 6e 79 20 74 68 61 74 20 6d 61 79 20 68 61   any that may ha
33c0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
33d0: 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a 20 20 23  overridden...  #
33e0: 0d 0a 20 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  ..  loadSQLiteTe
33f0: 73 74 53 65 74 74 69 6e 67 73 20 24 74 65 73 74  stSettings $test
3400: 5f 63 68 61 6e 6e 65 6c 20 2e 73 74 72 65 73 73  _channel .stress
3410: 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23  ....  ##########
3420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3460: 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20  ###....  #..  # 
3470: 4e 4f 54 45 3a 20 54 68 65 20 74 72 61 63 65 20  NOTE: The trace 
3480: 6c 69 73 74 65 6e 65 72 20 75 73 65 64 20 77 69  listener used wi
3490: 74 68 20 74 68 65 20 53 51 4c 69 74 65 4c 6f 67  th the SQLiteLog
34a0: 20 63 6c 61 73 73 20 74 6f 20 63 61 70 74 75 72   class to captur
34b0: 65 20 6f 75 74 70 75 74 0d 0a 20 20 23 20 20 20  e output..  #   
34c0: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 63 6f 72      from the cor
34d0: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
34e0: 20 72 65 71 75 69 72 65 73 20 69 74 73 20 6f 77   requires its ow
34f0: 6e 20 6c 6f 67 20 66 69 6c 65 20 62 65 63 61 75  n log file becau
3500: 73 65 20 74 68 65 0d 0a 20 20 23 20 20 20 20 20  se the..  #     
3510: 20 20 54 65 78 74 57 72 69 74 65 72 54 72 61 63    TextWriterTrac
3520: 65 4c 69 73 74 65 6e 65 72 20 63 6c 61 73 73 20  eListener class 
3530: 6f 70 65 6e 73 20 61 6e 64 20 6c 6f 63 6b 73 20  opens and locks 
3540: 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 74 20  the log file it 
3550: 75 73 65 73 0d 0a 20 20 23 20 20 20 20 20 20 20  uses..  #       
3560: 61 73 20 74 68 65 20 62 61 73 69 73 20 6f 66 20  as the basis of 
3570: 74 68 65 20 6f 75 74 70 75 74 20 73 74 72 65 61  the output strea
3580: 6d 2e 20 20 42 65 66 6f 72 65 20 74 68 69 73 20  m.  Before this 
3590: 74 65 73 74 20 69 73 20 63 6f 6d 70 6c 65 74 65  test is complete
35a0: 2c 0d 0a 20 20 23 20 20 20 20 20 20 20 74 68 65  ,..  #       the
35b0: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
35c0: 20 6f 66 20 74 68 69 73 20 74 72 61 63 65 20 6c   of this trace l
35d0: 6f 67 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  og file will be 
35e0: 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 0d  copied into the.
35f0: 0a 20 20 23 20 20 20 20 20 20 20 6d 61 69 6e 20  .  #       main 
3600: 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 20 61 6e  test log file an
3610: 64 20 74 68 65 6e 20 64 65 6c 65 74 65 64 2e 0d  d then deleted..
3620: 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 24 6e 6f  .  #..  if {!$no
3630: 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  Trace} then {.. 
3640: 20 20 20 73 65 74 20 6c 6f 67 46 69 6c 65 4e 61     set logFileNa
3650: 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  me [appendArgs [
3660: 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 74  file rootname $t
3670: 65 73 74 5f 6c 6f 67 5d 20 2e 74 72 61 63 65 2e  est_log] .trace.
3680: 6c 6f 67 5d 0d 0a 20 20 20 20 73 65 74 75 70 4c  log]..    setupL
3690: 6f 67 67 69 6e 67 20 24 6c 6f 67 46 69 6c 65 4e  ogging $logFileN
36a0: 61 6d 65 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23  ame..  }....  ##
36b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
36c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
36d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
36e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
36f0: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
3700: 20 23 0d 0a 20 20 23 20 48 41 43 4b 3a 20 4d 61   #..  # HACK: Ma
3710: 6b 65 20 73 75 72 65 20 74 68 65 20 65 66 66 65  ke sure the effe
3720: 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  ctive connection
3730: 20 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73 20   flags for this 
3740: 74 65 73 74 20 61 72 65 20 6c 6f 67 67 65 64 2e  test are logged.
3750: 0d 0a 20 20 23 0d 0a 20 20 67 65 74 43 6f 6e 6e  ..  #..  getConn
3760: 65 63 74 69 6f 6e 46 6c 61 67 73 20 22 73 74 72  ectionFlags "str
3770: 65 73 73 20 74 65 73 74 22 20 22 22 20 66 61 6c  ess test" "" fal
3780: 73 65 3b 20 23 20 49 47 4e 4f 52 45 44 0d 0a 0d  se; # IGNORED...
3790: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
37a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
37b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
37c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
37d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
37e0: 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
37f0: 45 3a 20 49 6e 20 73 68 61 72 65 64 2d 63 61 63  E: In shared-cac
3800: 68 65 20 6d 6f 64 65 2c 20 73 6b 69 70 20 74 68  he mode, skip th
3810: 65 20 62 61 63 6b 75 70 20 74 65 73 74 73 2e 20  e backup tests. 
3820: 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   The SQLite core
3830: 20 6c 69 62 72 61 72 79 0d 0a 20 20 23 20 20 20   library..  #   
3840: 20 20 20 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f      documentatio
3850: 6e 20 73 74 61 74 65 73 3a 0d 0a 20 20 23 0d 0a  n states:..  #..
3860: 20 20 23 20 20 20 20 20 20 20 22 49 66 20 72 75    #       "If ru
3870: 6e 6e 69 6e 67 20 69 6e 20 73 68 61 72 65 64 20  nning in shared 
3880: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 20  cache mode, the 
3890: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6d 75 73 74  application must
38a0: 20 67 75 61 72 61 6e 74 65 65 0d 0a 20 20 23 20   guarantee..  # 
38b0: 20 20 20 20 20 20 20 74 68 61 74 20 74 68 65 20         that the 
38c0: 73 68 61 72 65 64 20 63 61 63 68 65 20 75 73 65  shared cache use
38d0: 64 20 62 79 20 74 68 65 20 64 65 73 74 69 6e 61  d by the destina
38e0: 74 69 6f 6e 20 64 61 74 61 62 61 73 65 20 69 73  tion database is
38f0: 20 6e 6f 74 0d 0a 20 20 23 20 20 20 20 20 20 20   not..  #       
3900: 20 61 63 63 65 73 73 65 64 20 77 68 69 6c 65 20   accessed while 
3910: 74 68 65 20 62 61 63 6b 75 70 20 69 73 20 72 75  the backup is ru
3920: 6e 6e 69 6e 67 2e 20 49 6e 20 70 72 61 63 74 69  nning. In practi
3930: 63 65 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  ce this means th
3940: 61 74 0d 0a 20 20 23 20 20 20 20 20 20 20 20 74  at..  #        t
3950: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6d  he application m
3960: 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
3970: 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
3980: 20 62 65 69 6e 67 20 62 61 63 6b 65 64 20 75 70   being backed up
3990: 0d 0a 20 20 23 20 20 20 20 20 20 20 20 74 6f 20  ..  #        to 
39a0: 69 73 20 6e 6f 74 20 61 63 63 65 73 73 65 64 20  is not accessed 
39b0: 62 79 20 61 6e 79 20 63 6f 6e 6e 65 63 74 69 6f  by any connectio
39c0: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 70 72 6f  n within the pro
39d0: 63 65 73 73 2c 20 6e 6f 74 20 6a 75 73 74 0d 0a  cess, not just..
39e0: 20 20 23 20 20 20 20 20 20 20 20 74 68 65 20 73    #        the s
39f0: 70 65 63 69 66 69 63 20 63 6f 6e 6e 65 63 74 69  pecific connecti
3a00: 6f 6e 20 74 68 61 74 20 77 61 73 20 70 61 73 73  on that was pass
3a10: 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 62 61  ed to sqlite3_ba
3a20: 63 6b 75 70 5f 69 6e 69 74 28 29 2e 22 0d 0a 20  ckup_init().".. 
3a30: 20 23 0d 0a 20 20 23 20 20 20 20 20 20 20 54 68   #..  #       Th
3a40: 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 61 62 6c  e only reasonabl
3a50: 65 20 77 61 79 20 74 68 61 74 20 74 68 69 73 20  e way that this 
3a60: 74 65 73 74 20 63 61 6e 20 67 75 61 72 61 6e 74  test can guarant
3a70: 65 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  ee this conditio
3a80: 6e 0d 0a 20 20 23 20 20 20 20 20 20 20 69 73 20  n..  #       is 
3a90: 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 62  to disable the b
3aa0: 61 63 6b 75 70 20 74 65 73 74 73 20 77 68 65 6e  ackup tests when
3ab0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
3ac0: 64 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  de is being used
3ad0: 0d 0a 20 20 23 20 20 20 20 20 20 20 66 6f 72 20  ..  #       for 
3ae0: 74 65 73 74 69 6e 67 2e 0d 0a 20 20 23 0d 0a 20  testing...  #.. 
3af0: 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
3b00: 4f 70 74 69 6f 6e 20 73 68 61 72 65 64 43 61 63  Option sharedCac
3b10: 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  he]} then {..   
3b20: 20 6c 61 70 70 65 6e 64 20 6e 6f 57 6f 72 6b 6c   lappend noWorkl
3b30: 6f 61 64 20 31 32 20 31 33 3b 20 23 20 54 4f 44  oad 12 13; # TOD
3b40: 4f 3a 20 55 70 64 61 74 65 20 69 66 20 74 68 65  O: Update if the
3b50: 20 77 6f 72 6b 6c 6f 61 64 20 6e 75 6d 62 65 72   workload number
3b60: 73 20 63 68 61 6e 67 65 2e 0d 0a 20 20 7d 0d 0a  s change...  }..
3b70: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
3b80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3b90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ba0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3bb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3bc0: 23 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65  #....  tputs $te
3bd0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
3be0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
3bf0: 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20  "---- workloads 
3c00: 77 69 6c 6c 20 72 65 70 65 61 74 20 22 20 24 63  will repeat " $c
3c10: 6f 75 6e 74 28 30 29 20 22 20 74 69 6d 65 28 73  ount(0) " time(s
3c20: 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 74 70 75 74 73  )\n"]....  tputs
3c30: 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b   $test_channel [
3c40: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
3c50: 20 20 20 20 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f      "---- worklo
3c60: 61 64 73 20 77 69 6c 6c 20 68 61 76 65 20 22 20  ads will have " 
3c70: 24 63 6f 75 6e 74 28 31 29 20 22 20 69 74 65 72  $count(1) " iter
3c80: 61 74 69 6f 6e 28 73 29 5c 6e 22 5d 0d 0a 0d 0a  ation(s)\n"]....
3c90: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
3ca0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
3cb0: 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d  s \..      "----
3cc0: 20 77 6f 72 6b 6c 6f 61 64 73 20 77 69 6c 6c 20   workloads will 
3cd0: 77 61 69 74 20 61 74 20 6c 65 61 73 74 20 22 20  wait at least " 
3ce0: 24 63 6f 75 6e 74 28 32 29 20 5c 0d 0a 20 20 20  $count(2) \..   
3cf0: 20 20 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64     " millisecond
3d00: 28 73 29 20 61 66 74 65 72 20 65 61 63 68 20 69  (s) after each i
3d10: 74 65 72 61 74 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a  teration\n"]....
3d20: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
3d30: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
3d40: 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d  s \..      "----
3d50: 20 73 6d 61 6c 6c 20 63 68 75 6e 6b 20 73 69 7a   small chunk siz
3d60: 65 20 69 73 20 22 20 24 63 6f 75 6e 74 28 33 29  e is " $count(3)
3d70: 20 22 20 62 79 74 65 28 73 29 5c 6e 22 5d 0d 0a   " byte(s)\n"]..
3d80: 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f  ..  tputs $test_
3d90: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
3da0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d  rgs \..      "--
3db0: 2d 2d 20 62 69 67 20 63 68 75 6e 6b 20 73 69 7a  -- big chunk siz
3dc0: 65 20 69 73 20 22 20 24 63 6f 75 6e 74 28 34 29  e is " $count(4)
3dd0: 20 22 20 62 79 74 65 28 73 29 5c 6e 22 5d 0d 0a   " byte(s)\n"]..
3de0: 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f  ..  tputs $test_
3df0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
3e00: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d  rgs \..      "--
3e10: 2d 2d 20 6d 61 78 69 6d 75 6d 20 65 78 63 6c 75  -- maximum exclu
3e20: 64 65 64 20 68 65 61 70 20 6d 65 6d 6f 72 79 20  ded heap memory 
3e30: 69 73 20 22 20 24 63 6f 75 6e 74 28 35 29 20 22  is " $count(5) "
3e40: 20 62 79 74 65 28 73 29 5c 6e 22 5d 0d 0a 0d 0a   byte(s)\n"]....
3e50: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
3e60: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
3e70: 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d  s \..      "----
3e80: 20 77 6f 72 6b 6c 6f 61 64 73 20 74 6f 20 62 65   workloads to be
3e90: 20 73 6b 69 70 70 65 64 2e 2e 2e 20 22 20 5c 0d   skipped... " \.
3ea0: 0a 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b 6c  .      [expr {[l
3eb0: 6c 65 6e 67 74 68 20 24 6e 6f 57 6f 72 6b 6c 6f  length $noWorklo
3ec0: 61 64 5d 20 3e 20 30 20 3f 20 24 6e 6f 57 6f 72  ad] > 0 ? $noWor
3ed0: 6b 6c 6f 61 64 20 3a 20 22 6e 6f 6e 65 22 7d 5d  kload : "none"}]
3ee0: 20 5c 6e 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20   \n]....  tputs 
3ef0: 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  $test_channel [a
3f00: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
3f10: 20 20 20 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61     "---- workloa
3f20: 64 73 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72  ds priority over
3f30: 72 69 64 65 73 2e 2e 2e 20 22 20 5c 0d 0a 20 20  rides... " \..  
3f40: 20 20 20 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e      [expr {[llen
3f50: 67 74 68 20 24 70 72 69 6f 72 69 74 69 65 73 5d  gth $priorities]
3f60: 20 3e 20 30 20 3f 20 24 70 72 69 6f 72 69 74 69   > 0 ? $prioriti
3f70: 65 73 20 3a 20 22 6e 6f 6e 65 22 7d 5d 20 5c 6e  es : "none"}] \n
3f80: 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65  ]....  tputs $te
3f90: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
3fa0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
3fb0: 22 2d 2d 2d 2d 20 75 6e 65 78 70 65 63 74 65 64  "---- unexpected
3fc0: 20 65 72 72 6f 72 73 20 22 20 5c 0d 0a 20 20 20   errors " \..   
3fd0: 20 20 20 5b 65 78 70 72 20 7b 24 65 78 69 74 4f     [expr {$exitO
3fe0: 6e 46 61 69 6c 20 3f 20 22 77 69 6c 6c 22 20 3a  nFail ? "will" :
3ff0: 20 22 77 69 6c 6c 20 6e 6f 74 22 7d 5d 20 5c 0d   "will not"}] \.
4000: 0a 20 20 20 20 20 20 22 20 68 61 6c 74 20 74 65  .      " halt te
4010: 73 74 69 6e 67 20 61 6e 64 20 65 78 69 74 20 74  sting and exit t
4020: 68 65 20 70 72 6f 63 65 73 73 5c 6e 22 5d 0d 0a  he process\n"]..
4030: 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f  ..  tputs $test_
4040: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
4050: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d  rgs \..      "--
4060: 2d 2d 20 74 68 65 20 22 20 5b 65 78 70 72 20 7b  -- the " [expr {
4070: 24 63 6f 54 61 73 6b 4d 65 6d 20 3f 20 22 43 6f  $coTaskMem ? "Co
4080: 54 61 73 6b 4d 65 6d 22 20 3a 20 22 53 51 4c 69  TaskMem" : "SQLi
4090: 74 65 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 22  te"}] \..      "
40a0: 20 61 6c 6c 6f 63 61 74 6f 72 20 77 69 6c 6c 20   allocator will 
40b0: 62 65 20 75 73 65 64 20 74 6f 20 65 78 63 6c 75  be used to exclu
40c0: 64 65 20 68 65 61 70 20 6d 65 6d 6f 72 79 5c 6e  de heap memory\n
40d0: 22 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74  "]....  tputs $t
40e0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
40f0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
4100: 20 22 2d 2d 2d 2d 20 74 72 61 63 65 20 6c 6f 67   "---- trace log
4110: 67 69 6e 67 20 74 6f 20 61 20 66 69 6c 65 20 69  ging to a file i
4120: 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 5b 65 78  s " \..      [ex
4130: 70 72 20 7b 24 6e 6f 54 72 61 63 65 20 3f 20 22  pr {$noTrace ? "
4140: 64 69 73 61 62 6c 65 64 22 20 3a 20 22 65 6e 61  disabled" : "ena
4150: 62 6c 65 64 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20  bled"}] \n].... 
4160: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
4170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
41a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
41b0: 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
41c0: 20 43 72 65 61 74 65 20 74 68 65 20 77 6f 72 6b   Create the work
41d0: 6c 6f 61 64 20 70 72 69 6f 72 69 74 79 20 61 72  load priority ar
41e0: 72 61 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ray based on the
41f0: 20 70 72 69 6f 72 69 74 79 20 6c 69 73 74 20 73   priority list s
4200: 65 65 6e 0d 0a 20 20 23 20 20 20 20 20 20 20 6f  een..  #       o
4210: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
4220: 6e 65 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 23  ne, if any...  #
4230: 0d 0a 20 20 61 72 72 61 79 20 73 65 74 20 70 72  ..  array set pr
4240: 69 6f 72 69 74 79 20 24 70 72 69 6f 72 69 74 69  iority $prioriti
4250: 65 73 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23  es....  ########
4260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
42a0: 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20  #####....  #..  
42b0: 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64  # NOTE: Workload
42c0: 73 20 23 31 32 20 61 6e 64 20 23 31 33 20 63 6f  s #12 and #13 co
42d0: 6e 74 61 69 6e 20 43 23 20 63 6f 64 65 20 74 68  ntain C# code th
42e0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  at should be com
42f0: 70 69 6c 65 64 2c 20 62 75 74 0d 0a 20 20 23 20  piled, but..  # 
4300: 20 20 20 20 20 20 6f 6e 6c 79 20 6f 6e 63 65 2e        only once.
4310: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
4320: 73 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  s keep track of 
4330: 74 68 61 74 20 73 74 61 74 65 20 69 6e 66 6f 72  that state infor
4340: 6d 61 74 69 6f 6e 2e 0d 0a 20 20 23 20 20 20 20  mation...  #    
4350: 20 20 20 41 6e 20 69 6e 74 65 67 65 72 20 76 61     An integer va
4360: 6c 75 65 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68  lue in one of th
4370: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 6d 65  ese variables me
4380: 61 6e 73 20 74 68 65 20 63 6f 6d 70 69 6c 61 74  ans the compilat
4390: 69 6f 6e 20 77 61 73 0d 0a 20 20 23 20 20 20 20  ion was..  #    
43a0: 20 20 20 63 6f 6d 70 6c 65 74 65 64 20 61 6e 64     completed and
43b0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 63   the resulting c
43c0: 6f 6d 70 69 6c 65 64 20 6d 65 74 68 6f 64 20 6d  ompiled method m
43d0: 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 75 73  ay be invoked us
43e0: 69 6e 67 20 74 68 65 0d 0a 20 20 23 20 20 20 20  ing the..  #    
43f0: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d     following com
4400: 6d 61 6e 64 20 28 77 68 65 72 65 20 24 7b 69 64  mand (where ${id
4410: 7d 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 6f  } is the value o
4420: 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 29 3a  f the variable):
4430: 0d 0a 20 20 23 0d 0a 20 20 23 20 20 20 20 20 20  ..  #..  #      
4440: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
4450: 6b 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d  ke _Dynamic${id}
4460: 2e 54 65 73 74 24 7b 69 64 7d 20 42 61 63 6b 75  .Test${id} Backu
4470: 70 41 6e 64 47 65 74 44 61 74 61 0d 0a 20 20 23  pAndGetData..  #
4480: 0d 0a 20 20 73 65 74 20 63 6f 6d 70 69 6c 65 64  ..  set compiled
4490: 28 31 32 29 20 22 22 0d 0a 20 20 73 65 74 20 63  (12) ""..  set c
44a0: 6f 6d 70 69 6c 65 64 28 31 33 29 20 22 22 0d 0a  ompiled(13) ""..
44b0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
44c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
44d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
44e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
44f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4500: 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  #....  #..  # NO
4510: 54 45 3a 20 54 68 69 73 20 69 73 20 61 6e 20 69  TE: This is an i
4520: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
4530: 65 20 77 69 74 68 20 73 68 61 72 65 64 20 63 61  e with shared ca
4540: 63 68 65 20 65 6e 61 62 6c 65 64 2e 0d 0a 20 20  che enabled...  
4550: 23 0d 0a 20 20 73 65 74 20 66 69 6c 65 4e 61 6d  #..  set fileNam
4560: 65 28 31 29 20 66 69 6c 65 3a 3a 6d 65 6d 6f 72  e(1) file::memor
4570: 79 3a 3f 63 61 63 68 65 3d 73 68 61 72 65 64 0d  y:?cache=shared.
4580: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
4590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45d0: 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e  ##....  #..  # N
45e0: 4f 54 45 3a 20 54 68 69 73 20 69 73 20 61 20 6e  OTE: This is a n
45f0: 6f 72 6d 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61  ormal on-disk da
4600: 74 61 62 61 73 65 2e 0d 0a 20 20 23 0d 0a 20 20  tabase...  #..  
4610: 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 32 29 20  set fileName(2) 
4620: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44  [file join [getD
4630: 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79  atabaseDirectory
4640: 5d 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  ] [appendArgs \.
4650: 0a 20 20 20 20 20 20 73 74 72 65 73 73 2d 20 5b  .      stress- [
4660: 70 69 64 5d 20 2d 20 5b 73 74 72 69 6e 67 20 74  pid] - [string t
4670: 72 69 6d 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  rim [clock secon
4680: 64 73 5d 20 2d 5d 20 2e 64 62 5d 5d 0d 0a 0d 0a  ds] -] .db]]....
4690: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
46a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
46b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
46c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
46d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
46e0: 0a 0d 0a 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f  ...  setupWorklo
46f0: 61 64 4d 65 6d 44 62 20 24 66 69 6c 65 4e 61 6d  adMemDb $fileNam
4700: 65 28 31 29 20 73 72 63 44 62 0d 0a 20 20 73 65  e(1) srcDb..  se
4710: 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44  tupWorkloadFileD
4720: 62 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 64  b $fileName(2) d
4730: 62 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  b....  #########
4740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4750: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4780: 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23  ####....  #..  #
4790: 20 4e 4f 54 45 3a 20 54 68 69 73 20 73 65 72 76   NOTE: This serv
47a0: 65 73 20 74 77 6f 20 70 75 72 70 6f 73 65 73 2e  es two purposes.
47b0: 20 20 46 69 72 73 74 2c 20 69 74 20 61 6c 6c 6f    First, it allo
47c0: 77 73 20 75 73 20 74 6f 20 76 65 72 69 66 79 20  ws us to verify 
47d0: 74 68 65 20 74 72 61 63 65 0d 0a 20 20 23 20 20  the trace..  #  
47e0: 20 20 20 20 20 6c 6f 67 67 69 6e 67 20 73 75 62       logging sub
47f0: 73 79 73 74 65 6d 20 69 73 20 77 6f 72 6b 69 6e  system is workin
4800: 67 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 65 63  g properly.  Sec
4810: 6f 6e 64 2c 20 69 74 20 70 6c 61 63 65 73 20 74  ond, it places t
4820: 68 65 20 66 69 6c 65 0d 0a 20 20 23 20 20 20 20  he file..  #    
4830: 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20     name for the 
4840: 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
4850: 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
4860: 65 20 74 72 61 63 65 20 6c 6f 67 20 66 69 6c 65  e trace log file
4870: 2e 0d 0a 20 20 23 0d 0a 20 20 73 65 74 20 63 6f  ...  #..  set co
4880: 6e 6e 65 63 74 69 6f 6e 20 5b 67 65 74 44 62 43  nnection [getDbC
4890: 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 0d 0a 20 20  onnection]....  
48a0: 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 4c 6f 67 4d  $connection LogM
48b0: 65 73 73 61 67 65 20 30 20 5b 61 70 70 65 6e 64  essage 0 [append
48c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 73  Args \..      "s
48d0: 74 61 72 74 69 6e 67 20 73 74 72 65 73 73 20 74  tarting stress t
48e0: 65 73 74 20 75 73 69 6e 67 20 64 61 74 61 62 61  est using databa
48f0: 73 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  se \"" $fileName
4900: 28 32 29 20 5c 22 2e 2e 2e 5d 0d 0a 0d 0a 20 20  (2) \"...]....  
4910: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4920: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4930: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4940: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4950: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
4960: 0a 20 20 73 65 74 20 74 69 6d 65 6f 75 74 20 5b  .  set timeout [
4970: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
4980: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
4990: 5c 0d 0a 20 20 20 20 20 20 45 61 67 6c 65 2e 5f  \..      Eagle._
49a0: 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61  Components.Priva
49b0: 74 65 2e 54 68 72 65 61 64 4f 70 73 20 44 65 66  te.ThreadOps Def
49c0: 61 75 6c 74 4a 6f 69 6e 54 69 6d 65 6f 75 74 5d  aultJoinTimeout]
49d0: 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73  ....  tputs $tes
49e0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
49f0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22  dArgs \..      "
4a00: 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20 77  ---- workloads w
4a10: 69 6c 6c 20 73 74 61 72 74 20 62 65 66 6f 72 65  ill start before
4a20: 20 6f 72 20 74 69 6d 65 6f 75 74 20 61 66 74 65   or timeout afte
4a30: 72 20 22 20 24 74 69 6d 65 6f 75 74 20 5c 0d 0a  r " $timeout \..
4a40: 20 20 20 20 20 20 22 20 6d 69 6c 6c 69 73 65 63        " millisec
4a50: 6f 6e 64 28 73 29 5c 6e 22 5d 0d 0a 0d 0a 20 20  ond(s)\n"]....  
4a60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4aa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
4ab0: 0a 20 20 73 65 74 20 65 76 65 6e 74 20 5b 6f 62  .  set event [ob
4ac0: 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69  ject create -ali
4ad0: 61 73 20 5c 0d 0a 20 20 20 20 20 20 53 79 73 74  as \..      Syst
4ae0: 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 45 76 65  em.Threading.Eve
4af0: 6e 74 57 61 69 74 48 61 6e 64 6c 65 20 66 61 6c  ntWaitHandle fal
4b00: 73 65 20 4d 61 6e 75 61 6c 52 65 73 65 74 5d 0d  se ManualReset].
4b10: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
4b20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b60: 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20  ##..  #         
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31       WORKLOAD #1
4b90: 20 28 41 29 20 20 20 20 20 20 20 20 20 20 20 20   (A)            
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 20 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23    #..  #########
4bc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4bd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4be0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4bf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4c00: 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f  ####....  set wo
4c10: 72 6b 6c 6f 61 64 28 31 29 20 5b 6c 69 73 74 20  rkload(1) [list 
4c20: 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73  \..      [list s
4c30: 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69  rcFileName dstFi
4c40: 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75  leName table cou
4c50: 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74  nt1 count2 count
4c60: 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20  3] {..    #..   
4c70: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
4c80: 64 20 23 31 2c 20 43 52 45 41 54 45 20 54 41 42  d #1, CREATE TAB
4c90: 4c 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a  LE statements...
4ca0: 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54      #..    waitT
4cb0: 65 73 74 20 41 0d 0a 20 20 20 20 6c 61 70 70 65  est A..    lappe
4cc0: 6e 64 20 3a 3a 74 69 6d 65 73 28 31 29 20 5b 6c  nd ::times(1) [l
4cd0: 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20  index [time {.. 
4ce0: 20 20 20 20 20 69 6e 69 74 54 65 73 74 20 41 0d       initTest A.
4cf0: 0a 20 20 20 20 20 20 73 65 74 75 70 57 6f 72 6b  .      setupWork
4d00: 6c 6f 61 64 46 69 6c 65 44 62 20 24 64 73 74 46  loadFileDb $dstF
4d10: 69 6c 65 4e 61 6d 65 20 64 62 0d 0a 20 20 20 20  ileName db..    
4d20: 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
4d30: 20 32 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24   2} {$index <= $
4d40: 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e  count1} {incr in
4d50: 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  dex} {..        
4d60: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
4d70: 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
4d80: 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41  ute $db [appendA
4d90: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
4da0: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
4db0: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
4dc0: 20 74 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   t" \..         
4dd0: 20 20 20 20 20 24 69 6e 64 65 78 20 22 28 78 20       $index "(x 
4de0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 2c 20  PRIMARY KEY, y, 
4df0: 7a 29 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  z);"]..         
4e00: 20 73 68 6f 77 54 65 73 74 20 41 0d 0a 20 20 20   showTest A..   
4e10: 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
4e20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
4e30: 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64   if {[isExpected
4e40: 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74  Error $error]} t
4e50: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
4e60: 20 20 20 73 68 6f 77 54 65 73 74 20 61 0d 0a 20     showTest a.. 
4e70: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
4e80: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
4e90: 61 69 6c 54 65 73 74 20 61 20 24 65 72 72 6f 72  ailTest a $error
4ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
4eb0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4ec0: 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70  }..      cleanup
4ed0: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
4ee0: 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61  db false true fa
4ef0: 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54  lse..      doneT
4f00: 65 73 74 20 41 0d 0a 20 20 20 20 7d 5d 20 30 5d  est A..    }] 0]
4f10: 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23  ..  }]....  ####
4f20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4f30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4f40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4f50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4f60: 23 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20  #########..  #  
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b              WORK
4f90: 4c 4f 41 44 20 23 32 20 28 42 29 20 20 20 20 20  LOAD #2 (B)     
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23           #..  ##
4fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5000: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
5010: 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 32 29   set workload(2)
5020: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
5030: 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d  [list srcFileNam
5040: 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61  e dstFileName ta
5050: 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74  ble count1 count
5060: 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20  2 count3] {..   
5070: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
5080: 57 6f 72 6b 6c 6f 61 64 20 23 32 2c 20 44 52 4f  Workload #2, DRO
5090: 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
50a0: 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ts...    #..    
50b0: 77 61 69 74 54 65 73 74 20 42 0d 0a 20 20 20 20  waitTest B..    
50c0: 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28  lappend ::times(
50d0: 32 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65  2) [lindex [time
50e0: 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65   {..      initTe
50f0: 73 74 20 42 0d 0a 20 20 20 20 20 20 73 65 74 75  st B..      setu
5100: 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20  pWorkloadFileDb 
5110: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 0d  $dstFileName db.
5120: 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20  .      for {set 
5130: 69 6e 64 65 78 20 32 7d 20 7b 24 69 6e 64 65 78  index 2} {$index
5140: 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e   <= $count1} {in
5150: 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
5160: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
5170: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  {..          sql
5180: 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70   execute $db [ap
5190: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
51a0: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 20            "DROP 
51b0: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
51c0: 74 22 20 24 69 6e 64 65 78 20 5c 3b 5d 0d 0a 20  t" $index \;].. 
51d0: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
51e0: 74 20 42 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  t B..        } e
51f0: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
5200: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
5210: 45 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65  ExpectedError $e
5220: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
5230: 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54             showT
5240: 65 73 74 20 62 0d 0a 20 20 20 20 20 20 20 20 20  est b..         
5250: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
5260: 20 20 20 20 20 20 20 66 61 69 6c 54 65 73 74 20         failTest 
5270: 62 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  b $error..      
5280: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
5290: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
52a0: 20 63 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46   cleanupDb $dstF
52b0: 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
52c0: 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20   true false..   
52d0: 20 20 20 64 6f 6e 65 54 65 73 74 20 42 0d 0a 20     doneTest B.. 
52e0: 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a     }] 0]..  }]..
52f0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
5300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5340: 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20 20  #..  #          
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 33 20      WORKLOAD #3 
5370: 28 43 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (C)             
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23   #..  ##########
53a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
53b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
53c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
53d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
53e0: 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72  ###....  set wor
53f0: 6b 6c 6f 61 64 28 33 29 20 5b 6c 69 73 74 20 5c  kload(3) [list \
5400: 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72  ..      [list sr
5410: 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c  cFileName dstFil
5420: 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e  eName table coun
5430: 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33  t1 count2 count3
5440: 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ] {..    #..    
5450: 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64  # NOTE: Workload
5460: 20 23 33 2c 20 22 73 6d 61 6c 6c 22 20 53 45 4c   #3, "small" SEL
5470: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d  ECT statements..
5480: 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69 74  .    #..    wait
5490: 54 65 73 74 20 43 0d 0a 20 20 20 20 6c 61 70 70  Test C..    lapp
54a0: 65 6e 64 20 3a 3a 74 69 6d 65 73 28 33 29 20 5b  end ::times(3) [
54b0: 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a  lindex [time {..
54c0: 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20 43        initTest C
54d0: 0d 0a 20 20 20 20 20 20 73 65 74 75 70 57 6f 72  ..      setupWor
54e0: 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24 64 73 74  kloadFileDb $dst
54f0: 46 69 6c 65 4e 61 6d 65 20 64 62 0d 0a 20 20 20  FileName db..   
5500: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65     for {set inde
5510: 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20  x 1} {$index <= 
5520: 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69  $count1} {incr i
5530: 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ndex} {..       
5540: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
5550: 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65 61           set rea
5560: 64 65 72 20 5b 73 71 6c 20 65 78 65 63 75 74 65  der [sql execute
5570: 20 2d 65 78 65 63 75 74 65 20 72 65 61 64 65 72   -execute reader
5580: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5590: 20 20 2d 66 6f 72 6d 61 74 20 64 61 74 61 52 65    -format dataRe
55a0: 61 64 65 72 20 2d 61 6c 69 61 73 20 24 64 62 20  ader -alias $db 
55b0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
55d0: 4c 45 43 54 20 78 2c 20 79 20 46 52 4f 4d 20 22  LECT x, y FROM "
55e0: 20 24 74 61 62 6c 65 20 22 20 57 48 45 52 45 20   $table " WHERE 
55f0: 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b 22 5d 5d 0d  z = 'small';"]].
5600: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
5610: 20 7b 5b 24 72 65 61 64 65 72 20 52 65 61 64 5d   {[$reader Read]
5620: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
5630: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
5640: 23 20 4e 4f 54 45 3a 20 44 6f 20 6e 6f 74 68 69  # NOTE: Do nothi
5650: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ng...           
5660: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   #..          }.
5670: 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74  .          unset
5680: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72 65 61   -nocomplain rea
5690: 64 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 73  der..          s
56a0: 68 6f 77 54 65 73 74 20 43 0d 0a 20 20 20 20 20  howTest C..     
56b0: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
56c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
56d0: 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72  f {[isExpectedEr
56e0: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
56f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
5700: 20 73 68 6f 77 54 65 73 74 20 63 0d 0a 20 20 20   showTest c..   
5710: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
5720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69  .            fai
5730: 6c 54 65 73 74 20 63 20 24 65 72 72 6f 72 0d 0a  lTest c $error..
5740: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
5750: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
5760: 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62  .      cleanupDb
5770: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62   $dstFileName db
5780: 20 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73   false true fals
5790: 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73  e..      doneTes
57a0: 74 20 43 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a  t C..    }] 0]..
57b0: 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23    }]....  ######
57c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
57d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
57e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
57f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5800: 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20  #######..  #    
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f            WORKLO
5830: 41 44 20 23 34 20 28 44 29 20 20 20 20 20 20 20  AD #4 (D)       
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23         #..  ####
5860: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5870: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5880: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5890: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
58a0: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73  #########....  s
58b0: 65 74 20 77 6f 72 6b 6c 6f 61 64 28 34 29 20 5b  et workload(4) [
58c0: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c  list \..      [l
58d0: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
58e0: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
58f0: 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20  e count1 count2 
5900: 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23  count3] {..    #
5910: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f  ..    # NOTE: Wo
5920: 72 6b 6c 6f 61 64 20 23 34 2c 20 22 62 69 67 22  rkload #4, "big"
5930: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5940: 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ts...    #..    
5950: 77 61 69 74 54 65 73 74 20 44 0d 0a 20 20 20 20  waitTest D..    
5960: 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28  lappend ::times(
5970: 34 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65  4) [lindex [time
5980: 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65   {..      initTe
5990: 73 74 20 44 0d 0a 20 20 20 20 20 20 73 65 74 75  st D..      setu
59a0: 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20  pWorkloadFileDb 
59b0: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 0d  $dstFileName db.
59c0: 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20  .      for {set 
59d0: 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78  index 1} {$index
59e0: 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e   <= $count1} {in
59f0: 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
5a00: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
5a10: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
5a20: 20 72 65 61 64 65 72 20 5b 73 71 6c 20 65 78 65   reader [sql exe
5a30: 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 72 65  cute -execute re
5a40: 61 64 65 72 20 5c 0d 0a 20 20 20 20 20 20 20 20  ader \..        
5a50: 20 20 20 20 20 20 2d 66 6f 72 6d 61 74 20 64 61        -format da
5a60: 74 61 52 65 61 64 65 72 20 2d 61 6c 69 61 73 20  taReader -alias 
5a70: 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20  $db [appendArgs 
5a80: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
5a90: 20 22 53 45 4c 45 43 54 20 78 2c 20 79 20 46 52   "SELECT x, y FR
5aa0: 4f 4d 20 22 20 24 74 61 62 6c 65 20 22 20 57 48  OM " $table " WH
5ab0: 45 52 45 20 7a 20 3d 20 27 62 69 67 27 3b 22 5d  ERE z = 'big';"]
5ac0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ]..          whi
5ad0: 6c 65 20 7b 5b 24 72 65 61 64 65 72 20 52 65 61  le {[$reader Rea
5ae0: 64 5d 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  d]} {..         
5af0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
5b00: 20 20 23 20 4e 4f 54 45 3a 20 44 6f 20 6e 6f 74    # NOTE: Do not
5b10: 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  hing...         
5b20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
5b30: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73  }..          uns
5b40: 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72  et -nocomplain r
5b50: 65 61 64 65 72 0d 0a 20 20 20 20 20 20 20 20 20  eader..         
5b60: 20 73 68 6f 77 54 65 73 74 20 44 0d 0a 20 20 20   showTest D..   
5b70: 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
5b80: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
5b90: 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64   if {[isExpected
5ba0: 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74  Error $error]} t
5bb0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
5bc0: 20 20 20 73 68 6f 77 54 65 73 74 20 64 0d 0a 20     showTest d.. 
5bd0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
5be0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
5bf0: 61 69 6c 54 65 73 74 20 64 20 24 65 72 72 6f 72  ailTest d $error
5c00: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
5c10: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
5c20: 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70  }..      cleanup
5c30: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
5c40: 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61  db false true fa
5c50: 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54  lse..      doneT
5c60: 65 73 74 20 44 0d 0a 20 20 20 20 7d 5d 20 30 5d  est D..    }] 0]
5c70: 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23  ..  }]....  ####
5c80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5c90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ca0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5cb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5cc0: 23 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20  #########..  #  
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b              WORK
5cf0: 4c 4f 41 44 20 23 35 20 28 45 29 20 20 20 20 20  LOAD #5 (E)     
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23           #..  ##
5d20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5d30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5d40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5d50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5d60: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
5d70: 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 35 29   set workload(5)
5d80: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
5d90: 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d  [list srcFileNam
5da0: 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61  e dstFileName ta
5db0: 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74  ble count1 count
5dc0: 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20  2 count3] {..   
5dd0: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
5de0: 57 6f 72 6b 6c 6f 61 64 20 23 35 2c 20 22 73 6d  Workload #5, "sm
5df0: 61 6c 6c 22 20 49 4e 53 45 52 54 20 73 74 61 74  all" INSERT stat
5e00: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a  ements...    #..
5e10: 20 20 20 20 77 61 69 74 54 65 73 74 20 45 0d 0a      waitTest E..
5e20: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69      lappend ::ti
5e30: 6d 65 73 28 35 29 20 5b 6c 69 6e 64 65 78 20 5b  mes(5) [lindex [
5e40: 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e  time {..      in
5e50: 69 74 54 65 73 74 20 45 0d 0a 20 20 20 20 20 20  itTest E..      
5e60: 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c  setupWorkloadFil
5e70: 65 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65  eDb $dstFileName
5e80: 20 64 62 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b   db..      for {
5e90: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
5ea0: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
5eb0: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
5ec0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
5ed0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
5ee0: 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
5ef0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 49 4e   [appendArgs "IN
5f00: 53 45 52 54 20 49 4e 54 4f 20 22 20 24 74 61 62  SERT INTO " $tab
5f10: 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
5f20: 20 20 20 20 22 28 78 2c 20 79 2c 20 7a 29 20 56      "(x, y, z) V
5f30: 41 4c 55 45 53 28 27 22 20 5b 66 6f 72 6d 61 74  ALUES('" [format
5f40: 20 25 6c 58 20 5b 65 78 70 72 20 7b 72 61 6e 64   %lX [expr {rand
5f50: 6f 6d 28 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20  om()}]] \..     
5f60: 20 20 20 20 20 20 20 20 20 22 27 2c 20 27 22 20           "', '" 
5f70: 5b 62 61 73 65 36 34 20 65 6e 63 6f 64 65 20 2d  [base64 encode -
5f80: 2d 20 5b 65 78 70 72 20 7b 72 61 6e 64 73 74 72  - [expr {randstr
5f90: 28 24 63 6f 75 6e 74 32 29 7d 5d 5d 20 5c 0d 0a  ($count2)}]] \..
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27                "'
5fb0: 2c 20 27 73 6d 61 6c 6c 27 29 3b 22 5d 0d 0a 20  , 'small');"].. 
5fc0: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
5fd0: 74 20 45 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  t E..        } e
5fe0: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
5ff0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
6000: 45 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65  ExpectedError $e
6010: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
6020: 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54             showT
6030: 65 73 74 20 65 0d 0a 20 20 20 20 20 20 20 20 20  est e..         
6040: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
6050: 20 20 20 20 20 20 20 66 61 69 6c 54 65 73 74 20         failTest 
6060: 65 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  e $error..      
6070: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
6080: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
6090: 20 63 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46   cleanupDb $dstF
60a0: 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
60b0: 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20   true false..   
60c0: 20 20 20 64 6f 6e 65 54 65 73 74 20 45 0d 0a 20     doneTest E.. 
60d0: 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a     }] 0]..  }]..
60e0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
60f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6110: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6120: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6130: 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20 20  #..  #          
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 36 20      WORKLOAD #6 
6160: 28 46 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (F)             
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23   #..  ##########
6190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
61a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
61b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
61c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
61d0: 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72  ###....  set wor
61e0: 6b 6c 6f 61 64 28 36 29 20 5b 6c 69 73 74 20 5c  kload(6) [list \
61f0: 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72  ..      [list sr
6200: 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c  cFileName dstFil
6210: 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e  eName table coun
6220: 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33  t1 count2 count3
6230: 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ] {..    #..    
6240: 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64  # NOTE: Workload
6250: 20 23 36 2c 20 22 62 69 67 22 20 49 4e 53 45 52   #6, "big" INSER
6260: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20  T statements... 
6270: 20 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65     #..    waitTe
6280: 73 74 20 46 0d 0a 20 20 20 20 6c 61 70 70 65 6e  st F..    lappen
6290: 64 20 3a 3a 74 69 6d 65 73 28 36 29 20 5b 6c 69  d ::times(6) [li
62a0: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
62b0: 20 20 20 20 69 6e 69 74 54 65 73 74 20 46 0d 0a      initTest F..
62c0: 20 20 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c        setupWorkl
62d0: 6f 61 64 46 69 6c 65 44 62 20 24 64 73 74 46 69  oadFileDb $dstFi
62e0: 6c 65 4e 61 6d 65 20 64 62 0d 0a 20 20 20 20 20  leName db..     
62f0: 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
6300: 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63  1} {$index <= $c
6310: 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64  ount1} {incr ind
6320: 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ex} {..        i
6330: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
6340: 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
6350: 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  te $db [appendAr
6360: 67 73 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  gs "INSERT INTO 
6370: 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20  " $table \..    
6380: 20 20 20 20 20 20 20 20 20 20 22 28 78 2c 20 79            "(x, y
6390: 2c 20 7a 29 20 56 41 4c 55 45 53 28 27 22 20 5b  , z) VALUES('" [
63a0: 66 6f 72 6d 61 74 20 25 6c 58 20 5b 65 78 70 72  format %lX [expr
63b0: 20 7b 72 61 6e 64 6f 6d 28 29 7d 5d 5d 20 5c 0d   {random()}]] \.
63c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
63d0: 27 2c 20 52 41 4e 44 4f 4d 42 4c 4f 42 28 22 20  ', RANDOMBLOB(" 
63e0: 24 63 6f 75 6e 74 33 20 22 29 2c 20 27 62 69 67  $count3 "), 'big
63f0: 27 29 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  ');"]..         
6400: 20 73 68 6f 77 54 65 73 74 20 46 0d 0a 20 20 20   showTest F..   
6410: 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
6420: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
6430: 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64   if {[isExpected
6440: 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74  Error $error]} t
6450: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
6460: 20 20 20 73 68 6f 77 54 65 73 74 20 66 0d 0a 20     showTest f.. 
6470: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
6480: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
6490: 61 69 6c 54 65 73 74 20 66 20 24 65 72 72 6f 72  ailTest f $error
64a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
64b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
64c0: 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70  }..      cleanup
64d0: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
64e0: 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61  db false true fa
64f0: 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54  lse..      doneT
6500: 65 73 74 20 46 0d 0a 20 20 20 20 7d 5d 20 30 5d  est F..    }] 0]
6510: 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23  ..  }]....  ####
6520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6560: 23 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20  #########..  #  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b              WORK
6590: 4c 4f 41 44 20 23 37 20 28 47 29 20 20 20 20 20  LOAD #7 (G)     
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23           #..  ##
65c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
65d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
65e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
65f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6600: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
6610: 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 37 29   set workload(7)
6620: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
6630: 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d  [list srcFileNam
6640: 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61  e dstFileName ta
6650: 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74  ble count1 count
6660: 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20  2 count3] {..   
6670: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
6680: 57 6f 72 6b 6c 6f 61 64 20 23 37 2c 20 22 73 6d  Workload #7, "sm
6690: 61 6c 6c 22 20 55 50 44 41 54 45 20 73 74 61 74  all" UPDATE stat
66a0: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a  ements...    #..
66b0: 20 20 20 20 77 61 69 74 54 65 73 74 20 47 0d 0a      waitTest G..
66c0: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69      lappend ::ti
66d0: 6d 65 73 28 37 29 20 5b 6c 69 6e 64 65 78 20 5b  mes(7) [lindex [
66e0: 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e  time {..      in
66f0: 69 74 54 65 73 74 20 47 0d 0a 20 20 20 20 20 20  itTest G..      
6700: 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c  setupWorkloadFil
6710: 65 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65  eDb $dstFileName
6720: 20 64 62 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b   db..      for {
6730: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
6740: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
6750: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
6760: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
6770: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
6780: 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
6790: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 55 50   [appendArgs "UP
67a0: 44 41 54 45 20 22 20 24 74 61 62 6c 65 20 5c 0d  DATE " $table \.
67b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
67c0: 20 53 45 54 20 79 20 3d 20 27 22 20 5b 62 61 73   SET y = '" [bas
67d0: 65 36 34 20 65 6e 63 6f 64 65 20 2d 2d 20 5b 65  e64 encode -- [e
67e0: 78 70 72 20 7b 72 61 6e 64 73 74 72 28 24 63 6f  xpr {randstr($co
67f0: 75 6e 74 32 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20  unt2)}]] \..    
6800: 20 20 20 20 20 20 20 20 20 20 22 27 20 57 48 45            "' WHE
6810: 52 45 20 78 20 4c 49 4b 45 20 27 22 20 5b 66 6f  RE x LIKE '" [fo
6820: 72 6d 61 74 20 25 58 20 24 69 6e 64 65 78 5d 20  rmat %X $index] 
6830: 22 25 27 20 41 4e 44 20 7a 20 3d 20 27 73 6d 61  "%' AND z = 'sma
6840: 6c 6c 27 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20  ll';"]..        
6850: 20 20 73 68 6f 77 54 65 73 74 20 47 0d 0a 20 20    showTest G..  
6860: 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20        } error]} 
6870: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6880: 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65    if {[isExpecte
6890: 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20  dError $error]} 
68a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
68b0: 20 20 20 20 73 68 6f 77 54 65 73 74 20 67 0d 0a      showTest g..
68c0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
68d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
68e0: 66 61 69 6c 54 65 73 74 20 67 20 24 65 72 72 6f  failTest g $erro
68f0: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  r..          }..
6900: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
6910: 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75   }..      cleanu
6920: 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65  pDb $dstFileName
6930: 20 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66   db false true f
6940: 61 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65  alse..      done
6950: 54 65 73 74 20 47 0d 0a 20 20 20 20 7d 5d 20 30  Test G..    }] 0
6960: 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23  ]..  }]....  ###
6970: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6980: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6990: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
69a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
69b0: 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20  ##########..  # 
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 52               WOR
69e0: 4b 4c 4f 41 44 20 23 38 20 28 48 29 20 20 20 20  KLOAD #8 (H)    
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23            #..  #
6a10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6a20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6a30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6a40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6a50: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
6a60: 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 38    set workload(8
6a70: 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  ) [list \..     
6a80: 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61   [list srcFileNa
6a90: 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74  me dstFileName t
6aa0: 61 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e  able count1 coun
6ab0: 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20  t2 count3] {..  
6ac0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
6ad0: 20 57 6f 72 6b 6c 6f 61 64 20 23 38 2c 20 22 62   Workload #8, "b
6ae0: 69 67 22 20 55 50 44 41 54 45 20 73 74 61 74 65  ig" UPDATE state
6af0: 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20  ments...    #.. 
6b00: 20 20 20 77 61 69 74 54 65 73 74 20 48 0d 0a 20     waitTest H.. 
6b10: 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d     lappend ::tim
6b20: 65 73 28 38 29 20 5b 6c 69 6e 64 65 78 20 5b 74  es(8) [lindex [t
6b30: 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69  ime {..      ini
6b40: 74 54 65 73 74 20 48 0d 0a 20 20 20 20 20 20 73  tTest H..      s
6b50: 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65  etupWorkloadFile
6b60: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
6b70: 64 62 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73  db..      for {s
6b80: 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e  et index 1} {$in
6b90: 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20  dex <= $count1} 
6ba0: 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
6bb0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
6bc0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
6bd0: 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
6be0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 55 50 44  [appendArgs "UPD
6bf0: 41 54 45 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a  ATE " $table \..
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
6c10: 53 45 54 20 79 20 3d 20 52 41 4e 44 4f 4d 42 4c  SET y = RANDOMBL
6c20: 4f 42 28 22 20 24 63 6f 75 6e 74 33 20 22 29 20  OB(" $count3 ") 
6c30: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 22 20  WHERE x LIKE '" 
6c40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
6c50: 20 5b 66 6f 72 6d 61 74 20 25 58 20 24 69 6e 64   [format %X $ind
6c60: 65 78 5d 20 22 25 27 20 41 4e 44 20 7a 20 3d 20  ex] "%' AND z = 
6c70: 27 62 69 67 27 3b 22 5d 0d 0a 20 20 20 20 20 20  'big';"]..      
6c80: 20 20 20 20 73 68 6f 77 54 65 73 74 20 48 0d 0a      showTest H..
6c90: 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
6ca0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6cb0: 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63      if {[isExpec
6cc0: 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d  tedError $error]
6cd0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6ce0: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 68        showTest h
6cf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
6d00: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
6d10: 20 20 66 61 69 6c 54 65 73 74 20 68 20 24 65 72    failTest h $er
6d20: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ror..          }
6d30: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
6d40: 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61     }..      clea
6d50: 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61  nupDb $dstFileNa
6d60: 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72 75 65  me db false true
6d70: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f   false..      do
6d80: 6e 65 54 65 73 74 20 48 0d 0a 20 20 20 20 7d 5d  neTest H..    }]
6d90: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23   0]..  }]....  #
6da0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6db0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6dc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6de0: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
6df0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
6e10: 4f 52 4b 4c 4f 41 44 20 23 39 20 28 49 29 20 20  ORKLOAD #9 (I)  
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
6e40: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
6e50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6e60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6e70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6e80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
6e90: 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64  ..  set workload
6ea0: 28 39 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  (9) [list \..   
6eb0: 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65     [list srcFile
6ec0: 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65  Name dstFileName
6ed0: 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f   table count1 co
6ee0: 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a  unt2 count3] {..
6ef0: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
6f00: 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 39 2c 20  E: Workload #9, 
6f10: 22 73 6d 61 6c 6c 22 20 44 45 4c 45 54 45 20 73  "small" DELETE s
6f20: 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20  tatements...    
6f30: 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74 20  #..    waitTest 
6f40: 49 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a  I..    lappend :
6f50: 3a 74 69 6d 65 73 28 39 29 20 5b 6c 69 6e 64 65  :times(9) [linde
6f60: 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20  x [time {..     
6f70: 20 69 6e 69 74 54 65 73 74 20 49 0d 0a 20 20 20   initTest I..   
6f80: 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64     setupWorkload
6f90: 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c 65 4e  FileDb $dstFileN
6fa0: 61 6d 65 20 64 62 0d 0a 20 20 20 20 20 20 66 6f  ame db..      fo
6fb0: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
6fc0: 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e  {$index <= $coun
6fd0: 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  t1} {incr index}
6fe0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
6ff0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
7000: 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
7010: 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20  $db [appendArgs 
7020: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 22 20 24  "DELETE FROM " $
7030: 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  table \..       
7040: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 78         " WHERE x
7050: 20 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74   LIKE '" [format
7060: 20 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20   %X $index] "%' 
7070: 41 4e 44 20 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b  AND z = 'small';
7080: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68  "]..          sh
7090: 6f 77 54 65 73 74 20 49 0d 0a 20 20 20 20 20 20  owTest I..      
70a0: 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
70b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
70c0: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
70d0: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
70e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
70f0: 73 68 6f 77 54 65 73 74 20 69 0d 0a 20 20 20 20  showTest i..    
7100: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7110: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
7120: 54 65 73 74 20 69 20 24 65 72 72 6f 72 0d 0a 20  Test i $error.. 
7130: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
7140: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
7150: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
7160: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20  $dstFileName db 
7170: 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65  false true false
7180: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
7190: 20 49 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   I..    }] 0].. 
71a0: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
71b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
71c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
71d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
71e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
71f0: 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20  ######..  #     
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41           WORKLOA
7220: 44 20 23 31 30 20 28 4a 29 20 20 20 20 20 20 20  D #10 (J)       
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7240: 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23        #..  #####
7250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7290: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
72a0: 74 20 77 6f 72 6b 6c 6f 61 64 28 31 30 29 20 5b  t workload(10) [
72b0: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c  list \..      [l
72c0: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
72d0: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
72e0: 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20  e count1 count2 
72f0: 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23  count3] {..    #
7300: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f  ..    # NOTE: Wo
7310: 72 6b 6c 6f 61 64 20 23 31 30 2c 20 22 62 69 67  rkload #10, "big
7320: 22 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  " DELETE stateme
7330: 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  nts...    #..   
7340: 20 77 61 69 74 54 65 73 74 20 4a 0d 0a 20 20 20   waitTest J..   
7350: 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73   lappend ::times
7360: 28 31 30 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69  (10) [lindex [ti
7370: 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74  me {..      init
7380: 54 65 73 74 20 4a 0d 0a 20 20 20 20 20 20 73 65  Test J..      se
7390: 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44  tupWorkloadFileD
73a0: 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64  b $dstFileName d
73b0: 62 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65  b..      for {se
73c0: 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64  t index 1} {$ind
73d0: 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b  ex <= $count1} {
73e0: 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
73f0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
7400: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  h {..          s
7410: 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b  ql execute $db [
7420: 61 70 70 65 6e 64 41 72 67 73 20 22 44 45 4c 45  appendArgs "DELE
7430: 54 45 20 46 52 4f 4d 20 22 20 24 74 61 62 6c 65  TE FROM " $table
7440: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7450: 20 20 22 20 57 48 45 52 45 20 78 20 4c 49 4b 45    " WHERE x LIKE
7460: 20 27 22 20 5b 66 6f 72 6d 61 74 20 25 58 20 24   '" [format %X $
7470: 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44 20 7a  index] "%' AND z
7480: 20 3d 20 27 62 69 67 27 3b 22 5d 0d 0a 20 20 20   = 'big';"]..   
7490: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
74a0: 4a 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  J..        } err
74b0: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
74c0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78         if {[isEx
74d0: 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72  pectedError $err
74e0: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
74f0: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
7500: 74 20 6a 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  t j..          }
7510: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
7520: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 6a 20       failTest j 
7530: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
7540: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
7550: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63        }..      c
7560: 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c  leanupDb $dstFil
7570: 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74  eName db false t
7580: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
7590: 20 64 6f 6e 65 54 65 73 74 20 4a 0d 0a 20 20 20   doneTest J..   
75a0: 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a   }] 0]..  }]....
75b0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
75c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
75d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
75e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
75f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
7600: 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20  .  #            
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 31 20 28    WORKLOAD #11 (
7630: 4b 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K)              
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
7650: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
7660: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7670: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7680: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7690: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
76a0: 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  #....  set workl
76b0: 6f 61 64 28 31 31 29 20 5b 6c 69 73 74 20 5c 0d  oad(11) [list \.
76c0: 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63  .      [list src
76d0: 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65  FileName dstFile
76e0: 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74  Name table count
76f0: 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d  1 count2 count3]
7700: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
7710: 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20   NOTE: Workload 
7720: 23 31 31 2c 20 56 41 43 55 55 4d 20 73 74 61 74  #11, VACUUM stat
7730: 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 23 0d 0a 20  ement...    #.. 
7740: 20 20 20 77 61 69 74 54 65 73 74 20 4b 0d 0a 20     waitTest K.. 
7750: 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d     lappend ::tim
7760: 65 73 28 31 31 29 20 5b 6c 69 6e 64 65 78 20 5b  es(11) [lindex [
7770: 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e  time {..      in
7780: 69 74 54 65 73 74 20 4b 0d 0a 20 20 20 20 20 20  itTest K..      
7790: 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c  setupWorkloadFil
77a0: 65 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65  eDb $dstFileName
77b0: 20 64 62 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b   db..      for {
77c0: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
77d0: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
77e0: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
77f0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
7800: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
7810: 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
7820: 20 22 56 41 43 55 55 4d 3b 22 0d 0a 20 20 20 20   "VACUUM;"..    
7830: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 4b        showTest K
7840: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f  ..        } erro
7850: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
7860: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70        if {[isExp
7870: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
7880: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
7890: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
78a0: 20 6b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   k..          } 
78b0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
78c0: 20 20 20 20 66 61 69 6c 54 65 73 74 20 6b 20 24      failTest k $
78d0: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
78e0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
78f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c       }..      cl
7900: 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65  eanupDb $dstFile
7910: 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72  Name db false tr
7920: 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ue false..      
7930: 64 6f 6e 65 54 65 73 74 20 4b 0d 0a 20 20 20 20  doneTest K..    
7940: 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20  }] 0]..  }].... 
7950: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
7960: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7970: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7980: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7990: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
79a0: 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20    #             
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79c0: 20 57 4f 52 4b 4c 4f 41 44 20 23 31 32 20 28 4c   WORKLOAD #12 (L
79d0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
79f0: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
7a00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7a10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7a20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7a30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7a40: 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f  ....  set worklo
7a50: 61 64 28 31 32 29 20 5b 6c 69 73 74 20 5c 0d 0a  ad(12) [list \..
7a60: 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46        [list srcF
7a70: 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e  ileName dstFileN
7a80: 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31  ame table count1
7a90: 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20   count2 count3] 
7aa0: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
7ab0: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
7ac0: 31 32 2c 20 62 61 63 6b 75 70 20 74 6f 20 69 6e  12, backup to in
7ad0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
7ae0: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61  ...    #..    wa
7af0: 69 74 54 65 73 74 20 4c 0d 0a 20 20 20 20 6c 61  itTest L..    la
7b00: 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 32  ppend ::times(12
7b10: 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20  ) [lindex [time 
7b20: 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73  {..      initTes
7b30: 74 20 4c 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b  t L..      for {
7b40: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
7b50: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
7b60: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
7b70: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
7b80: 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20  ring is integer 
7b90: 2d 73 74 72 69 63 74 20 24 3a 3a 63 6f 6d 70 69  -strict $::compi
7ba0: 6c 65 64 28 31 32 29 5d 7d 20 74 68 65 6e 20 7b  led(12)]} then {
7bb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
7bc0: 69 64 20 24 3a 3a 63 6f 6d 70 69 6c 65 64 28 31  id $::compiled(1
7bd0: 32 29 3b 20 23 20 4e 4f 54 45 3a 20 41 6c 72 65  2); # NOTE: Alre
7be0: 61 64 79 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20  ady compiled... 
7bf0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
7c00: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
7c10: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
7c20: 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54   _Dynamic${id}.T
7c30: 65 73 74 24 7b 69 64 7d 20 42 61 63 6b 75 70 41  est${id} BackupA
7c40: 6e 64 47 65 74 44 61 74 61 0d 0a 20 20 20 20 20  ndGetData..     
7c50: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
7c60: 4c 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  L..          } e
7c70: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
7c80: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
7c90: 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20  isExpectedError 
7ca0: 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d  $error]} then {.
7cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
7cc0: 68 6f 77 54 65 73 74 20 6c 0d 0a 20 20 20 20 20  howTest l..     
7cd0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
7ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
7cf0: 61 69 6c 54 65 73 74 20 6c 20 24 65 72 72 6f 72  ailTest l $error
7d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
7d10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
7d20: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7d30: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69 64            set id
7d40: 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
7d50: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
7d60: 63 74 69 76 65 20 4e 65 78 74 49 64 5d 0d 0a 20  ctive NextId].. 
7d70: 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64           set cod
7d80: 65 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72 70  e [compileCSharp
7d90: 57 69 74 68 20 5b 73 75 62 73 74 20 7b 0d 0a 20  With [subst {.. 
7da0: 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
7db0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
7dc0: 69 74 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ite;....        
7dd0: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 5f 44      namespace _D
7de0: 79 6e 61 6d 69 63 24 7b 69 64 7d 0d 0a 20 20 20  ynamic${id}..   
7df0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
7e00: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
7e10: 20 73 74 61 74 69 63 20 63 6c 61 73 73 20 54 65   static class Te
7e20: 73 74 24 7b 69 64 7d 0d 0a 20 20 20 20 20 20 20  st${id}..       
7e30: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
7e40: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
7e50: 20 73 74 61 74 69 63 20 76 6f 69 64 20 42 61 63   static void Bac
7e60: 6b 75 70 41 6e 64 47 65 74 44 61 74 61 28 29 0d  kupAndGetData().
7e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7e80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7e90: 20 20 20 20 20 20 75 73 69 6e 67 20 28 53 51 4c        using (SQL
7ea0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f  iteConnection so
7eb0: 75 72 63 65 20 3d 20 6e 65 77 20 53 51 4c 69 74  urce = new SQLit
7ec0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d 0a 20 20  eConnection(..  
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 22 46 75 6c 6c 55 72 69 3d 24 7b 64      "FullUri=${d
7ef0: 73 74 46 69 6c 65 4e 61 6d 65 7d 3b 5b 67 65 74  stFileName};[get
7f00: 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b 7d  FlagsProperty {}
7f10: 20 74 72 75 65 5d 22 29 29 0d 0a 20 20 20 20 20   true]"))..     
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 20 73 6f 75 72 63 65 2e 4f 70 65 6e 28      source.Open(
7f50: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
7f60: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
7f70: 28 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  (SQLiteConnectio
7f80: 6e 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 3d 20  n destination = 
7f90: 6e 65 77 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  new SQLiteConnec
7fa0: 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20  tion(..         
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
7fc0: 46 75 6c 6c 55 72 69 3d 24 7b 73 72 63 46 69 6c  FullUri=${srcFil
7fd0: 65 4e 61 6d 65 7d 3b 5b 67 65 74 46 6c 61 67 73  eName};[getFlags
7fe0: 50 72 6f 70 65 72 74 79 20 7b 7d 20 74 72 75 65  Property {} true
7ff0: 5d 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ]"))..          
8000: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8020: 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 4f     destination.O
8030: 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  pen();....      
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8050: 73 6f 75 72 63 65 2e 42 61 63 6b 75 70 44 61 74  source.BackupDat
8060: 61 62 61 73 65 28 0d 0a 20 20 20 20 20 20 20 20  abase(..        
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8080: 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 20 22    destination, "
8090: 6d 61 69 6e 22 2c 20 22 6d 61 69 6e 22 2c 20 2d  main", "main", -
80a0: 31 2c 20 6e 75 6c 6c 2c 20 30 29 3b 0d 0a 20 20  1, null, 0);..  
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
80d0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
80e0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8100: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8120: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8130: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
8140: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8150: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
8160: 76 6f 69 64 20 4d 61 69 6e 28 29 0d 0a 20 20 20  void Main()..   
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e    // do nothing.
81a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
81b0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
81c0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
81d0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
81e0: 5d 20 74 72 75 65 20 74 72 75 65 20 74 72 75 65  ] true true true
81f0: 20 72 65 73 75 6c 74 73 20 65 72 72 6f 72 73 20   results errors 
8200: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
8210: 74 65 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 20  te.dll]..       
8220: 20 20 20 69 66 20 7b 24 63 6f 64 65 20 65 71 20     if {$code eq 
8230: 22 4f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  "Ok"} then {..  
8240: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
8250: 63 6f 6d 70 69 6c 65 64 28 31 32 29 20 24 69 64  compiled(12) $id
8260: 3b 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 70 69 6c  ; # NOTE: Compil
8270: 65 64 20 4f 4b 2e 0d 0a 20 20 20 20 20 20 20 20  ed OK...        
8280: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
8290: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
82a0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5f 44  object invoke _D
82b0: 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54 65 73 74  ynamic${id}.Test
82c0: 24 7b 69 64 7d 20 42 61 63 6b 75 70 41 6e 64 47  ${id} BackupAndG
82d0: 65 74 44 61 74 61 0d 0a 20 20 20 20 20 20 20 20  etData..        
82e0: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 4c        showTest L
82f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
8300: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8320: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
8330: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
8340: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8350: 20 20 20 20 73 68 6f 77 54 65 73 74 20 6c 0d 0a      showTest l..
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
8370: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
8380: 20 20 20 20 20 20 20 20 66 61 69 6c 54 65 73 74          failTest
8390: 20 6c 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20   l $error..     
83a0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
83b0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
83c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
83d0: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
83e0: 20 24 65 72 72 6f 72 73 0d 0a 20 20 20 20 20 20   $errors..      
83f0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
8400: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
8410: 20 64 6f 6e 65 54 65 73 74 20 4c 0d 0a 20 20 20   doneTest L..   
8420: 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a   }] 0]..  }]....
8430: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
8440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8470: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
8480: 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20  .  #            
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 33 20 28    WORKLOAD #13 (
84b0: 4d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M)              
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
84d0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
84e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
84f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8500: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8520: 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  #....  set workl
8530: 6f 61 64 28 31 33 29 20 5b 6c 69 73 74 20 5c 0d  oad(13) [list \.
8540: 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63  .      [list src
8550: 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65  FileName dstFile
8560: 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74  Name table count
8570: 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d  1 count2 count3]
8580: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
8590: 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20   NOTE: Workload 
85a0: 23 31 33 2c 20 62 61 63 6b 75 70 20 66 72 6f 6d  #13, backup from
85b0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
85c0: 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 23 0d 0a  tabase...    #..
85d0: 20 20 20 20 77 61 69 74 54 65 73 74 20 4d 0d 0a      waitTest M..
85e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69      lappend ::ti
85f0: 6d 65 73 28 31 33 29 20 5b 6c 69 6e 64 65 78 20  mes(13) [lindex 
8600: 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69  [time {..      i
8610: 6e 69 74 54 65 73 74 20 4d 0d 0a 20 20 20 20 20  nitTest M..     
8620: 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
8630: 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63  1} {$index <= $c
8640: 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64  ount1} {incr ind
8650: 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ex} {..        i
8660: 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e  f {[string is in
8670: 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 3a  teger -strict $:
8680: 3a 63 6f 6d 70 69 6c 65 64 28 31 33 29 5d 7d 20  :compiled(13)]} 
8690: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
86a0: 20 20 73 65 74 20 69 64 20 24 3a 3a 63 6f 6d 70    set id $::comp
86b0: 69 6c 65 64 28 31 33 29 3b 20 23 20 4e 4f 54 45  iled(13); # NOTE
86c0: 3a 20 41 6c 72 65 61 64 79 20 63 6f 6d 70 69 6c  : Already compil
86d0: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ed...          i
86e0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
86f0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
8700: 69 6e 76 6f 6b 65 20 5f 44 79 6e 61 6d 69 63 24  invoke _Dynamic$
8710: 7b 69 64 7d 2e 54 65 73 74 24 7b 69 64 7d 20 42  {id}.Test${id} B
8720: 61 63 6b 75 70 41 6e 64 47 65 74 44 61 74 61 0d  ackupAndGetData.
8730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f  .            sho
8740: 77 54 65 73 74 20 4d 0d 0a 20 20 20 20 20 20 20  wTest M..       
8750: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
8760: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
8770: 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64   if {[isExpected
8780: 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74  Error $error]} t
8790: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
87a0: 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 6d 0d       showTest m.
87b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
87c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
87d0: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 6d 20       failTest m 
87e0: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
87f0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
8800: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
8810: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
8820: 73 65 74 20 69 64 20 5b 6f 62 6a 65 63 74 20 69  set id [object i
8830: 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
8840: 72 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78 74  r.GetActive Next
8850: 49 64 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  Id]..          s
8860: 65 74 20 63 6f 64 65 20 5b 63 6f 6d 70 69 6c 65  et code [compile
8870: 43 53 68 61 72 70 57 69 74 68 20 5b 73 75 62 73  CSharpWith [subs
8880: 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t {..           
8890: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61   using System.Da
88a0: 74 61 2e 53 51 4c 69 74 65 3b 0d 0a 0d 0a 20 20  ta.SQLite;....  
88b0: 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 73 70            namesp
88c0: 61 63 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64  ace _Dynamic${id
88d0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  }..            {
88e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
88f0: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 63 6c  public static cl
8900: 61 73 73 20 54 65 73 74 24 7b 69 64 7d 0d 0a 20  ass Test${id}.. 
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 76 6f  public static vo
8940: 69 64 20 42 61 63 6b 75 70 41 6e 64 47 65 74 44  id BackupAndGetD
8950: 61 74 61 28 29 0d 0a 20 20 20 20 20 20 20 20 20  ata()..         
8960: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
8970: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
8980: 67 20 28 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  g (SQLiteConnect
8990: 69 6f 6e 20 73 6f 75 72 63 65 20 3d 20 6e 65 77  ion source = new
89a0: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
89b0: 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n(..            
89c0: 20 20 20 20 20 20 20 20 20 20 22 46 75 6c 6c 55            "FullU
89d0: 72 69 3d 24 7b 73 72 63 46 69 6c 65 4e 61 6d 65  ri=${srcFileName
89e0: 7d 3b 5b 67 65 74 46 6c 61 67 73 50 72 6f 70 65  };[getFlagsPrope
89f0: 72 74 79 20 7b 7d 20 74 72 75 65 5d 22 29 29 0d  rty {} true]")).
8a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8a10: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
8a20: 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65            source
8a30: 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20  .Open();....    
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 75 73 69 6e 67 20 28 53 51 4c 69 74 65 43 6f 6e  using (SQLiteCon
8a60: 6e 65 63 74 69 6f 6e 20 64 65 73 74 69 6e 61 74  nection destinat
8a70: 69 6f 6e 20 3d 20 6e 65 77 20 53 51 4c 69 74 65  ion = new SQLite
8a80: 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d 0a 20 20 20  Connection(..   
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 20 20 20 20 20 22 46 75 6c 6c 55 72 69 3d 24 7b       "FullUri=${
8ab0: 64 73 74 46 69 6c 65 4e 61 6d 65 7d 3b 5b 67 65  dstFileName};[ge
8ac0: 74 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b  tFlagsProperty {
8ad0: 7d 20 74 72 75 65 5d 22 29 29 0d 0a 20 20 20 20  } true]"))..    
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
8b00: 20 20 20 20 20 20 20 20 20 64 65 73 74 69 6e 61           destina
8b10: 74 69 6f 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a  tion.Open();....
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 20 20 20 20 20 73 6f 75 72 63 65 2e 42 61 63        source.Bac
8b40: 6b 75 70 44 61 74 61 62 61 73 65 28 0d 0a 20 20  kupDatabase(..  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 20 20 20 20 20 20 64 65 73 74 69 6e 61 74          destinat
8b70: 69 6f 6e 2c 20 22 6d 61 69 6e 22 2c 20 22 6d 61  ion, "main", "ma
8b80: 69 6e 22 2c 20 2d 31 2c 20 6e 75 6c 6c 2c 20 30  in", -1, null, 0
8b90: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
8ba0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
8be0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
8bf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c20: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
8c30: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
8c40: 74 61 74 69 63 20 76 6f 69 64 20 4d 61 69 6e 28  tatic void Main(
8c50: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
8c60: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
8c70: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
8c80: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
8c90: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8ca0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
8cb0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8cc0: 20 20 20 20 20 7d 5d 20 74 72 75 65 20 74 72 75       }] true tru
8cd0: 65 20 74 72 75 65 20 72 65 73 75 6c 74 73 20 65  e true results e
8ce0: 72 72 6f 72 73 20 53 79 73 74 65 6d 2e 44 61 74  rrors System.Dat
8cf0: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 20  a.SQLite.dll].. 
8d00: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 63 6f           if {$co
8d10: 64 65 20 65 71 20 22 4f 6b 22 7d 20 74 68 65 6e  de eq "Ok"} then
8d20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8d30: 73 65 74 20 3a 3a 63 6f 6d 70 69 6c 65 64 28 31  set ::compiled(1
8d40: 33 29 20 24 69 64 3b 20 23 20 4e 4f 54 45 3a 20  3) $id; # NOTE: 
8d50: 43 6f 6d 70 69 6c 65 64 20 4f 4b 2e 0d 0a 20 20  Compiled OK...  
8d60: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
8d70: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
8d80: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
8d90: 6f 6b 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64  oke _Dynamic${id
8da0: 7d 2e 54 65 73 74 24 7b 69 64 7d 20 42 61 63 6b  }.Test${id} Back
8db0: 75 70 41 6e 64 47 65 74 44 61 74 61 0d 0a 20 20  upAndGetData..  
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77              show
8dd0: 54 65 73 74 20 4d 0d 0a 20 20 20 20 20 20 20 20  Test M..        
8de0: 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
8df0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
8e00: 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63      if {[isExpec
8e10: 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d  tedError $error]
8e20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8e30: 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65            showTe
8e40: 73 74 20 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  st m..          
8e50: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
8e70: 69 6c 54 65 73 74 20 6d 20 24 65 72 72 6f 72 0d  ilTest m $error.
8e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8e90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
8ea0: 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
8eb0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
8ec0: 20 65 72 72 6f 72 20 24 65 72 72 6f 72 73 0d 0a   error $errors..
8ed0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
8ee0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
8ef0: 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20  .      doneTest 
8f00: 4d 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20  M..    }] 0]..  
8f10: 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23  }]....  ########
8f20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f60: 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20  #####..  #      
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44          WORKLOAD
8f90: 20 23 31 34 20 28 4e 29 20 20 20 20 20 20 20 20   #14 (N)        
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23       #..  ######
8fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9000: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
9010: 20 77 6f 72 6b 6c 6f 61 64 28 31 34 29 20 5b 6c   workload(14) [l
9020: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69  ist \..      [li
9030: 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64  st srcFileName d
9040: 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65  stFileName table
9050: 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63   count1 count2 c
9060: 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d  ount3] {..    #.
9070: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
9080: 6b 6c 6f 61 64 20 23 31 34 2c 20 50 52 41 47 4d  kload #14, PRAGM
9090: 41 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  A integrity chec
90a0: 6b 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20  k statement...  
90b0: 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73    #..    waitTes
90c0: 74 20 4e 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  t N..    lappend
90d0: 20 3a 3a 74 69 6d 65 73 28 31 34 29 20 5b 6c 69   ::times(14) [li
90e0: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
90f0: 20 20 20 20 69 6e 69 74 54 65 73 74 20 4e 0d 0a      initTest N..
9100: 20 20 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c        setupWorkl
9110: 6f 61 64 46 69 6c 65 44 62 20 24 64 73 74 46 69  oadFileDb $dstFi
9120: 6c 65 4e 61 6d 65 20 64 62 0d 0a 20 20 20 20 20  leName db..     
9130: 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
9140: 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63  1} {$index <= $c
9150: 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64  ount1} {incr ind
9160: 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ex} {..        i
9170: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
9180: 20 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c         set resul
9190: 74 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d  t [sql execute -
91a0: 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24  execute scalar $
91b0: 64 62 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  db \..          
91c0: 20 20 20 20 22 50 52 41 47 4d 41 20 69 6e 74 65      "PRAGMA inte
91d0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 22 5d 0d 0a  grity_check;"]..
91e0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 72            if {$r
91f0: 65 73 75 6c 74 20 6e 65 20 22 6f 6b 22 7d 20 74  esult ne "ok"} t
9200: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9210: 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64     error [append
9220: 41 72 67 73 20 22 69 6e 74 65 67 72 69 74 79 20  Args "integrity 
9230: 63 68 65 63 6b 20 66 61 69 6c 65 64 3a 20 22 20  check failed: " 
9240: 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20  $result]..      
9250: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
9260: 20 73 68 6f 77 54 65 73 74 20 4e 0d 0a 20 20 20   showTest N..   
9270: 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
9280: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9290: 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64   if {[isExpected
92a0: 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74  Error $error]} t
92b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
92c0: 20 20 20 73 68 6f 77 54 65 73 74 20 6e 0d 0a 20     showTest n.. 
92d0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
92e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
92f0: 61 69 6c 54 65 73 74 20 6e 20 24 65 72 72 6f 72  ailTest n $error
9300: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
9310: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9320: 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70  }..      cleanup
9330: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
9340: 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61  db false true fa
9350: 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54  lse..      doneT
9360: 65 73 74 20 4e 0d 0a 20 20 20 20 7d 5d 20 30 5d  est N..    }] 0]
9370: 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23  ..  }]....  ####
9380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93c0: 23 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20  #########..  #  
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b              WORK
93f0: 4c 4f 41 44 20 23 31 35 20 28 4f 29 20 20 20 20  LOAD #15 (O)    
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9410: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23           #..  ##
9420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9460: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
9470: 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 31 35   set workload(15
9480: 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  ) [list \..     
9490: 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61   [list srcFileNa
94a0: 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74  me dstFileName t
94b0: 61 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e  able count1 coun
94c0: 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20  t2 count3] {..  
94d0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
94e0: 20 57 6f 72 6b 6c 6f 61 64 20 23 31 35 2c 20 66   Workload #15, f
94f0: 6f 72 63 65 20 6d 61 6e 61 67 65 64 20 67 61 72  orce managed gar
9500: 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 0d  bage collection.
9510: 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69 74  .    #..    wait
9520: 54 65 73 74 20 4f 0d 0a 20 20 20 20 6c 61 70 70  Test O..    lapp
9530: 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 35 29 20  end ::times(15) 
9540: 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d  [lindex [time {.
9550: 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20  .      initTest 
9560: 4f 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65  O..      for {se
9570: 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64  t index 1} {$ind
9580: 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b  ex <= $count1} {
9590: 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
95a0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
95b0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  h {..          c
95c0: 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a  ollectGarbage $:
95d0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20  :test_channel.. 
95e0: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
95f0: 74 20 4f 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  t O..        } e
9600: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
9610: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
9620: 45 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65  ExpectedError $e
9630: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
9640: 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54             showT
9650: 65 73 74 20 6f 0d 0a 20 20 20 20 20 20 20 20 20  est o..         
9660: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
9670: 20 20 20 20 20 20 20 66 61 69 6c 54 65 73 74 20         failTest 
9680: 6f 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  o $error..      
9690: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
96a0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
96b0: 20 64 6f 6e 65 54 65 73 74 20 4f 0d 0a 20 20 20   doneTest O..   
96c0: 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a   }] 0]..  }]....
96d0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
96e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
96f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9700: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9710: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
9720: 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20  .  #            
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 36 20 28    WORKLOAD #16 (
9750: 50 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P)              
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
9770: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
9780: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9790: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
97a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
97b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
97c0: 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  #....  set workl
97d0: 6f 61 64 28 31 36 29 20 5b 6c 69 73 74 20 5c 0d  oad(16) [list \.
97e0: 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63  .      [list src
97f0: 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65  FileName dstFile
9800: 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74  Name table count
9810: 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d  1 count2 count3]
9820: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
9830: 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20   NOTE: Workload 
9840: 23 31 36 2c 20 61 6c 6c 6f 63 61 74 65 20 28 65  #16, allocate (e
9850: 78 63 6c 75 64 65 29 20 73 6f 6d 65 20 6e 61 74  xclude) some nat
9860: 69 76 65 20 68 65 61 70 20 6d 65 6d 6f 72 79 0d  ive heap memory.
9870: 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69 74  .    #..    wait
9880: 54 65 73 74 20 50 0d 0a 20 20 20 20 6c 61 70 70  Test P..    lapp
9890: 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 36 29 20  end ::times(16) 
98a0: 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d  [lindex [time {.
98b0: 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20  .      initTest 
98c0: 50 0d 0a 20 20 20 20 20 20 73 65 74 20 6d 61 78  P..      set max
98d0: 53 69 7a 65 20 24 3a 3a 63 6f 75 6e 74 28 35 29  Size $::count(5)
98e0: 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69  ..      object i
98f0: 6e 76 6f 6b 65 20 47 43 20 41 64 64 4d 65 6d 6f  nvoke GC AddMemo
9900: 72 79 50 72 65 73 73 75 72 65 20 24 6d 61 78 53  ryPressure $maxS
9910: 69 7a 65 0d 0a 20 20 20 20 20 20 74 72 79 20 7b  ize..      try {
9920: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73  ..        for {s
9930: 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e  et index 1} {$in
9940: 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20  dex <= $count1} 
9950: 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
9960: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
9970: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
9980: 20 20 20 20 73 65 74 20 73 69 7a 65 20 5b 65 78      set size [ex
9990: 70 72 20 7b 69 6e 74 28 6d 69 6e 28 24 6d 61 78  pr {int(min($max
99a0: 53 69 7a 65 2c 20 61 62 73 28 24 63 6f 75 6e 74  Size, abs($count
99b0: 33 20 2a 20 24 69 6e 64 65 78 20 2a 20 35 2e 30  3 * $index * 5.0
99c0: 29 29 29 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20  )))}]..         
99d0: 20 20 20 73 65 74 20 70 74 72 20 5b 61 6c 6c 6f     set ptr [allo
99e0: 63 4d 65 6d 20 24 73 69 7a 65 5d 3b 20 23 20 74  cMem $size]; # t
99f0: 68 72 6f 77 0d 0a 20 20 20 20 20 20 20 20 20 20  hrow..          
9a00: 20 20 75 73 65 4d 65 6d 20 24 70 74 72 20 24 73    useMem $ptr $s
9a10: 69 7a 65 3b 20 64 65 6c 61 79 54 65 73 74 20 24  ize; delayTest $
9a20: 63 6f 75 6e 74 32 0d 0a 20 20 20 20 20 20 20 20  count2..        
9a30: 20 20 20 20 66 72 65 65 4d 65 6d 20 24 70 74 72      freeMem $ptr
9a40: 3b 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  ; unset -nocompl
9a50: 61 69 6e 20 70 74 72 0d 0a 20 20 20 20 20 20 20  ain ptr..       
9a60: 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 50 0d       showTest P.
9a70: 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72  .          } err
9a80: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
9a90: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
9aa0: 45 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65  ExpectedError $e
9ab0: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f               sho
9ad0: 77 54 65 73 74 20 70 0d 0a 20 20 20 20 20 20 20  wTest p..       
9ae0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69               fai
9b00: 6c 54 65 73 74 20 70 20 24 65 72 72 6f 72 0d 0a  lTest p $error..
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
9b20: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9b30: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 66      }..      } f
9b40: 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20  inally {..      
9b50: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
9b60: 74 73 20 70 74 72 5d 7d 20 74 68 65 6e 20 7b 0d  ts ptr]} then {.
9b70: 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65 4d  .          freeM
9b80: 65 6d 20 24 70 74 72 3b 20 75 6e 73 65 74 20 2d  em $ptr; unset -
9b90: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 70 74 72 0d 0a  nocomplain ptr..
9ba0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
9bb0: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
9bc0: 20 47 43 20 52 65 6d 6f 76 65 4d 65 6d 6f 72 79   GC RemoveMemory
9bd0: 50 72 65 73 73 75 72 65 20 24 6d 61 78 53 69 7a  Pressure $maxSiz
9be0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
9bf0: 20 20 64 6f 6e 65 54 65 73 74 20 50 0d 0a 20 20    doneTest P..  
9c00: 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d    }] 0]..  }]...
9c10: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
9c20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9c30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9c40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9c50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9c60: 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20  ..  #           
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 37 20     WORKLOAD #17 
9c90: 28 51 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (Q)             
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  #..  ###########
9cc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9cf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9d00: 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b  ##....  set work
9d10: 6c 6f 61 64 28 31 37 29 20 5b 6c 69 73 74 20 5c  load(17) [list \
9d20: 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72  ..      [list sr
9d30: 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c  cFileName dstFil
9d40: 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e  eName table coun
9d50: 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33  t1 count2 count3
9d60: 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ] {..    #..    
9d70: 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64  # NOTE: Workload
9d80: 20 23 31 37 2c 20 63 68 61 6e 67 65 20 74 68 65   #17, change the
9d90: 20 64 61 74 61 62 61 73 65 20 6a 6f 75 72 6e 61   database journa
9da0: 6c 20 6d 6f 64 65 0d 0a 20 20 20 20 23 0d 0a 20  l mode..    #.. 
9db0: 20 20 20 77 61 69 74 54 65 73 74 20 51 0d 0a 20     waitTest Q.. 
9dc0: 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d     lappend ::tim
9dd0: 65 73 28 31 37 29 20 5b 6c 69 6e 64 65 78 20 5b  es(17) [lindex [
9de0: 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e  time {..      in
9df0: 69 74 54 65 73 74 20 51 0d 0a 20 20 20 20 20 20  itTest Q..      
9e00: 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c  setupWorkloadFil
9e10: 65 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65  eDb $dstFileName
9e20: 20 64 62 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b   db..      for {
9e30: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
9e40: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
9e50: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
9e60: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
9e70: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
9e80: 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
9e90: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52   [appendArgs "PR
9ea0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
9eb0: 65 20 3d 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  e = \"" \..     
9ec0: 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
9ed0: 24 69 6e 64 65 78 20 25 20 32 20 3d 3d 20 30 20  $index % 2 == 0 
9ee0: 3f 20 22 64 65 6c 65 74 65 22 20 3a 20 22 77 61  ? "delete" : "wa
9ef0: 6c 22 7d 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20  l"}] \"\;]..    
9f00: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 51        showTest Q
9f10: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f  ..        } erro
9f20: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
9f30: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70        if {[isExp
9f40: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
9f50: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
9f60: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
9f70: 20 71 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   q..          } 
9f80: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
9f90: 20 20 20 20 66 61 69 6c 54 65 73 74 20 71 20 24      failTest q $
9fa0: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
9fb0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
9fc0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c       }..      cl
9fd0: 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65  eanupDb $dstFile
9fe0: 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72  Name db false tr
9ff0: 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ue false..      
a000: 64 6f 6e 65 54 65 73 74 20 51 0d 0a 20 20 20 20  doneTest Q..    
a010: 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20  }] 0]..  }].... 
a020: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
a030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
a070: 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20    #             
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 57 4f 52 4b 4c 4f 41 44 20 23 31 38 20 28 52   WORKLOAD #18 (R
a0a0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
a0c0: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
a0d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a0e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a0f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a110: 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f  ....  set worklo
a120: 61 64 28 31 38 29 20 5b 6c 69 73 74 20 5c 0d 0a  ad(18) [list \..
a130: 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46        [list srcF
a140: 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e  ileName dstFileN
a150: 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31  ame table count1
a160: 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20   count2 count3] 
a170: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
a180: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
a190: 31 38 2c 20 65 78 65 63 75 74 65 20 71 75 65 72  18, execute quer
a1a0: 69 65 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ies against the 
a1b0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
a1c0: 73 65 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77  se..    #..    w
a1d0: 61 69 74 54 65 73 74 20 52 0d 0a 20 20 20 20 6c  aitTest R..    l
a1e0: 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31  append ::times(1
a1f0: 38 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65  8) [lindex [time
a200: 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65   {..      initTe
a210: 73 74 20 52 0d 0a 20 20 20 20 20 20 73 65 74 75  st R..      setu
a220: 70 57 6f 72 6b 6c 6f 61 64 4d 65 6d 44 62 20 24  pWorkloadMemDb $
a230: 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 62 0d 0a  srcFileName db..
a240: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
a250: 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
a260: 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63  <= $count1} {inc
a270: 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
a280: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
a290: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
a2a0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
a2b0: 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 33 2c   Workload #18.3,
a2c0: 20 22 73 6d 61 6c 6c 22 20 53 45 4c 45 43 54 20   "small" SELECT 
a2d0: 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20  statements...   
a2e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a2f0: 20 20 20 20 73 65 74 20 72 65 61 64 65 72 20 5b      set reader [
a300: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
a310: 63 75 74 65 20 72 65 61 64 65 72 20 5c 0d 0a 20  cute reader \.. 
a320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 66 6f               -fo
a330: 72 6d 61 74 20 64 61 74 61 52 65 61 64 65 72 20  rmat dataReader 
a340: 2d 61 6c 69 61 73 20 24 64 62 20 5b 61 70 70 65  -alias $db [appe
a350: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a360: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
a370: 78 2c 20 79 20 46 52 4f 4d 20 22 20 24 74 61 62  x, y FROM " $tab
a380: 6c 65 20 22 20 57 48 45 52 45 20 7a 20 3d 20 27  le " WHERE z = '
a390: 73 6d 61 6c 6c 27 3b 22 5d 5d 0d 0a 20 20 20 20  small';"]]..    
a3a0: 20 20 20 20 20 20 77 68 69 6c 65 20 7b 5b 24 72        while {[$r
a3b0: 65 61 64 65 72 20 52 65 61 64 5d 7d 20 7b 0d 0a  eader Read]} {..
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
a3d0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
a3e0: 45 3a 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a  E: Do nothing...
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
a400: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a410: 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
a420: 6f 6d 70 6c 61 69 6e 20 72 65 61 64 65 72 0d 0a  omplain reader..
a430: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
a440: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
a450: 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 34 2c 20 22  orkload #18.4, "
a460: 62 69 67 22 20 53 45 4c 45 43 54 20 73 74 61 74  big" SELECT stat
a470: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  ements...       
a480: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
a490: 73 65 74 20 72 65 61 64 65 72 20 5b 73 71 6c 20  set reader [sql 
a4a0: 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
a4b0: 20 72 65 61 64 65 72 20 5c 0d 0a 20 20 20 20 20   reader \..     
a4c0: 20 20 20 20 20 20 20 20 20 2d 66 6f 72 6d 61 74           -format
a4d0: 20 64 61 74 61 52 65 61 64 65 72 20 2d 61 6c 69   dataReader -ali
a4e0: 61 73 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  as $db [appendAr
a4f0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
a500: 20 20 20 20 22 53 45 4c 45 43 54 20 78 2c 20 79      "SELECT x, y
a510: 20 46 52 4f 4d 20 22 20 24 74 61 62 6c 65 20 22   FROM " $table "
a520: 20 57 48 45 52 45 20 7a 20 3d 20 27 62 69 67 27   WHERE z = 'big'
a530: 3b 22 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ;"]]..          
a540: 77 68 69 6c 65 20 7b 5b 24 72 65 61 64 65 72 20  while {[$reader 
a550: 52 65 61 64 5d 7d 20 7b 0d 0a 20 20 20 20 20 20  Read]} {..      
a560: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a570: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 20       # NOTE: Do 
a580: 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20  nothing...      
a590: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a5a0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
a5b0: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
a5c0: 6e 20 72 65 61 64 65 72 0d 0a 20 20 20 20 20 20  n reader..      
a5d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a5e0: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
a5f0: 64 20 23 31 38 2e 35 2c 20 22 73 6d 61 6c 6c 22  d #18.5, "small"
a600: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
a610: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts...          #
a620: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20  ..          sql 
a630: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
a640: 65 6e 64 41 72 67 73 20 22 49 4e 53 45 52 54 20  endArgs "INSERT 
a650: 49 4e 54 4f 20 22 20 24 74 61 62 6c 65 20 5c 0d  INTO " $table \.
a660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
a670: 28 78 2c 20 79 2c 20 7a 29 20 56 41 4c 55 45 53  (x, y, z) VALUES
a680: 28 27 22 20 5b 66 6f 72 6d 61 74 20 25 6c 58 20  ('" [format %lX 
a690: 5b 65 78 70 72 20 7b 72 61 6e 64 6f 6d 28 29 7d  [expr {random()}
a6a0: 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] \..          
a6b0: 20 20 20 20 22 27 2c 20 27 22 20 5b 62 61 73 65      "', '" [base
a6c0: 36 34 20 65 6e 63 6f 64 65 20 2d 2d 20 5b 65 78  64 encode -- [ex
a6d0: 70 72 20 7b 72 61 6e 64 73 74 72 28 24 63 6f 75  pr {randstr($cou
a6e0: 6e 74 32 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20  nt2)}]] \..     
a6f0: 20 20 20 20 20 20 20 20 20 22 27 2c 20 27 73 6d           "', 'sm
a700: 61 6c 6c 27 29 3b 22 5d 0d 0a 20 20 20 20 20 20  all');"]..      
a710: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a720: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
a730: 64 20 23 31 38 2e 36 2c 20 22 62 69 67 22 20 49  d #18.6, "big" I
a740: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73  NSERT statements
a750: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
a760: 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78            sql ex
a770: 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e  ecute $db [appen
a780: 64 41 72 67 73 20 22 49 4e 53 45 52 54 20 49 4e  dArgs "INSERT IN
a790: 54 4f 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20  TO " $table \.. 
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 28 78               "(x
a7b0: 2c 20 79 2c 20 7a 29 20 56 41 4c 55 45 53 28 27  , y, z) VALUES('
a7c0: 22 20 5b 66 6f 72 6d 61 74 20 25 6c 58 20 5b 65  " [format %lX [e
a7d0: 78 70 72 20 7b 72 61 6e 64 6f 6d 28 29 7d 5d 5d  xpr {random()}]]
a7e0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a7f0: 20 20 22 27 2c 20 52 41 4e 44 4f 4d 42 4c 4f 42    "', RANDOMBLOB
a800: 28 22 20 24 63 6f 75 6e 74 33 20 22 29 2c 20 27  (" $count3 "), '
a810: 62 69 67 27 29 3b 22 5d 0d 0a 20 20 20 20 20 20  big');"]..      
a820: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a830: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
a840: 64 20 23 31 38 2e 37 2c 20 22 73 6d 61 6c 6c 22  d #18.7, "small"
a850: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
a860: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts...          #
a870: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20  ..          sql 
a880: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
a890: 65 6e 64 41 72 67 73 20 22 55 50 44 41 54 45 20  endArgs "UPDATE 
a8a0: 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20  " $table \..    
a8b0: 20 20 20 20 20 20 20 20 20 20 22 20 53 45 54 20            " SET 
a8c0: 79 20 3d 20 27 22 20 5b 62 61 73 65 36 34 20 65  y = '" [base64 e
a8d0: 6e 63 6f 64 65 20 2d 2d 20 5b 65 78 70 72 20 7b  ncode -- [expr {
a8e0: 72 61 6e 64 73 74 72 28 24 63 6f 75 6e 74 32 29  randstr($count2)
a8f0: 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  }]] \..         
a900: 20 20 20 20 20 22 27 20 57 48 45 52 45 20 78 20       "' WHERE x 
a910: 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74 20  LIKE '" [format 
a920: 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20 41  %X $index] "%' A
a930: 4e 44 20 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b 22  ND z = 'small';"
a940: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ]..          #..
a950: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
a960: 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 38  : Workload #18.8
a970: 2c 20 22 62 69 67 22 20 55 50 44 41 54 45 20 73  , "big" UPDATE s
a980: 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20  tatements...    
a990: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a9a0: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
a9b0: 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  db [appendArgs "
a9c0: 55 50 44 41 54 45 20 22 20 24 74 61 62 6c 65 20  UPDATE " $table 
a9d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a9e0: 20 22 20 53 45 54 20 79 20 3d 20 52 41 4e 44 4f   " SET y = RANDO
a9f0: 4d 42 4c 4f 42 28 22 20 24 63 6f 75 6e 74 33 20  MBLOB(" $count3 
aa00: 22 29 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  ") WHERE x LIKE 
aa10: 27 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  '" \..          
aa20: 20 20 20 20 5b 66 6f 72 6d 61 74 20 25 58 20 24      [format %X $
aa30: 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44 20 7a  index] "%' AND z
aa40: 20 3d 20 27 62 69 67 27 3b 22 5d 0d 0a 20 20 20   = 'big';"]..   
aa50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
aa60: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b      # NOTE: Work
aa70: 6c 6f 61 64 20 23 31 38 2e 39 2c 20 22 73 6d 61  load #18.9, "sma
aa80: 6c 6c 22 20 44 45 4c 45 54 45 20 73 74 61 74 65  ll" DELETE state
aa90: 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  ments...        
aaa0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
aab0: 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b  ql execute $db [
aac0: 61 70 70 65 6e 64 41 72 67 73 20 22 44 45 4c 45  appendArgs "DELE
aad0: 54 45 20 46 52 4f 4d 20 22 20 24 74 61 62 6c 65  TE FROM " $table
aae0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
aaf0: 20 20 22 20 57 48 45 52 45 20 78 20 4c 49 4b 45    " WHERE x LIKE
ab00: 20 27 22 20 5b 66 6f 72 6d 61 74 20 25 58 20 24   '" [format %X $
ab10: 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44 20 7a  index] "%' AND z
ab20: 20 3d 20 27 73 6d 61 6c 6c 27 3b 22 5d 0d 0a 20   = 'small';"].. 
ab30: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
ab40: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f        # NOTE: Wo
ab50: 72 6b 6c 6f 61 64 20 23 31 38 2e 31 30 2c 20 22  rkload #18.10, "
ab60: 62 69 67 22 20 44 45 4c 45 54 45 20 73 74 61 74  big" DELETE stat
ab70: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  ements...       
ab80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
ab90: 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
aba0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 44 45 4c  [appendArgs "DEL
abb0: 45 54 45 20 46 52 4f 4d 20 22 20 24 74 61 62 6c  ETE FROM " $tabl
abc0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
abd0: 20 20 20 22 20 57 48 45 52 45 20 78 20 4c 49 4b     " WHERE x LIK
abe0: 45 20 27 22 20 5b 66 6f 72 6d 61 74 20 25 58 20  E '" [format %X 
abf0: 24 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44 20  $index] "%' AND 
ac00: 7a 20 3d 20 27 62 69 67 27 3b 22 5d 0d 0a 20 20  z = 'big';"]..  
ac10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ac20: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72       # NOTE: Wor
ac30: 6b 6c 6f 61 64 20 23 31 38 2e 31 31 2c 20 56 41  kload #18.11, VA
ac40: 43 55 55 4d 20 73 74 61 74 65 6d 65 6e 74 2e 0d  CUUM statement..
ac50: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
ac60: 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
ac70: 75 74 65 20 24 64 62 20 22 56 41 43 55 55 4d 3b  ute $db "VACUUM;
ac80: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  "..          #..
ac90: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
aca0: 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 31  : Workload #18.1
acb0: 34 2c 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72  4, PRAGMA integr
acc0: 69 74 79 20 63 68 65 63 6b 20 73 74 61 74 65 6d  ity check statem
acd0: 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ent...          
ace0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
acf0: 20 72 65 73 75 6c 74 20 5b 73 71 6c 20 65 78 65   result [sql exe
ad00: 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63  cute -execute sc
ad10: 61 6c 61 72 20 24 64 62 20 5c 0d 0a 20 20 20 20  alar $db \..    
ad20: 20 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d            "PRAGM
ad30: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
ad40: 6b 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  k;"]..          
ad50: 69 66 20 7b 24 72 65 73 75 6c 74 20 6e 65 20 22  if {$result ne "
ad60: 6f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ok"} then {..   
ad70: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b           error [
ad80: 61 70 70 65 6e 64 41 72 67 73 20 22 69 6e 74 65  appendArgs "inte
ad90: 67 72 69 74 79 20 63 68 65 63 6b 20 66 61 69 6c  grity check fail
ada0: 65 64 3a 20 22 20 24 72 65 73 75 6c 74 5d 0d 0a  ed: " $result]..
adb0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
adc0: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
add0: 52 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  R..        } err
ade0: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
adf0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78         if {[isEx
ae00: 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72  pectedError $err
ae10: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
ae20: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
ae30: 74 20 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  t r..          }
ae40: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
ae50: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 72 20       failTest r 
ae60: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
ae70: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
ae80: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63        }..      c
ae90: 6c 65 61 6e 75 70 44 62 20 24 73 72 63 46 69 6c  leanupDb $srcFil
aea0: 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74  eName db false t
aeb0: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
aec0: 20 64 6f 6e 65 54 65 73 74 20 52 0d 0a 20 20 20   doneTest R..   
aed0: 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a   }] 0]..  }]....
aee0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
aef0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
af00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
af10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
af20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
af30: 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20  .  #            
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af50: 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 39 20 28    WORKLOAD #19 (
af60: 53 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S)              
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
af80: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
af90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
afa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
afb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
afc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
afd0: 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  #....  set workl
afe0: 6f 61 64 28 31 39 29 20 5b 6c 69 73 74 20 5c 0d  oad(19) [list \.
aff0: 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63  .      [list src
b000: 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65  FileName dstFile
b010: 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74  Name table count
b020: 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d  1 count2 count3]
b030: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
b040: 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20   NOTE: Workload 
b050: 23 31 39 2c 20 72 61 70 69 64 6c 79 20 6f 70 65  #19, rapidly ope
b060: 6e 2f 63 6c 6f 73 65 20 63 6f 6e 6e 65 63 74 69  n/close connecti
b070: 6f 6e 73 2c 20 74 68 72 65 61 64 20 23 31 2e 0d  ons, thread #1..
b080: 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69 74  .    #..    wait
b090: 54 65 73 74 20 53 0d 0a 20 20 20 20 6c 61 70 70  Test S..    lapp
b0a0: 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 39 29 20  end ::times(19) 
b0b0: 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d  [lindex [time {.
b0c0: 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20  .      initTest 
b0d0: 53 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65  S..      for {se
b0e0: 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64  t index 1} {$ind
b0f0: 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b  ex <= $count1} {
b100: 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
b110: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
b120: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  h {..          s
b130: 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65  etupWorkloadFile
b140: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
b150: 64 62 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6c  db..          cl
b160: 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65  eanupDb $dstFile
b170: 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72  Name db false tr
b180: 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ue false..      
b190: 20 20 20 20 73 68 6f 77 54 65 73 74 20 53 0d 0a      showTest S..
b1a0: 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
b1b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b1c0: 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63      if {[isExpec
b1d0: 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d  tedError $error]
b1e0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b1f0: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 73        showTest s
b200: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
b210: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
b220: 20 20 66 61 69 6c 54 65 73 74 20 73 20 24 65 72    failTest s $er
b230: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ror..          }
b240: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
b250: 20 20 20 7d 0d 0a 20 20 20 20 20 20 64 6f 6e 65     }..      done
b260: 54 65 73 74 20 53 0d 0a 20 20 20 20 7d 5d 20 30  Test S..    }] 0
b270: 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23  ]..  }]....  ###
b280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b2a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b2b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b2c0: 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20  ##########..  # 
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 52               WOR
b2f0: 4b 4c 4f 41 44 20 23 32 30 20 28 54 29 20 20 20  KLOAD #20 (T)   
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23            #..  #
b320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b360: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
b370: 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 32    set workload(2
b380: 30 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  0) [list \..    
b390: 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e    [list srcFileN
b3a0: 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20  ame dstFileName 
b3b0: 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75  table count1 cou
b3c0: 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20  nt2 count3] {.. 
b3d0: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
b3e0: 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 32 30 2c 20  : Workload #20, 
b3f0: 72 61 70 69 64 6c 79 20 6f 70 65 6e 2f 63 6c 6f  rapidly open/clo
b400: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 20  se connections, 
b410: 74 68 72 65 61 64 20 23 32 2e 0d 0a 20 20 20 20  thread #2...    
b420: 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74 20  #..    waitTest 
b430: 54 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a  T..    lappend :
b440: 3a 74 69 6d 65 73 28 32 30 29 20 5b 6c 69 6e 64  :times(20) [lind
b450: 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20  ex [time {..    
b460: 20 20 69 6e 69 74 54 65 73 74 20 54 0d 0a 20 20    initTest T..  
b470: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64      for {set ind
b480: 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d  ex 1} {$index <=
b490: 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20   $count1} {incr 
b4a0: 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
b4b0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
b4c0: 20 20 20 20 20 20 20 20 20 20 73 65 74 75 70 57            setupW
b4d0: 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24 64  orkloadFileDb $d
b4e0: 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 0d 0a 20  stFileName db.. 
b4f0: 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70           cleanup
b500: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
b510: 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61  db false true fa
b520: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 73  lse..          s
b530: 68 6f 77 54 65 73 74 20 54 0d 0a 20 20 20 20 20  howTest T..     
b540: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
b550: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
b560: 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72  f {[isExpectedEr
b570: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
b580: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
b590: 20 73 68 6f 77 54 65 73 74 20 74 0d 0a 20 20 20   showTest t..   
b5a0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
b5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69  .            fai
b5c0: 6c 54 65 73 74 20 74 20 24 65 72 72 6f 72 0d 0a  lTest t $error..
b5d0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
b5e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
b5f0: 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20  .      doneTest 
b600: 54 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20  T..    }] 0]..  
b610: 7d 5d 0d 0a 7d 20 2d 62 6f 64 79 20 7b 0d 0a 20  }]..} -body {.. 
b620: 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 4e 61 6d   set workloadNam
b630: 65 73 28 61 6c 6c 29 20 5b 61 72 72 61 79 20 6e  es(all) [array n
b640: 61 6d 65 73 20 77 6f 72 6b 6c 6f 61 64 5d 0d 0a  ames workload]..
b650: 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f  ..  tputs $test_
b660: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
b670: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d  rgs \..      "--
b680: 2d 2d 20 74 68 65 72 65 20 61 72 65 20 22 20 5b  -- there are " [
b690: 6c 6c 65 6e 67 74 68 20 24 77 6f 72 6b 6c 6f 61  llength $workloa
b6a0: 64 4e 61 6d 65 73 28 61 6c 6c 29 5d 20 5c 0d 0a  dNames(all)] \..
b6b0: 20 20 20 20 20 20 22 20 74 6f 74 61 6c 20 77 6f        " total wo
b6c0: 72 6b 6c 6f 61 64 73 2c 20 74 68 65 69 72 20 6e  rkloads, their n
b6d0: 61 6d 65 73 20 61 72 65 3a 20 22 20 24 77 6f 72  ames are: " $wor
b6e0: 6b 6c 6f 61 64 4e 61 6d 65 73 28 61 6c 6c 29 20  kloadNames(all) 
b6f0: 5c 6e 5d 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72  \n]....  set wor
b700: 6b 6c 6f 61 64 4e 61 6d 65 73 28 65 6e 61 62 6c  kloadNames(enabl
b710: 65 64 29 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  ed) [list]....  
b720: 66 6f 72 65 61 63 68 20 69 6e 64 65 78 28 30 29  foreach index(0)
b730: 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72   [lsort -integer
b740: 20 24 77 6f 72 6b 6c 6f 61 64 4e 61 6d 65 73 28   $workloadNames(
b750: 61 6c 6c 29 5d 20 7b 0d 0a 20 20 20 20 69 66 20  all)] {..    if 
b760: 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
b770: 20 24 6e 6f 57 6f 72 6b 6c 6f 61 64 20 24 69 6e   $noWorkload $in
b780: 64 65 78 28 30 29 5d 20 3d 3d 20 2d 31 7d 20 74  dex(0)] == -1} t
b790: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 6c 61 70  hen {..      lap
b7a0: 70 65 6e 64 20 77 6f 72 6b 6c 6f 61 64 4e 61 6d  pend workloadNam
b7b0: 65 73 28 65 6e 61 62 6c 65 64 29 20 24 69 6e 64  es(enabled) $ind
b7c0: 65 78 28 30 29 0d 0a 20 20 20 20 7d 0d 0a 20 20  ex(0)..    }..  
b7d0: 7d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65  }....  tputs $te
b7e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
b7f0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b800: 22 2d 2d 2d 2d 20 74 68 65 72 65 20 61 72 65 20  "---- there are 
b810: 22 20 5b 6c 6c 65 6e 67 74 68 20 24 77 6f 72 6b  " [llength $work
b820: 6c 6f 61 64 4e 61 6d 65 73 28 65 6e 61 62 6c 65  loadNames(enable
b830: 64 29 5d 20 5c 0d 0a 20 20 20 20 20 20 22 20 65  d)] \..      " e
b840: 6e 61 62 6c 65 64 20 77 6f 72 6b 6c 6f 61 64 73  nabled workloads
b850: 2c 20 74 68 65 69 72 20 6e 61 6d 65 73 20 61 72  , their names ar
b860: 65 3a 20 22 20 24 77 6f 72 6b 6c 6f 61 64 4e 61  e: " $workloadNa
b870: 6d 65 73 28 65 6e 61 62 6c 65 64 29 20 5c 6e 5d  mes(enabled) \n]
b880: 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73  ....  tputs $tes
b890: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
b8a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22  dArgs \..      "
b8b0: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 74 68  ==== WARNING: th
b8c0: 69 73 20 73 74 72 65 73 73 20 74 65 73 74 20 6d  is stress test m
b8d0: 61 79 20 74 61 6b 65 20 73 65 76 65 72 61 6c 20  ay take several 
b8e0: 6d 69 6e 75 74 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a  minutes...\n"]..
b8f0: 0d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64  ..  for {set ind
b900: 65 78 28 30 29 20 31 7d 20 7b 24 69 6e 64 65 78  ex(0) 1} {$index
b910: 28 30 29 20 3c 3d 20 24 63 6f 75 6e 74 28 30 29  (0) <= $count(0)
b920: 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 28 30 29  } {incr index(0)
b930: 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 24 69 6e  } {..    if {$in
b940: 64 65 78 28 30 29 20 3e 20 31 7d 20 74 68 65 6e  dex(0) > 1} then
b950: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
b960: 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 76 61 6e     # NOTE: Advan
b970: 63 65 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  ce output to the
b980: 20 6e 65 78 74 20 6c 69 6e 65 20 64 75 65 20 74   next line due t
b990: 6f 20 74 68 65 20 77 6f 72 6b 6c 6f 61 64 0d 0a  o the workload..
b9a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
b9b0: 65 72 61 74 69 6f 6e 20 70 72 6f 67 72 65 73 73  eration progress
b9c0: 20 69 6e 64 69 63 61 74 6f 72 73 20 66 72 6f 6d   indicators from
b9d0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 75   the previous ru
b9e0: 6e 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  n...      #..   
b9f0: 20 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63     tputs $test_c
ba00: 68 61 6e 6e 65 6c 20 5c 6e 0d 0a 20 20 20 20 7d  hannel \n..    }
ba10: 0d 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24 74  ....    tputs $t
ba20: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
ba30: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
ba40: 20 20 20 22 2d 2d 2d 2d 20 73 74 61 72 74 69 6e     "---- startin
ba50: 67 20 77 6f 72 6b 6c 6f 61 64 20 72 75 6e 20 23  g workload run #
ba60: 22 20 24 69 6e 64 65 78 28 30 29 20 2e 2e 2e 5c  " $index(0) ...\
ba70: 6e 5d 0d 0a 0d 0a 20 20 20 20 75 6e 73 65 74 20  n]....    unset 
ba80: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 68 72 65  -nocomplain thre
ba90: 61 64 20 73 74 61 74 75 73 3b 20 64 6f 6e 65 54  ad status; doneT
baa0: 65 73 74 0d 0a 0d 0a 20 20 20 20 73 71 6c 20 65  est....    sql e
bab0: 78 65 63 75 74 65 20 24 73 72 63 44 62 20 22 43  xecute $srcDb "C
bac0: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
bad0: 4f 54 20 45 58 49 53 54 53 20 74 31 28 78 20 50  OT EXISTS t1(x P
bae0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 2c 20 7a  RIMARY KEY, y, z
baf0: 29 3b 22 0d 0a 20 20 20 20 73 71 6c 20 65 78 65  );"..    sql exe
bb00: 63 75 74 65 20 24 64 62 20 22 43 52 45 41 54 45  cute $db "CREATE
bb10: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
bb20: 49 53 54 53 20 74 31 28 78 20 50 52 49 4d 41 52  ISTS t1(x PRIMAR
bb30: 59 20 4b 45 59 2c 20 79 2c 20 7a 29 3b 22 0d 0a  Y KEY, y, z);"..
bb40: 0d 0a 20 20 20 20 73 71 6c 20 65 78 65 63 75 74  ..    sql execut
bb50: 65 20 24 73 72 63 44 62 20 22 43 52 45 41 54 45  e $srcDb "CREATE
bb60: 20 49 4e 44 45 58 20 49 46 20 4e 4f 54 20 45 58   INDEX IF NOT EX
bb70: 49 53 54 53 20 69 31 20 4f 4e 20 74 31 28 79 29  ISTS i1 ON t1(y)
bb80: 3b 22 0d 0a 20 20 20 20 73 71 6c 20 65 78 65 63  ;"..    sql exec
bb90: 75 74 65 20 24 64 62 20 22 43 52 45 41 54 45 20  ute $db "CREATE 
bba0: 49 4e 44 45 58 20 49 46 20 4e 4f 54 20 45 58 49  INDEX IF NOT EXI
bbb0: 53 54 53 20 69 31 20 4f 4e 20 74 31 28 79 29 3b  STS i1 ON t1(y);
bbc0: 22 0d 0a 0d 0a 20 20 20 20 66 6f 72 65 61 63 68  "....    foreach
bbd0: 20 69 6e 64 65 78 28 31 29 20 5b 6c 73 6f 72 74   index(1) [lsort
bbe0: 20 2d 69 6e 74 65 67 65 72 20 24 77 6f 72 6b 6c   -integer $workl
bbf0: 6f 61 64 4e 61 6d 65 73 28 65 6e 61 62 6c 65 64  oadNames(enabled
bc00: 29 5d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20  )] {..      set 
bc10: 77 6f 72 6b 6c 6f 61 64 43 61 6c 6c 62 61 63 6b  workloadCallback
bc20: 73 28 24 69 6e 64 65 78 28 31 29 29 20 5b 6c 69  s($index(1)) [li
bc30: 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
bc40: 61 70 70 6c 79 20 24 77 6f 72 6b 6c 6f 61 64 28  apply $workload(
bc50: 24 69 6e 64 65 78 28 31 29 29 20 24 66 69 6c 65  $index(1)) $file
bc60: 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e 61 6d  Name(1) $fileNam
bc70: 65 28 32 29 20 74 31 20 24 63 6f 75 6e 74 28 31  e(2) t1 $count(1
bc80: 29 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  ) \..          $
bc90: 63 6f 75 6e 74 28 33 29 20 24 63 6f 75 6e 74 28  count(3) $count(
bca0: 34 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74  4)]....      set
bcb0: 20 74 68 72 65 61 64 28 24 69 6e 64 65 78 28 31   thread($index(1
bcc0: 29 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74  )) [object creat
bcd0: 65 20 2d 61 6c 69 61 73 20 53 79 73 74 65 6d 2e  e -alias System.
bce0: 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64  Threading.Thread
bcf0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 77   \..          $w
bd00: 6f 72 6b 6c 6f 61 64 43 61 6c 6c 62 61 63 6b 73  orkloadCallbacks
bd10: 28 24 69 6e 64 65 78 28 31 29 29 20 31 30 34 38  ($index(1)) 1048
bd20: 35 37 36 5d 0d 0a 0d 0a 20 20 20 20 20 20 24 74  576]....      $t
bd30: 68 72 65 61 64 28 24 69 6e 64 65 78 28 31 29 29  hread($index(1))
bd40: 20 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67   Name [appendArg
bd50: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  s \..          [
bd60: 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
bd70: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
bd80: 6d 65 28 32 29 5d 5d 20 22 20 23 22 20 24 69 6e  me(2)]] " #" $in
bd90: 64 65 78 28 31 29 5d 0d 0a 0d 0a 20 20 20 20 20  dex(1)]....     
bda0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
bdb0: 73 20 70 72 69 6f 72 69 74 79 28 24 69 6e 64 65  s priority($inde
bdc0: 78 28 31 29 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  x(1))]} then {..
bdd0: 20 20 20 20 20 20 20 20 24 74 68 72 65 61 64 28          $thread(
bde0: 24 69 6e 64 65 78 28 31 29 29 20 50 72 69 6f 72  $index(1)) Prior
bdf0: 69 74 79 20 24 70 72 69 6f 72 69 74 79 28 24 69  ity $priority($i
be00: 6e 64 65 78 28 31 29 29 0d 0a 20 20 20 20 20 20  ndex(1))..      
be10: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
be20: 66 6f 72 65 61 63 68 20 69 6e 64 65 78 28 31 29  foreach index(1)
be30: 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 74 68   [array names th
be40: 72 65 61 64 5d 20 7b 0d 0a 20 20 20 20 20 20 24  read] {..      $
be50: 74 68 72 65 61 64 28 24 69 6e 64 65 78 28 31 29  thread($index(1)
be60: 29 20 53 74 61 72 74 0d 0a 20 20 20 20 7d 0d 0a  ) Start..    }..
be70: 0d 0a 20 20 20 20 24 65 76 65 6e 74 20 53 65 74  ..    $event Set
be80: 3b 20 23 20 47 4f 0d 0a 0d 0a 20 20 20 20 66 6f  ; # GO....    fo
be90: 72 65 61 63 68 20 69 6e 64 65 78 28 31 29 20 5b  reach index(1) [
bea0: 61 72 72 61 79 20 6e 61 6d 65 73 20 74 68 72 65  array names thre
beb0: 61 64 5d 20 7b 0d 0a 20 20 20 20 20 20 24 74 68  ad] {..      $th
bec0: 72 65 61 64 28 24 69 6e 64 65 78 28 31 29 29 20  read($index(1)) 
bed0: 4a 6f 69 6e 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  Join..    }.... 
bee0: 20 20 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78     foreach index
bef0: 28 31 29 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  (1) [array names
bf00: 20 74 68 72 65 61 64 5d 20 7b 0d 0a 20 20 20 20   thread] {..    
bf10: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
bf20: 74 73 20 74 68 72 65 61 64 28 24 69 6e 64 65 78  ts thread($index
bf30: 28 31 29 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  (1))] && \..    
bf40: 20 20 20 20 20 20 5b 63 6c 65 61 6e 75 70 54 68        [cleanupTh
bf50: 72 65 61 64 20 24 74 68 72 65 61 64 28 24 69 6e  read $thread($in
bf60: 64 65 78 28 31 29 29 5d 7d 20 74 68 65 6e 20 7b  dex(1))]} then {
bf70: 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20  ..        unset 
bf80: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 68 72 65  -nocomplain thre
bf90: 61 64 28 24 69 6e 64 65 78 28 31 29 29 0d 0a 20  ad($index(1)).. 
bfa0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
bfb0: 0a 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f  .    unset -noco
bfc0: 6d 70 6c 61 69 6e 20 74 68 72 65 61 64 20 73 74  mplain thread st
bfd0: 61 74 75 73 3b 20 64 6f 6e 65 54 65 73 74 0d 0a  atus; doneTest..
bfe0: 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23    }....  #######
bff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c030: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 66 6f 72 65  ######....  fore
c040: 61 63 68 20 69 6e 64 65 78 28 30 29 20 5b 73 70  ach index(0) [sp
c050: 6c 69 74 20 24 69 6e 64 69 63 61 74 6f 72 73 20  lit $indicators 
c060: 22 22 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  ""] {..    #..  
c070: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
c080: 20 74 68 69 73 20 77 6f 72 6b 6c 6f 61 64 20 69   this workload i
c090: 74 65 72 61 74 69 6f 6e 20 72 61 69 73 65 64 20  teration raised 
c0a0: 61 6e 20 65 72 72 6f 72 2e 20 20 49 66 20 73 6f  an error.  If so
c0b0: 2c 20 74 68 65 0d 0a 20 20 20 20 23 20 20 20 20  , the..    #    
c0c0: 20 20 20 69 6e 64 69 63 61 74 6f 72 20 6c 65 74     indicator let
c0d0: 74 65 72 20 77 69 6c 6c 20 62 65 20 69 6e 20 6c  ter will be in l
c0e0: 6f 77 65 72 20 63 61 73 65 3b 20 6f 74 68 65 72  ower case; other
c0f0: 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 0d 0a 20  wise, it will.. 
c100: 20 20 20 23 20 20 20 20 20 20 20 62 65 20 69 6e     #       be in
c110: 20 75 70 70 65 72 20 63 61 73 65 2e 0d 0a 20 20   upper case...  
c120: 20 20 23 0d 0a 20 20 20 20 73 65 74 20 69 6e 64    #..    set ind
c130: 65 78 28 31 29 20 5b 73 74 72 69 6e 67 20 69 73  ex(1) [string is
c140: 20 75 70 70 65 72 20 2d 73 74 72 69 63 74 20 24   upper -strict $
c150: 69 6e 64 65 78 28 30 29 5d 0d 0a 0d 0a 20 20 20  index(0)]....   
c160: 20 73 65 74 20 69 6e 64 65 78 28 32 29 20 5b 65   set index(2) [e
c170: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6f 72 64  xpr {[string ord
c180: 69 6e 61 6c 20 24 69 6e 64 65 78 28 30 29 20 30  inal $index(0) 0
c190: 5d 20 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b  ] - \..        [
c1a0: 73 74 72 69 6e 67 20 6f 72 64 69 6e 61 6c 20 5b  string ordinal [
c1b0: 65 78 70 72 20 7b 24 69 6e 64 65 78 28 31 29 20  expr {$index(1) 
c1c0: 3f 20 22 41 22 20 3a 20 22 61 22 7d 5d 20 30 5d  ? "A" : "a"}] 0]
c1d0: 20 2b 20 31 7d 5d 0d 0a 0d 0a 20 20 20 20 73 65   + 1}]....    se
c1e0: 74 20 69 6e 64 65 78 28 33 29 20 5b 65 78 70 72  t index(3) [expr
c1f0: 20 7b 24 69 6e 64 65 78 28 31 29 20 3f 20 22 6f   {$index(1) ? "o
c200: 6b 22 20 3a 20 22 65 72 72 6f 72 22 7d 5d 0d 0a  k" : "error"}]..
c210: 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f  ..    if {![info
c220: 20 65 78 69 73 74 73 20 69 74 65 72 61 74 69 6f   exists iteratio
c230: 6e 73 28 24 69 6e 64 65 78 28 32 29 2c 24 69 6e  ns($index(2),$in
c240: 64 65 78 28 33 29 29 5d 7d 20 74 68 65 6e 20 7b  dex(3))]} then {
c250: 0d 0a 20 20 20 20 20 20 73 65 74 20 69 74 65 72  ..      set iter
c260: 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 28 32 29  ations($index(2)
c270: 2c 24 69 6e 64 65 78 28 33 29 29 20 30 0d 0a 20  ,$index(3)) 0.. 
c280: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b     }....    if {
c290: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 69 74  ![info exists it
c2a0: 65 72 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 28  erations($index(
c2b0: 32 29 2c 74 6f 74 61 6c 29 5d 7d 20 74 68 65 6e  2),total)]} then
c2c0: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 69 74   {..      set it
c2d0: 65 72 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 28  erations($index(
c2e0: 32 29 2c 74 6f 74 61 6c 29 20 30 0d 0a 20 20 20  2),total) 0..   
c2f0: 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 63 72 20 69   }....    incr i
c300: 74 65 72 61 74 69 6f 6e 73 28 24 69 6e 64 65 78  terations($index
c310: 28 32 29 2c 24 69 6e 64 65 78 28 33 29 29 0d 0a  (2),$index(3))..
c320: 20 20 20 20 69 6e 63 72 20 69 74 65 72 61 74 69      incr iterati
c330: 6f 6e 73 28 24 69 6e 64 65 78 28 32 29 2c 74 6f  ons($index(2),to
c340: 74 61 6c 29 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  tal)..  }....  #
c350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c360: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c370: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c390: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
c3a0: 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 41    #..  # NOTE: A
c3b0: 64 76 61 6e 63 65 20 6f 75 74 70 75 74 20 74 6f  dvance output to
c3c0: 20 74 68 65 20 6e 65 78 74 20 6c 69 6e 65 20 64   the next line d
c3d0: 75 65 20 74 6f 20 74 68 65 20 77 6f 72 6b 6c 6f  ue to the worklo
c3e0: 61 64 0d 0a 20 20 23 20 20 20 20 20 20 20 69 74  ad..  #       it
c3f0: 65 72 61 74 69 6f 6e 20 70 72 6f 67 72 65 73 73  eration progress
c400: 20 69 6e 64 69 63 61 74 6f 72 73 20 66 72 6f 6d   indicators from
c410: 20 74 68 65 20 66 69 6e 61 6c 20 72 75 6e 2e 0d   the final run..
c420: 0a 20 20 23 0d 0a 20 20 74 70 75 74 73 20 24 74  .  #..  tputs $t
c430: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 6e 0d 0a  est_channel \n..
c440: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
c450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c470: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c480: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c490: 23 0d 0a 0d 0a 20 20 66 6f 72 65 61 63 68 20 69  #....  foreach i
c4a0: 6e 64 65 78 28 30 29 20 5b 6c 73 6f 72 74 20 2d  ndex(0) [lsort -
c4b0: 69 6e 74 65 67 65 72 20 24 77 6f 72 6b 6c 6f 61  integer $workloa
c4c0: 64 4e 61 6d 65 73 28 65 6e 61 62 6c 65 64 29 5d  dNames(enabled)]
c4d0: 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 74   {..    tputs $t
c4e0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 66 6f 72  est_channel [for
c4f0: 6d 61 74 57 6f 72 6b 6c 6f 61 64 52 65 73 75 6c  matWorkloadResul
c500: 74 20 24 69 6e 64 65 78 28 30 29 5d 0d 0a 20 20  t $index(0)]..  
c510: 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  }....  #########
c520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c560: 23 23 23 23 0d 0a 0d 0a 20 20 66 6f 72 65 61 63  ####....  foreac
c570: 68 20 69 6e 64 65 78 28 30 29 20 5b 6c 73 6f 72  h index(0) [lsor
c580: 74 20 2d 69 6e 74 65 67 65 72 20 5b 61 72 72 61  t -integer [arra
c590: 79 20 6e 61 6d 65 73 20 74 69 6d 65 73 5d 5d 20  y names times]] 
c5a0: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 74 65  {..    tputs $te
c5b0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 66 6f 72 6d  st_channel [form
c5c0: 61 74 57 6f 72 6b 6c 6f 61 64 54 69 6d 65 20 24  atWorkloadTime $
c5d0: 69 6e 64 65 78 28 30 29 5d 0d 0a 20 20 7d 0d 0a  index(0)]..  }..
c5e0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
c5f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c600: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c610: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c620: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c630: 23 0d 0a 0d 0a 20 20 73 65 74 20 72 65 73 75 6c  #....  set resul
c640: 74 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d  t [sql execute -
c650: 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24  execute scalar $
c660: 73 72 63 44 62 20 22 50 52 41 47 4d 41 20 69 6e  srcDb "PRAGMA in
c670: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 22 5d  tegrity_check;"]
c680: 0d 0a 0d 0a 20 20 69 66 20 7b 24 72 65 73 75 6c  ....  if {$resul
c690: 74 20 65 71 20 22 6f 6b 22 7d 20 74 68 65 6e 20  t eq "ok"} then 
c6a0: 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 74 65  {..    tputs $te
c6b0: 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  st_channel "----
c6c0: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
c6d0: 20 6f 6b 20 28 73 72 63 44 62 29 5c 6e 22 0d 0a   ok (srcDb)\n"..
c6e0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
c6f0: 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67  error [appendArg
c700: 73 20 22 69 6e 74 65 67 72 69 74 79 20 63 68 65  s "integrity che
c710: 63 6b 20 66 61 69 6c 65 64 20 28 73 72 63 44 62  ck failed (srcDb
c720: 29 3a 20 22 20 24 72 65 73 75 6c 74 5d 0d 0a 20  ): " $result].. 
c730: 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23   }....  ########
c740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c750: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c780: 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 72  #####....  set r
c790: 65 73 75 6c 74 20 5b 73 71 6c 20 65 78 65 63 75  esult [sql execu
c7a0: 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c  te -execute scal
c7b0: 61 72 20 24 64 62 20 22 50 52 41 47 4d 41 20 69  ar $db "PRAGMA i
c7c0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 22  ntegrity_check;"
c7d0: 5d 0d 0a 0d 0a 20 20 69 66 20 7b 24 72 65 73 75  ]....  if {$resu
c7e0: 6c 74 20 65 71 20 22 6f 6b 22 7d 20 74 68 65 6e  lt eq "ok"} then
c7f0: 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 74   {..    tputs $t
c800: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  est_channel "---
c810: 2d 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  - integrity chec
c820: 6b 20 6f 6b 20 28 64 62 29 5c 6e 22 0d 0a 20 20  k ok (db)\n"..  
c830: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 65 72  } else {..    er
c840: 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ror [appendArgs 
c850: 22 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b  "integrity check
c860: 20 66 61 69 6c 65 64 20 28 64 62 29 3a 20 22 20   failed (db): " 
c870: 24 72 65 73 75 6c 74 5d 0d 0a 20 20 7d 0d 0a 0d  $result]..  }...
c880: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
c890: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c8a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c8b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c8c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c8d0: 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
c8e0: 45 3a 20 54 68 65 20 6f 76 65 72 61 6c 6c 20 74  E: The overall t
c8f0: 65 73 74 20 72 65 73 75 6c 74 20 69 73 20 74 68  est result is th
c900: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
c910: 66 20 66 61 69 6c 75 72 65 73 20 28 69 2e 65 2e  f failures (i.e.
c920: 0d 0a 20 20 23 20 20 20 20 20 20 20 22 75 6e 65  ..  #       "une
c930: 78 70 65 63 74 65 64 20 65 72 72 6f 72 73 22 29  xpected errors")
c940: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 64 75 72   encountered dur
c950: 69 6e 67 20 61 20 77 6f 72 6b 6c 6f 61 64 20 69  ing a workload i
c960: 74 65 72 61 74 69 6f 6e 2e 0d 0a 20 20 23 0d 0a  teration...  #..
c970: 20 20 65 78 70 72 20 7b 5b 61 72 72 61 79 20 73    expr {[array s
c980: 69 7a 65 20 66 61 69 6c 75 72 65 73 5d 20 3e 20  ize failures] > 
c990: 30 20 3f 20 5c 0d 0a 20 20 20 20 20 20 5b 65 78  0 ? \..      [ex
c9a0: 70 72 20 5b 6a 6f 69 6e 20 5b 61 72 72 61 79 20  pr [join [array 
c9b0: 76 61 6c 75 65 73 20 66 61 69 6c 75 72 65 73 5d  values failures]
c9c0: 20 2b 5d 5d 20 3a 20 30 7d 0d 0a 7d 20 2d 63 6c   +]] : 0}..} -cl
c9d0: 65 61 6e 75 70 20 7b 0d 0a 20 20 66 6f 72 65 61  eanup {..  forea
c9e0: 63 68 20 69 6e 64 65 78 28 30 29 20 5b 61 72 72  ch index(0) [arr
c9f0: 61 79 20 6e 61 6d 65 73 20 74 68 72 65 61 64 5d  ay names thread]
ca00: 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66   {..    if {[inf
ca10: 6f 20 65 78 69 73 74 73 20 74 68 72 65 61 64 28  o exists thread(
ca20: 24 69 6e 64 65 78 28 30 29 29 5d 20 26 26 20 5c  $index(0))] && \
ca30: 0d 0a 20 20 20 20 20 20 20 20 5b 63 6c 65 61 6e  ..        [clean
ca40: 75 70 54 68 72 65 61 64 20 24 74 68 72 65 61 64  upThread $thread
ca50: 28 24 69 6e 64 65 78 28 30 29 29 5d 7d 20 74 68  ($index(0))]} th
ca60: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 75 6e 73 65  en {..      unse
ca70: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 68  t -nocomplain th
ca80: 72 65 61 64 28 24 69 6e 64 65 78 28 30 29 29 0d  read($index(0)).
ca90: 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20  .    }..  }.... 
caa0: 20 72 65 6e 61 6d 65 20 66 72 65 65 4d 65 6d 20   rename freeMem 
cab0: 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 75 73 65  ""..  rename use
cac0: 4d 65 6d 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65  Mem ""..  rename
cad0: 20 61 6c 6c 6f 63 4d 65 6d 20 22 22 0d 0a 20 20   allocMem ""..  
cae0: 72 65 6e 61 6d 65 20 66 61 69 6c 54 65 73 74 20  rename failTest 
caf0: 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 64 6f 6e  ""..  rename don
cb00: 65 54 65 73 74 20 22 22 0d 0a 20 20 72 65 6e 61  eTest ""..  rena
cb10: 6d 65 20 73 68 6f 77 54 65 73 74 20 22 22 0d 0a  me showTest ""..
cb20: 20 20 72 65 6e 61 6d 65 20 77 61 69 74 54 65 73    rename waitTes
cb30: 74 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 64  t ""..  rename d
cb40: 65 6c 61 79 54 65 73 74 20 22 22 0d 0a 20 20 72  elayTest ""..  r
cb50: 65 6e 61 6d 65 20 69 6e 69 74 54 65 73 74 20 22  ename initTest "
cb60: 22 0d 0a 20 20 72 65 6e 61 6d 65 20 69 73 45 78  "..  rename isEx
cb70: 70 65 63 74 65 64 45 72 72 6f 72 20 22 22 0d 0a  pectedError ""..
cb80: 20 20 72 65 6e 61 6d 65 20 66 6f 72 6d 61 74 57    rename formatW
cb90: 6f 72 6b 6c 6f 61 64 54 69 6d 65 20 22 22 0d 0a  orkloadTime ""..
cba0: 20 20 72 65 6e 61 6d 65 20 66 6f 72 6d 61 74 57    rename formatW
cbb0: 6f 72 6b 6c 6f 61 64 52 65 73 75 6c 74 20 22 22  orkloadResult ""
cbc0: 0d 0a 20 20 72 65 6e 61 6d 65 20 73 65 74 75 70  ..  rename setup
cbd0: 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 22  WorkloadFileDb "
cbe0: 22 0d 0a 20 20 72 65 6e 61 6d 65 20 73 65 74 75  "..  rename setu
cbf0: 70 57 6f 72 6b 6c 6f 61 64 4d 65 6d 44 62 20 22  pWorkloadMemDb "
cc00: 22 0d 0a 0d 0a 20 20 63 61 74 63 68 20 7b 0d 0a  "....  catch {..
cc10: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
cc20: 45 3a 20 57 65 20 6d 75 73 74 20 63 6c 65 61 72  E: We must clear
cc30: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
cc40: 70 6f 6f 6c 20 6e 6f 77 20 62 65 63 61 75 73 65  pool now because
cc50: 20 77 65 20 69 6e 74 65 6e 64 0d 0a 20 20 20 20   we intend..    
cc60: 23 20 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74  #       to delet
cc70: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 73 20  e the databases 
cc80: 66 6f 72 20 74 68 69 73 20 74 65 73 74 2e 0d 0a  for this test...
cc90: 20 20 20 20 23 0d 0a 20 20 20 20 6f 62 6a 65 63      #..    objec
cca0: 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e  t invoke System.
ccb0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
ccc0: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 43 6c 65  teConnection Cle
ccd0: 61 72 41 6c 6c 50 6f 6f 6c 73 0d 0a 20 20 7d 0d  arAllPools..  }.
cce0: 0a 0d 0a 20 20 63 6c 65 61 6e 75 70 44 62 20 24  ...  cleanupDb $
ccf0: 66 69 6c 65 4e 61 6d 65 28 32 29 0d 0a 20 20 63  fileName(2)..  c
cd00: 6c 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61  leanupDb $fileNa
cd10: 6d 65 28 31 29 20 73 72 63 44 62 0d 0a 0d 0a 20  me(1) srcDb.... 
cd20: 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78 28 30   foreach index(0
cd30: 29 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 77  ) [array names w
cd40: 6f 72 6b 6c 6f 61 64 43 61 6c 6c 62 61 63 6b 73  orkloadCallbacks
cd50: 5d 20 7b 0d 0a 20 20 20 20 63 61 74 63 68 20 7b  ] {..    catch {
cd60: 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 72  ..      object r
cd70: 65 6d 6f 76 65 63 61 6c 6c 62 61 63 6b 20 24 77  emovecallback $w
cd80: 6f 72 6b 6c 6f 61 64 43 61 6c 6c 62 61 63 6b 73  orkloadCallbacks
cd90: 28 24 69 6e 64 65 78 28 30 29 29 0d 0a 20 20 20  ($index(0))..   
cda0: 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 66 72 65   }..  }....  fre
cdb0: 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d  eDbConnection...
cdc0: 0a 20 20 69 66 20 7b 21 24 6e 6f 54 72 61 63 65  .  if {!$noTrace
cdd0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 63 6c  } then {..    cl
cde0: 65 61 6e 75 70 4c 6f 67 67 69 6e 67 20 24 6c 6f  eanupLogging $lo
cdf0: 67 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 7d 0d 0a  gFileName..  }..
ce00: 0d 0a 20 20 72 65 6e 61 6d 65 20 63 6c 65 61 6e  ..  rename clean
ce10: 75 70 4c 6f 67 67 69 6e 67 20 22 22 0d 0a 20 20  upLogging ""..  
ce20: 72 65 6e 61 6d 65 20 73 65 74 75 70 4c 6f 67 67  rename setupLogg
ce30: 69 6e 67 20 22 22 0d 0a 0d 0a 20 20 75 6e 73 65  ing ""....  unse
ce40: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72 65  t -nocomplain re
ce50: 73 75 6c 74 20 74 68 72 65 61 64 20 69 6e 64 65  sult thread inde
ce60: 78 20 77 6f 72 6b 6c 6f 61 64 20 70 72 69 6f 72  x workload prior
ce70: 69 74 79 20 6e 6f 57 6f 72 6b 6c 6f 61 64 20 5c  ity noWorkload \
ce80: 0d 0a 20 20 20 20 20 20 70 72 69 6f 72 69 74 69  ..      prioriti
ce90: 65 73 20 73 72 63 44 62 20 64 62 20 66 69 6c 65  es srcDb db file
cea0: 4e 61 6d 65 20 63 6f 6d 70 69 6c 65 64 20 6f 70  Name compiled op
ceb0: 74 69 6f 6e 73 20 63 6f 75 6e 74 20 74 69 6d 65  tions count time
cec0: 73 20 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 5c 0d  s logFileName \.
ced0: 0a 20 20 20 20 20 20 6c 6f 67 4c 69 73 74 65 6e  .      logListen
cee0: 65 72 20 65 76 65 6e 74 20 74 69 6d 65 6f 75 74  er event timeout
cef0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 64 69   connection indi
cf00: 63 61 74 6f 72 73 20 69 74 65 72 61 74 69 6f 6e  cators iteration
cf10: 73 20 65 78 69 74 4f 6e 46 61 69 6c 20 5c 0d 0a  s exitOnFail \..
cf20: 20 20 20 20 20 20 63 6f 54 61 73 6b 4d 65 6d 20        coTaskMem 
cf30: 6e 6f 54 72 61 63 65 20 66 61 69 6c 75 72 65 73  noTrace failures
cf40: 20 73 74 61 74 75 73 20 77 6f 72 6b 6c 6f 61 64   status workload
cf50: 4e 61 6d 65 73 20 77 6f 72 6b 6c 6f 61 64 43 61  Names workloadCa
cf60: 6c 6c 62 61 63 6b 73 0d 0a 7d 20 2d 74 69 6d 65  llbacks..} -time
cf70: 20 74 72 75 65 20 2d 63 6f 6e 73 74 72 61 69 6e   true -constrain
cf80: 74 73 20 7b 65 61 67 6c 65 20 6d 6f 6e 6f 42 75  ts {eagle monoBu
cf90: 67 32 38 20 63 6f 6d 6d 61 6e 64 2e 73 71 6c 20  g28 command.sql 
cfa0: 63 6f 6d 70 69 6c 65 2e 44 41 54 41 20 53 51 4c  compile.DATA SQL
cfb0: 69 74 65 5c 0d 0a 53 79 73 74 65 6d 2e 44 61 74  ite\..System.Dat
cfc0: 61 2e 53 51 4c 69 74 65 20 63 6f 6d 70 69 6c 65  a.SQLite compile
cfd0: 43 53 68 61 72 70 7d 20 2d 72 65 73 75 6c 74 20  CSharp} -result 
cfe0: 7b 30 7d 7d 0d 0a 0d 0a 23 23 23 23 23 23 23 23  {0}}....########
cff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d030: 23 23 23 23 23 23 23 0d 0a 0d 0a 23 0d 0a 23 20  #######....#..# 
d040: 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 61 66 74  NOTE: Report aft
d050: 65 72 20 74 65 73 74 2e 0d 0a 23 0d 0a 63 68 65  er test...#..che
d060: 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
d070: 74 6f 72 69 65 73 20 24 74 65 73 74 5f 63 68 61  tories $test_cha
d080: 6e 6e 65 6c 0d 0a 67 65 74 53 51 4c 69 74 65 48  nnel..getSQLiteH
d090: 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24 74 65 73  andleCounts $tes
d0a0: 74 5f 63 68 61 6e 6e 65 6c 0d 0a 72 65 70 6f 72  t_channel..repor
d0b0: 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73  tSQLiteResources
d0c0: 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a   $test_channel..
d0d0: 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
d0e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d0f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d110: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d120: 23 0d 0a 0d 0a 72 75 6e 53 51 4c 69 74 65 54 65  #....runSQLiteTe
d130: 73 74 45 70 69 6c 6f 67 75 65 0d 0a 72 75 6e 54  stEpilogue..runT
d140: 65 73 74 45 70 69 6c 6f 67 75 65 0d 0a           estEpilogue..