System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact ed7202ec6aa599552da6e8906929671d2a5b3a7c:


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 62 61 73 65 20 65 78  ayTest { base ex
1410: 74 72 61 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20  tra } {..    if 
1420: 7b 24 62 61 73 65 20 3c 20 30 7d 20 74 68 65 6e  {$base < 0} then
1430: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 62 61   {..      set ba
1440: 73 65 20 31 30 30 30 0d 0a 20 20 20 20 7d 0d 0a  se 1000..    }..
1450: 20 20 20 20 69 66 20 7b 24 62 61 73 65 20 3e 20      if {$base > 
1460: 30 20 7c 7c 20 24 65 78 74 72 61 20 3e 20 30 7d  0 || $extra > 0}
1470: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 61   then {..      a
1480: 66 74 65 72 20 5b 65 78 70 72 20 7b 69 6e 74 28  fter [expr {int(
1490: 28 72 61 6e 64 28 29 20 2a 20 24 62 61 73 65 29  (rand() * $base)
14a0: 20 2b 20 24 65 78 74 72 61 29 7d 5d 0d 0a 20 20   + $extra)}]..  
14b0: 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23    }..  }....  ##
14c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1500: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
1510: 20 70 72 6f 63 20 77 61 69 74 54 65 73 74 20 7b   proc waitTest {
1520: 20 69 6e 64 69 63 61 74 6f 72 20 7d 20 7b 0d 0a   indicator } {..
1530: 20 20 20 20 69 66 20 7b 21 5b 24 3a 3a 65 76 65      if {![$::eve
1540: 6e 74 20 57 61 69 74 4f 6e 65 20 24 3a 3a 74 69  nt WaitOne $::ti
1550: 6d 65 6f 75 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  meout]} then {..
1560: 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70        error [app
1570: 65 6e 64 41 72 67 73 20 22 74 69 6d 65 6f 75 74  endArgs "timeout
1580: 20 77 68 69 6c 65 20 73 74 61 72 74 69 6e 67 20   while starting 
1590: 77 6f 72 6b 6c 6f 61 64 20 23 22 20 5c 0d 0a 20  workload #" \.. 
15a0: 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
15b0: 5b 73 74 72 69 6e 67 20 6f 72 64 69 6e 61 6c 20  [string ordinal 
15c0: 24 69 6e 64 69 63 61 74 6f 72 20 30 5d 20 2d 20  $indicator 0] - 
15d0: 5b 73 74 72 69 6e 67 20 6f 72 64 69 6e 61 6c 20  [string ordinal 
15e0: 41 20 30 5d 20 2b 20 31 7d 5d 5d 0d 0a 20 20 20  A 0] + 1}]]..   
15f0: 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23   }..  }....  ###
1600: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1610: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1620: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1630: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1640: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
1650: 70 72 6f 63 20 73 68 6f 77 54 65 73 74 20 7b 20  proc showTest { 
1660: 69 6e 64 69 63 61 74 6f 72 20 7d 20 7b 0d 0a 20  indicator } {.. 
1670: 20 20 20 73 68 6f 77 54 65 73 74 57 69 74 68 44     showTestWithD
1680: 65 6c 61 79 20 24 69 6e 64 69 63 61 74 6f 72 20  elay $indicator 
1690: 2d 31 20 24 3a 3a 63 6f 75 6e 74 28 32 29 0d 0a  -1 $::count(2)..
16a0: 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23    }....  #######
16b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16f0: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63  ######....  proc
1700: 20 73 68 6f 77 54 65 73 74 57 69 74 68 44 65 6c   showTestWithDel
1710: 61 79 20 7b 20 69 6e 64 69 63 61 74 6f 72 20 62  ay { indicator b
1720: 61 73 65 20 65 78 74 72 61 20 7d 20 7b 0d 0a 20  ase extra } {.. 
1730: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1740: 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 64 69 63 61  _channel $indica
1750: 74 6f 72 0d 0a 20 20 20 20 61 70 70 65 6e 64 20  tor..    append 
1760: 3a 3a 69 6e 64 69 63 61 74 6f 72 73 20 24 69 6e  ::indicators $in
1770: 64 69 63 61 74 6f 72 0d 0a 20 20 20 20 64 65 6c  dicator..    del
1780: 61 79 54 65 73 74 20 24 62 61 73 65 20 24 65 78  ayTest $base $ex
1790: 74 72 61 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23  tra..  }....  ##
17a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17e0: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
17f0: 20 70 72 6f 63 20 64 6f 6e 65 54 65 73 74 20 7b   proc doneTest {
1800: 20 7b 69 6e 64 69 63 61 74 6f 72 20 22 22 7d 20   {indicator ""} 
1810: 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74  } {..    if {[st
1820: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69 6e 64  ring length $ind
1830: 69 63 61 74 6f 72 5d 20 3e 20 30 7d 20 74 68 65  icator] > 0} the
1840: 6e 20 7b 0d 0a 20 20 20 20 20 20 6c 61 70 70 65  n {..      lappe
1850: 6e 64 20 3a 3a 73 74 61 74 75 73 28 64 6f 6e 65  nd ::status(done
1860: 29 20 24 69 6e 64 69 63 61 74 6f 72 0d 0a 20 20  ) $indicator..  
1870: 20 20 7d 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e    }..    if {[in
1880: 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 74 61 74  fo exists ::stat
1890: 75 73 28 64 6f 6e 65 29 5d 7d 20 74 68 65 6e 20  us(done)]} then 
18a0: 7b 0d 0a 20 20 20 20 20 20 68 6f 73 74 20 74 69  {..      host ti
18b0: 74 6c 65 20 24 3a 3a 73 74 61 74 75 73 28 64 6f  tle $::status(do
18c0: 6e 65 29 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ne)..    } else 
18d0: 7b 0d 0a 20 20 20 20 20 20 68 6f 73 74 20 74 69  {..      host ti
18e0: 74 6c 65 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 20  tle ""..    }.. 
18f0: 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23   }....  ########
1900: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1910: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1920: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1930: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1940: 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20  #####....  proc 
1950: 66 61 69 6c 54 65 73 74 20 7b 20 69 6e 64 69 63  failTest { indic
1960: 61 74 6f 72 20 65 72 72 6f 72 20 7d 20 7b 0d 0a  ator error } {..
1970: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
1980: 45 3a 20 48 61 6c 74 20 61 6c 6c 20 74 65 73 74  E: Halt all test
1990: 69 6e 67 20 61 6e 64 20 65 78 69 74 20 74 68 65  ing and exit the
19a0: 20 70 72 6f 63 65 73 73 20 6e 6f 77 0d 0a 20 20   process now..  
19b0: 20 20 23 20 20 20 20 20 20 20 2d 4f 52 2d 20 6a    #       -OR- j
19c0: 75 73 74 20 72 65 63 6f 72 64 20 74 68 65 20 66  ust record the f
19d0: 61 69 6c 75 72 65 20 61 6e 64 20 63 6f 6e 74 69  ailure and conti
19e0: 6e 75 65 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20  nue?..    #..   
19f0: 20 73 65 74 20 6c 65 76 65 6c 20 5b 65 78 70 72   set level [expr
1a00: 20 7b 5b 69 6e 66 6f 20 6c 65 76 65 6c 5d 20 2d   {[info level] -
1a10: 20 31 7d 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b   1}]....    if {
1a20: 24 3a 3a 65 78 69 74 4f 6e 46 61 69 6c 7d 20 74  $::exitOnFail} t
1a30: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  hen {..      tpu
1a40: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1a50: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1a60: 0d 0a 20 20 20 20 20 20 20 20 20 20 5c 6e 20 5b  ..          \n [
1a70: 69 6e 66 6f 20 6c 65 76 65 6c 20 24 6c 65 76 65  info level $leve
1a80: 6c 5d 20 22 3a 20 22 20 5c 6e 5c 74 20 24 65 72  l] ": " \n\t $er
1a90: 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ror \n]....     
1aa0: 20 65 78 69 74 20 66 61 69 6c 75 72 65 0d 0a 20   exit failure.. 
1ab0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1ac0: 20 20 20 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41     tlog [appendA
1ad0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1ae0: 20 22 5c 6e 2d 2d 2d 2d 20 42 45 47 49 4e 20 54   "\n---- BEGIN T
1af0: 45 53 54 20 46 41 49 4c 55 52 45 20 4f 55 54 50  EST FAILURE OUTP
1b00: 55 54 5c 6e 22 20 5c 0d 0a 20 20 20 20 20 20 20  UT\n" \..       
1b10: 20 20 20 5c 6e 20 5b 69 6e 66 6f 20 6c 65 76 65     \n [info leve
1b20: 6c 20 24 6c 65 76 65 6c 5d 20 22 3a 20 22 20 5c  l $level] ": " \
1b30: 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 20 5c 0d  n\t $error \n \.
1b40: 0a 20 20 20 20 20 20 20 20 20 20 22 5c 6e 2d 2d  .          "\n--
1b50: 2d 2d 20 45 4e 44 20 54 45 53 54 20 46 41 49 4c  -- END TEST FAIL
1b60: 55 52 45 20 4f 55 54 50 55 54 5c 6e 22 5d 0d 0a  URE OUTPUT\n"]..
1b70: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 3a  ..      tputs $:
1b80: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69  :test_channel $i
1b90: 6e 64 69 63 61 74 6f 72 0d 0a 0d 0a 20 20 20 20  ndicator....    
1ba0: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1bb0: 73 74 73 20 3a 3a 66 61 69 6c 75 72 65 73 28 24  sts ::failures($
1bc0: 69 6e 64 69 63 61 74 6f 72 29 5d 7d 20 74 68 65  indicator)]} the
1bd0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
1be0: 20 3a 3a 66 61 69 6c 75 72 65 73 28 24 69 6e 64   ::failures($ind
1bf0: 69 63 61 74 6f 72 29 20 30 0d 0a 20 20 20 20 20  icator) 0..     
1c00: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 6e 63 72   }....      incr
1c10: 20 3a 3a 66 61 69 6c 75 72 65 73 28 24 69 6e 64   ::failures($ind
1c20: 69 63 61 74 6f 72 29 0d 0a 20 20 20 20 20 20 64  icator)..      d
1c30: 65 6c 61 79 54 65 73 74 20 2d 31 20 24 3a 3a 63  elayTest -1 $::c
1c40: 6f 75 6e 74 28 32 29 0d 0a 20 20 20 20 7d 0d 0a  ount(2)..    }..
1c50: 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23    }....  #######
1c60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ca0: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63  ######....  proc
1cb0: 20 61 6c 6c 6f 63 4d 65 6d 20 7b 20 73 69 7a 65   allocMem { size
1cc0: 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 24 3a   } {..    if {$:
1cd0: 3a 63 6f 54 61 73 6b 4d 65 6d 7d 20 74 68 65 6e  :coTaskMem} then
1ce0: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
1cf0: 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1d00: 2d 63 72 65 61 74 65 20 5c 0d 0a 20 20 20 20 20  -create \..     
1d10: 20 20 20 20 20 53 79 73 74 65 6d 2e 52 75 6e 74       System.Runt
1d20: 69 6d 65 2e 49 6e 74 65 72 6f 70 53 65 72 76 69  ime.InteropServi
1d30: 63 65 73 2e 4d 61 72 73 68 61 6c 20 5c 0d 0a 20  ces.Marshal \.. 
1d40: 20 20 20 20 20 20 20 20 20 41 6c 6c 6f 63 43 6f           AllocCo
1d50: 54 61 73 6b 4d 65 6d 20 24 73 69 7a 65 5d 3b 20  TaskMem $size]; 
1d60: 23 20 74 68 72 6f 77 0d 0a 20 20 20 20 7d 20 65  # throw..    } e
1d70: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  lse {..      set
1d80: 20 70 74 72 20 5b 6f 62 6a 65 63 74 20 69 6e 76   ptr [object inv
1d90: 6f 6b 65 20 2d 63 72 65 61 74 65 20 2d 66 6c 61  oke -create -fla
1da0: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1db0: 0a 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65  .          Syste
1dc0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
1dd0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
1de0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  s \..          s
1df0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 24 73  qlite3_malloc $s
1e00: 69 7a 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ize]....      if
1e10: 20 7b 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65   {[object invoke
1e20: 20 24 70 74 72 20 54 6f 49 6e 74 36 34 5d 20 21   $ptr ToInt64] !
1e30: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1e40: 20 20 20 20 20 72 65 74 75 72 6e 20 24 70 74 72       return $ptr
1e50: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1e60: 0d 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72 20  ..        error 
1e70: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 73 71 6c  [appendArgs "sql
1e80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 22 20 24 73  ite3_malloc(" $s
1e90: 69 7a 65 20 22 29 20 66 61 69 6c 65 64 22 5d 0d  ize ") failed"].
1ea0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1eb0: 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23  .  }....  ######
1ec0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ed0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ee0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ef0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f00: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f  #######....  pro
1f10: 63 20 75 73 65 4d 65 6d 20 7b 20 70 74 72 20 73  c useMem { ptr s
1f20: 69 7a 65 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20  ize } {..    if 
1f30: 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20  {[isWindows] && 
1f40: 21 5b 69 73 4d 6f 6e 6f 5d 7d 20 74 68 65 6e 20  ![isMono]} then 
1f50: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1f60: 20 20 23 20 48 41 43 4b 3a 20 54 68 65 20 74 79    # HACK: The ty
1f70: 70 65 20 73 69 67 6e 61 74 75 72 65 20 6f 66 20  pe signature of 
1f80: 74 68 65 20 5a 65 72 6f 4d 65 6d 6f 72 79 20 6d  the ZeroMemory m
1f90: 65 74 68 6f 64 20 63 68 61 6e 67 65 64 20 61 73  ethod changed as
1fa0: 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23   of the..      #
1fb0: 20 20 20 20 20 20 20 2e 4e 45 54 20 46 72 61 6d         .NET Fram
1fc0: 65 77 6f 72 6b 20 34 2e 35 2e 20 20 54 68 65 20  ework 4.5.  The 
1fd0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1fe0: 77 65 6e 74 20 66 72 6f 6d 20 62 65 69 6e 67 20  went from being 
1ff0: 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
2000: 20 20 74 79 70 65 20 55 49 6e 74 20 74 6f 20 74    type UInt to t
2010: 79 70 65 20 55 49 6e 74 50 74 72 2e 0d 0a 20 20  ype UIntPtr...  
2020: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
2030: 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  {[haveConstraint
2040: 20 64 6f 74 4e 65 74 34 30 5d 20 26 26 20 5c 0d   dotNet40] && \.
2050: 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
2060: 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74 4e 65  Constraint dotNe
2070: 74 34 35 4f 72 48 69 67 68 65 72 5d 7d 20 74 68  t45OrHigher]} th
2080: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
2090: 74 20 6e 65 77 53 69 7a 65 20 5b 6f 62 6a 65 63  t newSize [objec
20a0: 74 20 63 72 65 61 74 65 20 55 49 6e 74 50 74 72  t create UIntPtr
20b0: 20 24 73 69 7a 65 5d 0d 0a 20 20 20 20 20 20 7d   $size]..      }
20c0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
20d0: 20 73 65 74 20 6e 65 77 53 69 7a 65 20 24 73 69   set newSize $si
20e0: 7a 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ze..      }.... 
20f0: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
2100: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
2110: 62 6c 69 63 20 4d 69 63 72 6f 73 6f 66 74 2e 57  blic Microsoft.W
2120: 69 6e 33 32 2e 57 69 6e 33 32 4e 61 74 69 76 65  in32.Win32Native
2130: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5a 65   \..          Ze
2140: 72 6f 4d 65 6d 6f 72 79 20 24 70 74 72 20 24 6e  roMemory $ptr $n
2150: 65 77 53 69 7a 65 0d 0a 20 20 20 20 7d 0d 0a 20  ewSize..    }.. 
2160: 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23   }....  ########
2170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21b0: 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20  #####....  proc 
21c0: 66 72 65 65 4d 65 6d 20 7b 20 70 74 72 20 7d 20  freeMem { ptr } 
21d0: 7b 0d 0a 20 20 20 20 69 66 20 7b 24 3a 3a 63 6f  {..    if {$::co
21e0: 54 61 73 6b 4d 65 6d 7d 20 74 68 65 6e 20 7b 0d  TaskMem} then {.
21f0: 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e  .      object in
2200: 76 6f 6b 65 20 53 79 73 74 65 6d 2e 52 75 6e 74  voke System.Runt
2210: 69 6d 65 2e 49 6e 74 65 72 6f 70 53 65 72 76 69  ime.InteropServi
2220: 63 65 73 2e 4d 61 72 73 68 61 6c 20 5c 0d 0a 20  ces.Marshal \.. 
2230: 20 20 20 20 20 20 20 20 20 46 72 65 65 43 6f 54           FreeCoT
2240: 61 73 6b 4d 65 6d 20 24 70 74 72 0d 0a 20 20 20  askMem $ptr..   
2250: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
2260: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
2270: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
2280: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79   \..          Sy
2290: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
22a0: 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
22b0: 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
22c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 24    sqlite3_free $
22d0: 70 74 72 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ptr..    }....  
22e0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
22f0: 20 46 72 65 65 20 65 78 74 72 61 20 6f 70 61 71   Free extra opaq
2300: 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
2310: 20 72 65 66 65 72 65 6e 63 65 20 61 64 64 65 64   reference added
2320: 20 62 79 20 74 68 65 0d 0a 20 20 20 20 23 20 20   by the..    #  
2330: 20 20 20 20 20 5b 72 65 74 75 72 6e 5d 20 63 6f       [return] co
2340: 6d 6d 61 6e 64 20 69 6e 20 5b 61 6c 6c 6f 63 4d  mmand in [allocM
2350: 65 6d 5d 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  em]...    #..   
2360: 20 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20   object dispose 
2370: 24 70 74 72 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  $ptr..  }....  #
2380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23c0: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
23d0: 20 20 70 72 6f 63 20 72 65 6c 65 61 73 65 4d 65    proc releaseMe
23e0: 6d 20 7b 20 73 69 7a 65 20 7d 20 7b 0d 0a 20 20  m { size } {..  
23f0: 20 20 73 65 74 20 6e 46 72 65 65 20 30 3b 20 73    set nFree 0; s
2400: 65 74 20 72 65 73 65 74 4f 6b 20 66 61 6c 73 65  et resetOk false
2410: 3b 20 73 65 74 20 6e 4c 61 72 67 65 73 74 20 30  ; set nLargest 0
2420: 0d 0a 0d 0a 20 20 20 20 73 65 74 20 63 6f 64 65  ....    set code
2430: 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
2440: 5c 0d 0a 20 20 20 20 20 20 20 20 53 79 73 74 65  \..        Syste
2450: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
2460: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 52  LiteConnection R
2470: 65 6c 65 61 73 65 4d 65 6d 6f 72 79 20 5c 0d 0a  eleaseMemory \..
2480: 20 20 20 20 20 20 20 20 24 73 69 7a 65 20 74 72          $size tr
2490: 75 65 20 74 72 75 65 20 6e 46 72 65 65 20 72 65  ue true nFree re
24a0: 73 65 74 4f 6b 20 6e 4c 61 72 67 65 73 74 5d 0d  setOk nLargest].
24b0: 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 6c  ...    return [l
24c0: 69 73 74 20 24 63 6f 64 65 20 24 6e 46 72 65 65  ist $code $nFree
24d0: 20 24 72 65 73 65 74 4f 6b 20 24 6e 4c 61 72 67   $resetOk $nLarg
24e0: 65 73 74 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  est]..  }....  #
24f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2500: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2530: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
2540: 20 20 70 72 6f 63 20 73 65 74 75 70 4c 6f 67 67    proc setupLogg
2550: 69 6e 67 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  ing { fileName }
2560: 20 7b 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e   {..    if {![in
2570: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6c 6f 67 4c  fo exists ::logL
2580: 69 73 74 65 6e 65 72 5d 7d 20 74 68 65 6e 20 7b  istener]} then {
2590: 0d 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6c 6f  ..      set ::lo
25a0: 67 4c 69 73 74 65 6e 65 72 20 5b 6f 62 6a 65 63  gListener [objec
25b0: 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20  t create -alias 
25c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79 73  \..          Sys
25d0: 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e  tem.Diagnostics.
25e0: 54 65 78 74 57 72 69 74 65 72 54 72 61 63 65 4c  TextWriterTraceL
25f0: 69 73 74 65 6e 65 72 20 24 66 69 6c 65 4e 61 6d  istener $fileNam
2600: 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  e]..    }....   
2610: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53   object invoke S
2620: 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63  ystem.Diagnostic
2630: 73 2e 54 72 61 63 65 2e 4c 69 73 74 65 6e 65 72  s.Trace.Listener
2640: 73 20 41 64 64 20 24 3a 3a 6c 6f 67 4c 69 73 74  s Add $::logList
2650: 65 6e 65 72 0d 0a 20 20 20 20 6f 62 6a 65 63 74  ener..    object
2660: 20 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44   invoke System.D
2670: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
2680: 65 4c 6f 67 20 49 6e 69 74 69 61 6c 69 7a 65 0d  eLog Initialize.
2690: 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24 3a 3a  ...    tputs $::
26a0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
26b0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
26c0: 20 20 20 20 22 2d 2d 2d 2d 20 65 6e 61 62 6c 65      "---- enable
26d0: 64 20 53 51 4c 69 74 65 20 74 72 61 63 65 20 6c  d SQLite trace l
26e0: 6f 67 67 69 6e 67 20 74 6f 20 66 69 6c 65 20 5c  ogging to file \
26f0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
2700: 6e 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23  n]..  }....  ###
2710: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2720: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2750: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
2760: 70 72 6f 63 20 63 6c 65 61 6e 75 70 4c 6f 67 67  proc cleanupLogg
2770: 69 6e 67 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  ing { fileName }
2780: 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66   {..    if {[inf
2790: 6f 20 65 78 69 73 74 73 20 3a 3a 6c 6f 67 4c 69  o exists ::logLi
27a0: 73 74 65 6e 65 72 5d 7d 20 74 68 65 6e 20 7b 0d  stener]} then {.
27b0: 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e  .      object in
27c0: 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44 69 61 67  voke System.Diag
27d0: 6e 6f 73 74 69 63 73 2e 54 72 61 63 65 2e 4c 69  nostics.Trace.Li
27e0: 73 74 65 6e 65 72 73 20 52 65 6d 6f 76 65 20 24  steners Remove $
27f0: 3a 3a 6c 6f 67 4c 69 73 74 65 6e 65 72 0d 0a 20  ::logListener.. 
2800: 20 20 20 20 20 24 3a 3a 6c 6f 67 4c 69 73 74 65       $::logListe
2810: 6e 65 72 20 43 6c 6f 73 65 0d 0a 20 20 20 20 7d  ner Close..    }
2820: 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23  ....    #..    #
2830: 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20   NOTE: Copy the 
2840: 74 72 61 63 65 20 6c 69 73 74 65 6e 65 72 20 6c  trace listener l
2850: 6f 67 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6d  og file to the m
2860: 61 69 6e 20 74 65 73 74 20 6c 6f 67 20 66 69 6c  ain test log fil
2870: 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 74  e...    #..    t
2880: 6c 6f 67 20 22 2d 2d 2d 2d 20 42 45 47 49 4e 20  log "---- BEGIN 
2890: 54 52 41 43 45 20 4c 49 53 54 45 4e 45 52 20 4f  TRACE LISTENER O
28a0: 55 54 50 55 54 5c 6e 22 0d 0a 20 20 20 20 74 6c  UTPUT\n"..    tl
28b0: 6f 67 20 5b 72 65 61 64 46 69 6c 65 20 24 66 69  og [readFile $fi
28c0: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 74 6c 6f  leName]..    tlo
28d0: 67 20 22 5c 6e 2d 2d 2d 2d 20 45 4e 44 20 54 52  g "\n---- END TR
28e0: 41 43 45 20 4c 49 53 54 45 4e 45 52 20 4f 55 54  ACE LISTENER OUT
28f0: 50 55 54 5c 6e 22 0d 0a 0d 0a 20 20 20 20 23 0d  PUT\n"....    #.
2900: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 6c  .    # NOTE: Del
2910: 65 74 65 20 74 68 65 20 74 72 61 63 65 20 6c 69  ete the trace li
2920: 73 74 65 6e 65 72 20 6c 6f 67 20 66 69 6c 65 20  stener log file 
2930: 62 65 63 61 75 73 65 20 69 74 73 20 63 6f 6e 74  because its cont
2940: 65 6e 74 73 20 68 61 76 65 0d 0a 20 20 20 20 23  ents have..    #
2950: 20 20 20 20 20 20 20 62 65 65 6e 20 63 6f 70 69         been copi
2960: 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74  ed to the main t
2970: 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20  est log file... 
2980: 20 20 20 23 0d 0a 20 20 20 20 63 6c 65 61 6e 75     #..    cleanu
2990: 70 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d  pFile $fileName.
29a0: 0a 0d 0a 20 20 20 20 74 70 75 74 73 20 24 3a 3a  ...    tputs $::
29b0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
29c0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
29d0: 20 20 20 20 22 2d 2d 2d 2d 20 64 69 73 61 62 6c      "---- disabl
29e0: 65 64 20 53 51 4c 69 74 65 20 74 72 61 63 65 20  ed SQLite trace 
29f0: 6c 6f 67 67 69 6e 67 20 74 6f 20 66 69 6c 65 20  logging to file 
2a00: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
2a10: 5c 6e 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23  \n]..  }....  ##
2a20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a60: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
2a70: 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 65   #..  # NOTE: Se
2a80: 74 75 70 20 74 68 65 20 64 65 66 61 75 6c 74 20  tup the default 
2a90: 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 74  values for the t
2aa0: 75 6e 61 62 6c 65 20 77 6f 72 6b 6c 6f 61 64 20  unable workload 
2ab0: 70 61 72 61 6d 65 74 65 72 73 2e 20 20 41 6e 79  parameters.  Any
2ac0: 2c 0d 0a 20 20 23 20 20 20 20 20 20 20 61 6c 6c  ,..  #       all
2ad0: 2c 20 6f 72 20 6e 6f 6e 65 20 6f 66 20 74 68 65  , or none of the
2ae0: 73 65 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  se may be overri
2af0: 64 65 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d  den via the comm
2b00: 61 6e 64 20 6c 69 6e 65 2e 0d 0a 20 20 23 0d 0a  and line...  #..
2b10: 20 20 73 65 74 20 63 6f 75 6e 74 28 30 29 20 33    set count(0) 3
2b20: 3b 20 20 20 20 20 20 20 20 20 23 20 57 6f 72 6b  ;         # Work
2b30: 6c 6f 61 64 20 72 65 70 65 61 74 20 63 6f 75 6e  load repeat coun
2b40: 74 20 28 69 2e 65 2e 20 74 6f 74 61 6c 20 66 75  t (i.e. total fu
2b50: 6c 6c 20 72 75 6e 73 29 2e 0d 0a 20 20 73 65 74  ll runs)...  set
2b60: 20 63 6f 75 6e 74 28 31 29 20 35 3b 20 20 20 20   count(1) 5;    
2b70: 20 20 20 20 20 23 20 57 6f 72 6b 6c 6f 61 64 20       # Workload 
2b80: 69 74 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 20  iteration count 
2b90: 28 77 69 74 68 69 6e 20 61 20 72 75 6e 29 2e 0d  (within a run)..
2ba0: 0a 20 20 73 65 74 20 63 6f 75 6e 74 28 32 29 20  .  set count(2) 
2bb0: 32 30 30 3b 20 20 20 20 20 20 20 23 20 57 6f 72  200;       # Wor
2bc0: 6b 6c 6f 61 64 20 69 74 65 72 61 74 69 6f 6e 20  kload iteration 
2bd0: 64 65 6c 61 79 20 28 6d 69 6c 6c 69 73 65 63 6f  delay (milliseco
2be0: 6e 64 73 29 2e 0d 0a 20 20 73 65 74 20 63 6f 75  nds)...  set cou
2bf0: 6e 74 28 33 29 20 35 37 3b 20 20 20 20 20 20 20  nt(3) 57;       
2c00: 20 23 20 57 6f 72 6b 6c 6f 61 64 20 22 73 6d 61   # Workload "sma
2c10: 6c 6c 22 20 64 61 74 61 20 63 68 75 6e 6b 20 73  ll" data chunk s
2c20: 69 7a 65 2c 20 69 6e 20 62 79 74 65 73 2e 0d 0a  ize, in bytes...
2c30: 20 20 73 65 74 20 63 6f 75 6e 74 28 34 29 20 31    set count(4) 1
2c40: 30 30 30 30 3b 20 20 20 20 20 23 20 57 6f 72 6b  0000;     # Work
2c50: 6c 6f 61 64 20 22 62 69 67 22 20 64 61 74 61 20  load "big" data 
2c60: 63 68 75 6e 6b 20 73 69 7a 65 2c 20 69 6e 20 62  chunk size, in b
2c70: 79 74 65 73 2e 0d 0a 20 20 73 65 74 20 63 6f 75  ytes...  set cou
2c80: 6e 74 28 35 29 20 32 30 39 37 31 35 32 30 30 3b  nt(5) 209715200;
2c90: 20 23 20 4d 61 78 69 6d 75 6d 20 68 65 61 70 20   # Maximum heap 
2ca0: 6d 65 6d 6f 72 79 20 74 6f 20 65 78 63 6c 75 64  memory to exclud
2cb0: 65 20 61 74 20 6f 6e 65 20 74 69 6d 65 2e 0d 0a  e at one time...
2cc0: 20 20 73 65 74 20 63 6f 75 6e 74 28 36 29 20 31    set count(6) 1
2cd0: 35 3b 20 20 20 20 20 20 20 20 23 20 57 6f 72 6b  5;        # Work
2ce0: 6c 6f 61 64 20 61 75 78 69 6c 69 61 72 79 20 69  load auxiliary i
2cf0: 74 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 20 28  teration count (
2d00: 77 69 74 68 69 6e 20 61 20 72 75 6e 29 2e 0d 0a  within a run)...
2d10: 20 20 73 65 74 20 63 6f 75 6e 74 28 37 29 20 31    set count(7) 1
2d20: 30 30 3b 20 20 20 20 20 20 20 23 20 57 6f 72 6b  00;       # Work
2d30: 6c 6f 61 64 20 61 75 78 69 6c 69 61 72 79 20 69  load auxiliary i
2d40: 74 65 72 61 74 69 6f 6e 20 64 65 6c 61 79 20 28  teration delay (
2d50: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 2e 0d 0a  milliseconds)...
2d60: 20 20 73 65 74 20 63 6f 75 6e 74 28 38 29 20 35    set count(8) 5
2d70: 30 30 30 3b 20 20 20 20 20 20 23 20 57 6f 72 6b  000;      # Work
2d80: 6c 6f 61 64 20 61 75 78 69 6c 69 61 72 79 20 64  load auxiliary d
2d90: 61 74 61 20 76 61 6c 75 65 20 28 66 6f 72 20 75  ata value (for u
2da0: 73 65 20 62 79 20 72 75 6e 29 2e 0d 0a 20 20 73  se by run)...  s
2db0: 65 74 20 6e 6f 57 6f 72 6b 6c 6f 61 64 20 5b 6c  et noWorkload [l
2dc0: 69 73 74 5d 3b 20 20 23 20 57 6f 72 6b 6c 6f 61  ist];  # Workloa
2dd0: 64 73 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64  ds to be omitted
2de0: 20 66 72 6f 6d 20 74 68 65 20 72 75 6e 2c 20 62   from the run, b
2df0: 79 20 69 6e 64 65 78 2e 0d 0a 20 20 73 65 74 20  y index...  set 
2e00: 70 72 69 6f 72 69 74 69 65 73 20 5b 6c 69 73 74  priorities [list
2e10: 5d 3b 20 20 23 20 44 69 63 74 69 6f 6e 61 72 79  ];  # Dictionary
2e20: 20 6f 66 20 77 6f 72 6b 6c 6f 61 64 20 74 68 72   of workload thr
2e30: 65 61 64 20 70 72 69 6f 72 69 74 69 65 73 2e 0d  ead priorities..
2e40: 0a 20 20 73 65 74 20 65 78 69 74 4f 6e 46 61 69  .  set exitOnFai
2e50: 6c 20 66 61 6c 73 65 3b 20 20 20 23 20 48 61 6c  l false;   # Hal
2e60: 74 20 74 65 73 74 69 6e 67 20 61 6e 64 20 65 78  t testing and ex
2e70: 69 74 20 70 72 6f 63 65 73 73 20 6f 6e 20 74 65  it process on te
2e80: 73 74 20 66 61 69 6c 75 72 65 3f 0d 0a 20 20 73  st failure?..  s
2e90: 65 74 20 63 6f 54 61 73 6b 4d 65 6d 20 74 72 75  et coTaskMem tru
2ea0: 65 3b 20 20 20 20 20 23 20 55 73 65 20 41 6c 6c  e;     # Use All
2eb0: 6f 63 43 6f 54 61 73 6b 4d 65 6d 2f 46 72 65 65  ocCoTaskMem/Free
2ec0: 43 6f 54 61 73 6b 4d 65 6d 20 66 6f 72 20 6d 65  CoTaskMem for me
2ed0: 6d 6f 72 79 3f 0d 0a 20 20 73 65 74 20 6e 6f 54  mory?..  set noT
2ee0: 72 61 63 65 20 66 61 6c 73 65 3b 20 20 20 20 20  race false;     
2ef0: 20 23 20 44 69 73 61 62 6c 65 20 53 51 4c 69 74   # Disable SQLit
2f00: 65 20 74 72 61 63 65 20 6c 6f 67 67 69 6e 67 20  e trace logging 
2f10: 74 6f 20 61 20 66 69 6c 65 3f 0d 0a 0d 0a 20 20  to a file?....  
2f20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2f30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2f40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2f50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2f60: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
2f70: 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20  .  #..  # NOTE: 
2f80: 49 66 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  If command line 
2f90: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
2fa0: 20 74 65 73 74 20 73 75 69 74 65 20 61 72 65 20   test suite are 
2fb0: 61 76 61 69 6c 61 62 6c 65 2c 20 70 72 6f 63 65  available, proce
2fc0: 73 73 0d 0a 20 20 23 20 20 20 20 20 20 20 74 68  ss..  #       th
2fd0: 65 6d 20 66 6f 72 20 61 6e 79 20 6f 70 74 69 6f  em for any optio
2fe0: 6e 73 20 74 68 61 74 20 61 72 65 20 61 70 70 6c  ns that are appl
2ff0: 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74  icable to this t
3000: 65 73 74 20 28 69 2e 65 2e 20 61 6e 79 20 6f 66  est (i.e. any of
3010: 0d 0a 20 20 23 20 20 20 20 20 20 20 74 68 65 20  ..  #       the 
3020: 74 75 6e 61 62 6c 65 20 77 6f 72 6b 6c 6f 61 64  tunable workload
3030: 20 70 61 72 61 6d 65 74 65 72 73 20 6c 69 73 74   parameters list
3040: 65 64 20 61 62 6f 76 65 29 2e 0d 0a 20 20 23 0d  ed above)...  #.
3050: 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  .  if {[info exi
3060: 73 74 73 20 61 72 67 76 5d 20 26 26 20 5b 6c 6c  sts argv] && [ll
3070: 65 6e 67 74 68 20 24 61 72 67 76 5d 20 3e 20 30  ength $argv] > 0
3080: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 70 61  } then {..    pa
3090: 72 73 65 20 6f 70 74 69 6f 6e 73 20 2d 66 6c 61  rse options -fla
30a0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 7b 2d  gs \..        {-
30b0: 53 74 6f 70 4f 6e 55 6e 6b 6e 6f 77 6e 4f 70 74  StopOnUnknownOpt
30c0: 69 6f 6e 20 2b 49 67 6e 6f 72 65 4f 6e 55 6e 6b  ion +IgnoreOnUnk
30d0: 6e 6f 77 6e 4f 70 74 69 6f 6e 20 53 6b 69 70 4f  nownOption SkipO
30e0: 6e 55 6e 6b 6e 6f 77 6e 4f 70 74 69 6f 6e 7d 20  nUnknownOption} 
30f0: 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c  -- \..        [l
3100: 69 73 74 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d  ist [list null M
3110: 75 73 74 48 61 76 65 49 6e 74 65 67 65 72 56 61  ustHaveIntegerVa
3120: 6c 75 65 20 2d 31 20 2d 31 20 2d 63 6f 75 6e 74  lue -1 -1 -count
3130: 30 20 24 63 6f 75 6e 74 28 30 29 5d 20 5c 0d 0a  0 $count(0)] \..
3140: 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75          [list nu
3150: 6c 6c 20 4d 75 73 74 48 61 76 65 49 6e 74 65 67  ll MustHaveInteg
3160: 65 72 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 63  erValue -1 -1 -c
3170: 6f 75 6e 74 31 20 24 63 6f 75 6e 74 28 31 29 5d  ount1 $count(1)]
3180: 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73   \..        [lis
3190: 74 20 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 49  t null MustHaveI
31a0: 6e 74 65 67 65 72 56 61 6c 75 65 20 2d 31 20 2d  ntegerValue -1 -
31b0: 31 20 2d 63 6f 75 6e 74 32 20 24 63 6f 75 6e 74  1 -count2 $count
31c0: 28 32 29 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  (2)] \..        
31d0: 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48  [list null MustH
31e0: 61 76 65 49 6e 74 65 67 65 72 56 61 6c 75 65 20  aveIntegerValue 
31f0: 2d 31 20 2d 31 20 2d 63 6f 75 6e 74 33 20 24 63  -1 -1 -count3 $c
3200: 6f 75 6e 74 28 33 29 5d 20 5c 0d 0a 20 20 20 20  ount(3)] \..    
3210: 20 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d      [list null M
3220: 75 73 74 48 61 76 65 49 6e 74 65 67 65 72 56 61  ustHaveIntegerVa
3230: 6c 75 65 20 2d 31 20 2d 31 20 2d 63 6f 75 6e 74  lue -1 -1 -count
3240: 34 20 24 63 6f 75 6e 74 28 34 29 5d 20 5c 0d 0a  4 $count(4)] \..
3250: 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75          [list nu
3260: 6c 6c 20 4d 75 73 74 48 61 76 65 49 6e 74 65 67  ll MustHaveInteg
3270: 65 72 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 63  erValue -1 -1 -c
3280: 6f 75 6e 74 35 20 24 63 6f 75 6e 74 28 35 29 5d  ount5 $count(5)]
3290: 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73   \..        [lis
32a0: 74 20 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 49  t null MustHaveI
32b0: 6e 74 65 67 65 72 56 61 6c 75 65 20 2d 31 20 2d  ntegerValue -1 -
32c0: 31 20 2d 63 6f 75 6e 74 36 20 24 63 6f 75 6e 74  1 -count6 $count
32d0: 28 36 29 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  (6)] \..        
32e0: 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48  [list null MustH
32f0: 61 76 65 49 6e 74 65 67 65 72 56 61 6c 75 65 20  aveIntegerValue 
3300: 2d 31 20 2d 31 20 2d 63 6f 75 6e 74 37 20 24 63  -1 -1 -count7 $c
3310: 6f 75 6e 74 28 37 29 5d 20 5c 0d 0a 20 20 20 20  ount(7)] \..    
3320: 20 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d      [list null M
3330: 75 73 74 48 61 76 65 49 6e 74 65 67 65 72 56 61  ustHaveIntegerVa
3340: 6c 75 65 20 2d 31 20 2d 31 20 2d 63 6f 75 6e 74  lue -1 -1 -count
3350: 38 20 24 63 6f 75 6e 74 28 38 29 5d 20 5c 0d 0a  8 $count(8)] \..
3360: 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75          [list nu
3370: 6c 6c 20 4d 75 73 74 48 61 76 65 4c 69 73 74 56  ll MustHaveListV
3380: 61 6c 75 65 20 2d 31 20 2d 31 20 2d 6e 6f 57 6f  alue -1 -1 -noWo
3390: 72 6b 6c 6f 61 64 20 24 6e 6f 57 6f 72 6b 6c 6f  rkload $noWorklo
33a0: 61 64 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b  ad] \..        [
33b0: 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48 61  list null MustHa
33c0: 76 65 4c 69 73 74 56 61 6c 75 65 20 2d 31 20 2d  veListValue -1 -
33d0: 31 20 2d 70 72 69 6f 72 69 74 69 65 73 20 24 70  1 -priorities $p
33e0: 72 69 6f 72 69 74 69 65 73 5d 20 5c 0d 0a 20 20  riorities] \..  
33f0: 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c        [list null
3400: 20 4d 75 73 74 48 61 76 65 42 6f 6f 6c 65 61 6e   MustHaveBoolean
3410: 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 65 78 69  Value -1 -1 -exi
3420: 74 4f 6e 46 61 69 6c 20 24 65 78 69 74 4f 6e 46  tOnFail $exitOnF
3430: 61 69 6c 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ail] \..        
3440: 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48  [list null MustH
3450: 61 76 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65 20  aveBooleanValue 
3460: 2d 31 20 2d 31 20 2d 63 6f 54 61 73 6b 4d 65 6d  -1 -1 -coTaskMem
3470: 20 24 63 6f 54 61 73 6b 4d 65 6d 5d 20 5c 0d 0a   $coTaskMem] \..
3480: 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75          [list nu
3490: 6c 6c 20 4d 75 73 74 48 61 76 65 42 6f 6f 6c 65  ll MustHaveBoole
34a0: 61 6e 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 6e  anValue -1 -1 -n
34b0: 6f 54 72 61 63 65 20 24 6e 6f 54 72 61 63 65 5d  oTrace $noTrace]
34c0: 5d 20 24 61 72 67 76 0d 0a 0d 0a 20 20 20 20 73  ] $argv....    s
34d0: 65 74 20 63 6f 75 6e 74 28 30 29 20 24 6f 70 74  et count(0) $opt
34e0: 69 6f 6e 73 28 2d 63 6f 75 6e 74 30 2c 76 61 6c  ions(-count0,val
34f0: 75 65 29 0d 0a 20 20 20 20 73 65 74 20 63 6f 75  ue)..    set cou
3500: 6e 74 28 31 29 20 24 6f 70 74 69 6f 6e 73 28 2d  nt(1) $options(-
3510: 63 6f 75 6e 74 31 2c 76 61 6c 75 65 29 0d 0a 20  count1,value).. 
3520: 20 20 20 73 65 74 20 63 6f 75 6e 74 28 32 29 20     set count(2) 
3530: 24 6f 70 74 69 6f 6e 73 28 2d 63 6f 75 6e 74 32  $options(-count2
3540: 2c 76 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74  ,value)..    set
3550: 20 63 6f 75 6e 74 28 33 29 20 24 6f 70 74 69 6f   count(3) $optio
3560: 6e 73 28 2d 63 6f 75 6e 74 33 2c 76 61 6c 75 65  ns(-count3,value
3570: 29 0d 0a 20 20 20 20 73 65 74 20 63 6f 75 6e 74  )..    set count
3580: 28 34 29 20 24 6f 70 74 69 6f 6e 73 28 2d 63 6f  (4) $options(-co
3590: 75 6e 74 34 2c 76 61 6c 75 65 29 0d 0a 20 20 20  unt4,value)..   
35a0: 20 73 65 74 20 63 6f 75 6e 74 28 35 29 20 24 6f   set count(5) $o
35b0: 70 74 69 6f 6e 73 28 2d 63 6f 75 6e 74 35 2c 76  ptions(-count5,v
35c0: 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74 20 63  alue)..    set c
35d0: 6f 75 6e 74 28 36 29 20 24 6f 70 74 69 6f 6e 73  ount(6) $options
35e0: 28 2d 63 6f 75 6e 74 36 2c 76 61 6c 75 65 29 0d  (-count6,value).
35f0: 0a 20 20 20 20 73 65 74 20 63 6f 75 6e 74 28 37  .    set count(7
3600: 29 20 24 6f 70 74 69 6f 6e 73 28 2d 63 6f 75 6e  ) $options(-coun
3610: 74 37 2c 76 61 6c 75 65 29 0d 0a 20 20 20 20 73  t7,value)..    s
3620: 65 74 20 63 6f 75 6e 74 28 38 29 20 24 6f 70 74  et count(8) $opt
3630: 69 6f 6e 73 28 2d 63 6f 75 6e 74 38 2c 76 61 6c  ions(-count8,val
3640: 75 65 29 0d 0a 20 20 20 20 73 65 74 20 6e 6f 57  ue)..    set noW
3650: 6f 72 6b 6c 6f 61 64 20 24 6f 70 74 69 6f 6e 73  orkload $options
3660: 28 2d 6e 6f 57 6f 72 6b 6c 6f 61 64 2c 76 61 6c  (-noWorkload,val
3670: 75 65 29 0d 0a 20 20 20 20 73 65 74 20 70 72 69  ue)..    set pri
3680: 6f 72 69 74 69 65 73 20 24 6f 70 74 69 6f 6e 73  orities $options
3690: 28 2d 70 72 69 6f 72 69 74 69 65 73 2c 76 61 6c  (-priorities,val
36a0: 75 65 29 0d 0a 20 20 20 20 73 65 74 20 65 78 69  ue)..    set exi
36b0: 74 4f 6e 46 61 69 6c 20 24 6f 70 74 69 6f 6e 73  tOnFail $options
36c0: 28 2d 65 78 69 74 4f 6e 46 61 69 6c 2c 76 61 6c  (-exitOnFail,val
36d0: 75 65 29 0d 0a 20 20 20 20 73 65 74 20 63 6f 54  ue)..    set coT
36e0: 61 73 6b 4d 65 6d 20 24 6f 70 74 69 6f 6e 73 28  askMem $options(
36f0: 2d 63 6f 54 61 73 6b 4d 65 6d 2c 76 61 6c 75 65  -coTaskMem,value
3700: 29 0d 0a 20 20 20 20 73 65 74 20 6e 6f 54 72 61  )..    set noTra
3710: 63 65 20 24 6f 70 74 69 6f 6e 73 28 2d 6e 6f 54  ce $options(-noT
3720: 72 61 63 65 2c 76 61 6c 75 65 29 0d 0a 20 20 7d  race,value)..  }
3730: 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23  ....  ##########
3740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3750: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3780: 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20  ###....  #..  # 
3790: 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f  NOTE: Load custo
37a0: 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f  m per-user and/o
37b0: 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  r per-host test 
37c0: 73 65 74 74 69 6e 67 73 2e 20 20 43 75 72 72 65  settings.  Curre
37d0: 6e 74 6c 79 2c 20 74 68 69 73 0d 0a 20 20 23 20  ntly, this..  # 
37e0: 20 20 20 20 20 20 69 73 20 64 6f 6e 65 20 61 66        is done af
37f0: 74 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74  ter processing t
3800: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
3810: 6f 70 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 65  options.  The se
3820: 74 74 69 6e 67 73 20 66 69 6c 65 0d 0a 20 20 23  ttings file..  #
3830: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 74 61         should ta
3840: 6b 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20  ke into account 
3850: 74 68 65 20 65 78 69 73 74 69 6e 67 20 77 6f 72  the existing wor
3860: 6b 6c 6f 61 64 20 70 61 72 61 6d 65 74 65 72 73  kload parameters
3870: 20 61 6e 64 20 61 76 6f 69 64 0d 0a 20 20 23 20   and avoid..  # 
3880: 20 20 20 20 20 20 63 68 61 6e 67 69 6e 67 20 61        changing a
3890: 6e 79 20 74 68 61 74 20 6d 61 79 20 68 61 76 65  ny that may have
38a0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 76   already been ov
38b0: 65 72 72 69 64 64 65 6e 2e 0d 0a 20 20 23 0d 0a  erridden...  #..
38c0: 20 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74    loadSQLiteTest
38d0: 53 65 74 74 69 6e 67 73 20 24 74 65 73 74 5f 63  Settings $test_c
38e0: 68 61 6e 6e 65 6c 20 2e 73 74 72 65 73 73 0d 0a  hannel .stress..
38f0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
3900: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3910: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3920: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3930: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3940: 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  #....  #..  # NO
3950: 54 45 3a 20 54 68 65 20 74 72 61 63 65 20 6c 69  TE: The trace li
3960: 73 74 65 6e 65 72 20 75 73 65 64 20 77 69 74 68  stener used with
3970: 20 74 68 65 20 53 51 4c 69 74 65 4c 6f 67 20 63   the SQLiteLog c
3980: 6c 61 73 73 20 74 6f 20 63 61 70 74 75 72 65 20  lass to capture 
3990: 6f 75 74 70 75 74 0d 0a 20 20 23 20 20 20 20 20  output..  #     
39a0: 20 20 66 72 6f 6d 20 74 68 65 20 63 6f 72 65 20    from the core 
39b0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 72  SQLite library r
39c0: 65 71 75 69 72 65 73 20 69 74 73 20 6f 77 6e 20  equires its own 
39d0: 6c 6f 67 20 66 69 6c 65 20 62 65 63 61 75 73 65  log file because
39e0: 20 74 68 65 0d 0a 20 20 23 20 20 20 20 20 20 20   the..  #       
39f0: 54 65 78 74 57 72 69 74 65 72 54 72 61 63 65 4c  TextWriterTraceL
3a00: 69 73 74 65 6e 65 72 20 63 6c 61 73 73 20 6f 70  istener class op
3a10: 65 6e 73 20 61 6e 64 20 6c 6f 63 6b 73 20 74 68  ens and locks th
3a20: 65 20 6c 6f 67 20 66 69 6c 65 20 69 74 20 75 73  e log file it us
3a30: 65 73 0d 0a 20 20 23 20 20 20 20 20 20 20 61 73  es..  #       as
3a40: 20 74 68 65 20 62 61 73 69 73 20 6f 66 20 74 68   the basis of th
3a50: 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 2e  e output stream.
3a60: 20 20 42 65 66 6f 72 65 20 74 68 69 73 20 74 65    Before this te
3a70: 73 74 20 69 73 20 63 6f 6d 70 6c 65 74 65 2c 0d  st is complete,.
3a80: 0a 20 20 23 20 20 20 20 20 20 20 74 68 65 20 65  .  #       the e
3a90: 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
3aa0: 66 20 74 68 69 73 20 74 72 61 63 65 20 6c 6f 67  f this trace log
3ab0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 63 6f   file will be co
3ac0: 70 69 65 64 20 69 6e 74 6f 20 74 68 65 0d 0a 20  pied into the.. 
3ad0: 20 23 20 20 20 20 20 20 20 6d 61 69 6e 20 74 65   #       main te
3ae0: 73 74 20 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20  st log file and 
3af0: 74 68 65 6e 20 64 65 6c 65 74 65 64 2e 0d 0a 20  then deleted... 
3b00: 20 23 0d 0a 20 20 69 66 20 7b 21 24 6e 6f 54 72   #..  if {!$noTr
3b10: 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ace} then {..   
3b20: 20 73 65 74 20 6c 6f 67 46 69 6c 65 4e 61 6d 65   set logFileName
3b30: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69   [appendArgs [fi
3b40: 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 74 65 73  le rootname $tes
3b50: 74 5f 6c 6f 67 5d 20 2e 74 72 61 63 65 2e 6c 6f  t_log] .trace.lo
3b60: 67 5d 0d 0a 20 20 20 20 73 65 74 75 70 4c 6f 67  g]..    setupLog
3b70: 67 69 6e 67 20 24 6c 6f 67 46 69 6c 65 4e 61 6d  ging $logFileNam
3b80: 65 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23  e..  }....  ####
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 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3bd0: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23  #########....  #
3be0: 0d 0a 20 20 23 20 48 41 43 4b 3a 20 4d 61 6b 65  ..  # HACK: Make
3bf0: 20 73 75 72 65 20 74 68 65 20 65 66 66 65 63 74   sure the effect
3c00: 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ive connection f
3c10: 6c 61 67 73 20 66 6f 72 20 74 68 69 73 20 74 65  lags for this te
3c20: 73 74 20 61 72 65 20 6c 6f 67 67 65 64 2e 0d 0a  st are logged...
3c30: 20 20 23 0d 0a 20 20 67 65 74 43 6f 6e 6e 65 63    #..  getConnec
3c40: 74 69 6f 6e 46 6c 61 67 73 20 22 73 74 72 65 73  tionFlags "stres
3c50: 73 20 74 65 73 74 22 20 22 22 20 66 61 6c 73 65  s test" "" false
3c60: 3b 20 23 20 49 47 4e 4f 52 45 44 0d 0a 0d 0a 20  ; # IGNORED.... 
3c70: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
3c80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3c90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ca0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3cb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
3cc0: 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
3cd0: 20 49 6e 20 73 68 61 72 65 64 2d 63 61 63 68 65   In shared-cache
3ce0: 20 6d 6f 64 65 2c 20 73 6b 69 70 20 74 68 65 20   mode, skip the 
3cf0: 62 61 63 6b 75 70 20 74 65 73 74 73 2e 20 20 54  backup tests.  T
3d00: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
3d10: 69 62 72 61 72 79 0d 0a 20 20 23 20 20 20 20 20  ibrary..  #     
3d20: 20 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20    documentation 
3d30: 73 74 61 74 65 73 3a 0d 0a 20 20 23 0d 0a 20 20  states:..  #..  
3d40: 23 20 20 20 20 20 20 20 22 49 66 20 72 75 6e 6e  #       "If runn
3d50: 69 6e 67 20 69 6e 20 73 68 61 72 65 64 20 63 61  ing in shared ca
3d60: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 20 61 70  che mode, the ap
3d70: 70 6c 69 63 61 74 69 6f 6e 20 6d 75 73 74 20 67  plication must g
3d80: 75 61 72 61 6e 74 65 65 0d 0a 20 20 23 20 20 20  uarantee..  #   
3d90: 20 20 20 20 20 74 68 61 74 20 74 68 65 20 73 68       that the sh
3da0: 61 72 65 64 20 63 61 63 68 65 20 75 73 65 64 20  ared cache used 
3db0: 62 79 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  by the destinati
3dc0: 6f 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  on database is n
3dd0: 6f 74 0d 0a 20 20 23 20 20 20 20 20 20 20 20 61  ot..  #        a
3de0: 63 63 65 73 73 65 64 20 77 68 69 6c 65 20 74 68  ccessed while th
3df0: 65 20 62 61 63 6b 75 70 20 69 73 20 72 75 6e 6e  e backup is runn
3e00: 69 6e 67 2e 20 49 6e 20 70 72 61 63 74 69 63 65  ing. In practice
3e10: 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   this means that
3e20: 0d 0a 20 20 23 20 20 20 20 20 20 20 20 74 68 65  ..  #        the
3e30: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6d 75 73   application mus
3e40: 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
3e50: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 62   the disk file b
3e60: 65 69 6e 67 20 62 61 63 6b 65 64 20 75 70 0d 0a  eing backed up..
3e70: 20 20 23 20 20 20 20 20 20 20 20 74 6f 20 69 73    #        to is
3e80: 20 6e 6f 74 20 61 63 63 65 73 73 65 64 20 62 79   not accessed by
3e90: 20 61 6e 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   any connection 
3ea0: 77 69 74 68 69 6e 20 74 68 65 20 70 72 6f 63 65  within the proce
3eb0: 73 73 2c 20 6e 6f 74 20 6a 75 73 74 0d 0a 20 20  ss, not just..  
3ec0: 23 20 20 20 20 20 20 20 20 74 68 65 20 73 70 65  #        the spe
3ed0: 63 69 66 69 63 20 63 6f 6e 6e 65 63 74 69 6f 6e  cific connection
3ee0: 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64   that was passed
3ef0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   to sqlite3_back
3f00: 75 70 5f 69 6e 69 74 28 29 2e 22 0d 0a 20 20 23  up_init()."..  #
3f10: 0d 0a 20 20 23 20 20 20 20 20 20 20 54 68 65 20  ..  #       The 
3f20: 6f 6e 6c 79 20 72 65 61 73 6f 6e 61 62 6c 65 20  only reasonable 
3f30: 77 61 79 20 74 68 61 74 20 74 68 69 73 20 74 65  way that this te
3f40: 73 74 20 63 61 6e 20 67 75 61 72 61 6e 74 65 65  st can guarantee
3f50: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 0d   this condition.
3f60: 0a 20 20 23 20 20 20 20 20 20 20 69 73 20 74 6f  .  #       is to
3f70: 20 64 69 73 61 62 6c 65 20 74 68 65 20 62 61 63   disable the bac
3f80: 6b 75 70 20 74 65 73 74 73 20 77 68 65 6e 20 73  kup tests when s
3f90: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
3fa0: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 0d 0a   is being used..
3fb0: 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 65    #       for te
3fc0: 73 74 69 6e 67 2e 0d 0a 20 20 23 0d 0a 20 20 69  sting...  #..  i
3fd0: 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  f {[hasRuntimeOp
3fe0: 74 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68 65  tion sharedCache
3ff0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 6c  ]} then {..    l
4000: 61 70 70 65 6e 64 20 6e 6f 57 6f 72 6b 6c 6f 61  append noWorkloa
4010: 64 20 31 32 20 31 33 3b 20 23 20 54 4f 44 4f 3a  d 12 13; # TODO:
4020: 20 55 70 64 61 74 65 20 69 66 20 74 68 65 20 77   Update if the w
4030: 6f 72 6b 6c 6f 61 64 20 6e 75 6d 62 65 72 73 20  orkload numbers 
4040: 63 68 61 6e 67 65 2e 0d 0a 20 20 7d 0d 0a 0d 0a  change...  }....
4050: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
4060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4070: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4080: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4090: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
40a0: 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74  ...  tputs $test
40b0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
40c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d  Args \..      "-
40d0: 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20 77 69  --- workloads wi
40e0: 6c 6c 20 72 65 70 65 61 74 20 22 20 24 63 6f 75  ll repeat " $cou
40f0: 6e 74 28 30 29 20 22 20 74 69 6d 65 28 73 29 5c  nt(0) " time(s)\
4100: 6e 22 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24  n"]....  tputs $
4110: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
4120: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
4130: 20 20 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64    "---- workload
4140: 73 20 77 69 6c 6c 20 68 61 76 65 20 22 20 24 63  s will have " $c
4150: 6f 75 6e 74 28 31 29 20 22 20 69 74 65 72 61 74  ount(1) " iterat
4160: 69 6f 6e 28 73 29 5c 6e 22 5d 0d 0a 0d 0a 20 20  ion(s)\n"]....  
4170: 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e  tputs $test_chan
4180: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
4190: 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77  \..      "---- w
41a0: 6f 72 6b 6c 6f 61 64 73 20 77 69 6c 6c 20 77 61  orkloads will wa
41b0: 69 74 20 61 74 20 6c 65 61 73 74 20 22 20 24 63  it at least " $c
41c0: 6f 75 6e 74 28 32 29 20 5c 0d 0a 20 20 20 20 20  ount(2) \..     
41d0: 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 28 73   " millisecond(s
41e0: 29 20 61 66 74 65 72 20 65 61 63 68 20 69 74 65  ) after each ite
41f0: 72 61 74 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20  ration\n"]....  
4200: 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e  tputs $test_chan
4210: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
4220: 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73  \..      "---- s
4230: 6d 61 6c 6c 20 63 68 75 6e 6b 20 73 69 7a 65 20  mall chunk size 
4240: 69 73 20 22 20 24 63 6f 75 6e 74 28 33 29 20 22  is " $count(3) "
4250: 20 62 79 74 65 28 73 29 5c 6e 22 5d 0d 0a 0d 0a   byte(s)\n"]....
4260: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
4270: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
4280: 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d  s \..      "----
4290: 20 62 69 67 20 63 68 75 6e 6b 20 73 69 7a 65 20   big chunk size 
42a0: 69 73 20 22 20 24 63 6f 75 6e 74 28 34 29 20 22  is " $count(4) "
42b0: 20 62 79 74 65 28 73 29 5c 6e 22 5d 0d 0a 0d 0a   byte(s)\n"]....
42c0: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
42d0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
42e0: 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d  s \..      "----
42f0: 20 6d 61 78 69 6d 75 6d 20 65 78 63 6c 75 64 65   maximum exclude
4300: 64 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 69 73  d heap memory is
4310: 20 22 20 24 63 6f 75 6e 74 28 35 29 20 22 20 62   " $count(5) " b
4320: 79 74 65 28 73 29 5c 6e 22 5d 0d 0a 0d 0a 20 20  yte(s)\n"]....  
4330: 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e  tputs $test_chan
4340: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
4350: 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77  \..      "---- w
4360: 6f 72 6b 6c 6f 61 64 73 20 77 69 6c 6c 20 68 61  orkloads will ha
4370: 76 65 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  ve an auxiliary 
4380: 69 74 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 20  iteration count 
4390: 6f 66 20 22 20 5c 0d 0a 20 20 20 20 20 20 24 63  of " \..      $c
43a0: 6f 75 6e 74 28 36 29 20 5c 6e 5d 0d 0a 0d 0a 20  ount(6) \n].... 
43b0: 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61   tputs $test_cha
43c0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
43d0: 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20   \..      "---- 
43e0: 77 6f 72 6b 6c 6f 61 64 73 20 77 69 6c 6c 20 68  workloads will h
43f0: 61 76 65 20 61 6e 20 61 75 78 69 6c 69 61 72 79  ave an auxiliary
4400: 20 69 74 65 72 61 74 69 6f 6e 20 64 65 6c 61 79   iteration delay
4410: 20 6f 66 20 22 20 5c 0d 0a 20 20 20 20 20 20 24   of " \..      $
4420: 63 6f 75 6e 74 28 37 29 20 22 20 6d 69 6c 6c 69  count(7) " milli
4430: 73 65 63 6f 6e 64 28 73 29 5c 6e 22 5d 0d 0a 0d  second(s)\n"]...
4440: 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63  .  tputs $test_c
4450: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
4460: 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d  gs \..      "---
4470: 2d 20 77 6f 72 6b 6c 6f 61 64 73 20 77 69 6c 6c  - workloads will
4480: 20 68 61 76 65 20 61 6e 20 61 75 78 69 6c 69 61   have an auxilia
4490: 72 79 20 64 61 74 61 20 76 61 6c 75 65 20 6f 66  ry data value of
44a0: 20 22 20 5c 0d 0a 20 20 20 20 20 20 24 63 6f 75   " \..      $cou
44b0: 6e 74 28 38 29 20 5c 6e 5d 0d 0a 0d 0a 20 20 74  nt(8) \n]....  t
44c0: 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e  puts $test_chann
44d0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
44e0: 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77 6f  ..      "---- wo
44f0: 72 6b 6c 6f 61 64 73 20 74 6f 20 62 65 20 73 6b  rkloads to be sk
4500: 69 70 70 65 64 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ipped... " \..  
4510: 20 20 20 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e      [expr {[llen
4520: 67 74 68 20 24 6e 6f 57 6f 72 6b 6c 6f 61 64 5d  gth $noWorkload]
4530: 20 3e 20 30 20 3f 20 24 6e 6f 57 6f 72 6b 6c 6f   > 0 ? $noWorklo
4540: 61 64 20 3a 20 22 6e 6f 6e 65 22 7d 5d 20 5c 6e  ad : "none"}] \n
4550: 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65  ]....  tputs $te
4560: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
4570: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
4580: 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20  "---- workloads 
4590: 70 72 69 6f 72 69 74 79 20 6f 76 65 72 72 69 64  priority overrid
45a0: 65 73 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  es... " \..     
45b0: 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68   [expr {[llength
45c0: 20 24 70 72 69 6f 72 69 74 69 65 73 5d 20 3e 20   $priorities] > 
45d0: 30 20 3f 20 24 70 72 69 6f 72 69 74 69 65 73 20  0 ? $priorities 
45e0: 3a 20 22 6e 6f 6e 65 22 7d 5d 20 5c 6e 5d 0d 0a  : "none"}] \n]..
45f0: 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f  ..  tputs $test_
4600: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
4610: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d  rgs \..      "--
4620: 2d 2d 20 75 6e 65 78 70 65 63 74 65 64 20 65 72  -- unexpected er
4630: 72 6f 72 73 20 22 20 5c 0d 0a 20 20 20 20 20 20  rors " \..      
4640: 5b 65 78 70 72 20 7b 24 65 78 69 74 4f 6e 46 61  [expr {$exitOnFa
4650: 69 6c 20 3f 20 22 77 69 6c 6c 22 20 3a 20 22 77  il ? "will" : "w
4660: 69 6c 6c 20 6e 6f 74 22 7d 5d 20 5c 0d 0a 20 20  ill not"}] \..  
4670: 20 20 20 20 22 20 68 61 6c 74 20 74 65 73 74 69      " halt testi
4680: 6e 67 20 61 6e 64 20 65 78 69 74 20 74 68 65 20  ng and exit the 
4690: 70 72 6f 63 65 73 73 5c 6e 22 5d 0d 0a 0d 0a 20  process\n"].... 
46a0: 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61   tputs $test_cha
46b0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
46c0: 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20   \..      "---- 
46d0: 74 68 65 20 22 20 5b 65 78 70 72 20 7b 24 63 6f  the " [expr {$co
46e0: 54 61 73 6b 4d 65 6d 20 3f 20 22 43 6f 54 61 73  TaskMem ? "CoTas
46f0: 6b 4d 65 6d 22 20 3a 20 22 53 51 4c 69 74 65 22  kMem" : "SQLite"
4700: 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 22 20 61 6c  }] \..      " al
4710: 6c 6f 63 61 74 6f 72 20 77 69 6c 6c 20 62 65 20  locator will be 
4720: 75 73 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20  used to exclude 
4730: 68 65 61 70 20 6d 65 6d 6f 72 79 5c 6e 22 5d 0d  heap memory\n"].
4740: 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74  ...  tputs $test
4750: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
4760: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d  Args \..      "-
4770: 2d 2d 2d 20 74 72 61 63 65 20 6c 6f 67 67 69 6e  --- trace loggin
4780: 67 20 74 6f 20 61 20 66 69 6c 65 20 69 73 20 22  g to a file is "
4790: 20 5c 0d 0a 20 20 20 20 20 20 5b 65 78 70 72 20   \..      [expr 
47a0: 7b 24 6e 6f 54 72 61 63 65 20 3f 20 22 64 69 73  {$noTrace ? "dis
47b0: 61 62 6c 65 64 22 20 3a 20 22 65 6e 61 62 6c 65  abled" : "enable
47c0: 64 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 23 23  d"}] \n]....  ##
47d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
47e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
47f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4800: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4810: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
4820: 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 43 72   #..  # NOTE: Cr
4830: 65 61 74 65 20 74 68 65 20 77 6f 72 6b 6c 6f 61  eate the workloa
4840: 64 20 70 72 69 6f 72 69 74 79 20 61 72 72 61 79  d priority array
4850: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70 72   based on the pr
4860: 69 6f 72 69 74 79 20 6c 69 73 74 20 73 65 65 6e  iority list seen
4870: 0d 0a 20 20 23 20 20 20 20 20 20 20 6f 6e 20 74  ..  #       on t
4880: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
4890: 20 69 66 20 61 6e 79 2e 0d 0a 20 20 23 0d 0a 20   if any...  #.. 
48a0: 20 61 72 72 61 79 20 73 65 74 20 70 72 69 6f 72   array set prior
48b0: 69 74 79 20 24 70 72 69 6f 72 69 74 69 65 73 0d  ity $priorities.
48c0: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
48d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
48e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
48f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4900: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4910: 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e  ##....  #..  # N
4920: 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 73 20 23  OTE: Workloads #
4930: 31 32 20 61 6e 64 20 23 31 33 20 63 6f 6e 74 61  12 and #13 conta
4940: 69 6e 20 43 23 20 63 6f 64 65 20 74 68 61 74 20  in C# code that 
4950: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 69 6c  should be compil
4960: 65 64 2c 20 62 75 74 0d 0a 20 20 23 20 20 20 20  ed, but..  #    
4970: 20 20 20 6f 6e 6c 79 20 6f 6e 63 65 2e 20 20 54     only once.  T
4980: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 6b  hese variables k
4990: 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 61  eep track of tha
49a0: 74 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  t state informat
49b0: 69 6f 6e 2e 0d 0a 20 20 23 20 20 20 20 20 20 20  ion...  #       
49c0: 41 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  An integer value
49d0: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   in one of these
49e0: 20 76 61 72 69 61 62 6c 65 73 20 6d 65 61 6e 73   variables means
49f0: 20 74 68 65 20 63 6f 6d 70 69 6c 61 74 69 6f 6e   the compilation
4a00: 20 77 61 73 0d 0a 20 20 23 20 20 20 20 20 20 20   was..  #       
4a10: 63 6f 6d 70 6c 65 74 65 64 20 61 6e 64 20 74 68  completed and th
4a20: 65 20 72 65 73 75 6c 74 69 6e 67 20 63 6f 6d 70  e resulting comp
4a30: 69 6c 65 64 20 6d 65 74 68 6f 64 20 6d 61 79 20  iled method may 
4a40: 62 65 20 69 6e 76 6f 6b 65 64 20 75 73 69 6e 67  be invoked using
4a50: 20 74 68 65 0d 0a 20 20 23 20 20 20 20 20 20 20   the..  #       
4a60: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e  following comman
4a70: 64 20 28 77 68 65 72 65 20 24 7b 69 64 7d 20 69  d (where ${id} i
4a80: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
4a90: 68 65 20 76 61 72 69 61 62 6c 65 29 3a 0d 0a 20  he variable):.. 
4aa0: 20 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20   #..  #         
4ab0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
4ac0: 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54 65  _Dynamic${id}.Te
4ad0: 73 74 24 7b 69 64 7d 20 42 61 63 6b 75 70 41 6e  st${id} BackupAn
4ae0: 64 47 65 74 44 61 74 61 0d 0a 20 20 23 0d 0a 20  dGetData..  #.. 
4af0: 20 73 65 74 20 63 6f 6d 70 69 6c 65 64 28 31 32   set compiled(12
4b00: 29 20 22 22 0d 0a 20 20 73 65 74 20 63 6f 6d 70  ) ""..  set comp
4b10: 69 6c 65 64 28 31 33 29 20 22 22 0d 0a 0d 0a 20  iled(13) "".... 
4b20: 20 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 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
4b70: 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
4b80: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   This is an in-m
4b90: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 77  emory database w
4ba0: 69 74 68 20 73 68 61 72 65 64 20 63 61 63 68 65  ith shared cache
4bb0: 20 65 6e 61 62 6c 65 64 2e 0d 0a 20 20 23 0d 0a   enabled...  #..
4bc0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 31    set fileName(1
4bd0: 29 20 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 3f  ) file::memory:?
4be0: 63 61 63 68 65 3d 73 68 61 72 65 64 0d 0a 0d 0a  cache=shared....
4bf0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
4c00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4c10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4c20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4c30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
4c40: 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
4c50: 3a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 72 6d  : This is a norm
4c60: 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61 62  al on-disk datab
4c70: 61 73 65 2e 0d 0a 20 20 23 0d 0a 20 20 73 65 74  ase...  #..  set
4c80: 20 66 69 6c 65 4e 61 6d 65 28 32 29 20 5b 66 69   fileName(2) [fi
4c90: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61  le join [getData
4ca0: 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b  baseDirectory] [
4cb0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
4cc0: 20 20 20 20 73 74 72 65 73 73 2d 20 5b 70 69 64      stress- [pid
4cd0: 5d 20 2d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  ] - [string trim
4ce0: 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
4cf0: 20 2d 5d 20 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 23   -] .db]]....  #
4d00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4d10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4d20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4d30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4d40: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
4d50: 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 4d    setupWorkloadM
4d60: 65 6d 44 62 20 24 66 69 6c 65 4e 61 6d 65 28 31  emDb $fileName(1
4d70: 29 20 73 72 63 44 62 0d 0a 20 20 73 65 74 75 70  ) srcDb..  setup
4d80: 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24  WorkloadFileDb $
4d90: 66 69 6c 65 4e 61 6d 65 28 32 29 20 64 62 0d 0a  fileName(2) db..
4da0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
4db0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4dc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4de0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4df0: 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  #....  #..  # NO
4e00: 54 45 3a 20 54 68 69 73 20 73 65 72 76 65 73 20  TE: This serves 
4e10: 74 77 6f 20 70 75 72 70 6f 73 65 73 2e 20 20 46  two purposes.  F
4e20: 69 72 73 74 2c 20 69 74 20 61 6c 6c 6f 77 73 20  irst, it allows 
4e30: 75 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  us to verify the
4e40: 20 74 72 61 63 65 0d 0a 20 20 23 20 20 20 20 20   trace..  #     
4e50: 20 20 6c 6f 67 67 69 6e 67 20 73 75 62 73 79 73    logging subsys
4e60: 74 65 6d 20 69 73 20 77 6f 72 6b 69 6e 67 20 70  tem is working p
4e70: 72 6f 70 65 72 6c 79 2e 20 20 53 65 63 6f 6e 64  roperly.  Second
4e80: 2c 20 69 74 20 70 6c 61 63 65 73 20 74 68 65 20  , it places the 
4e90: 66 69 6c 65 0d 0a 20 20 23 20 20 20 20 20 20 20  file..  #       
4ea0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 61 73 73  name for the ass
4eb0: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
4ec0: 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20 74   file into the t
4ed0: 72 61 63 65 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a  race log file...
4ee0: 20 20 23 0d 0a 20 20 73 65 74 20 63 6f 6e 6e 65    #..  set conne
4ef0: 63 74 69 6f 6e 20 5b 67 65 74 44 62 43 6f 6e 6e  ction [getDbConn
4f00: 65 63 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 24 63 6f  ection]....  $co
4f10: 6e 6e 65 63 74 69 6f 6e 20 4c 6f 67 4d 65 73 73  nnection LogMess
4f20: 61 67 65 20 30 20 5b 61 70 70 65 6e 64 41 72 67  age 0 [appendArg
4f30: 73 20 5c 0d 0a 20 20 20 20 20 20 22 73 74 61 72  s \..      "star
4f40: 74 69 6e 67 20 73 74 72 65 73 73 20 74 65 73 74  ting stress test
4f50: 20 75 73 69 6e 67 20 64 61 74 61 62 61 73 65 20   using database 
4f60: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  \"" $fileName(2)
4f70: 20 5c 22 2e 2e 2e 5d 0d 0a 0d 0a 20 20 23 23 23   \"...]....  ###
4f80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4f90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4fa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4fb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4fc0: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
4fd0: 73 65 74 20 74 69 6d 65 6f 75 74 20 5b 6f 62 6a  set timeout [obj
4fe0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
4ff0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
5000: 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d        Eagle._Com
5010: 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e  ponents.Private.
5020: 54 68 72 65 61 64 4f 70 73 20 44 65 66 61 75 6c  ThreadOps Defaul
5030: 74 4a 6f 69 6e 54 69 6d 65 6f 75 74 5d 0d 0a 0d  tJoinTimeout]...
5040: 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63  .  tputs $test_c
5050: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
5060: 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d  gs \..      "---
5070: 2d 20 77 6f 72 6b 6c 6f 61 64 73 20 77 69 6c 6c  - workloads will
5080: 20 73 74 61 72 74 20 62 65 66 6f 72 65 20 6f 72   start before or
5090: 20 74 69 6d 65 6f 75 74 20 61 66 74 65 72 20 22   timeout after "
50a0: 20 24 74 69 6d 65 6f 75 74 20 5c 0d 0a 20 20 20   $timeout \..   
50b0: 20 20 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64     " millisecond
50c0: 28 73 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 23 23 23  (s)\n"]....  ###
50d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
50e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
50f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5110: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
5120: 73 65 74 20 65 76 65 6e 74 20 5b 6f 62 6a 65 63  set event [objec
5130: 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20  t create -alias 
5140: 5c 0d 0a 20 20 20 20 20 20 53 79 73 74 65 6d 2e  \..      System.
5150: 54 68 72 65 61 64 69 6e 67 2e 45 76 65 6e 74 57  Threading.EventW
5160: 61 69 74 48 61 6e 64 6c 65 20 66 61 6c 73 65 20  aitHandle false 
5170: 4d 61 6e 75 61 6c 52 65 73 65 74 5d 0d 0a 0d 0a  ManualReset]....
5180: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
5190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
51a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
51b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
51c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
51d0: 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20  .  #            
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 20 28 41    WORKLOAD #1 (A
5200: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
5220: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
5230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5270: 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  #....  set workl
5280: 6f 61 64 28 31 29 20 5b 6c 69 73 74 20 5c 0d 0a  oad(1) [list \..
5290: 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46        [list srcF
52a0: 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e  ileName dstFileN
52b0: 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31  ame table count1
52c0: 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20   count2 count3] 
52d0: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
52e0: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
52f0: 31 2c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  1, CREATE TABLE 
5300: 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20  statements...   
5310: 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74   #..    waitTest
5320: 20 41 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20   A..    lappend 
5330: 3a 3a 74 69 6d 65 73 28 31 29 20 5b 6c 69 6e 64  ::times(1) [lind
5340: 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20  ex [time {..    
5350: 20 20 69 6e 69 74 54 65 73 74 20 41 0d 0a 20 20    initTest A..  
5360: 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61      setupWorkloa
5370: 64 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c 65  dFileDb $dstFile
5380: 4e 61 6d 65 20 64 62 0d 0a 20 20 20 20 20 20 66  Name db..      f
5390: 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 32 7d  or {set index 2}
53a0: 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75   {$index <= $cou
53b0: 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  nt1} {incr index
53c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  } {..        if 
53d0: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
53e0: 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65       sql execute
53f0: 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73   $db [appendArgs
5400: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5410: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
5420: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 22  IF NOT EXISTS t"
5430: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5440: 20 20 24 69 6e 64 65 78 20 22 28 78 20 50 52 49    $index "(x PRI
5450: 4d 41 52 59 20 4b 45 59 2c 20 79 2c 20 7a 29 3b  MARY KEY, y, z);
5460: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68  "]..          sh
5470: 6f 77 54 65 73 74 20 41 0d 0a 20 20 20 20 20 20  owTest A..      
5480: 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
5490: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
54a0: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
54b0: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
54c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
54d0: 73 68 6f 77 54 65 73 74 20 61 0d 0a 20 20 20 20  showTest a..    
54e0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
5500: 54 65 73 74 20 61 20 24 65 72 72 6f 72 0d 0a 20  Test a $error.. 
5510: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
5520: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
5530: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
5540: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20  $dstFileName db 
5550: 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65  false true false
5560: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
5570: 20 41 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   A..    }] 0].. 
5580: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
5590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
55a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
55b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
55c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
55d0: 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20  ######..  #     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41           WORKLOA
5600: 44 20 23 32 20 28 42 29 20 20 20 20 20 20 20 20  D #2 (B)        
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23        #..  #####
5630: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5640: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5650: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5660: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5670: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
5680: 74 20 77 6f 72 6b 6c 6f 61 64 28 32 29 20 5b 6c  t workload(2) [l
5690: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69  ist \..      [li
56a0: 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64  st srcFileName d
56b0: 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65  stFileName table
56c0: 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63   count1 count2 c
56d0: 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d  ount3] {..    #.
56e0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
56f0: 6b 6c 6f 61 64 20 23 32 2c 20 44 52 4f 50 20 54  kload #2, DROP T
5700: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73 2e  ABLE statements.
5710: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69  ..    #..    wai
5720: 74 54 65 73 74 20 42 0d 0a 20 20 20 20 6c 61 70  tTest B..    lap
5730: 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 32 29 20  pend ::times(2) 
5740: 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d  [lindex [time {.
5750: 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20  .      initTest 
5760: 42 0d 0a 20 20 20 20 20 20 73 65 74 75 70 57 6f  B..      setupWo
5770: 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24 64 73  rkloadFileDb $ds
5780: 74 46 69 6c 65 4e 61 6d 65 20 64 62 0d 0a 20 20  tFileName db..  
5790: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64      for {set ind
57a0: 65 78 20 32 7d 20 7b 24 69 6e 64 65 78 20 3c 3d  ex 2} {$index <=
57b0: 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20   $count1} {incr 
57c0: 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
57d0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
57e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78            sql ex
57f0: 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e  ecute $db [appen
5800: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
5810: 20 20 20 20 20 20 20 22 44 52 4f 50 20 54 41 42         "DROP TAB
5820: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 22 20  LE IF EXISTS t" 
5830: 24 69 6e 64 65 78 20 5c 3b 5d 0d 0a 20 20 20 20  $index \;]..    
5840: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 42        showTest B
5850: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f  ..        } erro
5860: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
5870: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70        if {[isExp
5880: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
5890: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
58a0: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
58b0: 20 62 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   b..          } 
58c0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
58d0: 20 20 20 20 66 61 69 6c 54 65 73 74 20 62 20 24      failTest b $
58e0: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
58f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
5900: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c       }..      cl
5910: 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65  eanupDb $dstFile
5920: 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72  Name db false tr
5930: 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ue false..      
5940: 64 6f 6e 65 54 65 73 74 20 42 0d 0a 20 20 20 20  doneTest B..    
5950: 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20  }] 0]..  }].... 
5960: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
5970: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5980: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5990: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
59a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
59b0: 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20    #             
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 20 57 4f 52 4b 4c 4f 41 44 20 23 33 20 28 43 29   WORKLOAD #3 (C)
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
5a00: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
5a10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5a20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5a30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5a40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5a50: 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f  ....  set worklo
5a60: 61 64 28 33 29 20 5b 6c 69 73 74 20 5c 0d 0a 20  ad(3) [list \.. 
5a70: 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69       [list srcFi
5a80: 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61  leName dstFileNa
5a90: 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20  me table count1 
5aa0: 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b  count2 count3] {
5ab0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
5ac0: 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 33  OTE: Workload #3
5ad0: 2c 20 22 73 6d 61 6c 6c 22 20 53 45 4c 45 43 54  , "small" SELECT
5ae0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20   statements...  
5af0: 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73    #..    waitTes
5b00: 74 20 43 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  t C..    lappend
5b10: 20 3a 3a 74 69 6d 65 73 28 33 29 20 5b 6c 69 6e   ::times(3) [lin
5b20: 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20  dex [time {..   
5b30: 20 20 20 69 6e 69 74 54 65 73 74 20 43 0d 0a 20     initTest C.. 
5b40: 20 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f       setupWorklo
5b50: 61 64 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c  adFileDb $dstFil
5b60: 65 4e 61 6d 65 20 64 62 0d 0a 20 20 20 20 20 20  eName db..      
5b70: 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31  for {set index 1
5b80: 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f  } {$index <= $co
5b90: 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65  unt1} {incr inde
5ba0: 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  x} {..        if
5bb0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
5bc0: 20 20 20 20 20 20 73 65 74 20 72 65 61 64 65 72        set reader
5bd0: 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65   [sql execute -e
5be0: 78 65 63 75 74 65 20 72 65 61 64 65 72 20 5c 0d  xecute reader \.
5bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  .              -
5c00: 66 6f 72 6d 61 74 20 64 61 74 61 52 65 61 64 65  format dataReade
5c10: 72 20 2d 61 6c 69 61 73 20 24 64 62 20 5b 61 70  r -alias $db [ap
5c20: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
5c30: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
5c40: 54 20 78 2c 20 79 20 46 52 4f 4d 20 22 20 24 74  T x, y FROM " $t
5c50: 61 62 6c 65 20 22 20 57 48 45 52 45 20 7a 20 3d  able " WHERE z =
5c60: 20 27 73 6d 61 6c 6c 27 3b 22 5d 5d 0d 0a 20 20   'small';"]]..  
5c70: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 7b 5b          while {[
5c80: 24 72 65 61 64 65 72 20 52 65 61 64 5d 7d 20 7b  $reader Read]} {
5c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
5ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
5cb0: 4f 54 45 3a 20 44 6f 20 6e 6f 74 68 69 6e 67 2e  OTE: Do nothing.
5cc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
5cd0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
5ce0: 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
5cf0: 6f 63 6f 6d 70 6c 61 69 6e 20 72 65 61 64 65 72  ocomplain reader
5d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77  ..          show
5d10: 54 65 73 74 20 43 0d 0a 20 20 20 20 20 20 20 20  Test C..        
5d20: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
5d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
5d40: 5b 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72  [isExpectedError
5d50: 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b   $error]} then {
5d60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68  ..            sh
5d70: 6f 77 54 65 73 74 20 63 0d 0a 20 20 20 20 20 20  owTest c..      
5d80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
5d90: 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65            failTe
5da0: 73 74 20 63 20 24 65 72 72 6f 72 0d 0a 20 20 20  st c $error..   
5db0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
5dc0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
5dd0: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64      cleanupDb $d
5de0: 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61  stFileName db fa
5df0: 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a  lse true false..
5e00: 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20 43        doneTest C
5e10: 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d  ..    }] 0]..  }
5e20: 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  ]....  #########
5e30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5e40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5e50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5e60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5e70: 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20  ####..  #       
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20         WORKLOAD 
5ea0: 23 34 20 28 44 29 20 20 20 20 20 20 20 20 20 20  #4 (D)          
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23 23      #..  #######
5ed0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ee0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ef0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5f00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5f10: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20  ######....  set 
5f20: 77 6f 72 6b 6c 6f 61 64 28 34 29 20 5b 6c 69 73  workload(4) [lis
5f30: 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74  t \..      [list
5f40: 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74   srcFileName dst
5f50: 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63  FileName table c
5f60: 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75  ount1 count2 cou
5f70: 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  nt3] {..    #.. 
5f80: 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c     # NOTE: Workl
5f90: 6f 61 64 20 23 34 2c 20 22 62 69 67 22 20 53 45  oad #4, "big" SE
5fa0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
5fb0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69  ..    #..    wai
5fc0: 74 54 65 73 74 20 44 0d 0a 20 20 20 20 6c 61 70  tTest D..    lap
5fd0: 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 34 29 20  pend ::times(4) 
5fe0: 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d  [lindex [time {.
5ff0: 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20  .      initTest 
6000: 44 0d 0a 20 20 20 20 20 20 73 65 74 75 70 57 6f  D..      setupWo
6010: 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24 64 73  rkloadFileDb $ds
6020: 74 46 69 6c 65 4e 61 6d 65 20 64 62 0d 0a 20 20  tFileName db..  
6030: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64      for {set ind
6040: 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d  ex 1} {$index <=
6050: 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20   $count1} {incr 
6060: 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
6070: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
6080: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 72 65            set re
6090: 61 64 65 72 20 5b 73 71 6c 20 65 78 65 63 75 74  ader [sql execut
60a0: 65 20 2d 65 78 65 63 75 74 65 20 72 65 61 64 65  e -execute reade
60b0: 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r \..           
60c0: 20 20 20 2d 66 6f 72 6d 61 74 20 64 61 74 61 52     -format dataR
60d0: 65 61 64 65 72 20 2d 61 6c 69 61 73 20 24 64 62  eader -alias $db
60e0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
6100: 45 4c 45 43 54 20 78 2c 20 79 20 46 52 4f 4d 20  ELECT x, y FROM 
6110: 22 20 24 74 61 62 6c 65 20 22 20 57 48 45 52 45  " $table " WHERE
6120: 20 7a 20 3d 20 27 62 69 67 27 3b 22 5d 5d 0d 0a   z = 'big';"]]..
6130: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20            while 
6140: 7b 5b 24 72 65 61 64 65 72 20 52 65 61 64 5d 7d  {[$reader Read]}
6150: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
6160: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
6170: 20 4e 4f 54 45 3a 20 44 6f 20 6e 6f 74 68 69 6e   NOTE: Do nothin
6180: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
6190: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  #..          }..
61a0: 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
61b0: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72 65 61 64  -nocomplain read
61c0: 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68  er..          sh
61d0: 6f 77 54 65 73 74 20 44 0d 0a 20 20 20 20 20 20  owTest D..      
61e0: 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
61f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
6200: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
6210: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
6220: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
6230: 73 68 6f 77 54 65 73 74 20 64 0d 0a 20 20 20 20  showTest d..    
6240: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
6250: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
6260: 54 65 73 74 20 64 20 24 65 72 72 6f 72 0d 0a 20  Test d $error.. 
6270: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
6280: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
6290: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
62a0: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20  $dstFileName db 
62b0: 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65  false true false
62c0: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
62d0: 20 44 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   D..    }] 0].. 
62e0: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
62f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6330: 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20  ######..  #     
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41           WORKLOA
6360: 44 20 23 35 20 28 45 29 20 20 20 20 20 20 20 20  D #5 (E)        
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23        #..  #####
6390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
63a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
63b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
63c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
63d0: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
63e0: 74 20 77 6f 72 6b 6c 6f 61 64 28 35 29 20 5b 6c  t workload(5) [l
63f0: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69  ist \..      [li
6400: 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64  st srcFileName d
6410: 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65  stFileName table
6420: 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63   count1 count2 c
6430: 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d  ount3] {..    #.
6440: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
6450: 6b 6c 6f 61 64 20 23 35 2c 20 22 73 6d 61 6c 6c  kload #5, "small
6460: 22 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  " INSERT stateme
6470: 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  nts...    #..   
6480: 20 77 61 69 74 54 65 73 74 20 45 0d 0a 20 20 20   waitTest E..   
6490: 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73   lappend ::times
64a0: 28 35 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d  (5) [lindex [tim
64b0: 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54  e {..      initT
64c0: 65 73 74 20 45 0d 0a 20 20 20 20 20 20 73 65 74  est E..      set
64d0: 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62  upWorkloadFileDb
64e0: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62   $dstFileName db
64f0: 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74  ..      for {set
6500: 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65   index 1} {$inde
6510: 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69  x <= $count1} {i
6520: 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
6530: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
6540: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71   {..          sq
6550: 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61  l execute $db [a
6560: 70 70 65 6e 64 41 72 67 73 20 22 49 4e 53 45 52  ppendArgs "INSER
6570: 54 20 49 4e 54 4f 20 22 20 24 74 61 62 6c 65 20  T INTO " $table 
6580: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
6590: 20 22 28 78 2c 20 79 2c 20 7a 29 20 56 41 4c 55   "(x, y, z) VALU
65a0: 45 53 28 27 22 20 5b 66 6f 72 6d 61 74 20 25 6c  ES('" [format %l
65b0: 58 20 5b 65 78 70 72 20 7b 72 61 6e 64 6f 6d 28  X [expr {random(
65c0: 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  )}]] \..        
65d0: 20 20 20 20 20 20 22 27 2c 20 27 22 20 5b 62 61        "', '" [ba
65e0: 73 65 36 34 20 65 6e 63 6f 64 65 20 2d 2d 20 5b  se64 encode -- [
65f0: 65 78 70 72 20 7b 72 61 6e 64 73 74 72 28 24 63  expr {randstr($c
6600: 6f 75 6e 74 32 29 7d 5d 5d 20 5c 0d 0a 20 20 20  ount2)}]] \..   
6610: 20 20 20 20 20 20 20 20 20 20 20 22 27 2c 20 27             "', '
6620: 73 6d 61 6c 6c 27 29 3b 22 5d 0d 0a 20 20 20 20  small');"]..    
6630: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 45        showTest E
6640: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f  ..        } erro
6650: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
6660: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70        if {[isExp
6670: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
6680: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
6690: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
66a0: 20 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   e..          } 
66b0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
66c0: 20 20 20 20 66 61 69 6c 54 65 73 74 20 65 20 24      failTest e $
66d0: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
66e0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
66f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c       }..      cl
6700: 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65  eanupDb $dstFile
6710: 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72  Name db false tr
6720: 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ue false..      
6730: 64 6f 6e 65 54 65 73 74 20 45 0d 0a 20 20 20 20  doneTest E..    
6740: 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20  }] 0]..  }].... 
6750: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
6760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6780: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6790: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
67a0: 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20    #             
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67c0: 20 57 4f 52 4b 4c 4f 41 44 20 23 36 20 28 46 29   WORKLOAD #6 (F)
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
67f0: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
6800: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6810: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6820: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6830: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6840: 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f  ....  set worklo
6850: 61 64 28 36 29 20 5b 6c 69 73 74 20 5c 0d 0a 20  ad(6) [list \.. 
6860: 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69       [list srcFi
6870: 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61  leName dstFileNa
6880: 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20  me table count1 
6890: 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b  count2 count3] {
68a0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
68b0: 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 36  OTE: Workload #6
68c0: 2c 20 22 62 69 67 22 20 49 4e 53 45 52 54 20 73  , "big" INSERT s
68d0: 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20  tatements...    
68e0: 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74 20  #..    waitTest 
68f0: 46 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a  F..    lappend :
6900: 3a 74 69 6d 65 73 28 36 29 20 5b 6c 69 6e 64 65  :times(6) [linde
6910: 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20  x [time {..     
6920: 20 69 6e 69 74 54 65 73 74 20 46 0d 0a 20 20 20   initTest F..   
6930: 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64     setupWorkload
6940: 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c 65 4e  FileDb $dstFileN
6950: 61 6d 65 20 64 62 0d 0a 20 20 20 20 20 20 66 6f  ame db..      fo
6960: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
6970: 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e  {$index <= $coun
6980: 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  t1} {incr index}
6990: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
69a0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
69b0: 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
69c0: 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20  $db [appendArgs 
69d0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 20 24  "INSERT INTO " $
69e0: 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  table \..       
69f0: 20 20 20 20 20 20 20 22 28 78 2c 20 79 2c 20 7a         "(x, y, z
6a00: 29 20 56 41 4c 55 45 53 28 27 22 20 5b 66 6f 72  ) VALUES('" [for
6a10: 6d 61 74 20 25 6c 58 20 5b 65 78 70 72 20 7b 72  mat %lX [expr {r
6a20: 61 6e 64 6f 6d 28 29 7d 5d 5d 20 5c 0d 0a 20 20  andom()}]] \..  
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 22 27 2c 20              "', 
6a40: 52 41 4e 44 4f 4d 42 4c 4f 42 28 22 20 24 63 6f  RANDOMBLOB(" $co
6a50: 75 6e 74 33 20 22 29 2c 20 27 62 69 67 27 29 3b  unt3 "), 'big');
6a60: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68  "]..          sh
6a70: 6f 77 54 65 73 74 20 46 0d 0a 20 20 20 20 20 20  owTest F..      
6a80: 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
6a90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
6aa0: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
6ab0: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
6ac0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
6ad0: 73 68 6f 77 54 65 73 74 20 66 0d 0a 20 20 20 20  showTest f..    
6ae0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
6b00: 54 65 73 74 20 66 20 24 65 72 72 6f 72 0d 0a 20  Test f $error.. 
6b10: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
6b20: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
6b30: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
6b40: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20  $dstFileName db 
6b50: 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65  false true false
6b60: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
6b70: 20 46 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   F..    }] 0].. 
6b80: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
6b90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6ba0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6bb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6bc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6bd0: 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20  ######..  #     
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41           WORKLOA
6c00: 44 20 23 37 20 28 47 29 20 20 20 20 20 20 20 20  D #7 (G)        
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c20: 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23        #..  #####
6c30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6c40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6c50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6c60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6c70: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
6c80: 74 20 77 6f 72 6b 6c 6f 61 64 28 37 29 20 5b 6c  t workload(7) [l
6c90: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69  ist \..      [li
6ca0: 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64  st srcFileName d
6cb0: 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65  stFileName table
6cc0: 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63   count1 count2 c
6cd0: 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d  ount3] {..    #.
6ce0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
6cf0: 6b 6c 6f 61 64 20 23 37 2c 20 22 73 6d 61 6c 6c  kload #7, "small
6d00: 22 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  " UPDATE stateme
6d10: 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  nts...    #..   
6d20: 20 77 61 69 74 54 65 73 74 20 47 0d 0a 20 20 20   waitTest G..   
6d30: 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73   lappend ::times
6d40: 28 37 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d  (7) [lindex [tim
6d50: 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54  e {..      initT
6d60: 65 73 74 20 47 0d 0a 20 20 20 20 20 20 73 65 74  est G..      set
6d70: 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62  upWorkloadFileDb
6d80: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62   $dstFileName db
6d90: 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74  ..      for {set
6da0: 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65   index 1} {$inde
6db0: 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69  x <= $count1} {i
6dc0: 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
6dd0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
6de0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71   {..          sq
6df0: 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61  l execute $db [a
6e00: 70 70 65 6e 64 41 72 67 73 20 22 55 50 44 41 54  ppendArgs "UPDAT
6e10: 45 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20  E " $table \..  
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 53 45              " SE
6e30: 54 20 79 20 3d 20 27 22 20 5b 62 61 73 65 36 34  T y = '" [base64
6e40: 20 65 6e 63 6f 64 65 20 2d 2d 20 5b 65 78 70 72   encode -- [expr
6e50: 20 7b 72 61 6e 64 73 74 72 28 24 63 6f 75 6e 74   {randstr($count
6e60: 32 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20  2)}]] \..       
6e70: 20 20 20 20 20 20 20 22 27 20 57 48 45 52 45 20         "' WHERE 
6e80: 78 20 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61  x LIKE '" [forma
6e90: 74 20 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27  t %X $index] "%'
6ea0: 20 41 4e 44 20 7a 20 3d 20 27 73 6d 61 6c 6c 27   AND z = 'small'
6eb0: 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ;"]..          s
6ec0: 68 6f 77 54 65 73 74 20 47 0d 0a 20 20 20 20 20  howTest G..     
6ed0: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
6ee0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
6ef0: 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72  f {[isExpectedEr
6f00: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
6f10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
6f20: 20 73 68 6f 77 54 65 73 74 20 67 0d 0a 20 20 20   showTest g..   
6f30: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
6f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69  .            fai
6f50: 6c 54 65 73 74 20 67 20 24 65 72 72 6f 72 0d 0a  lTest g $error..
6f60: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
6f70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
6f80: 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62  .      cleanupDb
6f90: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62   $dstFileName db
6fa0: 20 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73   false true fals
6fb0: 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73  e..      doneTes
6fc0: 74 20 47 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a  t G..    }] 0]..
6fd0: 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23    }]....  ######
6fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7020: 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20  #######..  #    
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f            WORKLO
7050: 41 44 20 23 38 20 28 48 29 20 20 20 20 20 20 20  AD #8 (H)       
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23         #..  ####
7080: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7090: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
70a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
70b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
70c0: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73  #########....  s
70d0: 65 74 20 77 6f 72 6b 6c 6f 61 64 28 38 29 20 5b  et workload(8) [
70e0: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c  list \..      [l
70f0: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
7100: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
7110: 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20  e count1 count2 
7120: 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23  count3] {..    #
7130: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f  ..    # NOTE: Wo
7140: 72 6b 6c 6f 61 64 20 23 38 2c 20 22 62 69 67 22  rkload #8, "big"
7150: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
7160: 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ts...    #..    
7170: 77 61 69 74 54 65 73 74 20 48 0d 0a 20 20 20 20  waitTest H..    
7180: 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28  lappend ::times(
7190: 38 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65  8) [lindex [time
71a0: 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65   {..      initTe
71b0: 73 74 20 48 0d 0a 20 20 20 20 20 20 73 65 74 75  st H..      setu
71c0: 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20  pWorkloadFileDb 
71d0: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 0d  $dstFileName db.
71e0: 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20  .      for {set 
71f0: 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78  index 1} {$index
7200: 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e   <= $count1} {in
7210: 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
7220: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
7230: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  {..          sql
7240: 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70   execute $db [ap
7250: 70 65 6e 64 41 72 67 73 20 22 55 50 44 41 54 45  pendArgs "UPDATE
7260: 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20   " $table \..   
7270: 20 20 20 20 20 20 20 20 20 20 20 22 20 53 45 54             " SET
7280: 20 79 20 3d 20 52 41 4e 44 4f 4d 42 4c 4f 42 28   y = RANDOMBLOB(
7290: 22 20 24 63 6f 75 6e 74 33 20 22 29 20 57 48 45  " $count3 ") WHE
72a0: 52 45 20 78 20 4c 49 4b 45 20 27 22 20 5c 0d 0a  RE x LIKE '" \..
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
72c0: 6f 72 6d 61 74 20 25 58 20 24 69 6e 64 65 78 5d  ormat %X $index]
72d0: 20 22 25 27 20 41 4e 44 20 7a 20 3d 20 27 62 69   "%' AND z = 'bi
72e0: 67 27 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  g';"]..         
72f0: 20 73 68 6f 77 54 65 73 74 20 48 0d 0a 20 20 20   showTest H..   
7300: 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
7310: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
7320: 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64   if {[isExpected
7330: 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74  Error $error]} t
7340: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
7350: 20 20 20 73 68 6f 77 54 65 73 74 20 68 0d 0a 20     showTest h.. 
7360: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
7370: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
7380: 61 69 6c 54 65 73 74 20 68 20 24 65 72 72 6f 72  ailTest h $error
7390: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
73a0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
73b0: 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70  }..      cleanup
73c0: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
73d0: 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61  db false true fa
73e0: 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54  lse..      doneT
73f0: 65 73 74 20 48 0d 0a 20 20 20 20 7d 5d 20 30 5d  est H..    }] 0]
7400: 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23  ..  }]....  ####
7410: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7450: 23 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20  #########..  #  
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7470: 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b              WORK
7480: 4c 4f 41 44 20 23 39 20 28 49 29 20 20 20 20 20  LOAD #9 (I)     
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23           #..  ##
74b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
74c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
74d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
74e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
74f0: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
7500: 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 39 29   set workload(9)
7510: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
7520: 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d  [list srcFileNam
7530: 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61  e dstFileName ta
7540: 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74  ble count1 count
7550: 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20  2 count3] {..   
7560: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
7570: 57 6f 72 6b 6c 6f 61 64 20 23 39 2c 20 22 73 6d  Workload #9, "sm
7580: 61 6c 6c 22 20 44 45 4c 45 54 45 20 73 74 61 74  all" DELETE stat
7590: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a  ements...    #..
75a0: 20 20 20 20 77 61 69 74 54 65 73 74 20 49 0d 0a      waitTest I..
75b0: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69      lappend ::ti
75c0: 6d 65 73 28 39 29 20 5b 6c 69 6e 64 65 78 20 5b  mes(9) [lindex [
75d0: 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e  time {..      in
75e0: 69 74 54 65 73 74 20 49 0d 0a 20 20 20 20 20 20  itTest I..      
75f0: 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c  setupWorkloadFil
7600: 65 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65  eDb $dstFileName
7610: 20 64 62 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b   db..      for {
7620: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
7630: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
7640: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
7650: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
7660: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
7670: 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
7680: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 44 45   [appendArgs "DE
7690: 4c 45 54 45 20 46 52 4f 4d 20 22 20 24 74 61 62  LETE FROM " $tab
76a0: 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
76b0: 20 20 20 20 22 20 57 48 45 52 45 20 78 20 4c 49      " WHERE x LI
76c0: 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74 20 25 58  KE '" [format %X
76d0: 20 24 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44   $index] "%' AND
76e0: 20 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b 22 5d 0d   z = 'small';"].
76f0: 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54  .          showT
7700: 65 73 74 20 49 0d 0a 20 20 20 20 20 20 20 20 7d  est I..        }
7710: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
7720: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
7730: 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20  isExpectedError 
7740: 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d  $error]} then {.
7750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f  .            sho
7760: 77 54 65 73 74 20 69 0d 0a 20 20 20 20 20 20 20  wTest i..       
7770: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7780: 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65 73           failTes
7790: 74 20 69 20 24 65 72 72 6f 72 0d 0a 20 20 20 20  t i $error..    
77a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
77b0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
77c0: 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64 73     cleanupDb $ds
77d0: 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c  tFileName db fal
77e0: 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20  se true false.. 
77f0: 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20 49 0d       doneTest I.
7800: 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d  .    }] 0]..  }]
7810: 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23  ....  ##########
7820: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7830: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7840: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7860: 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20  ###..  #        
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7880: 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23        WORKLOAD #
7890: 31 30 20 28 4a 29 20 20 20 20 20 20 20 20 20 20  10 (J)          
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78b0: 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23     #..  ########
78c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
78d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
78e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
78f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7900: 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77  #####....  set w
7910: 6f 72 6b 6c 6f 61 64 28 31 30 29 20 5b 6c 69 73  orkload(10) [lis
7920: 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74  t \..      [list
7930: 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74   srcFileName dst
7940: 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63  FileName table c
7950: 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75  ount1 count2 cou
7960: 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  nt3] {..    #.. 
7970: 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c     # NOTE: Workl
7980: 6f 61 64 20 23 31 30 2c 20 22 62 69 67 22 20 44  oad #10, "big" D
7990: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73  ELETE statements
79a0: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61  ...    #..    wa
79b0: 69 74 54 65 73 74 20 4a 0d 0a 20 20 20 20 6c 61  itTest J..    la
79c0: 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 30  ppend ::times(10
79d0: 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20  ) [lindex [time 
79e0: 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73  {..      initTes
79f0: 74 20 4a 0d 0a 20 20 20 20 20 20 73 65 74 75 70  t J..      setup
7a00: 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24  WorkloadFileDb $
7a10: 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 0d 0a  dstFileName db..
7a20: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
7a30: 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
7a40: 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63  <= $count1} {inc
7a50: 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
7a60: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
7a70: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20  ..          sql 
7a80: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
7a90: 65 6e 64 41 72 67 73 20 22 44 45 4c 45 54 45 20  endArgs "DELETE 
7aa0: 46 52 4f 4d 20 22 20 24 74 61 62 6c 65 20 5c 0d  FROM " $table \.
7ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
7ac0: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 22   WHERE x LIKE '"
7ad0: 20 5b 66 6f 72 6d 61 74 20 25 58 20 24 69 6e 64   [format %X $ind
7ae0: 65 78 5d 20 22 25 27 20 41 4e 44 20 7a 20 3d 20  ex] "%' AND z = 
7af0: 27 62 69 67 27 3b 22 5d 0d 0a 20 20 20 20 20 20  'big';"]..      
7b00: 20 20 20 20 73 68 6f 77 54 65 73 74 20 4a 0d 0a      showTest J..
7b10: 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
7b20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7b30: 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63      if {[isExpec
7b40: 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d  tedError $error]
7b50: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7b60: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 6a        showTest j
7b70: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
7b80: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
7b90: 20 20 66 61 69 6c 54 65 73 74 20 6a 20 24 65 72    failTest j $er
7ba0: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ror..          }
7bb0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
7bc0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61     }..      clea
7bd0: 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61  nupDb $dstFileNa
7be0: 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72 75 65  me db false true
7bf0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f   false..      do
7c00: 6e 65 54 65 73 74 20 4a 0d 0a 20 20 20 20 7d 5d  neTest J..    }]
7c10: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23   0]..  }]....  #
7c20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7c30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7c40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7c50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7c60: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
7c70: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
7c90: 4f 52 4b 4c 4f 41 44 20 23 31 31 20 28 4b 29 20  ORKLOAD #11 (K) 
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
7cc0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
7cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7cf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7d00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
7d10: 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64  ..  set workload
7d20: 28 31 31 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  (11) [list \..  
7d30: 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c      [list srcFil
7d40: 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d  eName dstFileNam
7d50: 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63  e table count1 c
7d60: 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d  ount2 count3] {.
7d70: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
7d80: 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 31  TE: Workload #11
7d90: 2c 20 56 41 43 55 55 4d 20 73 74 61 74 65 6d 65  , VACUUM stateme
7da0: 6e 74 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  nt...    #..    
7db0: 77 61 69 74 54 65 73 74 20 4b 0d 0a 20 20 20 20  waitTest K..    
7dc0: 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28  lappend ::times(
7dd0: 31 31 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d  11) [lindex [tim
7de0: 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54  e {..      initT
7df0: 65 73 74 20 4b 0d 0a 20 20 20 20 20 20 73 65 74  est K..      set
7e00: 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62  upWorkloadFileDb
7e10: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62   $dstFileName db
7e20: 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74  ..      for {set
7e30: 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65   index 1} {$inde
7e40: 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69  x <= $count1} {i
7e50: 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
7e60: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
7e70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71   {..          sq
7e80: 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 22 56  l execute $db "V
7e90: 41 43 55 55 4d 3b 22 0d 0a 20 20 20 20 20 20 20  ACUUM;"..       
7ea0: 20 20 20 73 68 6f 77 54 65 73 74 20 4b 0d 0a 20     showTest K.. 
7eb0: 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d         } error]}
7ec0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7ed0: 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74     if {[isExpect
7ee0: 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d  edError $error]}
7ef0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7f00: 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 6b 0d       showTest k.
7f10: 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
7f20: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
7f30: 20 66 61 69 6c 54 65 73 74 20 6b 20 24 65 72 72   failTest k $err
7f40: 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  or..          }.
7f50: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
7f60: 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e    }..      clean
7f70: 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d  upDb $dstFileNam
7f80: 65 20 64 62 20 66 61 6c 73 65 20 74 72 75 65 20  e db false true 
7f90: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e  false..      don
7fa0: 65 54 65 73 74 20 4b 0d 0a 20 20 20 20 7d 5d 20  eTest K..    }] 
7fb0: 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23  0]..  }]....  ##
7fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8000: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 23  ###########..  #
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 4f                WO
8030: 52 4b 4c 4f 41 44 20 23 31 32 20 28 4c 29 20 20  RKLOAD #12 (L)  
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8050: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
8060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8070: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8080: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8090: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
80a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
80b0: 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28  .  set workload(
80c0: 31 32 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  12) [list \..   
80d0: 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65     [list srcFile
80e0: 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65  Name dstFileName
80f0: 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f   table count1 co
8100: 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a  unt2 count3] {..
8110: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
8120: 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 32 2c  E: Workload #12,
8130: 20 62 61 63 6b 75 70 20 74 6f 20 69 6e 2d 6d 65   backup to in-me
8140: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a  mory database...
8150: 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54      #..    waitT
8160: 65 73 74 20 4c 0d 0a 20 20 20 20 6c 61 70 70 65  est L..    lappe
8170: 6e 64 20 3a 3a 74 69 6d 65 73 28 31 32 29 20 5b  nd ::times(12) [
8180: 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a  lindex [time {..
8190: 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20 4c        initTest L
81a0: 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74  ..      for {set
81b0: 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65   index 1} {$inde
81c0: 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69  x <= $count1} {i
81d0: 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
81e0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
81f0: 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74  g is integer -st
8200: 72 69 63 74 20 24 3a 3a 63 6f 6d 70 69 6c 65 64  rict $::compiled
8210: 28 31 32 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  (12)]} then {.. 
8220: 20 20 20 20 20 20 20 20 20 73 65 74 20 69 64 20           set id 
8230: 24 3a 3a 63 6f 6d 70 69 6c 65 64 28 31 32 29 3b  $::compiled(12);
8240: 20 23 20 4e 4f 54 45 3a 20 41 6c 72 65 61 64 79   # NOTE: Already
8250: 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20   compiled...    
8260: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
8270: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8280: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5f 44  object invoke _D
8290: 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54 65 73 74  ynamic${id}.Test
82a0: 24 7b 69 64 7d 20 42 61 63 6b 75 70 41 6e 64 47  ${id} BackupAndG
82b0: 65 74 44 61 74 61 0d 0a 20 20 20 20 20 20 20 20  etData..        
82c0: 20 20 20 20 73 68 6f 77 54 65 73 74 20 4c 0d 0a      showTest L..
82d0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
82e0: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
82f0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45          if {[isE
8300: 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72  xpectedError $er
8310: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
8320: 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77              show
8330: 54 65 73 74 20 6c 0d 0a 20 20 20 20 20 20 20 20  Test l..        
8340: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
8360: 54 65 73 74 20 6c 20 24 65 72 72 6f 72 0d 0a 20  Test l $error.. 
8370: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
8380: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8390: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
83a0: 20 20 20 20 20 20 20 73 65 74 20 69 64 20 5b 6f         set id [o
83b0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74  bject invoke Int
83c0: 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
83d0: 76 65 20 4e 65 78 74 49 64 5d 0d 0a 20 20 20 20  ve NextId]..    
83e0: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b        set code [
83f0: 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74  compileCSharpWit
8400: 68 20 5b 73 75 62 73 74 20 7b 0d 0a 20 20 20 20  h [subst {..    
8410: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 53 79          using Sy
8420: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
8430: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
8440: 20 6e 61 6d 65 73 70 61 63 65 20 5f 44 79 6e 61   namespace _Dyna
8450: 6d 69 63 24 7b 69 64 7d 0d 0a 20 20 20 20 20 20  mic${id}..      
8460: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
8470: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74         public st
8480: 61 74 69 63 20 63 6c 61 73 73 20 54 65 73 74 24  atic class Test$
8490: 7b 69 64 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  {id}..          
84a0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
84b0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74         public st
84c0: 61 74 69 63 20 76 6f 69 64 20 42 61 63 6b 75 70  atic void Backup
84d0: 41 6e 64 47 65 74 44 61 74 61 28 29 0d 0a 20 20  AndGetData()..  
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
84f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8500: 20 20 20 75 73 69 6e 67 20 28 53 51 4c 69 74 65     using (SQLite
8510: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f 75 72 63  Connection sourc
8520: 65 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 43 6f  e = new SQLiteCo
8530: 6e 6e 65 63 74 69 6f 6e 28 0d 0a 20 20 20 20 20  nnection(..     
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 22 46 75 6c 6c 55 72 69 3d 24 7b 64 73 74 46   "FullUri=${dstF
8560: 69 6c 65 4e 61 6d 65 7d 3b 5b 67 65 74 46 6c 61  ileName};[getFla
8570: 67 73 50 72 6f 70 65 72 74 79 20 7b 7d 20 74 72  gsProperty {} tr
8580: 75 65 5d 22 29 29 0d 0a 20 20 20 20 20 20 20 20  ue]"))..        
8590: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 73 6f 75 72 63 65 2e 4f 70 65 6e 28 29 3b 0d   source.Open();.
85c0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
85d0: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 53 51         using (SQ
85e0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 64  LiteConnection d
85f0: 65 73 74 69 6e 61 74 69 6f 6e 20 3d 20 6e 65 77  estination = new
8600: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
8610: 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n(..            
8620: 20 20 20 20 20 20 20 20 20 20 20 20 22 46 75 6c              "Ful
8630: 6c 55 72 69 3d 24 7b 73 72 63 46 69 6c 65 4e 61  lUri=${srcFileNa
8640: 6d 65 7d 3b 5b 67 65 74 46 6c 61 67 73 50 72 6f  me};[getFlagsPro
8650: 70 65 72 74 79 20 7b 7d 20 74 72 75 65 5d 22 29  perty {} true]")
8660: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
8670: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8690: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 4f 70 65 6e  destination.Open
86a0: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
86c0: 72 63 65 2e 42 61 63 6b 75 70 44 61 74 61 62 61  rce.BackupDataba
86d0: 73 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se(..           
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
86f0: 65 73 74 69 6e 61 74 69 6f 6e 2c 20 22 6d 61 69  estination, "mai
8700: 6e 22 2c 20 22 6d 61 69 6e 22 2c 20 2d 31 2c 20  n", "main", -1, 
8710: 6e 75 6c 6c 2c 20 30 29 3b 0d 0a 20 20 20 20 20  null, 0);..     
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8730: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8740: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
8750: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
8760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
8770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
87a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
87c0: 75 62 6c 69 63 20 73 74 61 74 69 63 20 76 6f 69  ublic static voi
87d0: 64 20 4d 61 69 6e 28 29 0d 0a 20 20 20 20 20 20  d Main()..      
87e0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8800: 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20  / do nothing... 
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8820: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8830: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
8840: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 5d 20 74  ..          }] t
8850: 72 75 65 20 74 72 75 65 20 74 72 75 65 20 72 65  rue true true re
8860: 73 75 6c 74 73 20 65 72 72 6f 72 73 20 53 79 73  sults errors Sys
8870: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
8880: 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  dll]..          
8890: 69 66 20 7b 24 63 6f 64 65 20 65 71 20 22 4f 6b  if {$code eq "Ok
88a0: 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
88b0: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 63 6f 6d         set ::com
88c0: 70 69 6c 65 64 28 31 32 29 20 24 69 64 3b 20 23  piled(12) $id; #
88d0: 20 4e 4f 54 45 3a 20 43 6f 6d 70 69 6c 65 64 20   NOTE: Compiled 
88e0: 4f 4b 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  OK...           
88f0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
8910: 65 63 74 20 69 6e 76 6f 6b 65 20 5f 44 79 6e 61  ect invoke _Dyna
8920: 6d 69 63 24 7b 69 64 7d 2e 54 65 73 74 24 7b 69  mic${id}.Test${i
8930: 64 7d 20 42 61 63 6b 75 70 41 6e 64 47 65 74 44  d} BackupAndGetD
8940: 61 74 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ata..           
8950: 20 20 20 73 68 6f 77 54 65 73 74 20 4c 0d 0a 20     showTest L.. 
8960: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72             } err
8970: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
8980: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
8990: 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20  isExpectedError 
89a0: 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d  $error]} then {.
89b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
89c0: 20 73 68 6f 77 54 65 73 74 20 6c 0d 0a 20 20 20   showTest l..   
89d0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
89e0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
89f0: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 6c 20       failTest l 
8a00: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
8a10: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
8a20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
8a30: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
8a40: 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 24 65          error $e
8a50: 72 72 6f 72 73 0d 0a 20 20 20 20 20 20 20 20 20  rrors..         
8a60: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
8a70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 64 6f       }..      do
8a80: 6e 65 54 65 73 74 20 4c 0d 0a 20 20 20 20 7d 5d  neTest L..    }]
8a90: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23   0]..  }]....  #
8aa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8ab0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8ac0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8ad0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8ae0: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
8af0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
8b10: 4f 52 4b 4c 4f 41 44 20 23 31 33 20 28 4d 29 20  ORKLOAD #13 (M) 
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
8b40: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
8b50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8b60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8b80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
8b90: 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64  ..  set workload
8ba0: 28 31 33 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  (13) [list \..  
8bb0: 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c      [list srcFil
8bc0: 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d  eName dstFileNam
8bd0: 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63  e table count1 c
8be0: 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d  ount2 count3] {.
8bf0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
8c00: 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 33  TE: Workload #13
8c10: 2c 20 62 61 63 6b 75 70 20 66 72 6f 6d 20 61 6e  , backup from an
8c20: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
8c30: 61 73 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  ase...    #..   
8c40: 20 77 61 69 74 54 65 73 74 20 4d 0d 0a 20 20 20   waitTest M..   
8c50: 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73   lappend ::times
8c60: 28 31 33 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69  (13) [lindex [ti
8c70: 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74  me {..      init
8c80: 54 65 73 74 20 4d 0d 0a 20 20 20 20 20 20 66 6f  Test M..      fo
8c90: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
8ca0: 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e  {$index <= $coun
8cb0: 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  t1} {incr index}
8cc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
8cd0: 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67  [string is integ
8ce0: 65 72 20 2d 73 74 72 69 63 74 20 24 3a 3a 63 6f  er -strict $::co
8cf0: 6d 70 69 6c 65 64 28 31 33 29 5d 7d 20 74 68 65  mpiled(13)]} the
8d00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
8d10: 65 74 20 69 64 20 24 3a 3a 63 6f 6d 70 69 6c 65  et id $::compile
8d20: 64 28 31 33 29 3b 20 23 20 4e 4f 54 45 3a 20 41  d(13); # NOTE: A
8d30: 6c 72 65 61 64 79 20 63 6f 6d 70 69 6c 65 64 2e  lready compiled.
8d40: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
8d50: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
8d60: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
8d70: 6f 6b 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64  oke _Dynamic${id
8d80: 7d 2e 54 65 73 74 24 7b 69 64 7d 20 42 61 63 6b  }.Test${id} Back
8d90: 75 70 41 6e 64 47 65 74 44 61 74 61 0d 0a 20 20  upAndGetData..  
8da0: 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65            showTe
8db0: 73 74 20 4d 0d 0a 20 20 20 20 20 20 20 20 20 20  st M..          
8dc0: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
8dd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
8de0: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
8df0: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
8e00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8e10: 20 20 73 68 6f 77 54 65 73 74 20 6d 0d 0a 20 20    showTest m..  
8e20: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
8e30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8e40: 20 20 66 61 69 6c 54 65 73 74 20 6d 20 24 65 72    failTest m $er
8e50: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ror..           
8e60: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
8e70: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
8e80: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
8e90: 20 69 64 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f   id [object invo
8ea0: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
8eb0: 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d  etActive NextId]
8ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
8ed0: 63 6f 64 65 20 5b 63 6f 6d 70 69 6c 65 43 53 68  code [compileCSh
8ee0: 61 72 70 57 69 74 68 20 5b 73 75 62 73 74 20 7b  arpWith [subst {
8ef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ..            us
8f00: 69 6e 67 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ing System.Data.
8f10: 53 51 4c 69 74 65 3b 0d 0a 0d 0a 20 20 20 20 20  SQLite;....     
8f20: 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63 65         namespace
8f30: 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d 0d 0a   _Dynamic${id}..
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62               pub
8f60: 6c 69 63 20 73 74 61 74 69 63 20 63 6c 61 73 73  lic static class
8f70: 20 54 65 73 74 24 7b 69 64 7d 0d 0a 20 20 20 20   Test${id}..    
8f80: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62               pub
8fa0: 6c 69 63 20 73 74 61 74 69 63 20 76 6f 69 64 20  lic static void 
8fb0: 42 61 63 6b 75 70 41 6e 64 47 65 74 44 61 74 61  BackupAndGetData
8fc0: 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ()..            
8fd0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
8fe0: 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
8ff0: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
9000: 20 73 6f 75 72 63 65 20 3d 20 6e 65 77 20 53 51   source = new SQ
9010: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d  LiteConnection(.
9020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9030: 20 20 20 20 20 20 20 22 46 75 6c 6c 55 72 69 3d         "FullUri=
9040: 24 7b 73 72 63 46 69 6c 65 4e 61 6d 65 7d 3b 5b  ${srcFileName};[
9050: 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72 74 79  getFlagsProperty
9060: 20 7b 7d 20 74 72 75 65 5d 22 29 29 0d 0a 20 20   {} true]"))..  
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9080: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9090: 20 20 20 20 20 20 20 73 6f 75 72 63 65 2e 4f 70         source.Op
90a0: 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  en();....       
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69               usi
90c0: 6e 67 20 28 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ng (SQLiteConnec
90d0: 74 69 6f 6e 20 64 65 73 74 69 6e 61 74 69 6f 6e  tion destination
90e0: 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 43 6f 6e   = new SQLiteCon
90f0: 6e 65 63 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20  nection(..      
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 20 22 46 75 6c 6c 55 72 69 3d 24 7b 64 73 74    "FullUri=${dst
9120: 46 69 6c 65 4e 61 6d 65 7d 3b 5b 67 65 74 46 6c  FileName};[getFl
9130: 61 67 73 50 72 6f 70 65 72 74 79 20 7b 7d 20 74  agsProperty {} t
9140: 72 75 65 5d 22 29 29 0d 0a 20 20 20 20 20 20 20  rue]"))..       
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9170: 20 20 20 20 20 20 64 65 73 74 69 6e 61 74 69 6f        destinatio
9180: 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20  n.Open();....   
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 73 6f 75 72 63 65 2e 42 61 63 6b 75 70     source.Backup
91b0: 44 61 74 61 62 61 73 65 28 0d 0a 20 20 20 20 20  Database(..     
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e       destination
91e0: 2c 20 22 6d 61 69 6e 22 2c 20 22 6d 61 69 6e 22  , "main", "main"
91f0: 2c 20 2d 31 2c 20 6e 75 6c 6c 2c 20 30 29 3b 0d  , -1, null, 0);.
9200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9210: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9220: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
9240: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9250: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
9260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9290: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
92a0: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
92b0: 69 63 20 76 6f 69 64 20 4d 61 69 6e 28 29 0d 0a  ic void Main()..
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
92e0: 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69       // do nothi
92f0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ng...           
9300: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9310: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
9320: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9330: 20 20 7d 5d 20 74 72 75 65 20 74 72 75 65 20 74    }] true true t
9340: 72 75 65 20 72 65 73 75 6c 74 73 20 65 72 72 6f  rue results erro
9350: 72 73 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  rs System.Data.S
9360: 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 20 20 20 20  QLite.dll]..    
9370: 20 20 20 20 20 20 69 66 20 7b 24 63 6f 64 65 20        if {$code 
9380: 65 71 20 22 4f 6b 22 7d 20 74 68 65 6e 20 7b 0d  eq "Ok"} then {.
9390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
93a0: 20 3a 3a 63 6f 6d 70 69 6c 65 64 28 31 33 29 20   ::compiled(13) 
93b0: 24 69 64 3b 20 23 20 4e 4f 54 45 3a 20 43 6f 6d  $id; # NOTE: Com
93c0: 70 69 6c 65 64 20 4f 4b 2e 0d 0a 20 20 20 20 20  piled OK...     
93d0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
93e0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
93f0: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
9400: 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54   _Dynamic${id}.T
9410: 65 73 74 24 7b 69 64 7d 20 42 61 63 6b 75 70 41  est${id} BackupA
9420: 6e 64 47 65 74 44 61 74 61 0d 0a 20 20 20 20 20  ndGetData..     
9430: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
9440: 74 20 4d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t M..           
9450: 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
9460: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9470: 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64   if {[isExpected
9480: 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74  Error $error]} t
9490: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
94a0: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
94b0: 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m..             
94c0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
94d0: 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 54             failT
94e0: 65 73 74 20 6d 20 24 65 72 72 6f 72 0d 0a 20 20  est m $error..  
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
9500: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
9510: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
9520: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72  ..            er
9530: 72 6f 72 20 24 65 72 72 6f 72 73 0d 0a 20 20 20  ror $errors..   
9540: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9550: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
9560: 20 20 20 20 64 6f 6e 65 54 65 73 74 20 4d 0d 0a      doneTest M..
9570: 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d      }] 0]..  }].
9580: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
9590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
95a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
95b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
95c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
95d0: 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20  ##..  #         
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31       WORKLOAD #1
9600: 34 20 28 4e 29 20 20 20 20 20 20 20 20 20 20 20  4 (N)           
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23    #..  #########
9630: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9640: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9650: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9660: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9670: 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f  ####....  set wo
9680: 72 6b 6c 6f 61 64 28 31 34 29 20 5b 6c 69 73 74  rkload(14) [list
9690: 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20   \..      [list 
96a0: 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46  srcFileName dstF
96b0: 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f  ileName table co
96c0: 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e  unt1 count2 coun
96d0: 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  t3] {..    #..  
96e0: 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f    # NOTE: Worklo
96f0: 61 64 20 23 31 34 2c 20 50 52 41 47 4d 41 20 69  ad #14, PRAGMA i
9700: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 73  ntegrity check s
9710: 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 23  tatement...    #
9720: 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74 20 4e  ..    waitTest N
9730: 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a  ..    lappend ::
9740: 74 69 6d 65 73 28 31 34 29 20 5b 6c 69 6e 64 65  times(14) [linde
9750: 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20  x [time {..     
9760: 20 69 6e 69 74 54 65 73 74 20 4e 0d 0a 20 20 20   initTest N..   
9770: 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64     setupWorkload
9780: 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c 65 4e  FileDb $dstFileN
9790: 61 6d 65 20 64 62 0d 0a 20 20 20 20 20 20 66 6f  ame db..      fo
97a0: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
97b0: 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e  {$index <= $coun
97c0: 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  t1} {incr index}
97d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
97e0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
97f0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
9800: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
9810: 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20  cute scalar $db 
9820: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9830: 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   "PRAGMA integri
9840: 74 79 5f 63 68 65 63 6b 3b 22 5d 0d 0a 20 20 20  ty_check;"]..   
9850: 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 75         if {$resu
9860: 6c 74 20 6e 65 20 22 6f 6b 22 7d 20 74 68 65 6e  lt ne "ok"} then
9870: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9880: 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67  error [appendArg
9890: 73 20 22 69 6e 74 65 67 72 69 74 79 20 63 68 65  s "integrity che
98a0: 63 6b 20 66 61 69 6c 65 64 3a 20 22 20 24 72 65  ck failed: " $re
98b0: 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 20 20 20  sult]..         
98c0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68   }..          sh
98d0: 6f 77 54 65 73 74 20 4e 0d 0a 20 20 20 20 20 20  owTest N..      
98e0: 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
98f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
9900: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
9910: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
9920: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9930: 73 68 6f 77 54 65 73 74 20 6e 0d 0a 20 20 20 20  showTest n..    
9940: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
9950: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
9960: 54 65 73 74 20 6e 20 24 65 72 72 6f 72 0d 0a 20  Test n $error.. 
9970: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9980: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
9990: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
99a0: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20  $dstFileName db 
99b0: 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65  false true false
99c0: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
99d0: 20 4e 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   N..    }] 0].. 
99e0: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
99f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9a00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9a10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9a20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9a30: 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20  ######..  #     
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a50: 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41           WORKLOA
9a60: 44 20 23 31 35 20 28 4f 29 20 20 20 20 20 20 20  D #15 (O)       
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23        #..  #####
9a90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9aa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ab0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ac0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ad0: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
9ae0: 74 20 77 6f 72 6b 6c 6f 61 64 28 31 35 29 20 5b  t workload(15) [
9af0: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c  list \..      [l
9b00: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
9b10: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
9b20: 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20  e count1 count2 
9b30: 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23  count3] {..    #
9b40: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f  ..    # NOTE: Wo
9b50: 72 6b 6c 6f 61 64 20 23 31 35 2c 20 66 6f 72 63  rkload #15, forc
9b60: 65 20 6d 61 6e 61 67 65 64 20 67 61 72 62 61 67  e managed garbag
9b70: 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 0d 0a 20 20  e collection..  
9b80: 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73    #..    waitTes
9b90: 74 20 4f 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  t O..    lappend
9ba0: 20 3a 3a 74 69 6d 65 73 28 31 35 29 20 5b 6c 69   ::times(15) [li
9bb0: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
9bc0: 20 20 20 20 69 6e 69 74 54 65 73 74 20 4f 0d 0a      initTest O..
9bd0: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
9be0: 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
9bf0: 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63  <= $count1} {inc
9c00: 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
9c10: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
9c20: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 6c  ..          coll
9c30: 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65  ectGarbage $::te
9c40: 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
9c50: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 4f        showTest O
9c60: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f  ..        } erro
9c70: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
9c80: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70        if {[isExp
9c90: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
9ca0: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
9cb0: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
9cc0: 20 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   o..          } 
9cd0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
9ce0: 20 20 20 20 66 61 69 6c 54 65 73 74 20 6f 20 24      failTest o $
9cf0: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
9d00: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
9d10: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 64 6f       }..      do
9d20: 6e 65 54 65 73 74 20 4f 0d 0a 20 20 20 20 7d 5d  neTest O..    }]
9d30: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23   0]..  }]....  #
9d40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9d50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9d60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9d70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9d80: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
9d90: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
9db0: 4f 52 4b 4c 4f 41 44 20 23 31 36 20 28 50 29 20  ORKLOAD #16 (P) 
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
9de0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
9df0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
9e30: 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64  ..  set workload
9e40: 28 31 36 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  (16) [list \..  
9e50: 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c      [list srcFil
9e60: 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d  eName dstFileNam
9e70: 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63  e table count1 c
9e80: 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d  ount2 count3] {.
9e90: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
9ea0: 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 36  TE: Workload #16
9eb0: 2c 20 61 6c 6c 6f 63 61 74 65 20 28 65 78 63 6c  , allocate (excl
9ec0: 75 64 65 29 20 73 6f 6d 65 20 6e 61 74 69 76 65  ude) some native
9ed0: 20 68 65 61 70 20 6d 65 6d 6f 72 79 0d 0a 20 20   heap memory..  
9ee0: 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73    #..    waitTes
9ef0: 74 20 50 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  t P..    lappend
9f00: 20 3a 3a 74 69 6d 65 73 28 31 36 29 20 5b 6c 69   ::times(16) [li
9f10: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
9f20: 20 20 20 20 69 6e 69 74 54 65 73 74 20 50 0d 0a      initTest P..
9f30: 20 20 20 20 20 20 73 65 74 20 6d 61 78 53 69 7a        set maxSiz
9f40: 65 20 24 3a 3a 63 6f 75 6e 74 28 35 29 0d 0a 20  e $::count(5).. 
9f50: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
9f60: 6b 65 20 47 43 20 41 64 64 4d 65 6d 6f 72 79 50  ke GC AddMemoryP
9f70: 72 65 73 73 75 72 65 20 24 6d 61 78 53 69 7a 65  ressure $maxSize
9f80: 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20  ..      try {.. 
9f90: 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20         for {set 
9fa0: 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78  index 1} {$index
9fb0: 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e   <= $count1} {in
9fc0: 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
9fd0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
9fe0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
9ff0: 20 73 65 74 20 73 69 7a 65 20 5b 65 78 70 72 20   set size [expr 
a000: 7b 69 6e 74 28 6d 69 6e 28 24 6d 61 78 53 69 7a  {int(min($maxSiz
a010: 65 2c 20 61 62 73 28 24 63 6f 75 6e 74 33 20 2a  e, abs($count3 *
a020: 20 24 69 6e 64 65 78 20 2a 20 35 2e 30 29 29 29   $index * 5.0)))
a030: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  }]..            
a040: 73 65 74 20 70 74 72 20 5b 61 6c 6c 6f 63 4d 65  set ptr [allocMe
a050: 6d 20 24 73 69 7a 65 5d 3b 20 23 20 74 68 72 6f  m $size]; # thro
a060: 77 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  w..            u
a070: 73 65 4d 65 6d 20 24 70 74 72 20 24 73 69 7a 65  seMem $ptr $size
a080: 3b 20 64 65 6c 61 79 54 65 73 74 20 2d 31 20 24  ; delayTest -1 $
a090: 63 6f 75 6e 74 32 0d 0a 20 20 20 20 20 20 20 20  count2..        
a0a0: 20 20 20 20 66 72 65 65 4d 65 6d 20 24 70 74 72      freeMem $ptr
a0b0: 3b 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  ; unset -nocompl
a0c0: 61 69 6e 20 70 74 72 0d 0a 20 20 20 20 20 20 20  ain ptr..       
a0d0: 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 50 0d       showTest P.
a0e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72  .          } err
a0f0: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
a100: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
a110: 45 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65  ExpectedError $e
a120: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f               sho
a140: 77 54 65 73 74 20 70 0d 0a 20 20 20 20 20 20 20  wTest p..       
a150: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69               fai
a170: 6c 54 65 73 74 20 70 20 24 65 72 72 6f 72 0d 0a  lTest p $error..
a180: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
a190: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a1a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 66      }..      } f
a1b0: 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20  inally {..      
a1c0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
a1d0: 74 73 20 70 74 72 5d 7d 20 74 68 65 6e 20 7b 0d  ts ptr]} then {.
a1e0: 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65 4d  .          freeM
a1f0: 65 6d 20 24 70 74 72 3b 20 75 6e 73 65 74 20 2d  em $ptr; unset -
a200: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 70 74 72 0d 0a  nocomplain ptr..
a210: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
a220: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
a230: 20 47 43 20 52 65 6d 6f 76 65 4d 65 6d 6f 72 79   GC RemoveMemory
a240: 50 72 65 73 73 75 72 65 20 24 6d 61 78 53 69 7a  Pressure $maxSiz
a250: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
a260: 20 20 64 6f 6e 65 54 65 73 74 20 50 0d 0a 20 20    doneTest P..  
a270: 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d    }] 0]..  }]...
a280: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
a290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a2a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a2b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a2c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a2d0: 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20  ..  #           
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2f0: 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 37 20     WORKLOAD #17 
a300: 28 51 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (Q)             
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  #..  ###########
a330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a360: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a370: 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b  ##....  set work
a380: 6c 6f 61 64 28 31 37 29 20 5b 6c 69 73 74 20 5c  load(17) [list \
a390: 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72  ..      [list sr
a3a0: 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c  cFileName dstFil
a3b0: 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e  eName table coun
a3c0: 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33  t1 count2 count3
a3d0: 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ] {..    #..    
a3e0: 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64  # NOTE: Workload
a3f0: 20 23 31 37 2c 20 63 68 61 6e 67 65 20 74 68 65   #17, change the
a400: 20 64 61 74 61 62 61 73 65 20 6a 6f 75 72 6e 61   database journa
a410: 6c 20 6d 6f 64 65 0d 0a 20 20 20 20 23 0d 0a 20  l mode..    #.. 
a420: 20 20 20 77 61 69 74 54 65 73 74 20 51 0d 0a 20     waitTest Q.. 
a430: 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d     lappend ::tim
a440: 65 73 28 31 37 29 20 5b 6c 69 6e 64 65 78 20 5b  es(17) [lindex [
a450: 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e  time {..      in
a460: 69 74 54 65 73 74 20 51 0d 0a 20 20 20 20 20 20  itTest Q..      
a470: 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c  setupWorkloadFil
a480: 65 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65  eDb $dstFileName
a490: 20 64 62 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b   db..      for {
a4a0: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
a4b0: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
a4c0: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
a4d0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
a4e0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
a4f0: 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
a500: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52   [appendArgs "PR
a510: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
a520: 65 20 3d 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  e = \"" \..     
a530: 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
a540: 24 69 6e 64 65 78 20 25 20 32 20 3d 3d 20 30 20  $index % 2 == 0 
a550: 3f 20 22 64 65 6c 65 74 65 22 20 3a 20 22 77 61  ? "delete" : "wa
a560: 6c 22 7d 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20  l"}] \"\;]..    
a570: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 51        showTest Q
a580: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f  ..        } erro
a590: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
a5a0: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70        if {[isExp
a5b0: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
a5c0: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
a5d0: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
a5e0: 20 71 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   q..          } 
a5f0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
a600: 20 20 20 20 66 61 69 6c 54 65 73 74 20 71 20 24      failTest q $
a610: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
a620: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
a630: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c       }..      cl
a640: 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65  eanupDb $dstFile
a650: 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72  Name db false tr
a660: 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ue false..      
a670: 64 6f 6e 65 54 65 73 74 20 51 0d 0a 20 20 20 20  doneTest Q..    
a680: 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20  }] 0]..  }].... 
a690: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
a6a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a6b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a6c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a6d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
a6e0: 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20    #             
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 20 57 4f 52 4b 4c 4f 41 44 20 23 31 38 20 28 52   WORKLOAD #18 (R
a710: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
a730: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
a740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a750: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a780: 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f  ....  set worklo
a790: 61 64 28 31 38 29 20 5b 6c 69 73 74 20 5c 0d 0a  ad(18) [list \..
a7a0: 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46        [list srcF
a7b0: 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e  ileName dstFileN
a7c0: 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31  ame table count1
a7d0: 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20   count2 count3] 
a7e0: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
a7f0: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
a800: 31 38 2c 20 65 78 65 63 75 74 65 20 71 75 65 72  18, execute quer
a810: 69 65 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ies against the 
a820: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
a830: 73 65 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77  se..    #..    w
a840: 61 69 74 54 65 73 74 20 52 0d 0a 20 20 20 20 6c  aitTest R..    l
a850: 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31  append ::times(1
a860: 38 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65  8) [lindex [time
a870: 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65   {..      initTe
a880: 73 74 20 52 0d 0a 20 20 20 20 20 20 73 65 74 75  st R..      setu
a890: 70 57 6f 72 6b 6c 6f 61 64 4d 65 6d 44 62 20 24  pWorkloadMemDb $
a8a0: 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 62 0d 0a  srcFileName db..
a8b0: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
a8c0: 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
a8d0: 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63  <= $count1} {inc
a8e0: 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
a8f0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
a900: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
a910: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
a920: 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 33 2c   Workload #18.3,
a930: 20 22 73 6d 61 6c 6c 22 20 53 45 4c 45 43 54 20   "small" SELECT 
a940: 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20  statements...   
a950: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a960: 20 20 20 20 73 65 74 20 72 65 61 64 65 72 20 5b      set reader [
a970: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
a980: 63 75 74 65 20 72 65 61 64 65 72 20 5c 0d 0a 20  cute reader \.. 
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 66 6f               -fo
a9a0: 72 6d 61 74 20 64 61 74 61 52 65 61 64 65 72 20  rmat dataReader 
a9b0: 2d 61 6c 69 61 73 20 24 64 62 20 5b 61 70 70 65  -alias $db [appe
a9c0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a9d0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
a9e0: 78 2c 20 79 20 46 52 4f 4d 20 22 20 24 74 61 62  x, y FROM " $tab
a9f0: 6c 65 20 22 20 57 48 45 52 45 20 7a 20 3d 20 27  le " WHERE z = '
aa00: 73 6d 61 6c 6c 27 3b 22 5d 5d 0d 0a 20 20 20 20  small';"]]..    
aa10: 20 20 20 20 20 20 77 68 69 6c 65 20 7b 5b 24 72        while {[$r
aa20: 65 61 64 65 72 20 52 65 61 64 5d 7d 20 7b 0d 0a  eader Read]} {..
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
aa40: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
aa50: 45 3a 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a  E: Do nothing...
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
aa70: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
aa80: 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
aa90: 6f 6d 70 6c 61 69 6e 20 72 65 61 64 65 72 0d 0a  omplain reader..
aaa0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
aab0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
aac0: 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 34 2c 20 22  orkload #18.4, "
aad0: 62 69 67 22 20 53 45 4c 45 43 54 20 73 74 61 74  big" SELECT stat
aae0: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  ements...       
aaf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
ab00: 73 65 74 20 72 65 61 64 65 72 20 5b 73 71 6c 20  set reader [sql 
ab10: 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
ab20: 20 72 65 61 64 65 72 20 5c 0d 0a 20 20 20 20 20   reader \..     
ab30: 20 20 20 20 20 20 20 20 20 2d 66 6f 72 6d 61 74           -format
ab40: 20 64 61 74 61 52 65 61 64 65 72 20 2d 61 6c 69   dataReader -ali
ab50: 61 73 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  as $db [appendAr
ab60: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
ab70: 20 20 20 20 22 53 45 4c 45 43 54 20 78 2c 20 79      "SELECT x, y
ab80: 20 46 52 4f 4d 20 22 20 24 74 61 62 6c 65 20 22   FROM " $table "
ab90: 20 57 48 45 52 45 20 7a 20 3d 20 27 62 69 67 27   WHERE z = 'big'
aba0: 3b 22 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ;"]]..          
abb0: 77 68 69 6c 65 20 7b 5b 24 72 65 61 64 65 72 20  while {[$reader 
abc0: 52 65 61 64 5d 7d 20 7b 0d 0a 20 20 20 20 20 20  Read]} {..      
abd0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
abe0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 20       # NOTE: Do 
abf0: 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20  nothing...      
ac00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ac10: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
ac20: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
ac30: 6e 20 72 65 61 64 65 72 0d 0a 20 20 20 20 20 20  n reader..      
ac40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
ac50: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
ac60: 64 20 23 31 38 2e 35 2c 20 22 73 6d 61 6c 6c 22  d #18.5, "small"
ac70: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
ac80: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts...          #
ac90: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20  ..          sql 
aca0: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
acb0: 65 6e 64 41 72 67 73 20 22 49 4e 53 45 52 54 20  endArgs "INSERT 
acc0: 49 4e 54 4f 20 22 20 24 74 61 62 6c 65 20 5c 0d  INTO " $table \.
acd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
ace0: 28 78 2c 20 79 2c 20 7a 29 20 56 41 4c 55 45 53  (x, y, z) VALUES
acf0: 28 27 22 20 5b 66 6f 72 6d 61 74 20 25 6c 58 20  ('" [format %lX 
ad00: 5b 65 78 70 72 20 7b 72 61 6e 64 6f 6d 28 29 7d  [expr {random()}
ad10: 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] \..          
ad20: 20 20 20 20 22 27 2c 20 27 22 20 5b 62 61 73 65      "', '" [base
ad30: 36 34 20 65 6e 63 6f 64 65 20 2d 2d 20 5b 65 78  64 encode -- [ex
ad40: 70 72 20 7b 72 61 6e 64 73 74 72 28 24 63 6f 75  pr {randstr($cou
ad50: 6e 74 32 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20  nt2)}]] \..     
ad60: 20 20 20 20 20 20 20 20 20 22 27 2c 20 27 73 6d           "', 'sm
ad70: 61 6c 6c 27 29 3b 22 5d 0d 0a 20 20 20 20 20 20  all');"]..      
ad80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
ad90: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
ada0: 64 20 23 31 38 2e 36 2c 20 22 62 69 67 22 20 49  d #18.6, "big" I
adb0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73  NSERT statements
adc0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
add0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78            sql ex
ade0: 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e  ecute $db [appen
adf0: 64 41 72 67 73 20 22 49 4e 53 45 52 54 20 49 4e  dArgs "INSERT IN
ae00: 54 4f 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20  TO " $table \.. 
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 28 78               "(x
ae20: 2c 20 79 2c 20 7a 29 20 56 41 4c 55 45 53 28 27  , y, z) VALUES('
ae30: 22 20 5b 66 6f 72 6d 61 74 20 25 6c 58 20 5b 65  " [format %lX [e
ae40: 78 70 72 20 7b 72 61 6e 64 6f 6d 28 29 7d 5d 5d  xpr {random()}]]
ae50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ae60: 20 20 22 27 2c 20 52 41 4e 44 4f 4d 42 4c 4f 42    "', RANDOMBLOB
ae70: 28 22 20 24 63 6f 75 6e 74 33 20 22 29 2c 20 27  (" $count3 "), '
ae80: 62 69 67 27 29 3b 22 5d 0d 0a 20 20 20 20 20 20  big');"]..      
ae90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
aea0: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
aeb0: 64 20 23 31 38 2e 37 2c 20 22 73 6d 61 6c 6c 22  d #18.7, "small"
aec0: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
aed0: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts...          #
aee0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20  ..          sql 
aef0: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
af00: 65 6e 64 41 72 67 73 20 22 55 50 44 41 54 45 20  endArgs "UPDATE 
af10: 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20  " $table \..    
af20: 20 20 20 20 20 20 20 20 20 20 22 20 53 45 54 20            " SET 
af30: 79 20 3d 20 27 22 20 5b 62 61 73 65 36 34 20 65  y = '" [base64 e
af40: 6e 63 6f 64 65 20 2d 2d 20 5b 65 78 70 72 20 7b  ncode -- [expr {
af50: 72 61 6e 64 73 74 72 28 24 63 6f 75 6e 74 32 29  randstr($count2)
af60: 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  }]] \..         
af70: 20 20 20 20 20 22 27 20 57 48 45 52 45 20 78 20       "' WHERE x 
af80: 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74 20  LIKE '" [format 
af90: 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20 41  %X $index] "%' A
afa0: 4e 44 20 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b 22  ND z = 'small';"
afb0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ]..          #..
afc0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
afd0: 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 38  : Workload #18.8
afe0: 2c 20 22 62 69 67 22 20 55 50 44 41 54 45 20 73  , "big" UPDATE s
aff0: 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20  tatements...    
b000: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b010: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
b020: 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  db [appendArgs "
b030: 55 50 44 41 54 45 20 22 20 24 74 61 62 6c 65 20  UPDATE " $table 
b040: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
b050: 20 22 20 53 45 54 20 79 20 3d 20 52 41 4e 44 4f   " SET y = RANDO
b060: 4d 42 4c 4f 42 28 22 20 24 63 6f 75 6e 74 33 20  MBLOB(" $count3 
b070: 22 29 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  ") WHERE x LIKE 
b080: 27 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  '" \..          
b090: 20 20 20 20 5b 66 6f 72 6d 61 74 20 25 58 20 24      [format %X $
b0a0: 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44 20 7a  index] "%' AND z
b0b0: 20 3d 20 27 62 69 67 27 3b 22 5d 0d 0a 20 20 20   = 'big';"]..   
b0c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b0d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b      # NOTE: Work
b0e0: 6c 6f 61 64 20 23 31 38 2e 39 2c 20 22 73 6d 61  load #18.9, "sma
b0f0: 6c 6c 22 20 44 45 4c 45 54 45 20 73 74 61 74 65  ll" DELETE state
b100: 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  ments...        
b110: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
b120: 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b  ql execute $db [
b130: 61 70 70 65 6e 64 41 72 67 73 20 22 44 45 4c 45  appendArgs "DELE
b140: 54 45 20 46 52 4f 4d 20 22 20 24 74 61 62 6c 65  TE FROM " $table
b150: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b160: 20 20 22 20 57 48 45 52 45 20 78 20 4c 49 4b 45    " WHERE x LIKE
b170: 20 27 22 20 5b 66 6f 72 6d 61 74 20 25 58 20 24   '" [format %X $
b180: 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44 20 7a  index] "%' AND z
b190: 20 3d 20 27 73 6d 61 6c 6c 27 3b 22 5d 0d 0a 20   = 'small';"].. 
b1a0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
b1b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f        # NOTE: Wo
b1c0: 72 6b 6c 6f 61 64 20 23 31 38 2e 31 30 2c 20 22  rkload #18.10, "
b1d0: 62 69 67 22 20 44 45 4c 45 54 45 20 73 74 61 74  big" DELETE stat
b1e0: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  ements...       
b1f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
b200: 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
b210: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 44 45 4c  [appendArgs "DEL
b220: 45 54 45 20 46 52 4f 4d 20 22 20 24 74 61 62 6c  ETE FROM " $tabl
b230: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
b240: 20 20 20 22 20 57 48 45 52 45 20 78 20 4c 49 4b     " WHERE x LIK
b250: 45 20 27 22 20 5b 66 6f 72 6d 61 74 20 25 58 20  E '" [format %X 
b260: 24 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44 20  $index] "%' AND 
b270: 7a 20 3d 20 27 62 69 67 27 3b 22 5d 0d 0a 20 20  z = 'big';"]..  
b280: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b290: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72       # NOTE: Wor
b2a0: 6b 6c 6f 61 64 20 23 31 38 2e 31 31 2c 20 56 41  kload #18.11, VA
b2b0: 43 55 55 4d 20 73 74 61 74 65 6d 65 6e 74 2e 0d  CUUM statement..
b2c0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
b2d0: 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
b2e0: 75 74 65 20 24 64 62 20 22 56 41 43 55 55 4d 3b  ute $db "VACUUM;
b2f0: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  "..          #..
b300: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
b310: 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 31  : Workload #18.1
b320: 34 2c 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72  4, PRAGMA integr
b330: 69 74 79 20 63 68 65 63 6b 20 73 74 61 74 65 6d  ity check statem
b340: 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ent...          
b350: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
b360: 20 72 65 73 75 6c 74 20 5b 73 71 6c 20 65 78 65   result [sql exe
b370: 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63  cute -execute sc
b380: 61 6c 61 72 20 24 64 62 20 5c 0d 0a 20 20 20 20  alar $db \..    
b390: 20 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d            "PRAGM
b3a0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
b3b0: 6b 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  k;"]..          
b3c0: 69 66 20 7b 24 72 65 73 75 6c 74 20 6e 65 20 22  if {$result ne "
b3d0: 6f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ok"} then {..   
b3e0: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b           error [
b3f0: 61 70 70 65 6e 64 41 72 67 73 20 22 69 6e 74 65  appendArgs "inte
b400: 67 72 69 74 79 20 63 68 65 63 6b 20 66 61 69 6c  grity check fail
b410: 65 64 3a 20 22 20 24 72 65 73 75 6c 74 5d 0d 0a  ed: " $result]..
b420: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
b430: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
b440: 52 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  R..        } err
b450: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
b460: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78         if {[isEx
b470: 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72  pectedError $err
b480: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
b490: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
b4a0: 74 20 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  t r..          }
b4b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
b4c0: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 72 20       failTest r 
b4d0: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
b4e0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
b4f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63        }..      c
b500: 6c 65 61 6e 75 70 44 62 20 24 73 72 63 46 69 6c  leanupDb $srcFil
b510: 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74  eName db false t
b520: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
b530: 20 64 6f 6e 65 54 65 73 74 20 52 0d 0a 20 20 20   doneTest R..   
b540: 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a   }] 0]..  }]....
b550: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
b560: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b570: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b580: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
b5a0: 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20  .  #            
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 39 20 28    WORKLOAD #19 (
b5d0: 53 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S)              
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
b5f0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
b600: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b610: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b620: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b630: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b640: 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  #....  set workl
b650: 6f 61 64 28 31 39 29 20 5b 6c 69 73 74 20 5c 0d  oad(19) [list \.
b660: 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63  .      [list src
b670: 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65  FileName dstFile
b680: 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74  Name table count
b690: 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d  1 count2 count3]
b6a0: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
b6b0: 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20   NOTE: Workload 
b6c0: 23 31 39 2c 20 72 61 70 69 64 6c 79 20 6f 70 65  #19, rapidly ope
b6d0: 6e 2f 63 6c 6f 73 65 20 63 6f 6e 6e 65 63 74 69  n/close connecti
b6e0: 6f 6e 73 2c 20 74 68 72 65 61 64 20 23 31 2e 0d  ons, thread #1..
b6f0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69 74  .    #..    wait
b700: 54 65 73 74 20 53 0d 0a 20 20 20 20 6c 61 70 70  Test S..    lapp
b710: 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 39 29 20  end ::times(19) 
b720: 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d  [lindex [time {.
b730: 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20  .      initTest 
b740: 53 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65  S..      for {se
b750: 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64  t index 1} {$ind
b760: 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b  ex <= $count1} {
b770: 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
b780: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
b790: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  h {..          s
b7a0: 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65  etupWorkloadFile
b7b0: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
b7c0: 64 62 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6c  db..          cl
b7d0: 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65  eanupDb $dstFile
b7e0: 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72  Name db false tr
b7f0: 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ue false..      
b800: 20 20 20 20 73 68 6f 77 54 65 73 74 20 53 0d 0a      showTest S..
b810: 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
b820: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b830: 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63      if {[isExpec
b840: 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d  tedError $error]
b850: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b860: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 73        showTest s
b870: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
b880: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
b890: 20 20 66 61 69 6c 54 65 73 74 20 73 20 24 65 72    failTest s $er
b8a0: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ror..          }
b8b0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
b8c0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 64 6f 6e 65     }..      done
b8d0: 54 65 73 74 20 53 0d 0a 20 20 20 20 7d 5d 20 30  Test S..    }] 0
b8e0: 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23  ]..  }]....  ###
b8f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b900: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b910: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b920: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b930: 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20  ##########..  # 
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 52               WOR
b960: 4b 4c 4f 41 44 20 23 32 30 20 28 54 29 20 20 20  KLOAD #20 (T)   
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b980: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23            #..  #
b990: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b9a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b9b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b9c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b9d0: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
b9e0: 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 32    set workload(2
b9f0: 30 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  0) [list \..    
ba00: 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e    [list srcFileN
ba10: 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20  ame dstFileName 
ba20: 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75  table count1 cou
ba30: 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20  nt2 count3] {.. 
ba40: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
ba50: 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 32 30 2c 20  : Workload #20, 
ba60: 72 61 70 69 64 6c 79 20 6f 70 65 6e 2f 63 6c 6f  rapidly open/clo
ba70: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 20  se connections, 
ba80: 74 68 72 65 61 64 20 23 32 2e 0d 0a 20 20 20 20  thread #2...    
ba90: 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74 20  #..    waitTest 
baa0: 54 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a  T..    lappend :
bab0: 3a 74 69 6d 65 73 28 32 30 29 20 5b 6c 69 6e 64  :times(20) [lind
bac0: 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20  ex [time {..    
bad0: 20 20 69 6e 69 74 54 65 73 74 20 54 0d 0a 20 20    initTest T..  
bae0: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64      for {set ind
baf0: 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d  ex 1} {$index <=
bb00: 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20   $count1} {incr 
bb10: 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
bb20: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
bb30: 20 20 20 20 20 20 20 20 20 20 73 65 74 75 70 57            setupW
bb40: 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24 64  orkloadFileDb $d
bb50: 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 0d 0a 20  stFileName db.. 
bb60: 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70           cleanup
bb70: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
bb80: 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61  db false true fa
bb90: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 73  lse..          s
bba0: 68 6f 77 54 65 73 74 20 54 0d 0a 20 20 20 20 20  howTest T..     
bbb0: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
bbc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
bbd0: 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72  f {[isExpectedEr
bbe0: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
bbf0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
bc00: 20 73 68 6f 77 54 65 73 74 20 74 0d 0a 20 20 20   showTest t..   
bc10: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
bc20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69  .            fai
bc30: 6c 54 65 73 74 20 74 20 24 65 72 72 6f 72 0d 0a  lTest t $error..
bc40: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
bc50: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
bc60: 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20  .      doneTest 
bc70: 54 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20  T..    }] 0]..  
bc80: 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23  }]....  ########
bc90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bca0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bcb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bcc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bcd0: 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20  #####..  #      
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44          WORKLOAD
bd00: 20 23 32 31 20 28 55 29 20 20 20 20 20 20 20 20   #21 (U)        
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23       #..  ######
bd30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bd40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bd50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bd60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bd70: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
bd80: 20 77 6f 72 6b 6c 6f 61 64 28 32 31 29 20 5b 6c   workload(21) [l
bd90: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69  ist \..      [li
bda0: 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64  st srcFileName d
bdb0: 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65  stFileName table
bdc0: 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63   count1 count2 c
bdd0: 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d  ount3] {..    #.
bde0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
bdf0: 6b 6c 6f 61 64 20 23 32 31 2c 20 72 61 70 69 64  kload #21, rapid
be00: 6c 79 20 74 72 79 20 74 6f 20 72 65 6c 65 61 73  ly try to releas
be10: 65 20 61 6c 6c 20 6e 6f 6e 2d 65 73 73 65 6e 74  e all non-essent
be20: 69 61 6c 20 6d 65 6d 6f 72 79 2e 0d 0a 20 20 20  ial memory...   
be30: 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74   #..    waitTest
be40: 20 55 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20   U..    lappend 
be50: 3a 3a 74 69 6d 65 73 28 32 31 29 20 5b 6c 69 6e  ::times(21) [lin
be60: 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20  dex [time {..   
be70: 20 20 20 69 6e 69 74 54 65 73 74 20 55 0d 0a 20     initTest U.. 
be80: 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e       for {set in
be90: 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c  dex 1} {$index <
bea0: 3d 20 24 3a 3a 63 6f 75 6e 74 28 36 29 7d 20 7b  = $::count(6)} {
beb0: 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
bec0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
bed0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  h {..          r
bee0: 65 6c 65 61 73 65 4d 65 6d 20 2d 31 0d 0a 20 20  eleaseMem -1..  
bef0: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
bf00: 57 69 74 68 44 65 6c 61 79 20 55 20 30 20 24 3a  WithDelay U 0 $:
bf10: 3a 63 6f 75 6e 74 28 37 29 0d 0a 20 20 20 20 20  :count(7)..     
bf20: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
bf30: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
bf40: 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72  f {[isExpectedEr
bf50: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
bf60: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
bf70: 20 73 68 6f 77 54 65 73 74 20 75 0d 0a 20 20 20   showTest u..   
bf80: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
bf90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69  .            fai
bfa0: 6c 54 65 73 74 20 75 20 24 65 72 72 6f 72 0d 0a  lTest u $error..
bfb0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
bfc0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
bfd0: 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20  .      doneTest 
bfe0: 55 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20  U..    }] 0]..  
bff0: 7d 5d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23  ################
c040: 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20  #####..  #      
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44          WORKLOAD
c070: 20 23 32 32 20 28 56 29 20 20 20 20 20 20 20 20   #22 (V)        
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c090: 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23       #..  ######
c0a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c0b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c0c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c0d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c0e0: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
c0f0: 20 77 6f 72 6b 6c 6f 61 64 28 32 32 29 20 5b 6c   workload(22) [l
c100: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69  ist \..      [li
c110: 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64  st srcFileName d
c120: 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65  stFileName table
c130: 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63   count1 count2 c
c140: 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d  ount3] {..    #.
c150: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
c160: 6b 6c 6f 61 64 20 23 32 32 2c 20 72 61 70 69 64  kload #22, rapid
c170: 6c 79 20 74 72 79 20 74 6f 20 63 68 61 6e 67 65  ly try to change
c180: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 63   the default cac
c190: 68 65 20 73 69 7a 65 2e 0d 0a 20 20 20 20 23 0d  he size...    #.
c1a0: 0a 20 20 20 20 77 61 69 74 54 65 73 74 20 56 0d  .    waitTest V.
c1b0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74  .    lappend ::t
c1c0: 69 6d 65 73 28 32 32 29 20 5b 6c 69 6e 64 65 78  imes(22) [lindex
c1d0: 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20   [time {..      
c1e0: 69 6e 69 74 54 65 73 74 20 56 0d 0a 20 20 20 20  initTest V..    
c1f0: 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46    setupWorkloadF
c200: 69 6c 65 44 62 20 24 64 73 74 46 69 6c 65 4e 61  ileDb $dstFileNa
c210: 6d 65 20 64 62 0d 0a 20 20 20 20 20 20 66 6f 72  me db..      for
c220: 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b   {set index 1} {
c230: 24 69 6e 64 65 78 20 3c 3d 20 24 3a 3a 63 6f 75  $index <= $::cou
c240: 6e 74 28 36 29 7d 20 7b 69 6e 63 72 20 69 6e 64  nt(6)} {incr ind
c250: 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ex} {..        i
c260: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
c270: 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
c280: 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  te $db [appendAr
c290: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
c2a0: 20 20 20 20 22 50 52 41 47 4d 41 20 64 65 66 61      "PRAGMA defa
c2b0: 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d 22  ult_cache_size="
c2c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c2d0: 20 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61 6e    [expr {int(ran
c2e0: 64 28 29 20 2a 20 24 3a 3a 63 6f 75 6e 74 28 38  d() * $::count(8
c2f0: 29 29 7d 5d 20 5c 3b 5d 0d 0a 20 20 20 20 20 20  ))}] \;]..      
c300: 20 20 20 20 73 68 6f 77 54 65 73 74 57 69 74 68      showTestWith
c310: 44 65 6c 61 79 20 56 20 30 20 24 3a 3a 63 6f 75  Delay V 0 $::cou
c320: 6e 74 28 37 29 0d 0a 20 20 20 20 20 20 20 20 7d  nt(7)..        }
c330: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
c340: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
c350: 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20  isExpectedError 
c360: 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d  $error]} then {.
c370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f  .            sho
c380: 77 54 65 73 74 20 76 0d 0a 20 20 20 20 20 20 20  wTest v..       
c390: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
c3a0: 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65 73           failTes
c3b0: 74 20 76 20 24 65 72 72 6f 72 0d 0a 20 20 20 20  t v $error..    
c3c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
c3d0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
c3e0: 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64 73     cleanupDb $ds
c3f0: 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c  tFileName db fal
c400: 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20  se true false.. 
c410: 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20 56 0d       doneTest V.
c420: 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d  .    }] 0]..  }]
c430: 0d 0a 7d 20 2d 62 6f 64 79 20 7b 0d 0a 20 20 73  ..} -body {..  s
c440: 65 74 20 77 6f 72 6b 6c 6f 61 64 4e 61 6d 65 73  et workloadNames
c450: 28 61 6c 6c 29 20 5b 61 72 72 61 79 20 6e 61 6d  (all) [array nam
c460: 65 73 20 77 6f 72 6b 6c 6f 61 64 5d 0d 0a 0d 0a  es workload]....
c470: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
c480: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
c490: 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d  s \..      "----
c4a0: 20 74 68 65 72 65 20 61 72 65 20 22 20 5b 6c 6c   there are " [ll
c4b0: 65 6e 67 74 68 20 24 77 6f 72 6b 6c 6f 61 64 4e  ength $workloadN
c4c0: 61 6d 65 73 28 61 6c 6c 29 5d 20 5c 0d 0a 20 20  ames(all)] \..  
c4d0: 20 20 20 20 22 20 74 6f 74 61 6c 20 77 6f 72 6b      " total work
c4e0: 6c 6f 61 64 73 2c 20 74 68 65 69 72 20 6e 61 6d  loads, their nam
c4f0: 65 73 20 61 72 65 3a 20 22 20 24 77 6f 72 6b 6c  es are: " $workl
c500: 6f 61 64 4e 61 6d 65 73 28 61 6c 6c 29 20 5c 6e  oadNames(all) \n
c510: 5d 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  ]....  set workl
c520: 6f 61 64 4e 61 6d 65 73 28 65 6e 61 62 6c 65 64  oadNames(enabled
c530: 29 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 66 6f  ) [list]....  fo
c540: 72 65 61 63 68 20 69 6e 64 65 78 28 30 29 20 5b  reach index(0) [
c550: 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 24  lsort -integer $
c560: 77 6f 72 6b 6c 6f 61 64 4e 61 6d 65 73 28 61 6c  workloadNames(al
c570: 6c 29 5d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b  l)] {..    if {[
c580: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24  lsearch -exact $
c590: 6e 6f 57 6f 72 6b 6c 6f 61 64 20 24 69 6e 64 65  noWorkload $inde
c5a0: 78 28 30 29 5d 20 3d 3d 20 2d 31 7d 20 74 68 65  x(0)] == -1} the
c5b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 6c 61 70 70 65  n {..      lappe
c5c0: 6e 64 20 77 6f 72 6b 6c 6f 61 64 4e 61 6d 65 73  nd workloadNames
c5d0: 28 65 6e 61 62 6c 65 64 29 20 24 69 6e 64 65 78  (enabled) $index
c5e0: 28 30 29 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  (0)..    }..  }.
c5f0: 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74  ...  tputs $test
c600: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
c610: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d  Args \..      "-
c620: 2d 2d 2d 20 74 68 65 72 65 20 61 72 65 20 22 20  --- there are " 
c630: 5b 6c 6c 65 6e 67 74 68 20 24 77 6f 72 6b 6c 6f  [llength $worklo
c640: 61 64 4e 61 6d 65 73 28 65 6e 61 62 6c 65 64 29  adNames(enabled)
c650: 5d 20 5c 0d 0a 20 20 20 20 20 20 22 20 65 6e 61  ] \..      " ena
c660: 62 6c 65 64 20 77 6f 72 6b 6c 6f 61 64 73 2c 20  bled workloads, 
c670: 74 68 65 69 72 20 6e 61 6d 65 73 20 61 72 65 3a  their names are:
c680: 20 22 20 24 77 6f 72 6b 6c 6f 61 64 4e 61 6d 65   " $workloadName
c690: 73 28 65 6e 61 62 6c 65 64 29 20 5c 6e 5d 0d 0a  s(enabled) \n]..
c6a0: 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f  ..  tputs $test_
c6b0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
c6c0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 3d 3d  rgs \..      "==
c6d0: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 74 68 69 73  == WARNING: this
c6e0: 20 73 74 72 65 73 73 20 74 65 73 74 20 6d 61 79   stress test may
c6f0: 20 74 61 6b 65 20 73 65 76 65 72 61 6c 20 6d 69   take several mi
c700: 6e 75 74 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 0d 0a  nutes...\n"]....
c710: 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
c720: 28 30 29 20 31 7d 20 7b 24 69 6e 64 65 78 28 30  (0) 1} {$index(0
c730: 29 20 3c 3d 20 24 63 6f 75 6e 74 28 30 29 7d 20  ) <= $count(0)} 
c740: 7b 69 6e 63 72 20 69 6e 64 65 78 28 30 29 7d 20  {incr index(0)} 
c750: 7b 0d 0a 20 20 20 20 69 66 20 7b 24 69 6e 64 65  {..    if {$inde
c760: 78 28 30 29 20 3e 20 31 7d 20 74 68 65 6e 20 7b  x(0) > 1} then {
c770: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c780: 20 23 20 4e 4f 54 45 3a 20 41 64 76 61 6e 63 65   # NOTE: Advance
c790: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 6e   output to the n
c7a0: 65 78 74 20 6c 69 6e 65 20 64 75 65 20 74 6f 20  ext line due to 
c7b0: 74 68 65 20 77 6f 72 6b 6c 6f 61 64 0d 0a 20 20  the workload..  
c7c0: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 65 72      #       iter
c7d0: 61 74 69 6f 6e 20 70 72 6f 67 72 65 73 73 20 69  ation progress i
c7e0: 6e 64 69 63 61 74 6f 72 73 20 66 72 6f 6d 20 74  ndicators from t
c7f0: 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6e 2e  he previous run.
c800: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c810: 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61   tputs $test_cha
c820: 6e 6e 65 6c 20 5c 6e 0d 0a 20 20 20 20 7d 0d 0a  nnel \n..    }..
c830: 0d 0a 20 20 20 20 74 70 75 74 73 20 24 74 65 73  ..    tputs $tes
c840: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
c850: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c860: 20 22 2d 2d 2d 2d 20 73 74 61 72 74 69 6e 67 20   "---- starting 
c870: 77 6f 72 6b 6c 6f 61 64 20 72 75 6e 20 23 22 20  workload run #" 
c880: 24 69 6e 64 65 78 28 30 29 20 2e 2e 2e 5c 6e 5d  $index(0) ...\n]
c890: 0d 0a 0d 0a 20 20 20 20 75 6e 73 65 74 20 2d 6e  ....    unset -n
c8a0: 6f 63 6f 6d 70 6c 61 69 6e 20 74 68 72 65 61 64  ocomplain thread
c8b0: 20 73 74 61 74 75 73 3b 20 64 6f 6e 65 54 65 73   status; doneTes
c8c0: 74 0d 0a 0d 0a 20 20 20 20 73 71 6c 20 65 78 65  t....    sql exe
c8d0: 63 75 74 65 20 24 73 72 63 44 62 20 22 43 52 45  cute $srcDb "CRE
c8e0: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
c8f0: 20 45 58 49 53 54 53 20 74 31 28 78 20 50 52 49   EXISTS t1(x PRI
c900: 4d 41 52 59 20 4b 45 59 2c 20 79 2c 20 7a 29 3b  MARY KEY, y, z);
c910: 22 0d 0a 20 20 20 20 73 71 6c 20 65 78 65 63 75  "..    sql execu
c920: 74 65 20 24 64 62 20 22 43 52 45 41 54 45 20 54  te $db "CREATE T
c930: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
c940: 54 53 20 74 31 28 78 20 50 52 49 4d 41 52 59 20  TS t1(x PRIMARY 
c950: 4b 45 59 2c 20 79 2c 20 7a 29 3b 22 0d 0a 0d 0a  KEY, y, z);"....
c960: 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
c970: 24 73 72 63 44 62 20 22 43 52 45 41 54 45 20 49  $srcDb "CREATE I
c980: 4e 44 45 58 20 49 46 20 4e 4f 54 20 45 58 49 53  NDEX IF NOT EXIS
c990: 54 53 20 69 31 20 4f 4e 20 74 31 28 79 29 3b 22  TS i1 ON t1(y);"
c9a0: 0d 0a 20 20 20 20 73 71 6c 20 65 78 65 63 75 74  ..    sql execut
c9b0: 65 20 24 64 62 20 22 43 52 45 41 54 45 20 49 4e  e $db "CREATE IN
c9c0: 44 45 58 20 49 46 20 4e 4f 54 20 45 58 49 53 54  DEX IF NOT EXIST
c9d0: 53 20 69 31 20 4f 4e 20 74 31 28 79 29 3b 22 0d  S i1 ON t1(y);".
c9e0: 0a 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 69  ...    foreach i
c9f0: 6e 64 65 78 28 31 29 20 5b 6c 73 6f 72 74 20 2d  ndex(1) [lsort -
ca00: 69 6e 74 65 67 65 72 20 24 77 6f 72 6b 6c 6f 61  integer $workloa
ca10: 64 4e 61 6d 65 73 28 65 6e 61 62 6c 65 64 29 5d  dNames(enabled)]
ca20: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 77 6f   {..      set wo
ca30: 72 6b 6c 6f 61 64 43 61 6c 6c 62 61 63 6b 73 28  rkloadCallbacks(
ca40: 24 69 6e 64 65 78 28 31 29 29 20 5b 6c 69 73 74  $index(1)) [list
ca50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 61 70   \..          ap
ca60: 70 6c 79 20 24 77 6f 72 6b 6c 6f 61 64 28 24 69  ply $workload($i
ca70: 6e 64 65 78 28 31 29 29 20 24 66 69 6c 65 4e 61  ndex(1)) $fileNa
ca80: 6d 65 28 31 29 20 24 66 69 6c 65 4e 61 6d 65 28  me(1) $fileName(
ca90: 32 29 20 74 31 20 24 63 6f 75 6e 74 28 31 29 20  2) t1 $count(1) 
caa0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 63 6f  \..          $co
cab0: 75 6e 74 28 33 29 20 24 63 6f 75 6e 74 28 34 29  unt(3) $count(4)
cac0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74  ]....      set t
cad0: 68 72 65 61 64 28 24 69 6e 64 65 78 28 31 29 29  hread($index(1))
cae0: 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20   [object create 
caf0: 2d 61 6c 69 61 73 20 53 79 73 74 65 6d 2e 54 68  -alias System.Th
cb00: 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64 20 5c  reading.Thread \
cb10: 0d 0a 20 20 20 20 20 20 20 20 20 20 24 77 6f 72  ..          $wor
cb20: 6b 6c 6f 61 64 43 61 6c 6c 62 61 63 6b 73 28 24  kloadCallbacks($
cb30: 69 6e 64 65 78 28 31 29 29 20 31 30 34 38 35 37  index(1)) 104857
cb40: 36 5d 0d 0a 0d 0a 20 20 20 20 20 20 24 74 68 72  6]....      $thr
cb50: 65 61 64 28 24 69 6e 64 65 78 28 31 29 29 20 4e  ead($index(1)) N
cb60: 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
cb70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
cb80: 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c  le rootname [fil
cb90: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
cba0: 28 32 29 5d 5d 20 22 20 23 22 20 24 69 6e 64 65  (2)]] " #" $inde
cbb0: 78 28 31 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  x(1)]....      i
cbc0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
cbd0: 70 72 69 6f 72 69 74 79 28 24 69 6e 64 65 78 28  priority($index(
cbe0: 31 29 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  1))]} then {..  
cbf0: 20 20 20 20 20 20 24 74 68 72 65 61 64 28 24 69        $thread($i
cc00: 6e 64 65 78 28 31 29 29 20 50 72 69 6f 72 69 74  ndex(1)) Priorit
cc10: 79 20 24 70 72 69 6f 72 69 74 79 28 24 69 6e 64  y $priority($ind
cc20: 65 78 28 31 29 29 0d 0a 20 20 20 20 20 20 7d 0d  ex(1))..      }.
cc30: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 66 6f  .    }....    fo
cc40: 72 65 61 63 68 20 69 6e 64 65 78 28 31 29 20 5b  reach index(1) [
cc50: 61 72 72 61 79 20 6e 61 6d 65 73 20 74 68 72 65  array names thre
cc60: 61 64 5d 20 7b 0d 0a 20 20 20 20 20 20 24 74 68  ad] {..      $th
cc70: 72 65 61 64 28 24 69 6e 64 65 78 28 31 29 29 20  read($index(1)) 
cc80: 53 74 61 72 74 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  Start..    }....
cc90: 20 20 20 20 24 65 76 65 6e 74 20 53 65 74 3b 20      $event Set; 
cca0: 23 20 47 4f 0d 0a 0d 0a 20 20 20 20 66 6f 72 65  # GO....    fore
ccb0: 61 63 68 20 69 6e 64 65 78 28 31 29 20 5b 61 72  ach index(1) [ar
ccc0: 72 61 79 20 6e 61 6d 65 73 20 74 68 72 65 61 64  ray names thread
ccd0: 5d 20 7b 0d 0a 20 20 20 20 20 20 24 74 68 72 65  ] {..      $thre
cce0: 61 64 28 24 69 6e 64 65 78 28 31 29 29 20 4a 6f  ad($index(1)) Jo
ccf0: 69 6e 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  in..    }....   
cd00: 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78 28 31   foreach index(1
cd10: 29 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 74  ) [array names t
cd20: 68 72 65 61 64 5d 20 7b 0d 0a 20 20 20 20 20 20  hread] {..      
cd30: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
cd40: 20 74 68 72 65 61 64 28 24 69 6e 64 65 78 28 31   thread($index(1
cd50: 29 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ))] && \..      
cd60: 20 20 20 20 5b 63 6c 65 61 6e 75 70 54 68 72 65      [cleanupThre
cd70: 61 64 20 24 74 68 72 65 61 64 28 24 69 6e 64 65  ad $thread($inde
cd80: 78 28 31 29 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  x(1))]} then {..
cd90: 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
cda0: 6f 63 6f 6d 70 6c 61 69 6e 20 74 68 72 65 61 64  ocomplain thread
cdb0: 28 24 69 6e 64 65 78 28 31 29 29 0d 0a 20 20 20  ($index(1))..   
cdc0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
cdd0: 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
cde0: 6c 61 69 6e 20 74 68 72 65 61 64 20 73 74 61 74  lain thread stat
cdf0: 75 73 3b 20 64 6f 6e 65 54 65 73 74 0d 0a 20 20  us; doneTest..  
ce00: 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  }....  #########
ce10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
ce20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
ce30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
ce40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
ce50: 23 23 23 23 0d 0a 0d 0a 20 20 66 6f 72 65 61 63  ####....  foreac
ce60: 68 20 69 6e 64 65 78 28 30 29 20 5b 73 70 6c 69  h index(0) [spli
ce70: 74 20 24 69 6e 64 69 63 61 74 6f 72 73 20 22 22  t $indicators ""
ce80: 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ] {..    #..    
ce90: 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74  # NOTE: See if t
cea0: 68 69 73 20 77 6f 72 6b 6c 6f 61 64 20 69 74 65  his workload ite
ceb0: 72 61 74 69 6f 6e 20 72 61 69 73 65 64 20 61 6e  ration raised an
cec0: 20 65 72 72 6f 72 2e 20 20 49 66 20 73 6f 2c 20   error.  If so, 
ced0: 74 68 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20  the..    #      
cee0: 20 69 6e 64 69 63 61 74 6f 72 20 6c 65 74 74 65   indicator lette
cef0: 72 20 77 69 6c 6c 20 62 65 20 69 6e 20 6c 6f 77  r will be in low
cf00: 65 72 20 63 61 73 65 3b 20 6f 74 68 65 72 77 69  er case; otherwi
cf10: 73 65 2c 20 69 74 20 77 69 6c 6c 0d 0a 20 20 20  se, it will..   
cf20: 20 23 20 20 20 20 20 20 20 62 65 20 69 6e 20 75   #       be in u
cf30: 70 70 65 72 20 63 61 73 65 2e 0d 0a 20 20 20 20  pper case...    
cf40: 23 0d 0a 20 20 20 20 73 65 74 20 69 6e 64 65 78  #..    set index
cf50: 28 31 29 20 5b 73 74 72 69 6e 67 20 69 73 20 75  (1) [string is u
cf60: 70 70 65 72 20 2d 73 74 72 69 63 74 20 24 69 6e  pper -strict $in
cf70: 64 65 78 28 30 29 5d 0d 0a 0d 0a 20 20 20 20 73  dex(0)]....    s
cf80: 65 74 20 69 6e 64 65 78 28 32 29 20 5b 65 78 70  et index(2) [exp
cf90: 72 20 7b 5b 73 74 72 69 6e 67 20 6f 72 64 69 6e  r {[string ordin
cfa0: 61 6c 20 24 69 6e 64 65 78 28 30 29 20 30 5d 20  al $index(0) 0] 
cfb0: 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 73 74  - \..        [st
cfc0: 72 69 6e 67 20 6f 72 64 69 6e 61 6c 20 5b 65 78  ring ordinal [ex
cfd0: 70 72 20 7b 24 69 6e 64 65 78 28 31 29 20 3f 20  pr {$index(1) ? 
cfe0: 22 41 22 20 3a 20 22 61 22 7d 5d 20 30 5d 20 2b  "A" : "a"}] 0] +
cff0: 20 31 7d 5d 0d 0a 0d 0a 20 20 20 20 73 65 74 20   1}]....    set 
d000: 69 6e 64 65 78 28 33 29 20 5b 65 78 70 72 20 7b  index(3) [expr {
d010: 24 69 6e 64 65 78 28 31 29 20 3f 20 22 6f 6b 22  $index(1) ? "ok"
d020: 20 3a 20 22 65 72 72 6f 72 22 7d 5d 0d 0a 0d 0a   : "error"}]....
d030: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
d040: 78 69 73 74 73 20 69 74 65 72 61 74 69 6f 6e 73  xists iterations
d050: 28 24 69 6e 64 65 78 28 32 29 2c 24 69 6e 64 65  ($index(2),$inde
d060: 78 28 33 29 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  x(3))]} then {..
d070: 20 20 20 20 20 20 73 65 74 20 69 74 65 72 61 74        set iterat
d080: 69 6f 6e 73 28 24 69 6e 64 65 78 28 32 29 2c 24  ions($index(2),$
d090: 69 6e 64 65 78 28 33 29 29 20 30 0d 0a 20 20 20  index(3)) 0..   
d0a0: 20 7d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 21 5b   }....    if {![
d0b0: 69 6e 66 6f 20 65 78 69 73 74 73 20 69 74 65 72  info exists iter
d0c0: 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 28 32 29  ations($index(2)
d0d0: 2c 74 6f 74 61 6c 29 5d 7d 20 74 68 65 6e 20 7b  ,total)]} then {
d0e0: 0d 0a 20 20 20 20 20 20 73 65 74 20 69 74 65 72  ..      set iter
d0f0: 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 28 32 29  ations($index(2)
d100: 2c 74 6f 74 61 6c 29 20 30 0d 0a 20 20 20 20 7d  ,total) 0..    }
d110: 0d 0a 0d 0a 20 20 20 20 69 6e 63 72 20 69 74 65  ....    incr ite
d120: 72 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 28 32  rations($index(2
d130: 29 2c 24 69 6e 64 65 78 28 33 29 29 0d 0a 20 20  ),$index(3))..  
d140: 20 20 69 6e 63 72 20 69 74 65 72 61 74 69 6f 6e    incr iteration
d150: 73 28 24 69 6e 64 65 78 28 32 29 2c 74 6f 74 61  s($index(2),tota
d160: 6c 29 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23  l)..  }....  ###
d170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d1a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d1b0: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
d1c0: 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 41 64 76  #..  # NOTE: Adv
d1d0: 61 6e 63 65 20 6f 75 74 70 75 74 20 74 6f 20 74  ance output to t
d1e0: 68 65 20 6e 65 78 74 20 6c 69 6e 65 20 64 75 65  he next line due
d1f0: 20 74 6f 20 74 68 65 20 77 6f 72 6b 6c 6f 61 64   to the workload
d200: 0d 0a 20 20 23 20 20 20 20 20 20 20 69 74 65 72  ..  #       iter
d210: 61 74 69 6f 6e 20 70 72 6f 67 72 65 73 73 20 69  ation progress i
d220: 6e 64 69 63 61 74 6f 72 73 20 66 72 6f 6d 20 74  ndicators from t
d230: 68 65 20 66 69 6e 61 6c 20 72 75 6e 2e 0d 0a 20  he final run... 
d240: 20 23 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73   #..  tputs $tes
d250: 74 5f 63 68 61 6e 6e 65 6c 20 5c 6e 0d 0a 0d 0a  t_channel \n....
d260: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
d270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d2a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
d2b0: 0a 0d 0a 20 20 66 6f 72 65 61 63 68 20 69 6e 64  ...  foreach ind
d2c0: 65 78 28 30 29 20 5b 6c 73 6f 72 74 20 2d 69 6e  ex(0) [lsort -in
d2d0: 74 65 67 65 72 20 24 77 6f 72 6b 6c 6f 61 64 4e  teger $workloadN
d2e0: 61 6d 65 73 28 65 6e 61 62 6c 65 64 29 5d 20 7b  ames(enabled)] {
d2f0: 0d 0a 20 20 20 20 74 70 75 74 73 20 24 74 65 73  ..    tputs $tes
d300: 74 5f 63 68 61 6e 6e 65 6c 20 5b 66 6f 72 6d 61  t_channel [forma
d310: 74 57 6f 72 6b 6c 6f 61 64 52 65 73 75 6c 74 20  tWorkloadResult 
d320: 24 69 6e 64 65 78 28 30 29 5d 0d 0a 20 20 7d 0d  $index(0)]..  }.
d330: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
d340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d360: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d370: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d380: 23 23 0d 0a 0d 0a 20 20 66 6f 72 65 61 63 68 20  ##....  foreach 
d390: 69 6e 64 65 78 28 30 29 20 5b 6c 73 6f 72 74 20  index(0) [lsort 
d3a0: 2d 69 6e 74 65 67 65 72 20 5b 61 72 72 61 79 20  -integer [array 
d3b0: 6e 61 6d 65 73 20 74 69 6d 65 73 5d 5d 20 7b 0d  names times]] {.
d3c0: 0a 20 20 20 20 74 70 75 74 73 20 24 74 65 73 74  .    tputs $test
d3d0: 5f 63 68 61 6e 6e 65 6c 20 5b 66 6f 72 6d 61 74  _channel [format
d3e0: 57 6f 72 6b 6c 6f 61 64 54 69 6d 65 20 24 69 6e  WorkloadTime $in
d3f0: 64 65 78 28 30 29 5d 0d 0a 20 20 7d 0d 0a 0d 0a  dex(0)]..  }....
d400: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
d410: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
d450: 0a 0d 0a 20 20 73 65 74 20 72 65 73 75 6c 74 20  ...  set result 
d460: 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78  [sql execute -ex
d470: 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 73 72  ecute scalar $sr
d480: 63 44 62 20 22 50 52 41 47 4d 41 20 69 6e 74 65  cDb "PRAGMA inte
d490: 67 72 69 74 79 5f 63 68 65 63 6b 3b 22 5d 0d 0a  grity_check;"]..
d4a0: 0d 0a 20 20 69 66 20 7b 24 72 65 73 75 6c 74 20  ..  if {$result 
d4b0: 65 71 20 22 6f 6b 22 7d 20 74 68 65 6e 20 7b 0d  eq "ok"} then {.
d4c0: 0a 20 20 20 20 74 70 75 74 73 20 24 74 65 73 74  .    tputs $test
d4d0: 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 69  _channel "---- i
d4e0: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f  ntegrity check o
d4f0: 6b 20 28 73 72 63 44 62 29 5c 6e 22 0d 0a 20 20  k (srcDb)\n"..  
d500: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 65 72  } else {..    er
d510: 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ror [appendArgs 
d520: 22 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b  "integrity check
d530: 20 66 61 69 6c 65 64 20 28 73 72 63 44 62 29 3a   failed (srcDb):
d540: 20 22 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 7d   " $result]..  }
d550: 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23  ....  ##########
d560: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d570: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d580: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d5a0: 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 72 65 73  ###....  set res
d5b0: 75 6c 74 20 5b 73 71 6c 20 65 78 65 63 75 74 65  ult [sql execute
d5c0: 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72   -execute scalar
d5d0: 20 24 64 62 20 22 50 52 41 47 4d 41 20 69 6e 74   $db "PRAGMA int
d5e0: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 22 5d 0d  egrity_check;"].
d5f0: 0a 0d 0a 20 20 69 66 20 7b 24 72 65 73 75 6c 74  ...  if {$result
d600: 20 65 71 20 22 6f 6b 22 7d 20 74 68 65 6e 20 7b   eq "ok"} then {
d610: 0d 0a 20 20 20 20 74 70 75 74 73 20 24 74 65 73  ..    tputs $tes
d620: 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20  t_channel "---- 
d630: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  integrity check 
d640: 6f 6b 20 28 64 62 29 5c 6e 22 0d 0a 20 20 7d 20  ok (db)\n"..  } 
d650: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 65 72 72 6f  else {..    erro
d660: 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 69  r [appendArgs "i
d670: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 66  ntegrity check f
d680: 61 69 6c 65 64 20 28 64 62 29 3a 20 22 20 24 72  ailed (db): " $r
d690: 65 73 75 6c 74 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20  esult]..  }.... 
d6a0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
d6b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d6c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d6d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d6e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
d6f0: 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
d700: 20 54 68 65 20 6f 76 65 72 61 6c 6c 20 74 65 73   The overall tes
d710: 74 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  t result is the 
d720: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
d730: 66 61 69 6c 75 72 65 73 20 28 69 2e 65 2e 0d 0a  failures (i.e...
d740: 20 20 23 20 20 20 20 20 20 20 22 75 6e 65 78 70    #       "unexp
d750: 65 63 74 65 64 20 65 72 72 6f 72 73 22 29 20 65  ected errors") e
d760: 6e 63 6f 75 6e 74 65 72 65 64 20 64 75 72 69 6e  ncountered durin
d770: 67 20 61 20 77 6f 72 6b 6c 6f 61 64 20 69 74 65  g a workload ite
d780: 72 61 74 69 6f 6e 2e 0d 0a 20 20 23 0d 0a 20 20  ration...  #..  
d790: 65 78 70 72 20 7b 5b 61 72 72 61 79 20 73 69 7a  expr {[array siz
d7a0: 65 20 66 61 69 6c 75 72 65 73 5d 20 3e 20 30 20  e failures] > 0 
d7b0: 3f 20 5c 0d 0a 20 20 20 20 20 20 5b 65 78 70 72  ? \..      [expr
d7c0: 20 5b 6a 6f 69 6e 20 5b 61 72 72 61 79 20 76 61   [join [array va
d7d0: 6c 75 65 73 20 66 61 69 6c 75 72 65 73 5d 20 2b  lues failures] +
d7e0: 5d 5d 20 3a 20 30 7d 0d 0a 7d 20 2d 63 6c 65 61  ]] : 0}..} -clea
d7f0: 6e 75 70 20 7b 0d 0a 20 20 66 6f 72 65 61 63 68  nup {..  foreach
d800: 20 69 6e 64 65 78 28 30 29 20 5b 61 72 72 61 79   index(0) [array
d810: 20 6e 61 6d 65 73 20 74 68 72 65 61 64 5d 20 7b   names thread] {
d820: 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ..    if {[info 
d830: 65 78 69 73 74 73 20 74 68 72 65 61 64 28 24 69  exists thread($i
d840: 6e 64 65 78 28 30 29 29 5d 20 26 26 20 5c 0d 0a  ndex(0))] && \..
d850: 20 20 20 20 20 20 20 20 5b 63 6c 65 61 6e 75 70          [cleanup
d860: 54 68 72 65 61 64 20 24 74 68 72 65 61 64 28 24  Thread $thread($
d870: 69 6e 64 65 78 28 30 29 29 5d 7d 20 74 68 65 6e  index(0))]} then
d880: 20 7b 0d 0a 20 20 20 20 20 20 75 6e 73 65 74 20   {..      unset 
d890: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 68 72 65  -nocomplain thre
d8a0: 61 64 28 24 69 6e 64 65 78 28 30 29 29 0d 0a 20  ad($index(0)).. 
d8b0: 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72     }..  }....  r
d8c0: 65 6e 61 6d 65 20 72 65 6c 65 61 73 65 4d 65 6d  ename releaseMem
d8d0: 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 66 72   ""..  rename fr
d8e0: 65 65 4d 65 6d 20 22 22 0d 0a 20 20 72 65 6e 61  eeMem ""..  rena
d8f0: 6d 65 20 75 73 65 4d 65 6d 20 22 22 0d 0a 20 20  me useMem ""..  
d900: 72 65 6e 61 6d 65 20 61 6c 6c 6f 63 4d 65 6d 20  rename allocMem 
d910: 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 66 61 69  ""..  rename fai
d920: 6c 54 65 73 74 20 22 22 0d 0a 20 20 72 65 6e 61  lTest ""..  rena
d930: 6d 65 20 64 6f 6e 65 54 65 73 74 20 22 22 0d 0a  me doneTest ""..
d940: 20 20 72 65 6e 61 6d 65 20 73 68 6f 77 54 65 73    rename showTes
d950: 74 57 69 74 68 44 65 6c 61 79 20 22 22 0d 0a 20  tWithDelay "".. 
d960: 20 72 65 6e 61 6d 65 20 73 68 6f 77 54 65 73 74   rename showTest
d970: 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 77 61   ""..  rename wa
d980: 69 74 54 65 73 74 20 22 22 0d 0a 20 20 72 65 6e  itTest ""..  ren
d990: 61 6d 65 20 64 65 6c 61 79 54 65 73 74 20 22 22  ame delayTest ""
d9a0: 0d 0a 20 20 72 65 6e 61 6d 65 20 69 6e 69 74 54  ..  rename initT
d9b0: 65 73 74 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65  est ""..  rename
d9c0: 20 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72   isExpectedError
d9d0: 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 66 6f   ""..  rename fo
d9e0: 72 6d 61 74 57 6f 72 6b 6c 6f 61 64 54 69 6d 65  rmatWorkloadTime
d9f0: 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 66 6f   ""..  rename fo
da00: 72 6d 61 74 57 6f 72 6b 6c 6f 61 64 52 65 73 75  rmatWorkloadResu
da10: 6c 74 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20  lt ""..  rename 
da20: 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c  setupWorkloadFil
da30: 65 44 62 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65  eDb ""..  rename
da40: 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 4d 65   setupWorkloadMe
da50: 6d 44 62 20 22 22 0d 0a 0d 0a 20 20 63 61 74 63  mDb ""....  catc
da60: 68 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  h {..    #..    
da70: 23 20 4e 4f 54 45 3a 20 57 65 20 6d 75 73 74 20  # NOTE: We must 
da80: 63 6c 65 61 72 20 74 68 65 20 63 6f 6e 6e 65 63  clear the connec
da90: 74 69 6f 6e 20 70 6f 6f 6c 20 6e 6f 77 20 62 65  tion pool now be
daa0: 63 61 75 73 65 20 77 65 20 69 6e 74 65 6e 64 0d  cause we intend.
dab0: 0a 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20  .    #       to 
dac0: 64 65 6c 65 74 65 20 74 68 65 20 64 61 74 61 62  delete the datab
dad0: 61 73 65 73 20 66 6f 72 20 74 68 69 73 20 74 65  ases for this te
dae0: 73 74 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  st...    #..    
daf0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53 79  object invoke Sy
db00: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
db10: 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
db20: 6e 20 43 6c 65 61 72 41 6c 6c 50 6f 6f 6c 73 0d  n ClearAllPools.
db30: 0a 20 20 7d 0d 0a 0d 0a 20 20 63 6c 65 61 6e 75  .  }....  cleanu
db40: 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  pDb $fileName(2)
db50: 0d 0a 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66  ..  cleanupDb $f
db60: 69 6c 65 4e 61 6d 65 28 31 29 20 73 72 63 44 62  ileName(1) srcDb
db70: 0d 0a 0d 0a 20 20 66 6f 72 65 61 63 68 20 69 6e  ....  foreach in
db80: 64 65 78 28 30 29 20 5b 61 72 72 61 79 20 6e 61  dex(0) [array na
db90: 6d 65 73 20 77 6f 72 6b 6c 6f 61 64 43 61 6c 6c  mes workloadCall
dba0: 62 61 63 6b 73 5d 20 7b 0d 0a 20 20 20 20 63 61  backs] {..    ca
dbb0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 6f 62 6a  tch {..      obj
dbc0: 65 63 74 20 72 65 6d 6f 76 65 63 61 6c 6c 62 61  ect removecallba
dbd0: 63 6b 20 24 77 6f 72 6b 6c 6f 61 64 43 61 6c 6c  ck $workloadCall
dbe0: 62 61 63 6b 73 28 24 69 6e 64 65 78 28 30 29 29  backs($index(0))
dbf0: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
dc00: 20 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69    freeDbConnecti
dc10: 6f 6e 0d 0a 0d 0a 20 20 69 66 20 7b 21 24 6e 6f  on....  if {!$no
dc20: 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  Trace} then {.. 
dc30: 20 20 20 63 6c 65 61 6e 75 70 4c 6f 67 67 69 6e     cleanupLoggin
dc40: 67 20 24 6c 6f 67 46 69 6c 65 4e 61 6d 65 0d 0a  g $logFileName..
dc50: 20 20 7d 0d 0a 0d 0a 20 20 72 65 6e 61 6d 65 20    }....  rename 
dc60: 63 6c 65 61 6e 75 70 4c 6f 67 67 69 6e 67 20 22  cleanupLogging "
dc70: 22 0d 0a 20 20 72 65 6e 61 6d 65 20 73 65 74 75  "..  rename setu
dc80: 70 4c 6f 67 67 69 6e 67 20 22 22 0d 0a 0d 0a 20  pLogging "".... 
dc90: 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
dca0: 69 6e 20 72 65 73 75 6c 74 20 74 68 72 65 61 64  in result thread
dcb0: 20 69 6e 64 65 78 20 77 6f 72 6b 6c 6f 61 64 20   index workload 
dcc0: 70 72 69 6f 72 69 74 79 20 6e 6f 57 6f 72 6b 6c  priority noWorkl
dcd0: 6f 61 64 20 5c 0d 0a 20 20 20 20 20 20 70 72 69  oad \..      pri
dce0: 6f 72 69 74 69 65 73 20 73 72 63 44 62 20 64 62  orities srcDb db
dcf0: 20 66 69 6c 65 4e 61 6d 65 20 63 6f 6d 70 69 6c   fileName compil
dd00: 65 64 20 6f 70 74 69 6f 6e 73 20 63 6f 75 6e 74  ed options count
dd10: 20 74 69 6d 65 73 20 6c 6f 67 46 69 6c 65 4e 61   times logFileNa
dd20: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 6c 6f 67 4c  me \..      logL
dd30: 69 73 74 65 6e 65 72 20 65 76 65 6e 74 20 74 69  istener event ti
dd40: 6d 65 6f 75 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  meout connection
dd50: 20 69 6e 64 69 63 61 74 6f 72 73 20 69 74 65 72   indicators iter
dd60: 61 74 69 6f 6e 73 20 65 78 69 74 4f 6e 46 61 69  ations exitOnFai
dd70: 6c 20 5c 0d 0a 20 20 20 20 20 20 63 6f 54 61 73  l \..      coTas
dd80: 6b 4d 65 6d 20 6e 6f 54 72 61 63 65 20 66 61 69  kMem noTrace fai
dd90: 6c 75 72 65 73 20 73 74 61 74 75 73 20 77 6f 72  lures status wor
dda0: 6b 6c 6f 61 64 4e 61 6d 65 73 20 77 6f 72 6b 6c  kloadNames workl
ddb0: 6f 61 64 43 61 6c 6c 62 61 63 6b 73 0d 0a 7d 20  oadCallbacks..} 
ddc0: 2d 74 69 6d 65 20 74 72 75 65 20 2d 63 6f 6e 73  -time true -cons
ddd0: 74 72 61 69 6e 74 73 20 7b 65 61 67 6c 65 20 63  traints {eagle c
dde0: 6f 6d 6d 61 6e 64 2e 6f 62 6a 65 63 74 20 6d 6f  ommand.object mo
ddf0: 6e 6f 42 75 67 34 30 20 63 6f 6d 6d 61 6e 64 2e  noBug40 command.
de00: 73 71 6c 5c 0d 0a 63 6f 6d 70 69 6c 65 2e 44 41  sql\..compile.DA
de10: 54 41 20 53 51 4c 69 74 65 20 53 79 73 74 65 6d  TA SQLite System
de20: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 63 6f 6d  .Data.SQLite com
de30: 70 69 6c 65 43 53 68 61 72 70 7d 20 2d 72 65 73  pileCSharp} -res
de40: 75 6c 74 20 7b 30 7d 7d 0d 0a 0d 0a 23 23 23 23  ult {0}}....####
de50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
de60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
de70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
de80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
de90: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 23  ###########....#
dea0: 0d 0a 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74  ..# NOTE: Report
deb0: 20 61 66 74 65 72 20 74 65 73 74 2e 0d 0a 23 0d   after test...#.
dec0: 0a 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44  .checkForSQLiteD
ded0: 69 72 65 63 74 6f 72 69 65 73 20 24 74 65 73 74  irectories $test
dee0: 5f 63 68 61 6e 6e 65 6c 0d 0a 67 65 74 53 51 4c  _channel..getSQL
def0: 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20  iteHandleCounts 
df00: 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 72  $test_channel..r
df10: 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
df20: 72 63 65 73 20 24 74 65 73 74 5f 63 68 61 6e 6e  rces $test_chann
df30: 65 6c 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23 23  el....##########
df40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
df50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
df60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
df70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
df80: 23 23 23 23 23 0d 0a 0d 0a 72 75 6e 53 51 4c 69  #####....runSQLi
df90: 74 65 54 65 73 74 45 70 69 6c 6f 67 75 65 0d 0a  teTestEpilogue..
dfa0: 72 75 6e 54 65 73 74 45 70 69 6c 6f 67 75 65 0d  runTestEpilogue.
dfb0: 0a                                               .