System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 141e57adc86a7f1ae7c4cfa1a01e76f8dcb1df2b:


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 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  s....  #########
06b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
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 0d 0a 0d 0a 20 20 70 72 6f 63 20 73  ####....  proc s
0700: 65 74 75 70 57 6f 72 6b 6c 6f 61 64 4d 65 6d 44  etupWorkloadMemD
0710: 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61  b { fileName {va
0720: 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
0730: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
0740: 3a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  : This should be
0750: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
0760: 74 61 62 61 73 65 3b 20 74 68 65 72 65 66 6f 72  tabase; therefor
0770: 65 2c 20 73 6b 69 70 20 61 74 74 65 6d 70 74 69  e, skip attempti
0780: 6e 67 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  ng..    #       
0790: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e  to delete the un
07a0: 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
07b0: 65 20 66 69 6c 65 20 61 73 20 74 68 61 74 20 77  e file as that w
07c0: 6f 75 6c 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e  ould not make an
07d0: 79 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 73  y..    #       s
07e0: 65 6e 73 65 2e 20 20 41 6c 73 6f 2c 20 64 69 73  ense.  Also, dis
07f0: 61 62 6c 65 20 75 73 65 20 6f 66 20 22 50 52 41  able use of "PRA
0800: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
0810: 69 72 65 63 74 6f 72 79 22 20 77 68 65 6e 0d 0a  irectory" when..
0820: 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74      #       sett
0830: 69 6e 67 20 75 70 20 74 68 65 20 6e 65 77 20 63  ing up the new c
0840: 6f 6e 6e 65 63 74 69 6f 6e 20 62 65 63 61 75 73  onnection becaus
0850: 65 20 69 74 20 69 73 20 6e 6f 74 20 74 68 72 65  e it is not thre
0860: 61 64 2d 73 61 66 65 2e 0d 0a 20 20 20 20 23 0d  ad-safe...    #.
0870: 0a 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b  .    uplevel 1 [
0880: 6c 69 73 74 20 73 65 74 75 70 44 62 20 24 66 69  list setupDb $fi
0890: 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20  leName "" "" "" 
08a0: 22 22 20 22 22 20 66 61 6c 73 65 20 66 61 6c 73  "" "" false fals
08b0: 65 20 74 72 75 65 20 66 61 6c 73 65 20 5c 0d 0a  e true false \..
08c0: 20 20 20 20 20 20 20 20 24 76 61 72 4e 61 6d 65          $varName
08d0: 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23  ]..  }....  ####
08e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
08f0: 23 23 23 23 23 23 23 23 23 23 23 23 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 0d 0a 0d 0a 20 20 70  #########....  p
0930: 72 6f 63 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61  roc setupWorkloa
0940: 64 46 69 6c 65 44 62 20 7b 20 66 69 6c 65 4e 61  dFileDb { fileNa
0950: 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  me {varName db} 
0960: 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  } {..    #..    
0970: 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 74 74  # NOTE: Skip att
0980: 65 6d 70 74 69 6e 67 20 74 6f 20 64 65 6c 65 74  empting to delet
0990: 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
09a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
09b0: 20 41 6c 73 6f 2c 0d 0a 20 20 20 20 23 20 20 20   Also,..    #   
09c0: 20 20 20 20 64 69 73 61 62 6c 65 20 75 73 65 20      disable use 
09d0: 6f 66 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f  of "PRAGMA temp_
09e0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22  store_directory"
09f0: 20 77 68 65 6e 20 73 65 74 74 69 6e 67 20 75 70   when setting up
0a00: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 74 68  ..    #       th
0a10: 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
0a20: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
0a30: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0d  ot thread-safe..
0a40: 0a 20 20 20 20 23 0d 0a 20 20 20 20 75 70 6c 65  .    #..    uple
0a50: 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 65 74 75  vel 1 [list setu
0a60: 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 22 22  pDb $fileName ""
0a70: 20 22 22 20 22 22 20 22 22 20 22 22 20 74 72 75   "" "" "" "" tru
0a80: 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61  e false false fa
0a90: 6c 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 24  lse \..        $
0aa0: 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 7d 0d 0a 0d  varName]..  }...
0ab0: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
0ac0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0ad0: 23 23 23 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: 0d 0a 0d 0a 20 20 70 72 6f 63 20 66 6f 72 6d 61  ....  proc forma
0b10: 74 57 6f 72 6b 6c 6f 61 64 52 65 73 75 6c 74 20  tWorkloadResult 
0b20: 7b 20 69 6e 64 65 78 20 7d 20 7b 0d 0a 20 20 20  { index } {..   
0b30: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 61 70 70   set result [app
0b40: 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 69 74  endArgs "---- it
0b50: 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 77 6f 72  erations for wor
0b60: 6b 6c 6f 61 64 20 28 22 20 24 69 6e 64 65 78 20  kload (" $index 
0b70: 22 29 3a 20 22 5d 0d 0a 0d 0a 20 20 20 20 61 70  "): "]....    ap
0b80: 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 65 78 70  pend result [exp
0b90: 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  r {[info exists 
0ba0: 3a 3a 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e  ::iterations($in
0bb0: 64 65 78 2c 74 6f 74 61 6c 29 5d 20 3f 20 5c 0d  dex,total)] ? \.
0bc0: 0a 20 20 20 20 20 20 20 20 24 3a 3a 69 74 65 72  .        $::iter
0bd0: 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 2c 74 6f  ations($index,to
0be0: 74 61 6c 29 20 3a 20 30 7d 5d 20 22 20 74 6f 74  tal) : 0}] " tot
0bf0: 61 6c 2c 20 22 0d 0a 0d 0a 20 20 20 20 61 70 70  al, "....    app
0c00: 65 6e 64 20 72 65 73 75 6c 74 20 5b 65 78 70 72  end result [expr
0c10: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
0c20: 3a 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e 64  :iterations($ind
0c30: 65 78 2c 6f 6b 29 5d 20 3f 20 5c 0d 0a 20 20 20  ex,ok)] ? \..   
0c40: 20 20 20 20 20 24 3a 3a 69 74 65 72 61 74 69 6f       $::iteratio
0c50: 6e 73 28 24 69 6e 64 65 78 2c 6f 6b 29 20 3a 20  ns($index,ok) : 
0c60: 30 7d 5d 20 22 20 6f 6b 2c 20 22 0d 0a 0d 0a 20  0}] " ok, ".... 
0c70: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
0c80: 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78   [expr {[info ex
0c90: 69 73 74 73 20 3a 3a 69 74 65 72 61 74 69 6f 6e  ists ::iteration
0ca0: 73 28 24 69 6e 64 65 78 2c 65 72 72 6f 72 29 5d  s($index,error)]
0cb0: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 3a   ? \..        $:
0cc0: 3a 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e 64  :iterations($ind
0cd0: 65 78 2c 65 72 72 6f 72 29 20 3a 20 30 7d 5d 20  ex,error) : 0}] 
0ce0: 22 20 65 72 72 6f 72 2c 20 22 0d 0a 0d 0a 20 20  " error, "....  
0cf0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
0d00: 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 77   Translate the w
0d10: 6f 72 6b 6c 6f 61 64 20 69 6e 64 65 78 20 74 6f  orkload index to
0d20: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
0d30: 6e 67 20 69 74 65 72 61 74 69 6f 6e 0d 0a 20 20  ng iteration..  
0d40: 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20    #       error 
0d50: 69 6e 64 69 63 61 74 6f 72 20 73 6f 20 74 68 61  indicator so tha
0d60: 74 20 77 65 20 63 61 6e 20 65 61 73 69 6c 79 20  t we can easily 
0d70: 6c 6f 6f 6b 75 70 20 74 68 65 20 6e 75 6d 62 65  lookup the numbe
0d80: 72 20 6f 66 0d 0a 20 20 20 20 23 20 20 20 20 20  r of..    #     
0d90: 20 20 66 61 69 6c 75 72 65 73 20 28 69 2e 65 2e    failures (i.e.
0da0: 20 22 75 6e 65 78 70 65 63 74 65 64 20 65 72 72   "unexpected err
0db0: 6f 72 73 22 29 20 66 6f 72 20 74 68 65 20 77 6f  ors") for the wo
0dc0: 72 6b 6c 6f 61 64 2e 0d 0a 20 20 20 20 23 0d 0a  rkload...    #..
0dd0: 20 20 20 20 73 65 74 20 69 6e 64 69 63 61 74 6f      set indicato
0de0: 72 20 5b 73 74 72 69 6e 67 20 63 68 61 72 61 63  r [string charac
0df0: 74 65 72 20 5b 65 78 70 72 20 7b 5b 73 74 72 69  ter [expr {[stri
0e00: 6e 67 20 6f 72 64 69 6e 61 6c 20 61 20 30 5d 20  ng ordinal a 0] 
0e10: 2b 20 24 69 6e 64 65 78 20 2d 20 31 7d 5d 5d 0d  + $index - 1}]].
0e20: 0a 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 72 65  ...    append re
0e30: 73 75 6c 74 20 5b 65 78 70 72 20 7b 5b 69 6e 66  sult [expr {[inf
0e40: 6f 20 65 78 69 73 74 73 20 3a 3a 66 61 69 6c 75  o exists ::failu
0e50: 72 65 73 28 24 69 6e 64 69 63 61 74 6f 72 29 5d  res($indicator)]
0e60: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 3a   ? \..        $:
0e70: 3a 66 61 69 6c 75 72 65 73 28 24 69 6e 64 69 63  :failures($indic
0e80: 61 74 6f 72 29 20 3a 20 30 7d 5d 20 22 20 66 61  ator) : 0}] " fa
0e90: 69 6c 65 64 5c 6e 22 0d 0a 0d 0a 20 20 20 20 72  iled\n"....    r
0ea0: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
0eb0: 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23   }....  ########
0ec0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0ed0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0ee0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0ef0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0f00: 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20  #####....  proc 
0f10: 66 6f 72 6d 61 74 57 6f 72 6b 6c 6f 61 64 54 69  formatWorkloadTi
0f20: 6d 65 20 7b 20 69 6e 64 65 78 20 7d 20 7b 0d 0a  me { index } {..
0f30: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0f40: 69 73 74 73 20 3a 3a 74 69 6d 65 73 28 24 69 6e  ists ::times($in
0f50: 64 65 78 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  dex)]} then {.. 
0f60: 20 20 20 20 20 73 65 74 20 6c 65 6e 67 74 68 20       set length 
0f70: 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 69 6d 65  [llength $::time
0f80: 73 28 24 69 6e 64 65 78 29 5d 0d 0a 0d 0a 20 20  s($index)]....  
0f90: 20 20 20 20 69 66 20 7b 24 6c 65 6e 67 74 68 20      if {$length 
0fa0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
0fb0: 20 20 20 20 20 73 65 74 20 73 75 6d 20 5b 65 78       set sum [ex
0fc0: 70 72 20 5b 6a 6f 69 6e 20 24 3a 3a 74 69 6d 65  pr [join $::time
0fd0: 73 28 24 69 6e 64 65 78 29 20 2b 5d 5d 0d 0a 0d  s($index) +]]...
0fe0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0ff0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d  [appendArgs "---
1000: 2d 20 61 76 65 72 61 67 65 20 74 69 6d 65 20 66  - average time f
1010: 6f 72 20 77 6f 72 6b 6c 6f 61 64 20 28 22 20 24  or workload (" $
1020: 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20  index \..       
1030: 20 20 20 20 20 22 29 20 69 73 20 61 62 6f 75 74       ") is about
1040: 20 22 20 5b 65 78 70 72 20 7b 69 6e 74 28 24 73   " [expr {int($s
1050: 75 6d 20 2f 20 24 6c 65 6e 67 74 68 20 2f 20 31  um / $length / 1
1060: 30 30 30 2e 30 29 7d 5d 20 5c 0d 0a 20 20 20 20  000.0)}] \..    
1070: 20 20 20 20 20 20 20 20 22 20 6d 69 6c 6c 69 73          " millis
1080: 65 63 6f 6e 64 73 20 28 22 20 5b 65 78 70 72 20  econds (" [expr 
1090: 7b 69 6e 74 28 24 73 75 6d 20 2f 20 28 5b 69 6e  {int($sum / ([in
10a0: 66 6f 20 65 78 69 73 74 73 20 5c 0d 0a 20 20 20  fo exists \..   
10b0: 20 20 20 20 20 20 20 20 20 3a 3a 69 74 65 72 61           ::itera
10c0: 74 69 6f 6e 73 28 24 69 6e 64 65 78 2c 74 6f 74  tions($index,tot
10d0: 61 6c 29 5d 20 3f 20 24 3a 3a 69 74 65 72 61 74  al)] ? $::iterat
10e0: 69 6f 6e 73 28 24 69 6e 64 65 78 2c 74 6f 74 61  ions($index,tota
10f0: 6c 29 20 3a 20 5c 0d 0a 20 20 20 20 20 20 20 20  l) : \..        
1100: 20 20 20 20 24 6c 65 6e 67 74 68 29 20 2f 20 31      $length) / 1
1110: 30 30 30 2e 30 29 7d 5d 20 22 20 6d 69 6c 6c 69  000.0)}] " milli
1120: 73 65 63 6f 6e 64 73 20 70 65 72 20 69 74 65 72  seconds per iter
1130: 61 74 69 6f 6e 29 5c 6e 22 5d 0d 0a 20 20 20 20  ation)\n"]..    
1140: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
1150: 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64    return [append
1160: 41 72 67 73 20 22 2d 2d 2d 2d 20 6e 6f 20 74 69  Args "---- no ti
1170: 6d 65 73 20 66 6f 72 20 77 6f 72 6b 6c 6f 61 64  mes for workload
1180: 20 28 22 20 24 69 6e 64 65 78 20 29 5c 6e 5d 0d   (" $index )\n].
1190: 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23  .  }....  ######
11a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11e0: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f  #######....  pro
11f0: 63 20 69 73 45 78 70 65 63 74 65 64 45 72 72 6f  c isExpectedErro
1200: 72 20 7b 20 65 72 72 6f 72 20 7d 20 7b 0d 0a 20  r { error } {.. 
1210: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
1220: 7b 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5c 73 6e  {[regexp -- {\sn
1230: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 74 31  o such table: t1
1240: 5c 73 7d 20 24 65 72 72 6f 72 5d 20 7c 7c 20 5c  \s} $error] || \
1250: 0d 0a 20 20 20 20 20 20 20 20 5b 72 65 67 65 78  ..        [regex
1260: 70 20 2d 2d 20 7b 5c 73 64 61 74 61 62 61 73 65  p -- {\sdatabase
1270: 20 69 73 20 6c 6f 63 6b 65 64 5c 73 7d 20 24 65   is locked\s} $e
1280: 72 72 6f 72 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20  rror] || \..    
1290: 20 20 20 20 5b 72 65 67 65 78 70 20 2d 2d 20 7b      [regexp -- {
12a0: 5c 73 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  \sdatabase table
12b0: 20 69 73 20 6c 6f 63 6b 65 64 5c 73 7d 20 24 65   is locked\s} $e
12c0: 72 72 6f 72 5d 7d 5d 0d 0a 20 20 7d 0d 0a 0d 0a  rror]}]..  }....
12d0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
12e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f0: 23 23 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 0d  ###############.
1320: 0a 0d 0a 20 20 70 72 6f 63 20 69 6e 69 74 54 65  ...  proc initTe
1330: 73 74 20 7b 20 69 6e 64 69 63 61 74 6f 72 20 7d  st { indicator }
1340: 20 7b 0d 0a 20 20 20 20 73 65 74 20 3a 3a 65 61   {..    set ::ea
1350: 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e 73 74 72  gle_tests(constr
1360: 61 69 6e 74 73 29 20 24 3a 3a 74 65 73 74 5f 63  aints) $::test_c
1370: 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20 7d 0d  onstraints..  }.
1380: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
1390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13a0: 23 23 23 23 23 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 0d 0a 0d 0a 20 20 70 72 6f 63 20 64 65 6c  ##....  proc del
13e0: 61 79 54 65 73 74 20 7b 20 7b 65 78 74 72 61 20  ayTest { {extra 
13f0: 30 7d 20 7d 20 7b 0d 0a 20 20 20 20 61 66 74 65  0} } {..    afte
1400: 72 20 5b 65 78 70 72 20 7b 69 6e 74 28 28 72 61  r [expr {int((ra
1410: 6e 64 28 29 20 2a 20 31 30 30 30 29 20 2b 20 24  nd() * 1000) + $
1420: 65 78 74 72 61 29 7d 5d 0d 0a 20 20 7d 0d 0a 0d  extra)}]..  }...
1430: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
1440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1470: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1480: 0d 0a 0d 0a 20 20 70 72 6f 63 20 77 61 69 74 54  ....  proc waitT
1490: 65 73 74 20 7b 20 69 6e 64 69 63 61 74 6f 72 20  est { indicator 
14a0: 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 21 5b 24  } {..    if {![$
14b0: 3a 3a 65 76 65 6e 74 20 57 61 69 74 4f 6e 65 20  ::event WaitOne 
14c0: 24 3a 3a 74 69 6d 65 6f 75 74 5d 7d 20 74 68 65  $::timeout]} the
14d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 65 72 72 6f 72  n {..      error
14e0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 74 69   [appendArgs "ti
14f0: 6d 65 6f 75 74 20 77 68 69 6c 65 20 73 74 61 72  meout while star
1500: 74 69 6e 67 20 77 6f 72 6b 6c 6f 61 64 20 23 22  ting workload #"
1510: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 65   \..          [e
1520: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6f 72 64  xpr {[string ord
1530: 69 6e 61 6c 20 24 69 6e 64 69 63 61 74 6f 72 20  inal $indicator 
1540: 30 5d 20 2d 20 5b 73 74 72 69 6e 67 20 6f 72 64  0] - [string ord
1550: 69 6e 61 6c 20 41 20 30 5d 20 2b 20 31 7d 5d 5d  inal A 0] + 1}]]
1560: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
1570: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
1580: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
15c0: 0a 0d 0a 20 20 70 72 6f 63 20 73 68 6f 77 54 65  ...  proc showTe
15d0: 73 74 20 7b 20 69 6e 64 69 63 61 74 6f 72 20 7d  st { indicator }
15e0: 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24 3a   {..    tputs $:
15f0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69  :test_channel $i
1600: 6e 64 69 63 61 74 6f 72 0d 0a 20 20 20 20 61 70  ndicator..    ap
1610: 70 65 6e 64 20 3a 3a 69 6e 64 69 63 61 74 6f 72  pend ::indicator
1620: 73 20 24 69 6e 64 69 63 61 74 6f 72 0d 0a 20 20  s $indicator..  
1630: 20 20 64 65 6c 61 79 54 65 73 74 20 24 3a 3a 63    delayTest $::c
1640: 6f 75 6e 74 28 32 29 0d 0a 20 20 7d 0d 0a 0d 0a  ount(2)..  }....
1650: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
1660: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1670: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1680: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1690: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
16a0: 0a 0d 0a 20 20 70 72 6f 63 20 64 6f 6e 65 54 65  ...  proc doneTe
16b0: 73 74 20 7b 20 7b 69 6e 64 69 63 61 74 6f 72 20  st { {indicator 
16c0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20  ""} } {..    if 
16d0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
16e0: 24 69 6e 64 69 63 61 74 6f 72 5d 20 3e 20 30 7d  $indicator] > 0}
16f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 6c   then {..      l
1700: 61 70 70 65 6e 64 20 3a 3a 73 74 61 74 75 73 28  append ::status(
1710: 64 6f 6e 65 29 20 24 69 6e 64 69 63 61 74 6f 72  done) $indicator
1720: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66 20  ..    }..    if 
1730: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1740: 73 74 61 74 75 73 28 64 6f 6e 65 29 5d 7d 20 74  status(done)]} t
1750: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 68 6f 73  hen {..      hos
1760: 74 20 74 69 74 6c 65 20 24 3a 3a 73 74 61 74 75  t title $::statu
1770: 73 28 64 6f 6e 65 29 0d 0a 20 20 20 20 7d 20 65  s(done)..    } e
1780: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 68 6f 73  lse {..      hos
1790: 74 20 74 69 74 6c 65 20 22 22 0d 0a 20 20 20 20  t title ""..    
17a0: 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 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 23 23 23 23 23  ################
17f0: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70  #########....  p
1800: 72 6f 63 20 66 61 69 6c 54 65 73 74 20 7b 20 69  roc failTest { i
1810: 6e 64 69 63 61 74 6f 72 20 65 72 72 6f 72 20 7d  ndicator error }
1820: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
1830: 20 4e 4f 54 45 3a 20 48 61 6c 74 20 61 6c 6c 20   NOTE: Halt all 
1840: 74 65 73 74 69 6e 67 20 61 6e 64 20 65 78 69 74  testing and exit
1850: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6e 6f 77   the process now
1860: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 2d 4f  ..    #       -O
1870: 52 2d 20 6a 75 73 74 20 72 65 63 6f 72 64 20 74  R- just record t
1880: 68 65 20 66 61 69 6c 75 72 65 20 61 6e 64 20 63  he failure and c
1890: 6f 6e 74 69 6e 75 65 3f 0d 0a 20 20 20 20 23 0d  ontinue?..    #.
18a0: 0a 20 20 20 20 73 65 74 20 6c 65 76 65 6c 20 5b  .    set level [
18b0: 65 78 70 72 20 7b 5b 69 6e 66 6f 20 6c 65 76 65  expr {[info leve
18c0: 6c 5d 20 2d 20 31 7d 5d 0d 0a 0d 0a 20 20 20 20  l] - 1}]....    
18d0: 69 66 20 7b 24 3a 3a 65 78 69 74 4f 6e 46 61 69  if {$::exitOnFai
18e0: 6c 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  l} then {..     
18f0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1900: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1910: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1920: 5c 6e 20 5b 69 6e 66 6f 20 6c 65 76 65 6c 20 24  \n [info level $
1930: 6c 65 76 65 6c 5d 20 22 3a 20 22 20 5c 6e 5c 74  level] ": " \n\t
1940: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20   $error \n].... 
1950: 20 20 20 20 20 65 78 69 74 20 66 61 69 6c 75 72       exit failur
1960: 65 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  e..    } else {.
1970: 0a 20 20 20 20 20 20 74 6c 6f 67 20 5b 61 70 70  .      tlog [app
1980: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1990: 20 20 20 20 20 22 5c 6e 2d 2d 2d 2d 20 42 45 47       "\n---- BEG
19a0: 49 4e 20 54 45 53 54 20 46 41 49 4c 55 52 45 20  IN TEST FAILURE 
19b0: 4f 55 54 50 55 54 5c 6e 22 20 5c 0d 0a 20 20 20  OUTPUT\n" \..   
19c0: 20 20 20 20 20 20 20 5c 6e 20 5b 69 6e 66 6f 20         \n [info 
19d0: 6c 65 76 65 6c 20 24 6c 65 76 65 6c 5d 20 22 3a  level $level] ":
19e0: 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
19f0: 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  n \..          "
1a00: 5c 6e 2d 2d 2d 2d 20 45 4e 44 20 54 45 53 54 20  \n---- END TEST 
1a10: 46 41 49 4c 55 52 45 20 4f 55 54 50 55 54 5c 6e  FAILURE OUTPUT\n
1a20: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74  "]....      tput
1a30: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1a40: 6c 20 24 69 6e 64 69 63 61 74 6f 72 0d 0a 0d 0a  l $indicator....
1a50: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1a60: 20 65 78 69 73 74 73 20 3a 3a 66 61 69 6c 75 72   exists ::failur
1a70: 65 73 28 24 69 6e 64 69 63 61 74 6f 72 29 5d 7d  es($indicator)]}
1a80: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a90: 20 73 65 74 20 3a 3a 66 61 69 6c 75 72 65 73 28   set ::failures(
1aa0: 24 69 6e 64 69 63 61 74 6f 72 29 20 30 0d 0a 20  $indicator) 0.. 
1ab0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1ac0: 69 6e 63 72 20 3a 3a 66 61 69 6c 75 72 65 73 28  incr ::failures(
1ad0: 24 69 6e 64 69 63 61 74 6f 72 29 0d 0a 20 20 20  $indicator)..   
1ae0: 20 20 20 64 65 6c 61 79 54 65 73 74 20 24 3a 3a     delayTest $::
1af0: 63 6f 75 6e 74 28 32 29 0d 0a 20 20 20 20 7d 0d  count(2)..    }.
1b00: 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23  .  }....  ######
1b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b50: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f  #######....  pro
1b60: 63 20 61 6c 6c 6f 63 4d 65 6d 20 7b 20 73 69 7a  c allocMem { siz
1b70: 65 20 7d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 24  e } {..    if {$
1b80: 3a 3a 63 6f 54 61 73 6b 4d 65 6d 7d 20 74 68 65  ::coTaskMem} the
1b90: 6e 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  n {..      retur
1ba0: 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  n [object invoke
1bb0: 20 2d 63 72 65 61 74 65 20 5c 0d 0a 20 20 20 20   -create \..    
1bc0: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 52 75 6e        System.Run
1bd0: 74 69 6d 65 2e 49 6e 74 65 72 6f 70 53 65 72 76  time.InteropServ
1be0: 69 63 65 73 2e 4d 61 72 73 68 61 6c 20 5c 0d 0a  ices.Marshal \..
1bf0: 20 20 20 20 20 20 20 20 20 20 41 6c 6c 6f 63 43            AllocC
1c00: 6f 54 61 73 6b 4d 65 6d 20 24 73 69 7a 65 5d 3b  oTaskMem $size];
1c10: 20 23 20 74 68 72 6f 77 0d 0a 20 20 20 20 7d 20   # throw..    } 
1c20: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 73 65  else {..      se
1c30: 74 20 70 74 72 20 5b 6f 62 6a 65 63 74 20 69 6e  t ptr [object in
1c40: 76 6f 6b 65 20 2d 63 72 65 61 74 65 20 2d 66 6c  voke -create -fl
1c50: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1c60: 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79 73 74  ..          Syst
1c70: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
1c80: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
1c90: 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
1ca0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 24  sqlite3_malloc $
1cb0: 73 69 7a 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  size]....      i
1cc0: 66 20 7b 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  f {[object invok
1cd0: 65 20 24 70 74 72 20 54 6f 49 6e 74 36 34 5d 20  e $ptr ToInt64] 
1ce0: 21 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  != 0} then {..  
1cf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 70 74        return $pt
1d00: 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  r..      } else 
1d10: 7b 0d 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72  {..        error
1d20: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 73 71   [appendArgs "sq
1d30: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 22 20 24  lite3_malloc(" $
1d40: 73 69 7a 65 20 22 29 20 66 61 69 6c 65 64 22 5d  size ") failed"]
1d50: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1d60: 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23  ..  }....  #####
1d70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1da0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1db0: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72  ########....  pr
1dc0: 6f 63 20 75 73 65 4d 65 6d 20 7b 20 70 74 72 20  oc useMem { ptr 
1dd0: 73 69 7a 65 20 7d 20 7b 0d 0a 20 20 20 20 69 66  size } {..    if
1de0: 20 7b 21 5b 69 73 4d 6f 6e 6f 5d 7d 20 74 68 65   {![isMono]} the
1df0: 6e 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n {..      #..  
1e00: 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68 65 20      # HACK: The 
1e10: 74 79 70 65 20 73 69 67 6e 61 74 75 72 65 20 6f  type signature o
1e20: 66 20 74 68 65 20 5a 65 72 6f 4d 65 6d 6f 72 79  f the ZeroMemory
1e30: 20 6d 65 74 68 6f 64 20 63 68 61 6e 67 65 64 20   method changed 
1e40: 61 73 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  as of the..     
1e50: 20 23 20 20 20 20 20 20 20 2e 4e 45 54 20 46 72   #       .NET Fr
1e60: 61 6d 65 77 6f 72 6b 20 34 2e 35 2e 20 20 54 68  amework 4.5.  Th
1e70: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1e80: 74 20 77 65 6e 74 20 66 72 6f 6d 20 62 65 69 6e  t went from bein
1e90: 67 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  g of..      #   
1ea0: 20 20 20 20 74 79 70 65 20 55 49 6e 74 20 74 6f      type UInt to
1eb0: 20 74 79 70 65 20 55 49 6e 74 50 74 72 2e 0d 0a   type UIntPtr...
1ec0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1ed0: 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  f {[haveConstrai
1ee0: 6e 74 20 64 6f 74 4e 65 74 34 30 5d 20 26 26 20  nt dotNet40] && 
1ef0: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
1f00: 64 6f 74 4e 65 74 34 35 5d 7d 20 74 68 65 6e 20  dotNet45]} then 
1f10: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e  {..        set n
1f20: 65 77 53 69 7a 65 20 5b 6f 62 6a 65 63 74 20 63  ewSize [object c
1f30: 72 65 61 74 65 20 55 49 6e 74 50 74 72 20 24 73  reate UIntPtr $s
1f40: 69 7a 65 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ize]..      } el
1f50: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
1f60: 74 20 6e 65 77 53 69 7a 65 20 24 73 69 7a 65 0d  t newSize $size.
1f70: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1f80: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1f90: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1fa0: 63 20 4d 69 63 72 6f 73 6f 66 74 2e 57 69 6e 33  c Microsoft.Win3
1fb0: 32 2e 57 69 6e 33 32 4e 61 74 69 76 65 20 5c 0d  2.Win32Native \.
1fc0: 0a 20 20 20 20 20 20 20 20 20 20 5a 65 72 6f 4d  .          ZeroM
1fd0: 65 6d 6f 72 79 20 24 70 74 72 20 24 6e 65 77 53  emory $ptr $newS
1fe0: 69 7a 65 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  ize..    }..  }.
1ff0: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
2000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2040: 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20 66 72 65  ##....  proc fre
2050: 65 4d 65 6d 20 7b 20 70 74 72 20 7d 20 7b 0d 0a  eMem { ptr } {..
2060: 20 20 20 20 69 66 20 7b 24 3a 3a 63 6f 54 61 73      if {$::coTas
2070: 6b 4d 65 6d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  kMem} then {..  
2080: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
2090: 65 20 53 79 73 74 65 6d 2e 52 75 6e 74 69 6d 65  e System.Runtime
20a0: 2e 49 6e 74 65 72 6f 70 53 65 72 76 69 63 65 73  .InteropServices
20b0: 2e 4d 61 72 73 68 61 6c 20 5c 0d 0a 20 20 20 20  .Marshal \..    
20c0: 20 20 20 20 20 20 46 72 65 65 43 6f 54 61 73 6b        FreeCoTask
20d0: 4d 65 6d 20 24 70 74 72 0d 0a 20 20 20 20 7d 20  Mem $ptr..    } 
20e0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 6f 62  else {..      ob
20f0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
2100: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
2110: 0a 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65  .          Syste
2120: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
2130: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
2140: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  s \..          s
2150: 71 6c 69 74 65 33 5f 66 72 65 65 20 24 70 74 72  qlite3_free $ptr
2160: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23  ..    }....    #
2170: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 72  ..    # NOTE: Fr
2180: 65 65 20 65 78 74 72 61 20 6f 70 61 71 75 65 20  ee extra opaque 
2190: 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 72 65  object handle re
21a0: 66 65 72 65 6e 63 65 20 61 64 64 65 64 20 62 79  ference added by
21b0: 20 74 68 65 0d 0a 20 20 20 20 23 20 20 20 20 20   the..    #     
21c0: 20 20 5b 72 65 74 75 72 6e 5d 20 63 6f 6d 6d 61    [return] comma
21d0: 6e 64 20 69 6e 20 5b 61 6c 6c 6f 63 4d 65 6d 5d  nd in [allocMem]
21e0: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 6f 62  ...    #..    ob
21f0: 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24 70 74  ject dispose $pt
2200: 72 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23  r..  }....  ####
2210: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2250: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70  #########....  p
2260: 72 6f 63 20 73 65 74 75 70 4c 6f 67 67 69 6e 67  roc setupLogging
2270: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
2280: 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20  .    if {![info 
2290: 65 78 69 73 74 73 20 3a 3a 6c 6f 67 4c 69 73 74  exists ::logList
22a0: 65 6e 65 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ener]} then {.. 
22b0: 20 20 20 20 20 73 65 74 20 3a 3a 6c 6f 67 4c 69       set ::logLi
22c0: 73 74 65 6e 65 72 20 5b 6f 62 6a 65 63 74 20 63  stener [object c
22d0: 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a  reate -alias \..
22e0: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
22f0: 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 54 65 78  .Diagnostics.Tex
2300: 74 57 72 69 74 65 72 54 72 61 63 65 4c 69 73 74  tWriterTraceList
2310: 65 6e 65 72 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ener $fileName].
2320: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 6f 62  .    }....    ob
2330: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74  ject invoke Syst
2340: 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 54  em.Diagnostics.T
2350: 72 61 63 65 2e 4c 69 73 74 65 6e 65 72 73 20 41  race.Listeners A
2360: 64 64 20 24 3a 3a 6c 6f 67 4c 69 73 74 65 6e 65  dd $::logListene
2370: 72 0d 0a 20 20 20 20 6f 62 6a 65 63 74 20 69 6e  r..    object in
2380: 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44 61 74 61  voke System.Data
2390: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4c 6f  .SQLite.SQLiteLo
23a0: 67 20 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 0d 0a  g Initialize....
23b0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
23c0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
23d0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
23e0: 20 22 2d 2d 2d 2d 20 65 6e 61 62 6c 65 64 20 53   "---- enabled S
23f0: 51 4c 69 74 65 20 74 72 61 63 65 20 6c 6f 67 67  QLite trace logg
2400: 69 6e 67 20 74 6f 20 66 69 6c 65 20 5c 22 22 20  ing to file \"" 
2410: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  $fileName \"\n].
2420: 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23  .  }....  ######
2430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2470: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f  #######....  pro
2480: 63 20 63 6c 65 61 6e 75 70 4c 6f 67 67 69 6e 67  c cleanupLogging
2490: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
24a0: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
24b0: 78 69 73 74 73 20 3a 3a 6c 6f 67 4c 69 73 74 65  xists ::logListe
24c0: 6e 65 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ner]} then {..  
24d0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
24e0: 65 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73  e System.Diagnos
24f0: 74 69 63 73 2e 54 72 61 63 65 2e 4c 69 73 74 65  tics.Trace.Liste
2500: 6e 65 72 73 20 52 65 6d 6f 76 65 20 24 3a 3a 6c  ners Remove $::l
2510: 6f 67 4c 69 73 74 65 6e 65 72 0d 0a 20 20 20 20  ogListener..    
2520: 20 20 24 3a 3a 6c 6f 67 4c 69 73 74 65 6e 65 72    $::logListener
2530: 20 43 6c 6f 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d   Close..    }...
2540: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
2550: 54 45 3a 20 43 6f 70 79 20 74 68 65 20 74 72 61  TE: Copy the tra
2560: 63 65 20 6c 69 73 74 65 6e 65 72 20 6c 6f 67 20  ce listener log 
2570: 66 69 6c 65 20 74 6f 20 74 68 65 20 6d 61 69 6e  file to the main
2580: 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d   test log file..
2590: 0a 20 20 20 20 23 0d 0a 20 20 20 20 74 6c 6f 67  .    #..    tlog
25a0: 20 22 2d 2d 2d 2d 20 42 45 47 49 4e 20 54 52 41   "---- BEGIN TRA
25b0: 43 45 20 4c 49 53 54 45 4e 45 52 20 4f 55 54 50  CE LISTENER OUTP
25c0: 55 54 5c 6e 22 0d 0a 20 20 20 20 74 6c 6f 67 20  UT\n"..    tlog 
25d0: 5b 72 65 61 64 46 69 6c 65 20 24 66 69 6c 65 4e  [readFile $fileN
25e0: 61 6d 65 5d 0d 0a 20 20 20 20 74 6c 6f 67 20 22  ame]..    tlog "
25f0: 5c 6e 2d 2d 2d 2d 20 45 4e 44 20 54 52 41 43 45  \n---- END TRACE
2600: 20 4c 49 53 54 45 4e 45 52 20 4f 55 54 50 55 54   LISTENER OUTPUT
2610: 5c 6e 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20  \n"....    #..  
2620: 20 20 23 20 4e 4f 54 45 3a 20 44 65 6c 65 74 65    # NOTE: Delete
2630: 20 74 68 65 20 74 72 61 63 65 20 6c 69 73 74 65   the trace liste
2640: 6e 65 72 20 6c 6f 67 20 66 69 6c 65 20 62 65 63  ner log file bec
2650: 61 75 73 65 20 69 74 73 20 63 6f 6e 74 65 6e 74  ause its content
2660: 73 20 68 61 76 65 0d 0a 20 20 20 20 23 20 20 20  s have..    #   
2670: 20 20 20 20 62 65 65 6e 20 63 6f 70 69 65 64 20      been copied 
2680: 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 73 74  to the main test
2690: 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20   log file...    
26a0: 23 0d 0a 20 20 20 20 63 6c 65 61 6e 75 70 46 69  #..    cleanupFi
26b0: 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a  le $fileName....
26c0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
26d0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
26e0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
26f0: 20 22 2d 2d 2d 2d 20 64 69 73 61 62 6c 65 64 20   "---- disabled 
2700: 53 51 4c 69 74 65 20 74 72 61 63 65 20 6c 6f 67  SQLite trace log
2710: 67 69 6e 67 20 74 6f 20 66 69 6c 65 20 5c 22 22  ging to file \""
2720: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
2730: 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23  ################
2760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2780: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d  ########....  #.
2790: 0a 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70  .  # NOTE: Setup
27a0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
27b0: 75 65 73 20 66 6f 72 20 74 68 65 20 74 75 6e 61  ues for the tuna
27c0: 62 6c 65 20 77 6f 72 6b 6c 6f 61 64 20 70 61 72  ble workload par
27d0: 61 6d 65 74 65 72 73 2e 20 20 41 6e 79 2c 0d 0a  ameters.  Any,..
27e0: 20 20 23 20 20 20 20 20 20 20 61 6c 6c 2c 20 6f    #       all, o
27f0: 72 20 6e 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  r none of these 
2800: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 65 6e  may be overriden
2810: 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64   via the command
2820: 20 6c 69 6e 65 2e 0d 0a 20 20 23 0d 0a 20 20 73   line...  #..  s
2830: 65 74 20 63 6f 75 6e 74 28 30 29 20 33 3b 20 20  et count(0) 3;  
2840: 20 20 20 20 20 20 20 23 20 57 6f 72 6b 6c 6f 61         # Workloa
2850: 64 20 72 65 70 65 61 74 20 63 6f 75 6e 74 20 28  d repeat count (
2860: 69 2e 65 2e 20 74 6f 74 61 6c 20 66 75 6c 6c 20  i.e. total full 
2870: 72 75 6e 73 29 2e 0d 0a 20 20 73 65 74 20 63 6f  runs)...  set co
2880: 75 6e 74 28 31 29 20 35 3b 20 20 20 20 20 20 20  unt(1) 5;       
2890: 20 20 23 20 57 6f 72 6b 6c 6f 61 64 20 69 74 65    # Workload ite
28a0: 72 61 74 69 6f 6e 20 63 6f 75 6e 74 20 28 69 2e  ration count (i.
28b0: 65 2e 20 77 69 74 68 69 6e 20 61 20 72 75 6e 29  e. within a run)
28c0: 2e 0d 0a 20 20 73 65 74 20 63 6f 75 6e 74 28 32  ...  set count(2
28d0: 29 20 32 30 30 3b 20 20 20 20 20 20 20 23 20 57  ) 200;       # W
28e0: 6f 72 6b 6c 6f 61 64 20 69 74 65 72 61 74 69 6f  orkload iteratio
28f0: 6e 20 64 65 6c 61 79 2c 20 69 6e 20 6d 69 6c 6c  n delay, in mill
2900: 69 73 65 63 6f 6e 64 73 2e 0d 0a 20 20 73 65 74  iseconds...  set
2910: 20 63 6f 75 6e 74 28 33 29 20 35 37 3b 20 20 20   count(3) 57;   
2920: 20 20 20 20 20 23 20 57 6f 72 6b 6c 6f 61 64 20       # Workload 
2930: 22 73 6d 61 6c 6c 22 20 64 61 74 61 20 63 68 75  "small" data chu
2940: 6e 6b 20 73 69 7a 65 2c 20 69 6e 20 62 79 74 65  nk size, in byte
2950: 73 2e 0d 0a 20 20 73 65 74 20 63 6f 75 6e 74 28  s...  set count(
2960: 34 29 20 31 30 30 30 30 3b 20 20 20 20 20 23 20  4) 10000;     # 
2970: 57 6f 72 6b 6c 6f 61 64 20 22 62 69 67 22 20 64  Workload "big" d
2980: 61 74 61 20 63 68 75 6e 6b 20 73 69 7a 65 2c 20  ata chunk size, 
2990: 69 6e 20 62 79 74 65 73 2e 0d 0a 20 20 73 65 74  in bytes...  set
29a0: 20 63 6f 75 6e 74 28 35 29 20 32 30 39 37 31 35   count(5) 209715
29b0: 32 30 30 3b 20 23 20 4d 61 78 69 6d 75 6d 20 68  200; # Maximum h
29c0: 65 61 70 20 6d 65 6d 6f 72 79 20 74 6f 20 65 78  eap memory to ex
29d0: 63 6c 75 64 65 20 61 74 20 6f 6e 65 20 74 69 6d  clude at one tim
29e0: 65 2e 0d 0a 20 20 73 65 74 20 6e 6f 57 6f 72 6b  e...  set noWork
29f0: 6c 6f 61 64 20 5b 6c 69 73 74 5d 3b 20 20 23 20  load [list];  # 
2a00: 57 6f 72 6b 6c 6f 61 64 73 20 74 6f 20 62 65 20  Workloads to be 
2a10: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
2a20: 20 72 75 6e 2c 20 62 79 20 69 6e 64 65 78 2e 0d   run, by index..
2a30: 0a 20 20 73 65 74 20 70 72 69 6f 72 69 74 69 65  .  set prioritie
2a40: 73 20 5b 6c 69 73 74 5d 3b 20 20 23 20 44 69 63  s [list];  # Dic
2a50: 74 69 6f 6e 61 72 79 20 6f 66 20 77 6f 72 6b 6c  tionary of workl
2a60: 6f 61 64 20 74 68 72 65 61 64 20 70 72 69 6f 72  oad thread prior
2a70: 69 74 69 65 73 2e 0d 0a 20 20 73 65 74 20 65 78  ities...  set ex
2a80: 69 74 4f 6e 46 61 69 6c 20 66 61 6c 73 65 3b 20  itOnFail false; 
2a90: 20 20 23 20 48 61 6c 74 20 74 65 73 74 69 6e 67    # Halt testing
2aa0: 20 61 6e 64 20 65 78 69 74 20 70 72 6f 63 65 73   and exit proces
2ab0: 73 20 6f 6e 20 74 65 73 74 20 66 61 69 6c 75 72  s on test failur
2ac0: 65 3f 0d 0a 20 20 73 65 74 20 63 6f 54 61 73 6b  e?..  set coTask
2ad0: 4d 65 6d 20 74 72 75 65 3b 20 20 20 20 20 23 20  Mem true;     # 
2ae0: 55 73 65 20 41 6c 6c 6f 63 43 6f 54 61 73 6b 4d  Use AllocCoTaskM
2af0: 65 6d 2f 46 72 65 65 43 6f 54 61 73 6b 4d 65 6d  em/FreeCoTaskMem
2b00: 20 66 6f 72 20 6d 65 6d 6f 72 79 3f 0d 0a 20 20   for memory?..  
2b10: 73 65 74 20 6e 6f 54 72 61 63 65 20 66 61 6c 73  set noTrace fals
2b20: 65 3b 20 20 20 20 20 20 23 20 44 69 73 61 62 6c  e;      # Disabl
2b30: 65 20 53 51 4c 69 74 65 20 74 72 61 63 65 20 6c  e SQLite trace l
2b40: 6f 67 67 69 6e 67 20 74 6f 20 61 20 66 69 6c 65  ogging to a file
2b50: 3f 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  ?....  #########
2b60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2b80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2b90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ba0: 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23  ####....  #..  #
2bb0: 20 4e 4f 54 45 3a 20 49 66 20 63 6f 6d 6d 61 6e   NOTE: If comman
2bc0: 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73  d line arguments
2bd0: 20 74 6f 20 74 68 65 20 74 65 73 74 20 73 75 69   to the test sui
2be0: 74 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  te are available
2bf0: 2c 20 70 72 6f 63 65 73 73 0d 0a 20 20 23 20 20  , process..  #  
2c00: 20 20 20 20 20 74 68 65 6d 20 66 6f 72 20 61 6e       them for an
2c10: 79 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 61  y options that a
2c20: 72 65 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f  re applicable to
2c30: 20 74 68 69 73 20 74 65 73 74 20 28 69 2e 65 2e   this test (i.e.
2c40: 20 61 6e 79 20 6f 66 0d 0a 20 20 23 20 20 20 20   any of..  #    
2c50: 20 20 20 74 68 65 20 74 75 6e 61 62 6c 65 20 77     the tunable w
2c60: 6f 72 6b 6c 6f 61 64 20 70 61 72 61 6d 65 74 65  orkload paramete
2c70: 72 73 20 6c 69 73 74 65 64 20 61 62 6f 76 65 29  rs listed above)
2c80: 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 5b 69  ...  #..  if {[i
2c90: 6e 66 6f 20 65 78 69 73 74 73 20 61 72 67 76 5d  nfo exists argv]
2ca0: 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24 61 72   && [llength $ar
2cb0: 67 76 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  gv] > 0} then {.
2cc0: 0a 20 20 20 20 70 61 72 73 65 20 6f 70 74 69 6f  .    parse optio
2cd0: 6e 73 20 2d 66 6c 61 67 73 20 5c 0d 0a 20 20 20  ns -flags \..   
2ce0: 20 20 20 20 20 7b 2d 53 74 6f 70 4f 6e 55 6e 6b       {-StopOnUnk
2cf0: 6e 6f 77 6e 4f 70 74 69 6f 6e 20 2b 49 67 6e 6f  nownOption +Igno
2d00: 72 65 4f 6e 55 6e 6b 6e 6f 77 6e 4f 70 74 69 6f  reOnUnknownOptio
2d10: 6e 20 53 6b 69 70 4f 6e 55 6e 6b 6e 6f 77 6e 4f  n SkipOnUnknownO
2d20: 70 74 69 6f 6e 7d 20 2d 2d 20 5c 0d 0a 20 20 20  ption} -- \..   
2d30: 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 73 74       [list [list
2d40: 20 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 49 6e   null MustHaveIn
2d50: 74 65 67 65 72 56 61 6c 75 65 20 2d 31 20 2d 31  tegerValue -1 -1
2d60: 20 2d 63 6f 75 6e 74 30 20 24 63 6f 75 6e 74 28   -count0 $count(
2d70: 30 29 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b  0)] \..        [
2d80: 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48 61  list null MustHa
2d90: 76 65 49 6e 74 65 67 65 72 56 61 6c 75 65 20 2d  veIntegerValue -
2da0: 31 20 2d 31 20 2d 63 6f 75 6e 74 31 20 24 63 6f  1 -1 -count1 $co
2db0: 75 6e 74 28 31 29 5d 20 5c 0d 0a 20 20 20 20 20  unt(1)] \..     
2dc0: 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75     [list null Mu
2dd0: 73 74 48 61 76 65 49 6e 74 65 67 65 72 56 61 6c  stHaveIntegerVal
2de0: 75 65 20 2d 31 20 2d 31 20 2d 63 6f 75 6e 74 32  ue -1 -1 -count2
2df0: 20 24 63 6f 75 6e 74 28 32 29 5d 20 5c 0d 0a 20   $count(2)] \.. 
2e00: 20 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75 6c         [list nul
2e10: 6c 20 4d 75 73 74 48 61 76 65 49 6e 74 65 67 65  l MustHaveIntege
2e20: 72 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 63 6f  rValue -1 -1 -co
2e30: 75 6e 74 33 20 24 63 6f 75 6e 74 28 33 29 5d 20  unt3 $count(3)] 
2e40: 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73 74  \..        [list
2e50: 20 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 49 6e   null MustHaveIn
2e60: 74 65 67 65 72 56 61 6c 75 65 20 2d 31 20 2d 31  tegerValue -1 -1
2e70: 20 2d 63 6f 75 6e 74 34 20 24 63 6f 75 6e 74 28   -count4 $count(
2e80: 34 29 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b  4)] \..        [
2e90: 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48 61  list null MustHa
2ea0: 76 65 49 6e 74 65 67 65 72 56 61 6c 75 65 20 2d  veIntegerValue -
2eb0: 31 20 2d 31 20 2d 63 6f 75 6e 74 35 20 24 63 6f  1 -1 -count5 $co
2ec0: 75 6e 74 28 35 29 5d 20 5c 0d 0a 20 20 20 20 20  unt(5)] \..     
2ed0: 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75     [list null Mu
2ee0: 73 74 48 61 76 65 4c 69 73 74 56 61 6c 75 65 20  stHaveListValue 
2ef0: 2d 31 20 2d 31 20 2d 6e 6f 57 6f 72 6b 6c 6f 61  -1 -1 -noWorkloa
2f00: 64 20 24 6e 6f 57 6f 72 6b 6c 6f 61 64 5d 20 5c  d $noWorkload] \
2f10: 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20  ..        [list 
2f20: 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 4c 69 73  null MustHaveLis
2f30: 74 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 70 72  tValue -1 -1 -pr
2f40: 69 6f 72 69 74 69 65 73 20 24 70 72 69 6f 72 69  iorities $priori
2f50: 74 69 65 73 5d 20 5c 0d 0a 20 20 20 20 20 20 20  ties] \..       
2f60: 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74   [list null Must
2f70: 48 61 76 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65  HaveBooleanValue
2f80: 20 2d 31 20 2d 31 20 2d 65 78 69 74 4f 6e 46 61   -1 -1 -exitOnFa
2f90: 69 6c 20 24 65 78 69 74 4f 6e 46 61 69 6c 5d 20  il $exitOnFail] 
2fa0: 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73 74  \..        [list
2fb0: 20 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 42 6f   null MustHaveBo
2fc0: 6f 6c 65 61 6e 56 61 6c 75 65 20 2d 31 20 2d 31  oleanValue -1 -1
2fd0: 20 2d 63 6f 54 61 73 6b 4d 65 6d 20 24 63 6f 54   -coTaskMem $coT
2fe0: 61 73 6b 4d 65 6d 5d 20 5c 0d 0a 20 20 20 20 20  askMem] \..     
2ff0: 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75     [list null Mu
3000: 73 74 48 61 76 65 42 6f 6f 6c 65 61 6e 56 61 6c  stHaveBooleanVal
3010: 75 65 20 2d 31 20 2d 31 20 2d 6e 6f 54 72 61 63  ue -1 -1 -noTrac
3020: 65 20 24 6e 6f 54 72 61 63 65 5d 5d 20 24 61 72  e $noTrace]] $ar
3030: 67 76 0d 0a 0d 0a 20 20 20 20 73 65 74 20 63 6f  gv....    set co
3040: 75 6e 74 28 30 29 20 24 6f 70 74 69 6f 6e 73 28  unt(0) $options(
3050: 2d 63 6f 75 6e 74 30 2c 76 61 6c 75 65 29 0d 0a  -count0,value)..
3060: 20 20 20 20 73 65 74 20 63 6f 75 6e 74 28 31 29      set count(1)
3070: 20 24 6f 70 74 69 6f 6e 73 28 2d 63 6f 75 6e 74   $options(-count
3080: 31 2c 76 61 6c 75 65 29 0d 0a 20 20 20 20 73 65  1,value)..    se
3090: 74 20 63 6f 75 6e 74 28 32 29 20 24 6f 70 74 69  t count(2) $opti
30a0: 6f 6e 73 28 2d 63 6f 75 6e 74 32 2c 76 61 6c 75  ons(-count2,valu
30b0: 65 29 0d 0a 20 20 20 20 73 65 74 20 63 6f 75 6e  e)..    set coun
30c0: 74 28 33 29 20 24 6f 70 74 69 6f 6e 73 28 2d 63  t(3) $options(-c
30d0: 6f 75 6e 74 33 2c 76 61 6c 75 65 29 0d 0a 20 20  ount3,value)..  
30e0: 20 20 73 65 74 20 63 6f 75 6e 74 28 34 29 20 24    set count(4) $
30f0: 6f 70 74 69 6f 6e 73 28 2d 63 6f 75 6e 74 34 2c  options(-count4,
3100: 76 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74 20  value)..    set 
3110: 63 6f 75 6e 74 28 35 29 20 24 6f 70 74 69 6f 6e  count(5) $option
3120: 73 28 2d 63 6f 75 6e 74 35 2c 76 61 6c 75 65 29  s(-count5,value)
3130: 0d 0a 20 20 20 20 73 65 74 20 6e 6f 57 6f 72 6b  ..    set noWork
3140: 6c 6f 61 64 20 24 6f 70 74 69 6f 6e 73 28 2d 6e  load $options(-n
3150: 6f 57 6f 72 6b 6c 6f 61 64 2c 76 61 6c 75 65 29  oWorkload,value)
3160: 0d 0a 20 20 20 20 73 65 74 20 70 72 69 6f 72 69  ..    set priori
3170: 74 69 65 73 20 24 6f 70 74 69 6f 6e 73 28 2d 70  ties $options(-p
3180: 72 69 6f 72 69 74 69 65 73 2c 76 61 6c 75 65 29  riorities,value)
3190: 0d 0a 20 20 20 20 73 65 74 20 65 78 69 74 4f 6e  ..    set exitOn
31a0: 46 61 69 6c 20 24 6f 70 74 69 6f 6e 73 28 2d 65  Fail $options(-e
31b0: 78 69 74 4f 6e 46 61 69 6c 2c 76 61 6c 75 65 29  xitOnFail,value)
31c0: 0d 0a 20 20 20 20 73 65 74 20 63 6f 54 61 73 6b  ..    set coTask
31d0: 4d 65 6d 20 24 6f 70 74 69 6f 6e 73 28 2d 63 6f  Mem $options(-co
31e0: 54 61 73 6b 4d 65 6d 2c 76 61 6c 75 65 29 0d 0a  TaskMem,value)..
31f0: 20 20 20 20 73 65 74 20 6e 6f 54 72 61 63 65 20      set noTrace 
3200: 24 6f 70 74 69 6f 6e 73 28 2d 6e 6f 54 72 61 63  $options(-noTrac
3210: 65 2c 76 61 6c 75 65 29 0d 0a 20 20 7d 0d 0a 0d  e,value)..  }...
3220: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
3230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3270: 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
3280: 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70  E: Load custom p
3290: 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
32a0: 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
32b0: 74 69 6e 67 73 2e 20 20 43 75 72 72 65 6e 74 6c  tings.  Currentl
32c0: 79 2c 20 74 68 69 73 0d 0a 20 20 23 20 20 20 20  y, this..  #    
32d0: 20 20 20 69 73 20 64 6f 6e 65 20 61 66 74 65 72     is done after
32e0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20   processing the 
32f0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
3300: 69 6f 6e 73 2e 20 20 54 68 65 20 73 65 74 74 69  ions.  The setti
3310: 6e 67 73 20 66 69 6c 65 0d 0a 20 20 23 20 20 20  ngs file..  #   
3320: 20 20 20 20 73 68 6f 75 6c 64 20 74 61 6b 65 20      should take 
3330: 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 74 68 65  into account the
3340: 20 65 78 69 73 74 69 6e 67 20 77 6f 72 6b 6c 6f   existing worklo
3350: 61 64 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e  ad parameters an
3360: 64 20 61 76 6f 69 64 0d 0a 20 20 23 20 20 20 20  d avoid..  #    
3370: 20 20 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 20     changing any 
3380: 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 61 6c  that may have al
3390: 72 65 61 64 79 20 62 65 65 6e 20 6f 76 65 72 72  ready been overr
33a0: 69 64 64 65 6e 2e 0d 0a 20 20 23 0d 0a 20 20 6c  idden...  #..  l
33b0: 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
33c0: 74 69 6e 67 73 20 24 74 65 73 74 5f 63 68 61 6e  tings $test_chan
33d0: 6e 65 6c 20 2e 73 74 72 65 73 73 0d 0a 0d 0a 20  nel .stress.... 
33e0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
33f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3400: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3410: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
3430: 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
3440: 20 54 68 65 20 74 72 61 63 65 20 6c 69 73 74 65   The trace liste
3450: 6e 65 72 20 75 73 65 64 20 77 69 74 68 20 74 68  ner used with th
3460: 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73  e SQLiteLog clas
3470: 73 20 74 6f 20 63 61 70 74 75 72 65 20 6f 75 74  s to capture out
3480: 70 75 74 0d 0a 20 20 23 20 20 20 20 20 20 20 66  put..  #       f
3490: 72 6f 6d 20 74 68 65 20 63 6f 72 65 20 53 51 4c  rom the core SQL
34a0: 69 74 65 20 6c 69 62 72 61 72 79 20 72 65 71 75  ite library requ
34b0: 69 72 65 73 20 69 74 73 20 6f 77 6e 20 6c 6f 67  ires its own log
34c0: 20 66 69 6c 65 20 62 65 63 61 75 73 65 20 74 68   file because th
34d0: 65 0d 0a 20 20 23 20 20 20 20 20 20 20 54 65 78  e..  #       Tex
34e0: 74 57 72 69 74 65 72 54 72 61 63 65 4c 69 73 74  tWriterTraceList
34f0: 65 6e 65 72 20 63 6c 61 73 73 20 6f 70 65 6e 73  ener class opens
3500: 20 61 6e 64 20 6c 6f 63 6b 73 20 74 68 65 20 6c   and locks the l
3510: 6f 67 20 66 69 6c 65 20 69 74 20 75 73 65 73 0d  og file it uses.
3520: 0a 20 20 23 20 20 20 20 20 20 20 61 73 20 74 68  .  #       as th
3530: 65 20 62 61 73 69 73 20 6f 66 20 74 68 65 20 6f  e basis of the o
3540: 75 74 70 75 74 20 73 74 72 65 61 6d 2e 20 20 42  utput stream.  B
3550: 65 66 6f 72 65 20 74 68 69 73 20 74 65 73 74 20  efore this test 
3560: 69 73 20 63 6f 6d 70 6c 65 74 65 2c 0d 0a 20 20  is complete,..  
3570: 23 20 20 20 20 20 20 20 74 68 65 20 65 6e 74 69  #       the enti
3580: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3590: 68 69 73 20 74 72 61 63 65 20 6c 6f 67 20 66 69  his trace log fi
35a0: 6c 65 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65  le will be copie
35b0: 64 20 69 6e 74 6f 20 74 68 65 0d 0a 20 20 23 20  d into the..  # 
35c0: 20 20 20 20 20 20 6d 61 69 6e 20 74 65 73 74 20        main test 
35d0: 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20 74 68 65  log file and the
35e0: 6e 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 23 0d  n deleted...  #.
35f0: 0a 20 20 69 66 20 7b 21 24 6e 6f 54 72 61 63 65  .  if {!$noTrace
3600: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65  } then {..    se
3610: 74 20 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 5b 61  t logFileName [a
3620: 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20  ppendArgs [file 
3630: 72 6f 6f 74 6e 61 6d 65 20 24 74 65 73 74 5f 6c  rootname $test_l
3640: 6f 67 5d 20 2e 74 72 61 63 65 2e 6c 6f 67 5d 0d  og] .trace.log].
3650: 0a 20 20 20 20 73 65 74 75 70 4c 6f 67 67 69 6e  .    setupLoggin
3660: 67 20 24 6c 6f 67 46 69 6c 65 4e 61 6d 65 0d 0a  g $logFileName..
3670: 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23    }....  #######
3680: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3690: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
36a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
36b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
36c0: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 74 70 75 74  ######....  tput
36d0: 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  s $test_channel 
36e0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
36f0: 20 20 20 20 20 22 2d 2d 2d 2d 20 77 6f 72 6b 6c       "---- workl
3700: 6f 61 64 73 20 77 69 6c 6c 20 72 65 70 65 61 74  oads will repeat
3710: 20 22 20 24 63 6f 75 6e 74 28 30 29 20 22 20 74   " $count(0) " t
3720: 69 6d 65 28 73 29 5c 6e 22 5d 0d 0a 0d 0a 20 20  ime(s)\n"]....  
3730: 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e  tputs $test_chan
3740: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
3750: 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77  \..      "---- w
3760: 6f 72 6b 6c 6f 61 64 73 20 77 69 6c 6c 20 68 61  orkloads will ha
3770: 76 65 20 22 20 24 63 6f 75 6e 74 28 31 29 20 22  ve " $count(1) "
3780: 20 69 74 65 72 61 74 69 6f 6e 28 73 29 5c 6e 22   iteration(s)\n"
3790: 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65  ]....  tputs $te
37a0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
37b0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
37c0: 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20  "---- workloads 
37d0: 77 69 6c 6c 20 77 61 69 74 20 61 74 20 6c 65 61  will wait at lea
37e0: 73 74 20 22 20 24 63 6f 75 6e 74 28 32 29 20 5c  st " $count(2) \
37f0: 0d 0a 20 20 20 20 20 20 22 20 6d 69 6c 6c 69 73  ..      " millis
3800: 65 63 6f 6e 64 28 73 29 20 61 66 74 65 72 20 65  econd(s) after e
3810: 61 63 68 20 69 74 65 72 61 74 69 6f 6e 5c 6e 22  ach iteration\n"
3820: 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65  ]....  tputs $te
3830: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
3840: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
3850: 22 2d 2d 2d 2d 20 73 6d 61 6c 6c 20 63 68 75 6e  "---- small chun
3860: 6b 20 73 69 7a 65 20 69 73 20 22 20 24 63 6f 75  k size is " $cou
3870: 6e 74 28 33 29 20 22 20 62 79 74 65 28 73 29 5c  nt(3) " byte(s)\
3880: 6e 22 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24  n"]....  tputs $
3890: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
38a0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
38b0: 20 20 22 2d 2d 2d 2d 20 62 69 67 20 63 68 75 6e    "---- big chun
38c0: 6b 20 73 69 7a 65 20 69 73 20 22 20 24 63 6f 75  k size is " $cou
38d0: 6e 74 28 34 29 20 22 20 62 79 74 65 28 73 29 5c  nt(4) " byte(s)\
38e0: 6e 22 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24  n"]....  tputs $
38f0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
3900: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
3910: 20 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20    "---- maximum 
3920: 65 78 63 6c 75 64 65 64 20 68 65 61 70 20 6d 65  excluded heap me
3930: 6d 6f 72 79 20 69 73 20 22 20 24 63 6f 75 6e 74  mory is " $count
3940: 28 35 29 20 22 20 62 79 74 65 28 73 29 5c 6e 22  (5) " byte(s)\n"
3950: 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65  ]....  tputs $te
3960: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
3970: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
3980: 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20  "---- workloads 
3990: 74 6f 20 62 65 20 73 6b 69 70 70 65 64 2e 2e 2e  to be skipped...
39a0: 20 22 20 5c 0d 0a 20 20 20 20 20 20 5b 65 78 70   " \..      [exp
39b0: 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6e 6f 57  r {[llength $noW
39c0: 6f 72 6b 6c 6f 61 64 5d 20 3e 20 30 20 3f 20 24  orkload] > 0 ? $
39d0: 6e 6f 57 6f 72 6b 6c 6f 61 64 20 3a 20 22 6e 6f  noWorkload : "no
39e0: 6e 65 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 74  ne"}] \n]....  t
39f0: 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e  puts $test_chann
3a00: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
3a10: 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77 6f  ..      "---- wo
3a20: 72 6b 6c 6f 61 64 73 20 70 72 69 6f 72 69 74 79  rkloads priority
3a30: 20 6f 76 65 72 72 69 64 65 73 2e 2e 2e 20 22 20   overrides... " 
3a40: 5c 0d 0a 20 20 20 20 20 20 5b 65 78 70 72 20 7b  \..      [expr {
3a50: 5b 6c 6c 65 6e 67 74 68 20 24 70 72 69 6f 72 69  [llength $priori
3a60: 74 69 65 73 5d 20 3e 20 30 20 3f 20 24 70 72 69  ties] > 0 ? $pri
3a70: 6f 72 69 74 69 65 73 20 3a 20 22 6e 6f 6e 65 22  orities : "none"
3a80: 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 74 70 75 74  }] \n]....  tput
3a90: 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  s $test_channel 
3aa0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
3ab0: 20 20 20 20 20 22 2d 2d 2d 2d 20 75 6e 65 78 70       "---- unexp
3ac0: 65 63 74 65 64 20 65 72 72 6f 72 73 20 22 20 5c  ected errors " \
3ad0: 0d 0a 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24  ..      [expr {$
3ae0: 65 78 69 74 4f 6e 46 61 69 6c 20 3f 20 22 77 69  exitOnFail ? "wi
3af0: 6c 6c 22 20 3a 20 22 77 69 6c 6c 20 6e 6f 74 22  ll" : "will not"
3b00: 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 22 20 68 61  }] \..      " ha
3b10: 6c 74 20 74 65 73 74 69 6e 67 20 61 6e 64 20 65  lt testing and e
3b20: 78 69 74 20 74 68 65 20 70 72 6f 63 65 73 73 5c  xit the process\
3b30: 6e 22 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24  n"]....  tputs $
3b40: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
3b50: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
3b60: 20 20 22 2d 2d 2d 2d 20 74 68 65 20 22 20 5b 65    "---- the " [e
3b70: 78 70 72 20 7b 24 63 6f 54 61 73 6b 4d 65 6d 20  xpr {$coTaskMem 
3b80: 3f 20 22 43 6f 54 61 73 6b 4d 65 6d 22 20 3a 20  ? "CoTaskMem" : 
3b90: 22 53 51 4c 69 74 65 22 7d 5d 20 5c 0d 0a 20 20  "SQLite"}] \..  
3ba0: 20 20 20 20 22 20 61 6c 6c 6f 63 61 74 6f 72 20      " allocator 
3bb0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
3bc0: 65 78 63 6c 75 64 65 20 68 65 61 70 20 6d 65 6d  exclude heap mem
3bd0: 6f 72 79 5c 6e 22 5d 0d 0a 0d 0a 20 20 74 70 75  ory\n"]....  tpu
3be0: 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  ts $test_channel
3bf0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
3c00: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 74 72 61 63        "---- trac
3c10: 65 20 6c 6f 67 67 69 6e 67 20 74 6f 20 61 20 66  e logging to a f
3c20: 69 6c 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20  ile is " \..    
3c30: 20 20 5b 65 78 70 72 20 7b 24 6e 6f 54 72 61 63    [expr {$noTrac
3c40: 65 20 3f 20 22 64 69 73 61 62 6c 65 64 22 20 3a  e ? "disabled" :
3c50: 20 22 65 6e 61 62 6c 65 64 22 7d 5d 20 5c 6e 5d   "enabled"}] \n]
3c60: 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23  ....  ##########
3c70: 23 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 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20  ###....  #..  # 
3cc0: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65  NOTE: Create the
3cd0: 20 77 6f 72 6b 6c 6f 61 64 20 70 72 69 6f 72 69   workload priori
3ce0: 74 79 20 61 72 72 61 79 20 62 61 73 65 64 20 6f  ty array based o
3cf0: 6e 20 74 68 65 20 70 72 69 6f 72 69 74 79 20 6c  n the priority l
3d00: 69 73 74 20 73 65 65 6e 0d 0a 20 20 23 20 20 20  ist seen..  #   
3d10: 20 20 20 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61      on the comma
3d20: 6e 64 20 6c 69 6e 65 2c 20 69 66 20 61 6e 79 2e  nd line, if any.
3d30: 0d 0a 20 20 23 0d 0a 20 20 61 72 72 61 79 20 73  ..  #..  array s
3d40: 65 74 20 70 72 69 6f 72 69 74 79 20 24 70 72 69  et priority $pri
3d50: 6f 72 69 74 69 65 73 0d 0a 0d 0a 20 20 23 23 23  orities....  ###
3d60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3da0: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
3db0: 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  #..  # NOTE: Wor
3dc0: 6b 6c 6f 61 64 73 20 23 31 32 20 61 6e 64 20 23  kloads #12 and #
3dd0: 31 33 20 63 6f 6e 74 61 69 6e 20 43 23 20 63 6f  13 contain C# co
3de0: 64 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  de that should b
3df0: 65 20 63 6f 6d 70 69 6c 65 64 2c 20 62 75 74 0d  e compiled, but.
3e00: 0a 20 20 23 20 20 20 20 20 20 20 6f 6e 6c 79 20  .  #       only 
3e10: 6f 6e 63 65 2e 20 20 54 68 65 73 65 20 76 61 72  once.  These var
3e20: 69 61 62 6c 65 73 20 6b 65 65 70 20 74 72 61 63  iables keep trac
3e30: 6b 20 6f 66 20 74 68 61 74 20 73 74 61 74 65 20  k of that state 
3e40: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 20 20  information...  
3e50: 23 20 20 20 20 20 20 20 41 6e 20 69 6e 74 65 67  #       An integ
3e60: 65 72 20 76 61 6c 75 65 20 69 6e 20 6f 6e 65 20  er value in one 
3e70: 6f 66 20 74 68 65 73 65 20 76 61 72 69 61 62 6c  of these variabl
3e80: 65 73 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6d  es means the com
3e90: 70 69 6c 61 74 69 6f 6e 20 77 61 73 0d 0a 20 20  pilation was..  
3ea0: 23 20 20 20 20 20 20 20 63 6f 6d 70 6c 65 74 65  #       complete
3eb0: 64 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  d and the result
3ec0: 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 6d 65 74  ing compiled met
3ed0: 68 6f 64 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b  hod may be invok
3ee0: 65 64 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20  ed using the..  
3ef0: 23 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e  #       followin
3f00: 67 20 63 6f 6d 6d 61 6e 64 20 28 77 68 65 72 65  g command (where
3f10: 20 24 7b 69 64 7d 20 69 73 20 74 68 65 20 76 61   ${id} is the va
3f20: 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61  lue of the varia
3f30: 62 6c 65 29 3a 0d 0a 20 20 23 0d 0a 20 20 23 20  ble):..  #..  # 
3f40: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
3f50: 20 69 6e 76 6f 6b 65 20 5f 44 79 6e 61 6d 69 63   invoke _Dynamic
3f60: 24 7b 69 64 7d 2e 54 65 73 74 24 7b 69 64 7d 20  ${id}.Test${id} 
3f70: 42 61 63 6b 75 70 41 6e 64 47 65 74 44 61 74 61  BackupAndGetData
3f80: 0d 0a 20 20 23 0d 0a 20 20 73 65 74 20 63 6f 6d  ..  #..  set com
3f90: 70 69 6c 65 64 28 31 32 29 20 22 22 0d 0a 20 20  piled(12) ""..  
3fa0: 73 65 74 20 63 6f 6d 70 69 6c 65 64 28 31 33 29  set compiled(13)
3fb0: 20 22 22 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   ""....  #######
3fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4000: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20  ######....  #.. 
4010: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73   # NOTE: This is
4020: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
4030: 74 61 62 61 73 65 20 77 69 74 68 20 73 68 61 72  tabase with shar
4040: 65 64 20 63 61 63 68 65 20 65 6e 61 62 6c 65 64  ed cache enabled
4050: 2e 0d 0a 20 20 23 0d 0a 20 20 73 65 74 20 66 69  ...  #..  set fi
4060: 6c 65 4e 61 6d 65 28 31 29 20 66 69 6c 65 3a 3a  leName(1) file::
4070: 6d 65 6d 6f 72 79 3a 3f 63 61 63 68 65 3d 73 68  memory:?cache=sh
4080: 61 72 65 64 0d 0a 0d 0a 20 20 23 23 23 23 23 23  ared....  ######
4090: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
40a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
40b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
40c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
40d0: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a  #######....  #..
40e0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69    # NOTE: This i
40f0: 73 20 61 20 6e 6f 72 6d 61 6c 20 6f 6e 2d 64 69  s a normal on-di
4100: 73 6b 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  sk database...  
4110: 23 0d 0a 20 20 73 65 74 20 66 69 6c 65 4e 61 6d  #..  set fileNam
4120: 65 28 32 29 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  e(2) [file join 
4130: 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65  [getDatabaseDire
4140: 63 74 6f 72 79 5d 20 5b 61 70 70 65 6e 64 41 72  ctory] [appendAr
4150: 67 73 20 5c 0d 0a 20 20 20 20 20 20 73 74 72 65  gs \..      stre
4160: 73 73 2d 20 5b 70 69 64 5d 20 2d 20 5b 73 74 72  ss- [pid] - [str
4170: 69 6e 67 20 74 72 69 6d 20 5b 63 6c 6f 63 6b 20  ing trim [clock 
4180: 73 65 63 6f 6e 64 73 5d 20 2d 5d 20 2e 64 62 5d  seconds] -] .db]
4190: 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  ]....  #########
41a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
41b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
41c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
41d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
41e0: 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 75 70 57  ####....  setupW
41f0: 6f 72 6b 6c 6f 61 64 4d 65 6d 44 62 20 24 66 69  orkloadMemDb $fi
4200: 6c 65 4e 61 6d 65 28 31 29 20 73 72 63 44 62 0d  leName(1) srcDb.
4210: 0a 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64  .  setupWorkload
4220: 46 69 6c 65 44 62 20 24 66 69 6c 65 4e 61 6d 65  FileDb $fileName
4230: 28 32 29 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23  (2)....  #######
4240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4280: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20  ######....  #.. 
4290: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 73 65   # NOTE: This se
42a0: 72 76 65 73 20 74 77 6f 20 70 75 72 70 6f 73 65  rves two purpose
42b0: 73 2e 20 20 46 69 72 73 74 2c 20 69 74 20 61 6c  s.  First, it al
42c0: 6c 6f 77 73 20 75 73 20 74 6f 20 76 65 72 69 66  lows us to verif
42d0: 79 20 74 68 65 20 74 72 61 63 65 0d 0a 20 20 23  y the trace..  #
42e0: 20 20 20 20 20 20 20 6c 6f 67 67 69 6e 67 20 73         logging s
42f0: 75 62 73 79 73 74 65 6d 20 69 73 20 77 6f 72 6b  ubsystem is work
4300: 69 6e 67 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ing properly.  S
4310: 65 63 6f 6e 64 2c 20 69 74 20 70 6c 61 63 65 73  econd, it places
4320: 20 74 68 65 20 66 69 6c 65 0d 0a 20 20 23 20 20   the file..  #  
4330: 20 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68       name for th
4340: 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
4350: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
4360: 74 68 65 20 74 72 61 63 65 20 6c 6f 67 20 66 69  the trace log fi
4370: 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 73 65 74 20  le...  #..  set 
4380: 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 67 65 74 44  connection [getD
4390: 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 0d 0a  bConnection]....
43a0: 20 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 4c 6f    $connection Lo
43b0: 67 4d 65 73 73 61 67 65 20 30 20 5b 61 70 70 65  gMessage 0 [appe
43c0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
43d0: 22 73 74 61 72 74 69 6e 67 20 73 74 72 65 73 73  "starting stress
43e0: 20 74 65 73 74 20 75 73 69 6e 67 20 64 61 74 61   test using data
43f0: 62 61 73 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  base \"" $fileNa
4400: 6d 65 28 32 29 20 5c 22 2e 2e 2e 5d 0d 0a 0d 0a  me(2) \"...]....
4410: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
4420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
4460: 0a 0d 0a 20 20 73 65 74 20 74 69 6d 65 6f 75 74  ...  set timeout
4470: 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
4480: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
4490: 63 20 5c 0d 0a 20 20 20 20 20 20 45 61 67 6c 65  c \..      Eagle
44a0: 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69  ._Components.Pri
44b0: 76 61 74 65 2e 54 68 72 65 61 64 4f 70 73 20 44  vate.ThreadOps D
44c0: 65 66 61 75 6c 74 4a 6f 69 6e 54 69 6d 65 6f 75  efaultJoinTimeou
44d0: 74 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74  t]....  tputs $t
44e0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
44f0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
4500: 20 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73   "---- workloads
4510: 20 77 69 6c 6c 20 73 74 61 72 74 20 62 65 66 6f   will start befo
4520: 72 65 20 6f 72 20 74 69 6d 65 6f 75 74 20 61 66  re or timeout af
4530: 74 65 72 20 22 20 24 74 69 6d 65 6f 75 74 20 5c  ter " $timeout \
4540: 0d 0a 20 20 20 20 20 20 22 20 6d 69 6c 6c 69 73  ..      " millis
4550: 65 63 6f 6e 64 28 73 29 5c 6e 22 5d 0d 0a 0d 0a  econd(s)\n"]....
4560: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
4570: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4580: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
45b0: 0a 0d 0a 20 20 73 65 74 20 65 76 65 6e 74 20 5b  ...  set event [
45c0: 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61  object create -a
45d0: 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 53 79  lias \..      Sy
45e0: 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 45  stem.Threading.E
45f0: 76 65 6e 74 57 61 69 74 48 61 6e 64 6c 65 20 66  ventWaitHandle f
4600: 61 6c 73 65 20 4d 61 6e 75 61 6c 52 65 73 65 74  alse ManualReset
4610: 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  ]....  #########
4620: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4630: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4640: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4650: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4660: 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20  ####..  #       
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20         WORKLOAD 
4690: 23 31 20 28 41 29 20 20 20 20 20 20 20 20 20 20  #1 (A)          
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46b0: 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23 23      #..  #######
46c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
46d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
46e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
46f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4700: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20  ######....  set 
4710: 77 6f 72 6b 6c 6f 61 64 28 31 29 20 5b 6c 69 73  workload(1) [lis
4720: 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74  t \..      [list
4730: 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74   srcFileName dst
4740: 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63  FileName table c
4750: 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75  ount1 count2 cou
4760: 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  nt3] {..    #.. 
4770: 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c     # NOTE: Workl
4780: 6f 61 64 20 23 31 2c 20 43 52 45 41 54 45 20 54  oad #1, CREATE T
4790: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73 2e  ABLE statements.
47a0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69  ..    #..    wai
47b0: 74 54 65 73 74 20 41 0d 0a 20 20 20 20 6c 61 70  tTest A..    lap
47c0: 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 29 20  pend ::times(1) 
47d0: 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d  [lindex [time {.
47e0: 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20  .      initTest 
47f0: 41 0d 0a 20 20 20 20 20 20 73 65 74 75 70 57 6f  A..      setupWo
4800: 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24 64 73  rkloadFileDb $ds
4810: 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  tFileName..     
4820: 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
4830: 32 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63  2} {$index <= $c
4840: 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64  ount1} {incr ind
4850: 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ex} {..        i
4860: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
4870: 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
4880: 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  te $db [appendAr
4890: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
48a0: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
48b0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
48c0: 74 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  t" \..          
48d0: 20 20 20 20 24 69 6e 64 65 78 20 22 28 78 20 50      $index "(x P
48e0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 2c 20 7a  RIMARY KEY, y, z
48f0: 29 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  );"]..          
4900: 73 68 6f 77 54 65 73 74 20 41 0d 0a 20 20 20 20  showTest A..    
4910: 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
4920: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
4930: 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45  if {[isExpectedE
4940: 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68  rror $error]} th
4950: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
4960: 20 20 73 68 6f 77 54 65 73 74 20 61 0d 0a 20 20    showTest a..  
4970: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
4980: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61  ..            fa
4990: 69 6c 54 65 73 74 20 61 20 24 65 72 72 6f 72 0d  ilTest a $error.
49a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
49b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
49c0: 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44  ..      cleanupD
49d0: 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64  b $dstFileName d
49e0: 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c  b false true fal
49f0: 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65  se..      doneTe
4a00: 73 74 20 41 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d  st A..    }] 0].
4a10: 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23  .  }]....  #####
4a20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a60: 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20  ########..  #   
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 20 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c             WORKL
4a90: 4f 41 44 20 23 32 20 28 42 29 20 20 20 20 20 20  OAD #2 (B)      
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23          #..  ###
4ac0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ad0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ae0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4af0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b00: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
4b10: 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 32 29 20  set workload(2) 
4b20: 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b  [list \..      [
4b30: 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65  list srcFileName
4b40: 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62   dstFileName tab
4b50: 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32  le count1 count2
4b60: 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20   count3] {..    
4b70: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  #..    # NOTE: W
4b80: 6f 72 6b 6c 6f 61 64 20 23 32 2c 20 44 52 4f 50  orkload #2, DROP
4b90: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4ba0: 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77  s...    #..    w
4bb0: 61 69 74 54 65 73 74 20 42 0d 0a 20 20 20 20 6c  aitTest B..    l
4bc0: 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 32  append ::times(2
4bd0: 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20  ) [lindex [time 
4be0: 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73  {..      initTes
4bf0: 74 20 42 0d 0a 20 20 20 20 20 20 73 65 74 75 70  t B..      setup
4c00: 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24  WorkloadFileDb $
4c10: 64 73 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  dstFileName..   
4c20: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65     for {set inde
4c30: 78 20 32 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20  x 2} {$index <= 
4c40: 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69  $count1} {incr i
4c50: 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ndex} {..       
4c60: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
4c70: 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65           sql exe
4c80: 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64  cute $db [append
4c90: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
4ca0: 20 20 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c        "DROP TABL
4cb0: 45 20 49 46 20 45 58 49 53 54 53 20 74 22 20 24  E IF EXISTS t" $
4cc0: 69 6e 64 65 78 20 5c 3b 5d 0d 0a 20 20 20 20 20  index \;]..     
4cd0: 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 42 0d       showTest B.
4ce0: 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72  .        } error
4cf0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
4d00: 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65       if {[isExpe
4d10: 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72  ctedError $error
4d20: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
4d30: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
4d40: 62 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  b..          } e
4d50: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
4d60: 20 20 20 66 61 69 6c 54 65 73 74 20 62 20 24 65     failTest b $e
4d70: 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  rror..          
4d80: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
4d90: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65      }..      cle
4da0: 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e  anupDb $dstFileN
4db0: 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72 75  ame db false tru
4dc0: 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 64  e false..      d
4dd0: 6f 6e 65 54 65 73 74 20 42 0d 0a 20 20 20 20 7d  oneTest B..    }
4de0: 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20  ] 0]..  }]....  
4df0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e30: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
4e40: 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20   #              
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 57 4f 52 4b 4c 4f 41 44 20 23 33 20 28 43 29 20  WORKLOAD #3 (C) 
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
4e90: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
4ea0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4eb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ec0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ed0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
4ee0: 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61  ...  set workloa
4ef0: 64 28 33 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  d(3) [list \..  
4f00: 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c      [list srcFil
4f10: 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d  eName dstFileNam
4f20: 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63  e table count1 c
4f30: 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d  ount2 count3] {.
4f40: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
4f50: 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 33 2c  TE: Workload #3,
4f60: 20 22 73 6d 61 6c 6c 22 20 53 45 4c 45 43 54 20   "small" SELECT 
4f70: 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20  statements...   
4f80: 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74   #..    waitTest
4f90: 20 43 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20   C..    lappend 
4fa0: 3a 3a 74 69 6d 65 73 28 33 29 20 5b 6c 69 6e 64  ::times(3) [lind
4fb0: 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20  ex [time {..    
4fc0: 20 20 69 6e 69 74 54 65 73 74 20 43 0d 0a 20 20    initTest C..  
4fd0: 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61      setupWorkloa
4fe0: 64 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c 65  dFileDb $dstFile
4ff0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f 72 20  Name..      for 
5000: 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24  {set index 1} {$
5010: 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31  index <= $count1
5020: 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
5030: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
5040: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
5050: 20 20 73 65 74 20 72 65 61 64 65 72 20 5b 73 71    set reader [sq
5060: 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
5070: 74 65 20 72 65 61 64 65 72 20 5c 0d 0a 20 20 20  te reader \..   
5080: 20 20 20 20 20 20 20 20 20 20 20 2d 66 6f 72 6d             -form
5090: 61 74 20 64 61 74 61 52 65 61 64 65 72 20 2d 61  at dataReader -a
50a0: 6c 69 61 73 20 24 64 62 20 5b 61 70 70 65 6e 64  lias $db [append
50b0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
50c0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 2c        "SELECT x,
50d0: 20 79 20 46 52 4f 4d 20 22 20 24 74 61 62 6c 65   y FROM " $table
50e0: 20 22 20 57 48 45 52 45 20 7a 20 3d 20 27 73 6d   " WHERE z = 'sm
50f0: 61 6c 6c 27 3b 22 5d 5d 0d 0a 20 20 20 20 20 20  all';"]]..      
5100: 20 20 20 20 77 68 69 6c 65 20 7b 5b 24 72 65 61      while {[$rea
5110: 64 65 72 20 52 65 61 64 5d 7d 20 7b 0d 0a 20 20  der Read]} {..  
5120: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
5130: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
5140: 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20   Do nothing...  
5150: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
5160: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
5170: 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d      unset -nocom
5180: 70 6c 61 69 6e 20 72 65 61 64 65 72 0d 0a 20 20  plain reader..  
5190: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
51a0: 20 43 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72   C..        } er
51b0: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
51c0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45          if {[isE
51d0: 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72  xpectedError $er
51e0: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
51f0: 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65            showTe
5200: 73 74 20 63 0d 0a 20 20 20 20 20 20 20 20 20 20  st c..          
5210: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
5220: 20 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 63        failTest c
5230: 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20   $error..       
5240: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
5250: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
5260: 63 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46 69  cleanupDb $dstFi
5270: 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20  leName db false 
5280: 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20  true false..    
5290: 20 20 64 6f 6e 65 54 65 73 74 20 43 0d 0a 20 20    doneTest C..  
52a0: 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d    }] 0]..  }]...
52b0: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
52c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
52d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
52e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
52f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5300: 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20  ..  #           
5310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5320: 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 34 20 28     WORKLOAD #4 (
5330: 44 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D)              
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  #..  ###########
5360: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5370: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
53a0: 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b  ##....  set work
53b0: 6c 6f 61 64 28 34 29 20 5b 6c 69 73 74 20 5c 0d  load(4) [list \.
53c0: 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63  .      [list src
53d0: 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65  FileName dstFile
53e0: 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74  Name table count
53f0: 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d  1 count2 count3]
5400: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
5410: 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20   NOTE: Workload 
5420: 23 34 2c 20 22 62 69 67 22 20 53 45 4c 45 43 54  #4, "big" SELECT
5430: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20   statements...  
5440: 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73    #..    waitTes
5450: 74 20 44 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  t D..    lappend
5460: 20 3a 3a 74 69 6d 65 73 28 34 29 20 5b 6c 69 6e   ::times(4) [lin
5470: 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20  dex [time {..   
5480: 20 20 20 69 6e 69 74 54 65 73 74 20 44 0d 0a 20     initTest D.. 
5490: 20 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f       setupWorklo
54a0: 61 64 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c  adFileDb $dstFil
54b0: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f 72  eName..      for
54c0: 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b   {set index 1} {
54d0: 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74  $index <= $count
54e0: 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  1} {incr index} 
54f0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
5500: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
5510: 20 20 20 73 65 74 20 72 65 61 64 65 72 20 5b 73     set reader [s
5520: 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
5530: 75 74 65 20 72 65 61 64 65 72 20 5c 0d 0a 20 20  ute reader \..  
5540: 20 20 20 20 20 20 20 20 20 20 20 20 2d 66 6f 72              -for
5550: 6d 61 74 20 64 61 74 61 52 65 61 64 65 72 20 2d  mat dataReader -
5560: 61 6c 69 61 73 20 24 64 62 20 5b 61 70 70 65 6e  alias $db [appen
5570: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
5580: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78         "SELECT x
5590: 2c 20 79 20 46 52 4f 4d 20 22 20 24 74 61 62 6c  , y FROM " $tabl
55a0: 65 20 22 20 57 48 45 52 45 20 7a 20 3d 20 27 62  e " WHERE z = 'b
55b0: 69 67 27 3b 22 5d 5d 0d 0a 20 20 20 20 20 20 20  ig';"]]..       
55c0: 20 20 20 77 68 69 6c 65 20 7b 5b 24 72 65 61 64     while {[$read
55d0: 65 72 20 52 65 61 64 5d 7d 20 7b 0d 0a 20 20 20  er Read]} {..   
55e0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
55f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
5600: 44 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20  Do nothing...   
5610: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
5620: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5630: 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
5640: 6c 61 69 6e 20 72 65 61 64 65 72 0d 0a 20 20 20  lain reader..   
5650: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
5660: 44 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  D..        } err
5670: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
5680: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78         if {[isEx
5690: 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72  pectedError $err
56a0: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
56b0: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
56c0: 74 20 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  t d..          }
56d0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
56e0: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 64 20       failTest d 
56f0: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
5700: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
5710: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63        }..      c
5720: 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c  leanupDb $dstFil
5730: 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74  eName db false t
5740: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
5750: 20 64 6f 6e 65 54 65 73 74 20 44 0d 0a 20 20 20   doneTest D..   
5760: 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a   }] 0]..  }]....
5770: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
5780: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5790: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
57a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
57b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
57c0: 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20  .  #            
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 20 20 57 4f 52 4b 4c 4f 41 44 20 23 35 20 28 45    WORKLOAD #5 (E
57f0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
5810: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
5820: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5830: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5840: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5860: 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  #....  set workl
5870: 6f 61 64 28 35 29 20 5b 6c 69 73 74 20 5c 0d 0a  oad(5) [list \..
5880: 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46        [list srcF
5890: 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e  ileName dstFileN
58a0: 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31  ame table count1
58b0: 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20   count2 count3] 
58c0: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
58d0: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
58e0: 35 2c 20 22 73 6d 61 6c 6c 22 20 49 4e 53 45 52  5, "small" INSER
58f0: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20  T statements... 
5900: 20 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65     #..    waitTe
5910: 73 74 20 45 0d 0a 20 20 20 20 6c 61 70 70 65 6e  st E..    lappen
5920: 64 20 3a 3a 74 69 6d 65 73 28 35 29 20 5b 6c 69  d ::times(5) [li
5930: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
5940: 20 20 20 20 69 6e 69 74 54 65 73 74 20 45 0d 0a      initTest E..
5950: 20 20 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c        setupWorkl
5960: 6f 61 64 46 69 6c 65 44 62 20 24 64 73 74 46 69  oadFileDb $dstFi
5970: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f  leName..      fo
5980: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
5990: 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e  {$index <= $coun
59a0: 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  t1} {incr index}
59b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
59c0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
59d0: 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
59e0: 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20  $db [appendArgs 
59f0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 20 24  "INSERT INTO " $
5a00: 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  table \..       
5a10: 20 20 20 20 20 20 20 22 28 78 2c 20 79 2c 20 7a         "(x, y, z
5a20: 29 20 56 41 4c 55 45 53 28 27 22 20 5b 66 6f 72  ) VALUES('" [for
5a30: 6d 61 74 20 25 6c 58 20 5b 65 78 70 72 20 7b 72  mat %lX [expr {r
5a40: 61 6e 64 6f 6d 28 29 7d 5d 5d 20 5c 0d 0a 20 20  andom()}]] \..  
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 22 27 2c 20              "', 
5a60: 27 22 20 5b 62 61 73 65 36 34 20 65 6e 63 6f 64  '" [base64 encod
5a70: 65 20 2d 2d 20 5b 65 78 70 72 20 7b 72 61 6e 64  e -- [expr {rand
5a80: 73 74 72 28 24 63 6f 75 6e 74 32 29 7d 5d 5d 20  str($count2)}]] 
5a90: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
5aa0: 20 22 27 2c 20 27 73 6d 61 6c 6c 27 29 3b 22 5d   "', 'small');"]
5ab0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77  ..          show
5ac0: 54 65 73 74 20 45 0d 0a 20 20 20 20 20 20 20 20  Test E..        
5ad0: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
5ae0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
5af0: 5b 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72  [isExpectedError
5b00: 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b   $error]} then {
5b10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68  ..            sh
5b20: 6f 77 54 65 73 74 20 65 0d 0a 20 20 20 20 20 20  owTest e..      
5b30: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
5b40: 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65            failTe
5b50: 73 74 20 65 20 24 65 72 72 6f 72 0d 0a 20 20 20  st e $error..   
5b60: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
5b70: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
5b80: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64      cleanupDb $d
5b90: 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61  stFileName db fa
5ba0: 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a  lse true false..
5bb0: 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20 45        doneTest E
5bc0: 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d  ..    }] 0]..  }
5bd0: 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  ]....  #########
5be0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5bf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5c00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5c10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5c20: 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20  ####..  #       
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c40: 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20         WORKLOAD 
5c50: 23 36 20 28 46 29 20 20 20 20 20 20 20 20 20 20  #6 (F)          
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23 23      #..  #######
5c80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5c90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ca0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5cb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5cc0: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20  ######....  set 
5cd0: 77 6f 72 6b 6c 6f 61 64 28 36 29 20 5b 6c 69 73  workload(6) [lis
5ce0: 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74  t \..      [list
5cf0: 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74   srcFileName dst
5d00: 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63  FileName table c
5d10: 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75  ount1 count2 cou
5d20: 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  nt3] {..    #.. 
5d30: 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c     # NOTE: Workl
5d40: 6f 61 64 20 23 36 2c 20 22 62 69 67 22 20 49 4e  oad #6, "big" IN
5d50: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  SERT statements.
5d60: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69  ..    #..    wai
5d70: 74 54 65 73 74 20 46 0d 0a 20 20 20 20 6c 61 70  tTest F..    lap
5d80: 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 36 29 20  pend ::times(6) 
5d90: 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d  [lindex [time {.
5da0: 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20  .      initTest 
5db0: 46 0d 0a 20 20 20 20 20 20 73 65 74 75 70 57 6f  F..      setupWo
5dc0: 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24 64 73  rkloadFileDb $ds
5dd0: 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  tFileName..     
5de0: 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
5df0: 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63  1} {$index <= $c
5e00: 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64  ount1} {incr ind
5e10: 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ex} {..        i
5e20: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
5e30: 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
5e40: 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  te $db [appendAr
5e50: 67 73 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  gs "INSERT INTO 
5e60: 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20  " $table \..    
5e70: 20 20 20 20 20 20 20 20 20 20 22 28 78 2c 20 79            "(x, y
5e80: 2c 20 7a 29 20 56 41 4c 55 45 53 28 27 22 20 5b  , z) VALUES('" [
5e90: 66 6f 72 6d 61 74 20 25 6c 58 20 5b 65 78 70 72  format %lX [expr
5ea0: 20 7b 72 61 6e 64 6f 6d 28 29 7d 5d 5d 20 5c 0d   {random()}]] \.
5eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
5ec0: 27 2c 20 52 41 4e 44 4f 4d 42 4c 4f 42 28 22 20  ', RANDOMBLOB(" 
5ed0: 24 63 6f 75 6e 74 33 20 22 29 2c 20 27 62 69 67  $count3 "), 'big
5ee0: 27 29 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  ');"]..         
5ef0: 20 73 68 6f 77 54 65 73 74 20 46 0d 0a 20 20 20   showTest F..   
5f00: 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
5f10: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
5f20: 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64   if {[isExpected
5f30: 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74  Error $error]} t
5f40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
5f50: 20 20 20 73 68 6f 77 54 65 73 74 20 66 0d 0a 20     showTest f.. 
5f60: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
5f70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
5f80: 61 69 6c 54 65 73 74 20 66 20 24 65 72 72 6f 72  ailTest f $error
5f90: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
5fa0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
5fb0: 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70  }..      cleanup
5fc0: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
5fd0: 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61  db false true fa
5fe0: 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54  lse..      doneT
5ff0: 65 73 74 20 46 0d 0a 20 20 20 20 7d 5d 20 30 5d  est F..    }] 0]
6000: 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23  ..  }]....  ####
6010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6050: 23 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20  #########..  #  
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b              WORK
6080: 4c 4f 41 44 20 23 37 20 28 47 29 20 20 20 20 20  LOAD #7 (G)     
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23           #..  ##
60b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
60c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
60d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
60e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
60f0: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
6100: 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 37 29   set workload(7)
6110: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
6120: 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d  [list srcFileNam
6130: 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61  e dstFileName ta
6140: 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74  ble count1 count
6150: 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20  2 count3] {..   
6160: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
6170: 57 6f 72 6b 6c 6f 61 64 20 23 37 2c 20 22 73 6d  Workload #7, "sm
6180: 61 6c 6c 22 20 55 50 44 41 54 45 20 73 74 61 74  all" UPDATE stat
6190: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a  ements...    #..
61a0: 20 20 20 20 77 61 69 74 54 65 73 74 20 47 0d 0a      waitTest G..
61b0: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69      lappend ::ti
61c0: 6d 65 73 28 37 29 20 5b 6c 69 6e 64 65 78 20 5b  mes(7) [lindex [
61d0: 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e  time {..      in
61e0: 69 74 54 65 73 74 20 47 0d 0a 20 20 20 20 20 20  itTest G..      
61f0: 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c  setupWorkloadFil
6200: 65 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65  eDb $dstFileName
6210: 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74  ..      for {set
6220: 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65   index 1} {$inde
6230: 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69  x <= $count1} {i
6240: 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
6250: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
6260: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71   {..          sq
6270: 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61  l execute $db [a
6280: 70 70 65 6e 64 41 72 67 73 20 22 55 50 44 41 54  ppendArgs "UPDAT
6290: 45 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20  E " $table \..  
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 53 45              " SE
62b0: 54 20 79 20 3d 20 27 22 20 5b 62 61 73 65 36 34  T y = '" [base64
62c0: 20 65 6e 63 6f 64 65 20 2d 2d 20 5b 65 78 70 72   encode -- [expr
62d0: 20 7b 72 61 6e 64 73 74 72 28 24 63 6f 75 6e 74   {randstr($count
62e0: 32 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20  2)}]] \..       
62f0: 20 20 20 20 20 20 20 22 27 20 57 48 45 52 45 20         "' WHERE 
6300: 78 20 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61  x LIKE '" [forma
6310: 74 20 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27  t %X $index] "%'
6320: 20 41 4e 44 20 7a 20 3d 20 27 73 6d 61 6c 6c 27   AND z = 'small'
6330: 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ;"]..          s
6340: 68 6f 77 54 65 73 74 20 47 0d 0a 20 20 20 20 20  howTest G..     
6350: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
6360: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
6370: 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72  f {[isExpectedEr
6380: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
6390: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
63a0: 20 73 68 6f 77 54 65 73 74 20 67 0d 0a 20 20 20   showTest g..   
63b0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
63c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69  .            fai
63d0: 6c 54 65 73 74 20 67 20 24 65 72 72 6f 72 0d 0a  lTest g $error..
63e0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
63f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
6400: 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62  .      cleanupDb
6410: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62   $dstFileName db
6420: 20 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73   false true fals
6430: 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73  e..      doneTes
6440: 74 20 47 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a  t G..    }] 0]..
6450: 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23    }]....  ######
6460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6470: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6480: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
64a0: 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20  #######..  #    
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f            WORKLO
64d0: 41 44 20 23 38 20 28 48 29 20 20 20 20 20 20 20  AD #8 (H)       
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23         #..  ####
6500: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6540: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73  #########....  s
6550: 65 74 20 77 6f 72 6b 6c 6f 61 64 28 38 29 20 5b  et workload(8) [
6560: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c  list \..      [l
6570: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
6580: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
6590: 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20  e count1 count2 
65a0: 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23  count3] {..    #
65b0: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f  ..    # NOTE: Wo
65c0: 72 6b 6c 6f 61 64 20 23 38 2c 20 22 62 69 67 22  rkload #8, "big"
65d0: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
65e0: 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ts...    #..    
65f0: 77 61 69 74 54 65 73 74 20 48 0d 0a 20 20 20 20  waitTest H..    
6600: 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28  lappend ::times(
6610: 38 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65  8) [lindex [time
6620: 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65   {..      initTe
6630: 73 74 20 48 0d 0a 20 20 20 20 20 20 73 65 74 75  st H..      setu
6640: 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20  pWorkloadFileDb 
6650: 24 64 73 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20  $dstFileName..  
6660: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64      for {set ind
6670: 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d  ex 1} {$index <=
6680: 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20   $count1} {incr 
6690: 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
66a0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
66b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78            sql ex
66c0: 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e  ecute $db [appen
66d0: 64 41 72 67 73 20 22 55 50 44 41 54 45 20 22 20  dArgs "UPDATE " 
66e0: 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20  $table \..      
66f0: 20 20 20 20 20 20 20 20 22 20 53 45 54 20 79 20          " SET y 
6700: 3d 20 52 41 4e 44 4f 4d 42 4c 4f 42 28 22 20 24  = RANDOMBLOB(" $
6710: 63 6f 75 6e 74 33 20 22 29 20 57 48 45 52 45 20  count3 ") WHERE 
6720: 78 20 4c 49 4b 45 20 27 22 20 5c 0d 0a 20 20 20  x LIKE '" \..   
6730: 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d             [form
6740: 61 74 20 25 58 20 24 69 6e 64 65 78 5d 20 22 25  at %X $index] "%
6750: 27 20 41 4e 44 20 7a 20 3d 20 27 62 69 67 27 3b  ' AND z = 'big';
6760: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68  "]..          sh
6770: 6f 77 54 65 73 74 20 48 0d 0a 20 20 20 20 20 20  owTest H..      
6780: 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
6790: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
67a0: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
67b0: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
67c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
67d0: 73 68 6f 77 54 65 73 74 20 68 0d 0a 20 20 20 20  showTest h..    
67e0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
6800: 54 65 73 74 20 68 20 24 65 72 72 6f 72 0d 0a 20  Test h $error.. 
6810: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
6820: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
6830: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
6840: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20  $dstFileName db 
6850: 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65  false true false
6860: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
6870: 20 48 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   H..    }] 0].. 
6880: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
6890: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
68a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
68b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
68c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
68d0: 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20  ######..  #     
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41           WORKLOA
6900: 44 20 23 39 20 28 49 29 20 20 20 20 20 20 20 20  D #9 (I)        
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6920: 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23        #..  #####
6930: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6940: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6950: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6960: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6970: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
6980: 74 20 77 6f 72 6b 6c 6f 61 64 28 39 29 20 5b 6c  t workload(9) [l
6990: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69  ist \..      [li
69a0: 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64  st srcFileName d
69b0: 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65  stFileName table
69c0: 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63   count1 count2 c
69d0: 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d  ount3] {..    #.
69e0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
69f0: 6b 6c 6f 61 64 20 23 39 2c 20 22 73 6d 61 6c 6c  kload #9, "small
6a00: 22 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  " DELETE stateme
6a10: 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  nts...    #..   
6a20: 20 77 61 69 74 54 65 73 74 20 49 0d 0a 20 20 20   waitTest I..   
6a30: 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73   lappend ::times
6a40: 28 39 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d  (9) [lindex [tim
6a50: 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54  e {..      initT
6a60: 65 73 74 20 49 0d 0a 20 20 20 20 20 20 73 65 74  est I..      set
6a70: 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62  upWorkloadFileDb
6a80: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 0d 0a 20   $dstFileName.. 
6a90: 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e       for {set in
6aa0: 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c  dex 1} {$index <
6ab0: 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72  = $count1} {incr
6ac0: 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20   index} {..     
6ad0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
6ae0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65  .          sql e
6af0: 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65  xecute $db [appe
6b00: 6e 64 41 72 67 73 20 22 44 45 4c 45 54 45 20 46  ndArgs "DELETE F
6b10: 52 4f 4d 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a  ROM " $table \..
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
6b30: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 22 20  WHERE x LIKE '" 
6b40: 5b 66 6f 72 6d 61 74 20 25 58 20 24 69 6e 64 65  [format %X $inde
6b50: 78 5d 20 22 25 27 20 41 4e 44 20 7a 20 3d 20 27  x] "%' AND z = '
6b60: 73 6d 61 6c 6c 27 3b 22 5d 0d 0a 20 20 20 20 20  small';"]..     
6b70: 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 49 0d       showTest I.
6b80: 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72  .        } error
6b90: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
6ba0: 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65       if {[isExpe
6bb0: 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72  ctedError $error
6bc0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
6bd0: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
6be0: 69 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  i..          } e
6bf0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
6c00: 20 20 20 66 61 69 6c 54 65 73 74 20 69 20 24 65     failTest i $e
6c10: 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  rror..          
6c20: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
6c30: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65      }..      cle
6c40: 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e  anupDb $dstFileN
6c50: 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72 75  ame db false tru
6c60: 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 64  e false..      d
6c70: 6f 6e 65 54 65 73 74 20 49 0d 0a 20 20 20 20 7d  oneTest I..    }
6c80: 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20  ] 0]..  }]....  
6c90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6ca0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6cb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6cc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
6ce0: 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20   #              
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 57 4f 52 4b 4c 4f 41 44 20 23 31 30 20 28 4a 29  WORKLOAD #10 (J)
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
6d30: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
6d40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6d50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6d60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6d70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
6d80: 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61  ...  set workloa
6d90: 64 28 31 30 29 20 5b 6c 69 73 74 20 5c 0d 0a 20  d(10) [list \.. 
6da0: 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69       [list srcFi
6db0: 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61  leName dstFileNa
6dc0: 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20  me table count1 
6dd0: 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b  count2 count3] {
6de0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
6df0: 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31  OTE: Workload #1
6e00: 30 2c 20 22 62 69 67 22 20 44 45 4c 45 54 45 20  0, "big" DELETE 
6e10: 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20  statements...   
6e20: 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74   #..    waitTest
6e30: 20 4a 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20   J..    lappend 
6e40: 3a 3a 74 69 6d 65 73 28 31 30 29 20 5b 6c 69 6e  ::times(10) [lin
6e50: 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20  dex [time {..   
6e60: 20 20 20 69 6e 69 74 54 65 73 74 20 4a 0d 0a 20     initTest J.. 
6e70: 20 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f       setupWorklo
6e80: 61 64 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c  adFileDb $dstFil
6e90: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f 72  eName..      for
6ea0: 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b   {set index 1} {
6eb0: 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74  $index <= $count
6ec0: 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  1} {incr index} 
6ed0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
6ee0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
6ef0: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
6f00: 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  db [appendArgs "
6f10: 44 45 4c 45 54 45 20 46 52 4f 4d 20 22 20 24 74  DELETE FROM " $t
6f20: 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  able \..        
6f30: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 78 20        " WHERE x 
6f40: 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74 20  LIKE '" [format 
6f50: 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20 41  %X $index] "%' A
6f60: 4e 44 20 7a 20 3d 20 27 62 69 67 27 3b 22 5d 0d  ND z = 'big';"].
6f70: 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54  .          showT
6f80: 65 73 74 20 4a 0d 0a 20 20 20 20 20 20 20 20 7d  est J..        }
6f90: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
6fa0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
6fb0: 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20  isExpectedError 
6fc0: 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d  $error]} then {.
6fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f  .            sho
6fe0: 77 54 65 73 74 20 6a 0d 0a 20 20 20 20 20 20 20  wTest j..       
6ff0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7000: 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65 73           failTes
7010: 74 20 6a 20 24 65 72 72 6f 72 0d 0a 20 20 20 20  t j $error..    
7020: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
7030: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
7040: 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64 73     cleanupDb $ds
7050: 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c  tFileName db fal
7060: 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20  se true false.. 
7070: 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20 4a 0d       doneTest J.
7080: 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d  .    }] 0]..  }]
7090: 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23  ################
70d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
70e0: 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20  ###..  #        
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23        WORKLOAD #
7110: 31 31 20 28 4b 29 20 20 20 20 20 20 20 20 20 20  11 (K)          
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23     #..  ########
7140: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7150: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7160: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7180: 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77  #####....  set w
7190: 6f 72 6b 6c 6f 61 64 28 31 31 29 20 5b 6c 69 73  orkload(11) [lis
71a0: 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74  t \..      [list
71b0: 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74   srcFileName dst
71c0: 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63  FileName table c
71d0: 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75  ount1 count2 cou
71e0: 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  nt3] {..    #.. 
71f0: 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c     # NOTE: Workl
7200: 6f 61 64 20 23 31 31 2c 20 56 41 43 55 55 4d 20  oad #11, VACUUM 
7210: 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20  statement...    
7220: 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74 20  #..    waitTest 
7230: 4b 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a  K..    lappend :
7240: 3a 74 69 6d 65 73 28 31 31 29 20 5b 6c 69 6e 64  :times(11) [lind
7250: 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20  ex [time {..    
7260: 20 20 69 6e 69 74 54 65 73 74 20 4b 0d 0a 20 20    initTest K..  
7270: 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61      setupWorkloa
7280: 64 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c 65  dFileDb $dstFile
7290: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f 72 20  Name..      for 
72a0: 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24  {set index 1} {$
72b0: 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31  index <= $count1
72c0: 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
72d0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
72e0: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
72f0: 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64    sql execute $d
7300: 62 20 22 56 41 43 55 55 4d 3b 22 0d 0a 20 20 20  b "VACUUM;"..   
7310: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
7320: 4b 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  K..        } err
7330: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
7340: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78         if {[isEx
7350: 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72  pectedError $err
7360: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
7370: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
7380: 74 20 6b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  t k..          }
7390: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
73a0: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 6b 20       failTest k 
73b0: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
73c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
73d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63        }..      c
73e0: 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c  leanupDb $dstFil
73f0: 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74  eName db false t
7400: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
7410: 20 64 6f 6e 65 54 65 73 74 20 4b 0d 0a 20 20 20   doneTest K..   
7420: 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a   }] 0]..  }]....
7430: 20 20 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 23 23 23 23 23 23 23  ################
7460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7470: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
7480: 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20  .  #            
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 32 20 28    WORKLOAD #12 (
74b0: 4c 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L)              
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
74d0: 0d 0a 20 20 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 23 23 23 23 23  ################
7500: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7520: 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  #....  set workl
7530: 6f 61 64 28 31 32 29 20 5b 6c 69 73 74 20 5c 0d  oad(12) [list \.
7540: 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63  .      [list src
7550: 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65  FileName dstFile
7560: 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74  Name table count
7570: 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d  1 count2 count3]
7580: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
7590: 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20   NOTE: Workload 
75a0: 23 31 32 2c 20 62 61 63 6b 75 70 20 74 6f 20 69  #12, backup to i
75b0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
75c0: 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77  e...    #..    w
75d0: 61 69 74 54 65 73 74 20 4c 0d 0a 20 20 20 20 6c  aitTest L..    l
75e0: 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31  append ::times(1
75f0: 32 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65  2) [lindex [time
7600: 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65   {..      initTe
7610: 73 74 20 4c 0d 0a 20 20 20 20 20 20 66 6f 72 20  st L..      for 
7620: 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24  {set index 1} {$
7630: 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31  index <= $count1
7640: 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
7650: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
7660: 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72  tring is integer
7670: 20 2d 73 74 72 69 63 74 20 24 3a 3a 63 6f 6d 70   -strict $::comp
7680: 69 6c 65 64 28 31 32 29 5d 7d 20 74 68 65 6e 20  iled(12)]} then 
7690: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
76a0: 20 69 64 20 24 3a 3a 63 6f 6d 70 69 6c 65 64 28   id $::compiled(
76b0: 31 32 29 3b 20 23 20 4e 4f 54 45 3a 20 41 6c 72  12); # NOTE: Alr
76c0: 65 61 64 79 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a  eady compiled...
76d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
76e0: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
76f0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
7700: 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d 2e  e _Dynamic${id}.
7710: 54 65 73 74 24 7b 69 64 7d 20 42 61 63 6b 75 70  Test${id} Backup
7720: 41 6e 64 47 65 74 44 61 74 61 0d 0a 20 20 20 20  AndGetData..    
7730: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
7740: 20 4c 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   L..          } 
7750: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
7760: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
7770: 5b 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72  [isExpectedError
7780: 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b   $error]} then {
7790: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
77a0: 73 68 6f 77 54 65 73 74 20 6c 0d 0a 20 20 20 20  showTest l..    
77b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
77c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
77d0: 66 61 69 6c 54 65 73 74 20 6c 20 24 65 72 72 6f  failTest l $erro
77e0: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  r..            }
77f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
7800: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
7810: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69  .          set i
7820: 64 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  d [object invoke
7830: 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
7840: 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d 0d 0a  Active NextId]..
7850: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
7860: 64 65 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72  de [compileCShar
7870: 70 57 69 74 68 20 5b 73 75 62 73 74 20 7b 0d 0a  pWith [subst {..
7880: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
7890: 67 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  g System.Data.SQ
78a0: 4c 69 74 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  Lite;....       
78b0: 20 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 5f       namespace _
78c0: 44 79 6e 61 6d 69 63 24 7b 69 64 7d 0d 0a 20 20  Dynamic${id}..  
78d0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
78e0: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
78f0: 63 20 73 74 61 74 69 63 20 63 6c 61 73 73 20 54  c static class T
7900: 65 73 74 24 7b 69 64 7d 0d 0a 20 20 20 20 20 20  est${id}..      
7910: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
7920: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
7930: 63 20 73 74 61 74 69 63 20 76 6f 69 64 20 42 61  c static void Ba
7940: 63 6b 75 70 41 6e 64 47 65 74 44 61 74 61 28 29  ckupAndGetData()
7950: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7960: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
7970: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 53 51         using (SQ
7980: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 73  LiteConnection s
7990: 6f 75 72 63 65 20 3d 20 6e 65 77 20 53 51 4c 69  ource = new SQLi
79a0: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d 0a 20  teConnection(.. 
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79c0: 20 20 20 20 20 22 46 75 6c 6c 55 72 69 3d 24 7b       "FullUri=${
79d0: 64 73 74 46 69 6c 65 4e 61 6d 65 7d 3b 22 29 29  dstFileName};"))
79e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
79f0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
7a00: 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63             sourc
7a10: 65 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20  e.Open();....   
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 75 73 69 6e 67 20 28 53 51 4c 69 74 65 43 6f   using (SQLiteCo
7a40: 6e 6e 65 63 74 69 6f 6e 20 64 65 73 74 69 6e 61  nnection destina
7a50: 74 69 6f 6e 20 3d 20 6e 65 77 20 53 51 4c 69 74  tion = new SQLit
7a60: 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d 0a 20 20  eConnection(..  
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 20 20 20 20 20 20 22 46 75 6c 6c 55 72 69 3d 24        "FullUri=$
7a90: 7b 73 72 63 46 69 6c 65 4e 61 6d 65 7d 3b 22 29  {srcFileName};")
7aa0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
7ab0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ad0: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 4f 70 65 6e  destination.Open
7ae0: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
7b00: 72 63 65 2e 42 61 63 6b 75 70 44 61 74 61 62 61  rce.BackupDataba
7b10: 73 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se(..           
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
7b30: 65 73 74 69 6e 61 74 69 6f 6e 2c 20 22 6d 61 69  estination, "mai
7b40: 6e 22 2c 20 22 6d 61 69 6e 22 2c 20 2d 31 2c 20  n", "main", -1, 
7b50: 6e 75 6c 6c 2c 20 30 29 3b 0d 0a 20 20 20 20 20  null, 0);..     
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7b70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7b80: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
7b90: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
7bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7bc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7bd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7be0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7c00: 75 62 6c 69 63 20 73 74 61 74 69 63 20 76 6f 69  ublic static voi
7c10: 64 20 4d 61 69 6e 28 29 0d 0a 20 20 20 20 20 20  d Main()..      
7c20: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7c40: 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20  / do nothing... 
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7c60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7c70: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
7c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 5d 20 74  ..          }] t
7c90: 72 75 65 20 74 72 75 65 20 74 72 75 65 20 72 65  rue true true re
7ca0: 73 75 6c 74 73 20 65 72 72 6f 72 73 20 53 79 73  sults errors Sys
7cb0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
7cc0: 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  dll]..          
7cd0: 69 66 20 7b 24 63 6f 64 65 20 65 71 20 22 4f 6b  if {$code eq "Ok
7ce0: 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
7cf0: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 63 6f 6d         set ::com
7d00: 70 69 6c 65 64 28 31 32 29 20 24 69 64 3b 20 23  piled(12) $id; #
7d10: 20 4e 4f 54 45 3a 20 43 6f 6d 70 69 6c 65 64 20   NOTE: Compiled 
7d20: 4f 4b 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  OK...           
7d30: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
7d50: 65 63 74 20 69 6e 76 6f 6b 65 20 5f 44 79 6e 61  ect invoke _Dyna
7d60: 6d 69 63 24 7b 69 64 7d 2e 54 65 73 74 24 7b 69  mic${id}.Test${i
7d70: 64 7d 20 42 61 63 6b 75 70 41 6e 64 47 65 74 44  d} BackupAndGetD
7d80: 61 74 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ata..           
7d90: 20 20 20 73 68 6f 77 54 65 73 74 20 4c 0d 0a 20     showTest L.. 
7da0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72             } err
7db0: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
7dc0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
7dd0: 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20  isExpectedError 
7de0: 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d  $error]} then {.
7df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7e00: 20 73 68 6f 77 54 65 73 74 20 6c 0d 0a 20 20 20   showTest l..   
7e10: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
7e20: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
7e30: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 6c 20       failTest l 
7e40: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
7e50: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
7e60: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
7e70: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
7e80: 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 24 65          error $e
7e90: 72 72 6f 72 73 0d 0a 20 20 20 20 20 20 20 20 20  rrors..         
7ea0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
7eb0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 64 6f       }..      do
7ec0: 6e 65 54 65 73 74 20 4c 0d 0a 20 20 20 20 7d 5d  neTest L..    }]
7ed0: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23   0]..  }]....  #
7ee0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7ef0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7f00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7f10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7f20: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
7f30: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
7f50: 4f 52 4b 4c 4f 41 44 20 23 31 33 20 28 4d 29 20  ORKLOAD #13 (M) 
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
7f80: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
7f90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7fa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7fb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
7fd0: 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64  ..  set workload
7fe0: 28 31 33 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  (13) [list \..  
7ff0: 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c      [list srcFil
8000: 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d  eName dstFileNam
8010: 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63  e table count1 c
8020: 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d  ount2 count3] {.
8030: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
8040: 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 33  TE: Workload #13
8050: 2c 20 62 61 63 6b 75 70 20 66 72 6f 6d 20 61 6e  , backup from an
8060: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
8070: 61 73 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  ase...    #..   
8080: 20 77 61 69 74 54 65 73 74 20 4d 0d 0a 20 20 20   waitTest M..   
8090: 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73   lappend ::times
80a0: 28 31 33 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69  (13) [lindex [ti
80b0: 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74  me {..      init
80c0: 54 65 73 74 20 4d 0d 0a 20 20 20 20 20 20 66 6f  Test M..      fo
80d0: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
80e0: 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e  {$index <= $coun
80f0: 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  t1} {incr index}
8100: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
8110: 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67  [string is integ
8120: 65 72 20 2d 73 74 72 69 63 74 20 24 3a 3a 63 6f  er -strict $::co
8130: 6d 70 69 6c 65 64 28 31 33 29 5d 7d 20 74 68 65  mpiled(13)]} the
8140: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
8150: 65 74 20 69 64 20 24 3a 3a 63 6f 6d 70 69 6c 65  et id $::compile
8160: 64 28 31 33 29 3b 20 23 20 4e 4f 54 45 3a 20 41  d(13); # NOTE: A
8170: 6c 72 65 61 64 79 20 63 6f 6d 70 69 6c 65 64 2e  lready compiled.
8180: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
8190: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
81a0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
81b0: 6f 6b 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64  oke _Dynamic${id
81c0: 7d 2e 54 65 73 74 24 7b 69 64 7d 20 42 61 63 6b  }.Test${id} Back
81d0: 75 70 41 6e 64 47 65 74 44 61 74 61 0d 0a 20 20  upAndGetData..  
81e0: 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65            showTe
81f0: 73 74 20 4d 0d 0a 20 20 20 20 20 20 20 20 20 20  st M..          
8200: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
8210: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
8220: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
8230: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
8240: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8250: 20 20 73 68 6f 77 54 65 73 74 20 6d 0d 0a 20 20    showTest m..  
8260: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
8270: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8280: 20 20 66 61 69 6c 54 65 73 74 20 6d 20 24 65 72    failTest m $er
8290: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ror..           
82a0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
82b0: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
82c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
82d0: 20 69 64 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f   id [object invo
82e0: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
82f0: 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d  etActive NextId]
8300: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
8310: 63 6f 64 65 20 5b 63 6f 6d 70 69 6c 65 43 53 68  code [compileCSh
8320: 61 72 70 57 69 74 68 20 5b 73 75 62 73 74 20 7b  arpWith [subst {
8330: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ..            us
8340: 69 6e 67 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ing System.Data.
8350: 53 51 4c 69 74 65 3b 0d 0a 0d 0a 20 20 20 20 20  SQLite;....     
8360: 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63 65         namespace
8370: 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d 0d 0a   _Dynamic${id}..
8380: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62               pub
83a0: 6c 69 63 20 73 74 61 74 69 63 20 63 6c 61 73 73  lic static class
83b0: 20 54 65 73 74 24 7b 69 64 7d 0d 0a 20 20 20 20   Test${id}..    
83c0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62               pub
83e0: 6c 69 63 20 73 74 61 74 69 63 20 76 6f 69 64 20  lic static void 
83f0: 42 61 63 6b 75 70 41 6e 64 47 65 74 44 61 74 61  BackupAndGetData
8400: 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ()..            
8410: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
8420: 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
8430: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
8440: 20 73 6f 75 72 63 65 20 3d 20 6e 65 77 20 53 51   source = new SQ
8450: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d  LiteConnection(.
8460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8470: 20 20 20 20 20 20 20 22 46 75 6c 6c 55 72 69 3d         "FullUri=
8480: 24 7b 73 72 63 46 69 6c 65 4e 61 6d 65 7d 3b 22  ${srcFileName};"
8490: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
84a0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
84c0: 72 63 65 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20  rce.Open();.... 
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84e0: 20 20 20 75 73 69 6e 67 20 28 53 51 4c 69 74 65     using (SQLite
84f0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 64 65 73 74 69  Connection desti
8500: 6e 61 74 69 6f 6e 20 3d 20 6e 65 77 20 53 51 4c  nation = new SQL
8510: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d 0a  iteConnection(..
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 20 20 20 20 20 20 20 20 22 46 75 6c 6c 55 72 69          "FullUri
8540: 3d 24 7b 64 73 74 46 69 6c 65 4e 61 6d 65 7d 3b  =${dstFileName};
8550: 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "))..           
8560: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 4f 70    destination.Op
8590: 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  en();....       
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
85b0: 6f 75 72 63 65 2e 42 61 63 6b 75 70 44 61 74 61  ource.BackupData
85c0: 62 61 73 65 28 0d 0a 20 20 20 20 20 20 20 20 20  base(..         
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85e0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 20 22 6d   destination, "m
85f0: 61 69 6e 22 2c 20 22 6d 61 69 6e 22 2c 20 2d 31  ain", "main", -1
8600: 2c 20 6e 75 6c 6c 2c 20 30 29 3b 0d 0a 20 20 20  , null, 0);..   
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
8630: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
8640: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
8660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
86a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
86b0: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 76   public static v
86c0: 6f 69 64 20 4d 61 69 6e 28 29 0d 0a 20 20 20 20  oid Main()..    
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d   // do nothing..
8700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8710: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
8720: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
8730: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 5d   }..          }]
8740: 20 74 72 75 65 20 74 72 75 65 20 74 72 75 65 20   true true true 
8750: 72 65 73 75 6c 74 73 20 65 72 72 6f 72 73 20 53  results errors S
8760: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
8770: 65 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 20 20  e.dll]..        
8780: 20 20 69 66 20 7b 24 63 6f 64 65 20 65 71 20 22    if {$code eq "
8790: 4f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  Ok"} then {..   
87a0: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 63           set ::c
87b0: 6f 6d 70 69 6c 65 64 28 31 33 29 20 24 69 64 3b  ompiled(13) $id;
87c0: 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 70 69 6c 65   # NOTE: Compile
87d0: 64 20 4f 4b 2e 0d 0a 20 20 20 20 20 20 20 20 20  d OK...         
87e0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
87f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  .              o
8800: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5f 44 79  bject invoke _Dy
8810: 6e 61 6d 69 63 24 7b 69 64 7d 2e 54 65 73 74 24  namic${id}.Test$
8820: 7b 69 64 7d 20 42 61 63 6b 75 70 41 6e 64 47 65  {id} BackupAndGe
8830: 74 44 61 74 61 0d 0a 20 20 20 20 20 20 20 20 20  tData..         
8840: 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 4d 0d       showTest M.
8850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
8860: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
8880: 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72 6f  {[isExpectedErro
8890: 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  r $error]} then 
88a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
88b0: 20 20 20 73 68 6f 77 54 65 73 74 20 6d 0d 0a 20     showTest m.. 
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
88d0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
88e0: 20 20 20 20 20 20 20 66 61 69 6c 54 65 73 74 20         failTest 
88f0: 6d 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  m $error..      
8900: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8910: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8920: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
8930: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
8940: 24 65 72 72 6f 72 73 0d 0a 20 20 20 20 20 20 20  $errors..       
8950: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
8960: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
8970: 64 6f 6e 65 54 65 73 74 20 4d 0d 0a 20 20 20 20  doneTest M..    
8980: 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20  }] 0]..  }].... 
8990: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
89a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
89b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
89c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
89d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
89e0: 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20    #             
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 57 4f 52 4b 4c 4f 41 44 20 23 31 34 20 28 4e   WORKLOAD #14 (N
8a10: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
8a30: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
8a40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8a50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8a60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8a80: 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f  ....  set worklo
8a90: 61 64 28 31 34 29 20 5b 6c 69 73 74 20 5c 0d 0a  ad(14) [list \..
8aa0: 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46        [list srcF
8ab0: 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e  ileName dstFileN
8ac0: 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31  ame table count1
8ad0: 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20   count2 count3] 
8ae0: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
8af0: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
8b00: 31 34 2c 20 50 52 41 47 4d 41 20 69 6e 74 65 67  14, PRAGMA integ
8b10: 72 69 74 79 20 63 68 65 63 6b 20 73 74 61 74 65  rity check state
8b20: 6d 65 6e 74 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  ment...    #..  
8b30: 20 20 77 61 69 74 54 65 73 74 20 4e 0d 0a 20 20    waitTest N..  
8b40: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65    lappend ::time
8b50: 73 28 31 34 29 20 5b 6c 69 6e 64 65 78 20 5b 74  s(14) [lindex [t
8b60: 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69  ime {..      ini
8b70: 74 54 65 73 74 20 4e 0d 0a 20 20 20 20 20 20 73  tTest N..      s
8b80: 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65  etupWorkloadFile
8b90: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 0d  Db $dstFileName.
8ba0: 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20  .      for {set 
8bb0: 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78  index 1} {$index
8bc0: 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e   <= $count1} {in
8bd0: 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
8be0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
8bf0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
8c00: 20 72 65 73 75 6c 74 20 5b 73 71 6c 20 65 78 65   result [sql exe
8c10: 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63  cute -execute sc
8c20: 61 6c 61 72 20 24 64 62 20 5c 0d 0a 20 20 20 20  alar $db \..    
8c30: 20 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d            "PRAGM
8c40: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
8c50: 6b 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  k;"]..          
8c60: 69 66 20 7b 24 72 65 73 75 6c 74 20 6e 65 20 22  if {$result ne "
8c70: 6f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ok"} then {..   
8c80: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b           error [
8c90: 61 70 70 65 6e 64 41 72 67 73 20 22 69 6e 74 65  appendArgs "inte
8ca0: 67 72 69 74 79 20 63 68 65 63 6b 20 66 61 69 6c  grity check fail
8cb0: 65 64 3a 20 22 20 24 72 65 73 75 6c 74 5d 0d 0a  ed: " $result]..
8cc0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
8cd0: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
8ce0: 4e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  N..        } err
8cf0: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
8d00: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78         if {[isEx
8d10: 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72  pectedError $err
8d20: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
8d30: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
8d40: 74 20 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  t n..          }
8d50: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
8d60: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 6e 20       failTest n 
8d70: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
8d80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
8d90: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63        }..      c
8da0: 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c  leanupDb $dstFil
8db0: 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74  eName db false t
8dc0: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
8dd0: 20 64 6f 6e 65 54 65 73 74 20 4e 0d 0a 20 20 20   doneTest N..   
8de0: 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a   }] 0]..  }]....
8df0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
8e00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8e10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8e30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
8e40: 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20  .  #            
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e60: 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 35 20 28    WORKLOAD #15 (
8e70: 4f 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  O)              
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
8e90: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
8ea0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8eb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8ec0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8ed0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8ee0: 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  #....  set workl
8ef0: 6f 61 64 28 31 35 29 20 5b 6c 69 73 74 20 5c 0d  oad(15) [list \.
8f00: 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63  .      [list src
8f10: 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65  FileName dstFile
8f20: 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74  Name table count
8f30: 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d  1 count2 count3]
8f40: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
8f50: 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20   NOTE: Workload 
8f60: 23 31 35 2c 20 66 6f 72 63 65 20 6d 61 6e 61 67  #15, force manag
8f70: 65 64 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65  ed garbage colle
8f80: 63 74 69 6f 6e 0d 0a 20 20 20 20 23 0d 0a 20 20  ction..    #..  
8f90: 20 20 77 61 69 74 54 65 73 74 20 4f 0d 0a 20 20    waitTest O..  
8fa0: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65    lappend ::time
8fb0: 73 28 31 35 29 20 5b 6c 69 6e 64 65 78 20 5b 74  s(15) [lindex [t
8fc0: 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69  ime {..      ini
8fd0: 74 54 65 73 74 20 4f 0d 0a 20 20 20 20 20 20 66  tTest O..      f
8fe0: 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d  or {set index 1}
8ff0: 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75   {$index <= $cou
9000: 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  nt1} {incr index
9010: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  } {..        if 
9020: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
9030: 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
9040: 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
9050: 6e 65 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  nel..          s
9060: 68 6f 77 54 65 73 74 20 4f 0d 0a 20 20 20 20 20  howTest O..     
9070: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
9080: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
9090: 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72  f {[isExpectedEr
90a0: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
90b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
90c0: 20 73 68 6f 77 54 65 73 74 20 6f 0d 0a 20 20 20   showTest o..   
90d0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
90e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69  .            fai
90f0: 6c 54 65 73 74 20 6f 20 24 65 72 72 6f 72 0d 0a  lTest o $error..
9100: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
9110: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
9120: 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20  .      doneTest 
9130: 4f 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20  O..    }] 0]..  
9140: 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23  }]....  ########
9150: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9160: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9190: 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20  #####..  #      
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44          WORKLOAD
91c0: 20 23 31 36 20 28 50 29 20 20 20 20 20 20 20 20   #16 (P)        
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23       #..  ######
91f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9200: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9210: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9230: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
9240: 20 77 6f 72 6b 6c 6f 61 64 28 31 36 29 20 5b 6c   workload(16) [l
9250: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69  ist \..      [li
9260: 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64  st srcFileName d
9270: 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65  stFileName table
9280: 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63   count1 count2 c
9290: 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d  ount3] {..    #.
92a0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
92b0: 6b 6c 6f 61 64 20 23 31 36 2c 20 61 6c 6c 6f 63  kload #16, alloc
92c0: 61 74 65 20 28 65 78 63 6c 75 64 65 29 20 73 6f  ate (exclude) so
92d0: 6d 65 20 6e 61 74 69 76 65 20 68 65 61 70 20 6d  me native heap m
92e0: 65 6d 6f 72 79 0d 0a 20 20 20 20 23 0d 0a 20 20  emory..    #..  
92f0: 20 20 77 61 69 74 54 65 73 74 20 50 0d 0a 20 20    waitTest P..  
9300: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65    lappend ::time
9310: 73 28 31 36 29 20 5b 6c 69 6e 64 65 78 20 5b 74  s(16) [lindex [t
9320: 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69  ime {..      ini
9330: 74 54 65 73 74 20 50 0d 0a 20 20 20 20 20 20 73  tTest P..      s
9340: 65 74 20 6d 61 78 53 69 7a 65 20 24 3a 3a 63 6f  et maxSize $::co
9350: 75 6e 74 28 35 29 0d 0a 20 20 20 20 20 20 6f 62  unt(5)..      ob
9360: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 41  ject invoke GC A
9370: 64 64 4d 65 6d 6f 72 79 50 72 65 73 73 75 72 65  ddMemoryPressure
9380: 20 24 6d 61 78 53 69 7a 65 0d 0a 20 20 20 20 20   $maxSize..     
9390: 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20   try {..        
93a0: 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31  for {set index 1
93b0: 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f  } {$index <= $co
93c0: 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65  unt1} {incr inde
93d0: 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  x} {..          
93e0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
93f0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 69            set si
9400: 7a 65 20 5b 65 78 70 72 20 7b 69 6e 74 28 6d 69  ze [expr {int(mi
9410: 6e 28 24 6d 61 78 53 69 7a 65 2c 20 61 62 73 28  n($maxSize, abs(
9420: 24 63 6f 75 6e 74 33 20 2a 20 24 69 6e 64 65 78  $count3 * $index
9430: 20 2a 20 35 2e 30 29 29 29 7d 5d 0d 0a 20 20 20   * 5.0)))}]..   
9440: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 74 72           set ptr
9450: 20 5b 61 6c 6c 6f 63 4d 65 6d 20 24 73 69 7a 65   [allocMem $size
9460: 5d 3b 20 23 20 74 68 72 6f 77 0d 0a 20 20 20 20  ]; # throw..    
9470: 20 20 20 20 20 20 20 20 75 73 65 4d 65 6d 20 24          useMem $
9480: 70 74 72 20 24 73 69 7a 65 3b 20 64 65 6c 61 79  ptr $size; delay
9490: 54 65 73 74 20 24 63 6f 75 6e 74 32 0d 0a 20 20  Test $count2..  
94a0: 20 20 20 20 20 20 20 20 20 20 66 72 65 65 4d 65            freeMe
94b0: 6d 20 24 70 74 72 3b 20 75 6e 73 65 74 20 2d 6e  m $ptr; unset -n
94c0: 6f 63 6f 6d 70 6c 61 69 6e 20 70 74 72 0d 0a 20  ocomplain ptr.. 
94d0: 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54             showT
94e0: 65 73 74 20 50 0d 0a 20 20 20 20 20 20 20 20 20  est P..         
94f0: 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
9500: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
9510: 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72  f {[isExpectedEr
9520: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
9530: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
9540: 20 20 20 73 68 6f 77 54 65 73 74 20 70 0d 0a 20     showTest p.. 
9550: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
9560: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
9570: 20 20 20 66 61 69 6c 54 65 73 74 20 70 20 24 65     failTest p $e
9580: 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  rror..          
9590: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
95a0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
95b0: 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
95c0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
95d0: 6f 20 65 78 69 73 74 73 20 70 74 72 5d 7d 20 74  o exists ptr]} t
95e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
95f0: 20 66 72 65 65 4d 65 6d 20 24 70 74 72 3b 20 75   freeMem $ptr; u
9600: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
9610: 20 70 74 72 0d 0a 20 20 20 20 20 20 20 20 7d 0d   ptr..        }.
9620: 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
9630: 69 6e 76 6f 6b 65 20 47 43 20 52 65 6d 6f 76 65  invoke GC Remove
9640: 4d 65 6d 6f 72 79 50 72 65 73 73 75 72 65 20 24  MemoryPressure $
9650: 6d 61 78 53 69 7a 65 0d 0a 20 20 20 20 20 20 7d  maxSize..      }
9660: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
9670: 20 50 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   P..    }] 0].. 
9680: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
9690: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
96a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
96b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
96c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
96d0: 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20  ######..  #     
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41           WORKLOA
9700: 44 20 23 31 37 20 28 51 29 20 20 20 20 20 20 20  D #17 (Q)       
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9720: 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23        #..  #####
9730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9750: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9770: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
9780: 74 20 77 6f 72 6b 6c 6f 61 64 28 31 37 29 20 5b  t workload(17) [
9790: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c  list \..      [l
97a0: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
97b0: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
97c0: 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20  e count1 count2 
97d0: 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23  count3] {..    #
97e0: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f  ..    # NOTE: Wo
97f0: 72 6b 6c 6f 61 64 20 23 31 37 2c 20 63 68 61 6e  rkload #17, chan
9800: 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ge the database 
9810: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 0d 0a 20 20  journal mode..  
9820: 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73    #..    waitTes
9830: 74 20 51 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  t Q..    lappend
9840: 20 3a 3a 74 69 6d 65 73 28 31 37 29 20 5b 6c 69   ::times(17) [li
9850: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
9860: 20 20 20 20 69 6e 69 74 54 65 73 74 20 51 0d 0a      initTest Q..
9870: 20 20 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c        setupWorkl
9880: 6f 61 64 46 69 6c 65 44 62 20 24 64 73 74 46 69  oadFileDb $dstFi
9890: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f  leName..      fo
98a0: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
98b0: 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e  {$index <= $coun
98c0: 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  t1} {incr index}
98d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
98e0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
98f0: 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
9900: 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20  $db [appendArgs 
9910: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
9920: 6d 6f 64 65 20 3d 20 5c 22 22 20 5c 0d 0a 20 20  mode = \"" \..  
9930: 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
9940: 72 20 7b 24 69 6e 64 65 78 20 25 20 32 20 3d 3d  r {$index % 2 ==
9950: 20 30 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 20   0 ? "delete" : 
9960: 22 77 61 6c 22 7d 5d 20 5c 22 5c 3b 5d 0d 0a 20  "wal"}] \"\;].. 
9970: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
9980: 74 20 51 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  t Q..        } e
9990: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
99a0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
99b0: 45 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65  ExpectedError $e
99c0: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
99d0: 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54             showT
99e0: 65 73 74 20 71 0d 0a 20 20 20 20 20 20 20 20 20  est q..         
99f0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
9a00: 20 20 20 20 20 20 20 66 61 69 6c 54 65 73 74 20         failTest 
9a10: 71 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  q $error..      
9a20: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
9a30: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
9a40: 20 63 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46   cleanupDb $dstF
9a50: 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
9a60: 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20   true false..   
9a70: 20 20 20 64 6f 6e 65 54 65 73 74 20 51 0d 0a 20     doneTest Q.. 
9a80: 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a     }] 0]..  }]..
9a90: 0d 0a 20 20 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 23 23 23 23 23 23 23 23  ################
9ae0: 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20 20  #..  #          
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b00: 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 38      WORKLOAD #18
9b10: 20 28 52 29 20 20 20 20 20 20 20 20 20 20 20 20   (R)            
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23   #..  ##########
9b40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9b50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9b60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9b80: 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72  ###....  set wor
9b90: 6b 6c 6f 61 64 28 31 38 29 20 5b 6c 69 73 74 20  kload(18) [list 
9ba0: 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73  \..      [list s
9bb0: 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69  rcFileName dstFi
9bc0: 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75  leName table cou
9bd0: 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74  nt1 count2 count
9be0: 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20  3] {..    #..   
9bf0: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
9c00: 64 20 23 31 38 2c 20 65 78 65 63 75 74 65 20 71  d #18, execute q
9c10: 75 65 72 69 65 73 20 61 67 61 69 6e 73 74 20 74  ueries against t
9c20: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
9c30: 61 62 61 73 65 0d 0a 20 20 20 20 23 0d 0a 20 20  abase..    #..  
9c40: 20 20 77 61 69 74 54 65 73 74 20 52 0d 0a 20 20    waitTest R..  
9c50: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65    lappend ::time
9c60: 73 28 31 38 29 20 5b 6c 69 6e 64 65 78 20 5b 74  s(18) [lindex [t
9c70: 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69  ime {..      ini
9c80: 74 54 65 73 74 20 52 0d 0a 20 20 20 20 20 20 73  tTest R..      s
9c90: 65 74 75 70 57 6f 72 6b 6c 6f 61 64 4d 65 6d 44  etupWorkloadMemD
9ca0: 62 20 24 73 72 63 46 69 6c 65 4e 61 6d 65 0d 0a  b $srcFileName..
9cb0: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
9cc0: 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
9cd0: 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63  <= $count1} {inc
9ce0: 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
9cf0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
9d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
9d10: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9d20: 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 33 2c   Workload #18.3,
9d30: 20 22 73 6d 61 6c 6c 22 20 53 45 4c 45 43 54 20   "small" SELECT 
9d40: 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20  statements...   
9d50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9d60: 20 20 20 20 73 65 74 20 72 65 61 64 65 72 20 5b      set reader [
9d70: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
9d80: 63 75 74 65 20 72 65 61 64 65 72 20 5c 0d 0a 20  cute reader \.. 
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 66 6f               -fo
9da0: 72 6d 61 74 20 64 61 74 61 52 65 61 64 65 72 20  rmat dataReader 
9db0: 2d 61 6c 69 61 73 20 24 64 62 20 5b 61 70 70 65  -alias $db [appe
9dc0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
9dd0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
9de0: 78 2c 20 79 20 46 52 4f 4d 20 22 20 24 74 61 62  x, y FROM " $tab
9df0: 6c 65 20 22 20 57 48 45 52 45 20 7a 20 3d 20 27  le " WHERE z = '
9e00: 73 6d 61 6c 6c 27 3b 22 5d 5d 0d 0a 20 20 20 20  small';"]]..    
9e10: 20 20 20 20 20 20 77 68 69 6c 65 20 7b 5b 24 72        while {[$r
9e20: 65 61 64 65 72 20 52 65 61 64 5d 7d 20 7b 0d 0a  eader Read]} {..
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
9e40: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
9e50: 45 3a 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a  E: Do nothing...
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
9e70: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9e80: 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
9e90: 6f 6d 70 6c 61 69 6e 20 72 65 61 64 65 72 0d 0a  omplain reader..
9ea0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
9eb0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
9ec0: 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 34 2c 20 22  orkload #18.4, "
9ed0: 62 69 67 22 20 53 45 4c 45 43 54 20 73 74 61 74  big" SELECT stat
9ee0: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  ements...       
9ef0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
9f00: 73 65 74 20 72 65 61 64 65 72 20 5b 73 71 6c 20  set reader [sql 
9f10: 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
9f20: 20 72 65 61 64 65 72 20 5c 0d 0a 20 20 20 20 20   reader \..     
9f30: 20 20 20 20 20 20 20 20 20 2d 66 6f 72 6d 61 74           -format
9f40: 20 64 61 74 61 52 65 61 64 65 72 20 2d 61 6c 69   dataReader -ali
9f50: 61 73 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  as $db [appendAr
9f60: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
9f70: 20 20 20 20 22 53 45 4c 45 43 54 20 78 2c 20 79      "SELECT x, y
9f80: 20 46 52 4f 4d 20 22 20 24 74 61 62 6c 65 20 22   FROM " $table "
9f90: 20 57 48 45 52 45 20 7a 20 3d 20 27 62 69 67 27   WHERE z = 'big'
9fa0: 3b 22 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ;"]]..          
9fb0: 77 68 69 6c 65 20 7b 5b 24 72 65 61 64 65 72 20  while {[$reader 
9fc0: 52 65 61 64 5d 7d 20 7b 0d 0a 20 20 20 20 20 20  Read]} {..      
9fd0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9fe0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 20       # NOTE: Do 
9ff0: 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20  nothing...      
a000: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a010: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
a020: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
a030: 6e 20 72 65 61 64 65 72 0d 0a 20 20 20 20 20 20  n reader..      
a040: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a050: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
a060: 64 20 23 31 38 2e 35 2c 20 22 73 6d 61 6c 6c 22  d #18.5, "small"
a070: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
a080: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts...          #
a090: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20  ..          sql 
a0a0: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
a0b0: 65 6e 64 41 72 67 73 20 22 49 4e 53 45 52 54 20  endArgs "INSERT 
a0c0: 49 4e 54 4f 20 22 20 24 74 61 62 6c 65 20 5c 0d  INTO " $table \.
a0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
a0e0: 28 78 2c 20 79 2c 20 7a 29 20 56 41 4c 55 45 53  (x, y, z) VALUES
a0f0: 28 27 22 20 5b 66 6f 72 6d 61 74 20 25 6c 58 20  ('" [format %lX 
a100: 5b 65 78 70 72 20 7b 72 61 6e 64 6f 6d 28 29 7d  [expr {random()}
a110: 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] \..          
a120: 20 20 20 20 22 27 2c 20 27 22 20 5b 62 61 73 65      "', '" [base
a130: 36 34 20 65 6e 63 6f 64 65 20 2d 2d 20 5b 65 78  64 encode -- [ex
a140: 70 72 20 7b 72 61 6e 64 73 74 72 28 24 63 6f 75  pr {randstr($cou
a150: 6e 74 32 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20  nt2)}]] \..     
a160: 20 20 20 20 20 20 20 20 20 22 27 2c 20 27 73 6d           "', 'sm
a170: 61 6c 6c 27 29 3b 22 5d 0d 0a 20 20 20 20 20 20  all');"]..      
a180: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a190: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
a1a0: 64 20 23 31 38 2e 36 2c 20 22 62 69 67 22 20 49  d #18.6, "big" I
a1b0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73  NSERT statements
a1c0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
a1d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78            sql ex
a1e0: 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e  ecute $db [appen
a1f0: 64 41 72 67 73 20 22 49 4e 53 45 52 54 20 49 4e  dArgs "INSERT IN
a200: 54 4f 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20  TO " $table \.. 
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 28 78               "(x
a220: 2c 20 79 2c 20 7a 29 20 56 41 4c 55 45 53 28 27  , y, z) VALUES('
a230: 22 20 5b 66 6f 72 6d 61 74 20 25 6c 58 20 5b 65  " [format %lX [e
a240: 78 70 72 20 7b 72 61 6e 64 6f 6d 28 29 7d 5d 5d  xpr {random()}]]
a250: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a260: 20 20 22 27 2c 20 52 41 4e 44 4f 4d 42 4c 4f 42    "', RANDOMBLOB
a270: 28 22 20 24 63 6f 75 6e 74 33 20 22 29 2c 20 27  (" $count3 "), '
a280: 62 69 67 27 29 3b 22 5d 0d 0a 20 20 20 20 20 20  big');"]..      
a290: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a2a0: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
a2b0: 64 20 23 31 38 2e 37 2c 20 22 73 6d 61 6c 6c 22  d #18.7, "small"
a2c0: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
a2d0: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts...          #
a2e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20  ..          sql 
a2f0: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
a300: 65 6e 64 41 72 67 73 20 22 55 50 44 41 54 45 20  endArgs "UPDATE 
a310: 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20  " $table \..    
a320: 20 20 20 20 20 20 20 20 20 20 22 20 53 45 54 20            " SET 
a330: 79 20 3d 20 27 22 20 5b 62 61 73 65 36 34 20 65  y = '" [base64 e
a340: 6e 63 6f 64 65 20 2d 2d 20 5b 65 78 70 72 20 7b  ncode -- [expr {
a350: 72 61 6e 64 73 74 72 28 24 63 6f 75 6e 74 32 29  randstr($count2)
a360: 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  }]] \..         
a370: 20 20 20 20 20 22 27 20 57 48 45 52 45 20 78 20       "' WHERE x 
a380: 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74 20  LIKE '" [format 
a390: 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20 41  %X $index] "%' A
a3a0: 4e 44 20 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b 22  ND z = 'small';"
a3b0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ]..          #..
a3c0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
a3d0: 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 38  : Workload #18.8
a3e0: 2c 20 22 62 69 67 22 20 55 50 44 41 54 45 20 73  , "big" UPDATE s
a3f0: 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20  tatements...    
a400: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a410: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
a420: 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  db [appendArgs "
a430: 55 50 44 41 54 45 20 22 20 24 74 61 62 6c 65 20  UPDATE " $table 
a440: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a450: 20 22 20 53 45 54 20 79 20 3d 20 52 41 4e 44 4f   " SET y = RANDO
a460: 4d 42 4c 4f 42 28 22 20 24 63 6f 75 6e 74 33 20  MBLOB(" $count3 
a470: 22 29 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  ") WHERE x LIKE 
a480: 27 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  '" \..          
a490: 20 20 20 20 5b 66 6f 72 6d 61 74 20 25 58 20 24      [format %X $
a4a0: 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44 20 7a  index] "%' AND z
a4b0: 20 3d 20 27 62 69 67 27 3b 22 5d 0d 0a 20 20 20   = 'big';"]..   
a4c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a4d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b      # NOTE: Work
a4e0: 6c 6f 61 64 20 23 31 38 2e 39 2c 20 22 73 6d 61  load #18.9, "sma
a4f0: 6c 6c 22 20 44 45 4c 45 54 45 20 73 74 61 74 65  ll" DELETE state
a500: 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  ments...        
a510: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
a520: 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b  ql execute $db [
a530: 61 70 70 65 6e 64 41 72 67 73 20 22 44 45 4c 45  appendArgs "DELE
a540: 54 45 20 46 52 4f 4d 20 22 20 24 74 61 62 6c 65  TE FROM " $table
a550: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a560: 20 20 22 20 57 48 45 52 45 20 78 20 4c 49 4b 45    " WHERE x LIKE
a570: 20 27 22 20 5b 66 6f 72 6d 61 74 20 25 58 20 24   '" [format %X $
a580: 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44 20 7a  index] "%' AND z
a590: 20 3d 20 27 73 6d 61 6c 6c 27 3b 22 5d 0d 0a 20   = 'small';"].. 
a5a0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a5b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f        # NOTE: Wo
a5c0: 72 6b 6c 6f 61 64 20 23 31 38 2e 31 30 2c 20 22  rkload #18.10, "
a5d0: 62 69 67 22 20 44 45 4c 45 54 45 20 73 74 61 74  big" DELETE stat
a5e0: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  ements...       
a5f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
a600: 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
a610: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 44 45 4c  [appendArgs "DEL
a620: 45 54 45 20 46 52 4f 4d 20 22 20 24 74 61 62 6c  ETE FROM " $tabl
a630: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
a640: 20 20 20 22 20 57 48 45 52 45 20 78 20 4c 49 4b     " WHERE x LIK
a650: 45 20 27 22 20 5b 66 6f 72 6d 61 74 20 25 58 20  E '" [format %X 
a660: 24 69 6e 64 65 78 5d 20 22 25 27 20 41 4e 44 20  $index] "%' AND 
a670: 7a 20 3d 20 27 62 69 67 27 3b 22 5d 0d 0a 20 20  z = 'big';"]..  
a680: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a690: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72       # NOTE: Wor
a6a0: 6b 6c 6f 61 64 20 23 31 38 2e 31 31 2c 20 56 41  kload #18.11, VA
a6b0: 43 55 55 4d 20 73 74 61 74 65 6d 65 6e 74 2e 0d  CUUM statement..
a6c0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
a6d0: 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
a6e0: 75 74 65 20 24 64 62 20 22 56 41 43 55 55 4d 3b  ute $db "VACUUM;
a6f0: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  "..          #..
a700: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
a710: 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 31  : Workload #18.1
a720: 34 2c 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72  4, PRAGMA integr
a730: 69 74 79 20 63 68 65 63 6b 20 73 74 61 74 65 6d  ity check statem
a740: 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ent...          
a750: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
a760: 20 72 65 73 75 6c 74 20 5b 73 71 6c 20 65 78 65   result [sql exe
a770: 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63  cute -execute sc
a780: 61 6c 61 72 20 24 64 62 20 5c 0d 0a 20 20 20 20  alar $db \..    
a790: 20 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d            "PRAGM
a7a0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
a7b0: 6b 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  k;"]..          
a7c0: 69 66 20 7b 24 72 65 73 75 6c 74 20 6e 65 20 22  if {$result ne "
a7d0: 6f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ok"} then {..   
a7e0: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b           error [
a7f0: 61 70 70 65 6e 64 41 72 67 73 20 22 69 6e 74 65  appendArgs "inte
a800: 67 72 69 74 79 20 63 68 65 63 6b 20 66 61 69 6c  grity check fail
a810: 65 64 3a 20 22 20 24 72 65 73 75 6c 74 5d 0d 0a  ed: " $result]..
a820: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
a830: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
a840: 52 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  R..        } err
a850: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
a860: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78         if {[isEx
a870: 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72  pectedError $err
a880: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
a890: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
a8a0: 74 20 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  t r..          }
a8b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a8c0: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 72 20       failTest r 
a8d0: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
a8e0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
a8f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63        }..      c
a900: 6c 65 61 6e 75 70 44 62 20 24 73 72 63 46 69 6c  leanupDb $srcFil
a910: 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74  eName db false t
a920: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
a930: 20 64 6f 6e 65 54 65 73 74 20 52 0d 0a 20 20 20   doneTest R..   
a940: 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 7d 20   }] 0]..  }]..} 
a950: 2d 62 6f 64 79 20 7b 0d 0a 20 20 74 70 75 74 73  -body {..  tputs
a960: 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b   $test_channel [
a970: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
a980: 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
a990: 47 3a 20 74 68 69 73 20 73 74 72 65 73 73 20 74  G: this stress t
a9a0: 65 73 74 20 6d 61 79 20 74 61 6b 65 20 73 65 76  est may take sev
a9b0: 65 72 61 6c 20 6d 69 6e 75 74 65 73 2e 2e 2e 5c  eral minutes...\
a9c0: 6e 22 5d 0d 0a 0d 0a 20 20 66 6f 72 20 7b 73 65  n"]....  for {se
a9d0: 74 20 69 6e 64 65 78 28 30 29 20 31 7d 20 7b 24  t index(0) 1} {$
a9e0: 69 6e 64 65 78 28 30 29 20 3c 3d 20 24 63 6f 75  index(0) <= $cou
a9f0: 6e 74 28 30 29 7d 20 7b 69 6e 63 72 20 69 6e 64  nt(0)} {incr ind
aa00: 65 78 28 30 29 7d 20 7b 0d 0a 20 20 20 20 69 66  ex(0)} {..    if
aa10: 20 7b 24 69 6e 64 65 78 28 30 29 20 3e 20 31 7d   {$index(0) > 1}
aa20: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 23   then {..      #
aa30: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
aa40: 41 64 76 61 6e 63 65 20 6f 75 74 70 75 74 20 74  Advance output t
aa50: 6f 20 74 68 65 20 6e 65 78 74 20 6c 69 6e 65 20  o the next line 
aa60: 64 75 65 20 74 6f 20 74 68 65 20 77 6f 72 6b 6c  due to the workl
aa70: 6f 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  oad..      #    
aa80: 20 20 20 69 74 65 72 61 74 69 6f 6e 20 70 72 6f     iteration pro
aa90: 67 72 65 73 73 20 69 6e 64 69 63 61 74 6f 72 73  gress indicators
aaa0: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
aab0: 75 73 20 72 75 6e 2e 0d 0a 20 20 20 20 20 20 23  us run...      #
aac0: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 74  ..      tputs $t
aad0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 6e 0d 0a  est_channel \n..
aae0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 74 70 75      }....    tpu
aaf0: 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  ts $test_channel
ab00: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
ab10: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 74          "---- st
ab20: 61 72 74 69 6e 67 20 77 6f 72 6b 6c 6f 61 64 20  arting workload 
ab30: 72 75 6e 20 23 22 20 24 69 6e 64 65 78 28 30 29  run #" $index(0)
ab40: 20 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 75   ...\n]....    u
ab50: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
ab60: 20 74 68 72 65 61 64 20 73 74 61 74 75 73 3b 20   thread status; 
ab70: 64 6f 6e 65 54 65 73 74 0d 0a 0d 0a 20 20 20 20  doneTest....    
ab80: 73 71 6c 20 65 78 65 63 75 74 65 20 24 73 72 63  sql execute $src
ab90: 44 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  Db "CREATE TABLE
aba0: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74   IF NOT EXISTS t
abb0: 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(x PRIMARY KEY,
abc0: 20 79 2c 20 7a 29 3b 22 0d 0a 20 20 20 20 73 71   y, z);"..    sq
abd0: 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 22 43  l execute $db "C
abe0: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
abf0: 4f 54 20 45 58 49 53 54 53 20 74 31 28 78 20 50  OT EXISTS t1(x P
ac00: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 2c 20 7a  RIMARY KEY, y, z
ac10: 29 3b 22 0d 0a 0d 0a 20 20 20 20 66 6f 72 65 61  );"....    forea
ac20: 63 68 20 69 6e 64 65 78 28 31 29 20 5b 6c 73 6f  ch index(1) [lso
ac30: 72 74 20 2d 69 6e 74 65 67 65 72 20 5b 61 72 72  rt -integer [arr
ac40: 61 79 20 6e 61 6d 65 73 20 77 6f 72 6b 6c 6f 61  ay names workloa
ac50: 64 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  d]] {..      if 
ac60: 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
ac70: 20 24 6e 6f 57 6f 72 6b 6c 6f 61 64 20 24 69 6e   $noWorkload $in
ac80: 64 65 78 28 31 29 5d 20 3d 3d 20 2d 31 7d 20 74  dex(1)] == -1} t
ac90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
aca0: 65 74 20 74 68 72 65 61 64 28 24 69 6e 64 65 78  et thread($index
acb0: 28 31 29 29 20 5b 6f 62 6a 65 63 74 20 63 72 65  (1)) [object cre
acc0: 61 74 65 20 2d 61 6c 69 61 73 20 53 79 73 74 65  ate -alias Syste
acd0: 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65  m.Threading.Thre
ace0: 61 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ad \..          
acf0: 20 20 5b 6c 69 73 74 20 61 70 70 6c 79 20 24 77    [list apply $w
ad00: 6f 72 6b 6c 6f 61 64 28 24 69 6e 64 65 78 28 31  orkload($index(1
ad10: 29 29 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  )) $fileName(1) 
ad20: 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 74 31 20  $fileName(2) t1 
ad30: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
ad40: 63 6f 75 6e 74 28 31 29 20 24 63 6f 75 6e 74 28  count(1) $count(
ad50: 33 29 20 24 63 6f 75 6e 74 28 34 29 5d 20 31 30  3) $count(4)] 10
ad60: 34 38 35 37 36 5d 0d 0a 0d 0a 20 20 20 20 20 20  48576]....      
ad70: 20 20 24 74 68 72 65 61 64 28 24 69 6e 64 65 78    $thread($index
ad80: 28 31 29 29 20 4e 61 6d 65 20 5b 61 70 70 65 6e  (1)) Name [appen
ad90: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
ada0: 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e       [file rootn
adb0: 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ame [file tail $
adc0: 66 69 6c 65 4e 61 6d 65 28 32 29 5d 5d 20 22 20  fileName(2)]] " 
add0: 23 22 20 24 69 6e 64 65 78 28 31 29 5d 0d 0a 0d  #" $index(1)]...
ade0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
adf0: 66 6f 20 65 78 69 73 74 73 20 70 72 69 6f 72 69  fo exists priori
ae00: 74 79 28 24 69 6e 64 65 78 28 31 29 29 5d 7d 20  ty($index(1))]} 
ae10: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ae20: 20 20 24 74 68 72 65 61 64 28 24 69 6e 64 65 78    $thread($index
ae30: 28 31 29 29 20 50 72 69 6f 72 69 74 79 20 24 70  (1)) Priority $p
ae40: 72 69 6f 72 69 74 79 28 24 69 6e 64 65 78 28 31  riority($index(1
ae50: 29 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ))..        }.. 
ae60: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
ae70: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 69 6e 64  .    foreach ind
ae80: 65 78 28 31 29 20 5b 61 72 72 61 79 20 6e 61 6d  ex(1) [array nam
ae90: 65 73 20 74 68 72 65 61 64 5d 20 7b 0d 0a 20 20  es thread] {..  
aea0: 20 20 20 20 24 74 68 72 65 61 64 28 24 69 6e 64      $thread($ind
aeb0: 65 78 28 31 29 29 20 53 74 61 72 74 0d 0a 20 20  ex(1)) Start..  
aec0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 24 65 76 65 6e    }....    $even
aed0: 74 20 53 65 74 3b 20 23 20 47 4f 0d 0a 0d 0a 20  t Set; # GO.... 
aee0: 20 20 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78     foreach index
aef0: 28 31 29 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  (1) [array names
af00: 20 74 68 72 65 61 64 5d 20 7b 0d 0a 20 20 20 20   thread] {..    
af10: 20 20 24 74 68 72 65 61 64 28 24 69 6e 64 65 78    $thread($index
af20: 28 31 29 29 20 4a 6f 69 6e 0d 0a 20 20 20 20 7d  (1)) Join..    }
af30: 0d 0a 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20  ....    foreach 
af40: 69 6e 64 65 78 28 31 29 20 5b 61 72 72 61 79 20  index(1) [array 
af50: 6e 61 6d 65 73 20 74 68 72 65 61 64 5d 20 7b 0d  names thread] {.
af60: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
af70: 20 65 78 69 73 74 73 20 74 68 72 65 61 64 28 24   exists thread($
af80: 69 6e 64 65 78 28 31 29 29 5d 20 26 26 20 5c 0d  index(1))] && \.
af90: 0a 20 20 20 20 20 20 20 20 20 20 5b 63 6c 65 61  .          [clea
afa0: 6e 75 70 54 68 72 65 61 64 20 24 74 68 72 65 61  nupThread $threa
afb0: 64 28 24 69 6e 64 65 78 28 31 29 29 5d 7d 20 74  d($index(1))]} t
afc0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
afd0: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
afe0: 20 74 68 72 65 61 64 28 24 69 6e 64 65 78 28 31   thread($index(1
aff0: 29 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ))..      }..   
b000: 20 7d 0d 0a 0d 0a 20 20 20 20 75 6e 73 65 74 20   }....    unset 
b010: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 68 72 65  -nocomplain thre
b020: 61 64 20 73 74 61 74 75 73 3b 20 64 6f 6e 65 54  ad status; doneT
b030: 65 73 74 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23  est..  }....  ##
b040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b070: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b080: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
b090: 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78 28 30   foreach index(0
b0a0: 29 20 5b 73 70 6c 69 74 20 24 69 6e 64 69 63 61  ) [split $indica
b0b0: 74 6f 72 73 20 22 22 5d 20 7b 0d 0a 20 20 20 20  tors ""] {..    
b0c0: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  #..    # NOTE: S
b0d0: 65 65 20 69 66 20 74 68 69 73 20 77 6f 72 6b 6c  ee if this workl
b0e0: 6f 61 64 20 69 74 65 72 61 74 69 6f 6e 20 72 61  oad iteration ra
b0f0: 69 73 65 64 20 61 6e 20 65 72 72 6f 72 2e 20 20  ised an error.  
b100: 49 66 20 73 6f 2c 20 74 68 65 0d 0a 20 20 20 20  If so, the..    
b110: 23 20 20 20 20 20 20 20 69 6e 64 69 63 61 74 6f  #       indicato
b120: 72 20 6c 65 74 74 65 72 20 77 69 6c 6c 20 62 65  r letter will be
b130: 20 69 6e 20 6c 6f 77 65 72 20 63 61 73 65 3b 20   in lower case; 
b140: 6f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  otherwise, it wi
b150: 6c 6c 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  ll..    #       
b160: 62 65 20 69 6e 20 75 70 70 65 72 20 63 61 73 65  be in upper case
b170: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65  ...    #..    se
b180: 74 20 69 6e 64 65 78 28 31 29 20 5b 73 74 72 69  t index(1) [stri
b190: 6e 67 20 69 73 20 75 70 70 65 72 20 2d 73 74 72  ng is upper -str
b1a0: 69 63 74 20 24 69 6e 64 65 78 28 30 29 5d 0d 0a  ict $index(0)]..
b1b0: 0d 0a 20 20 20 20 73 65 74 20 69 6e 64 65 78 28  ..    set index(
b1c0: 32 29 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e  2) [expr {[strin
b1d0: 67 20 6f 72 64 69 6e 61 6c 20 24 69 6e 64 65 78  g ordinal $index
b1e0: 28 30 29 20 30 5d 20 2d 20 5c 0d 0a 20 20 20 20  (0) 0] - \..    
b1f0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6f 72 64 69      [string ordi
b200: 6e 61 6c 20 5b 65 78 70 72 20 7b 24 69 6e 64 65  nal [expr {$inde
b210: 78 28 31 29 20 3f 20 22 41 22 20 3a 20 22 61 22  x(1) ? "A" : "a"
b220: 7d 5d 20 30 5d 20 2b 20 31 7d 5d 0d 0a 0d 0a 20  }] 0] + 1}].... 
b230: 20 20 20 73 65 74 20 69 6e 64 65 78 28 33 29 20     set index(3) 
b240: 5b 65 78 70 72 20 7b 24 69 6e 64 65 78 28 31 29  [expr {$index(1)
b250: 20 3f 20 22 6f 6b 22 20 3a 20 22 65 72 72 6f 72   ? "ok" : "error
b260: 22 7d 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 21  "}]....    if {!
b270: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 69 74 65  [info exists ite
b280: 72 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 28 32  rations($index(2
b290: 29 2c 24 69 6e 64 65 78 28 33 29 29 5d 7d 20 74  ),$index(3))]} t
b2a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  hen {..      set
b2b0: 20 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e 64   iterations($ind
b2c0: 65 78 28 32 29 2c 24 69 6e 64 65 78 28 33 29 29  ex(2),$index(3))
b2d0: 20 30 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   0..    }....   
b2e0: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
b2f0: 74 73 20 69 74 65 72 61 74 69 6f 6e 73 28 24 69  ts iterations($i
b300: 6e 64 65 78 28 32 29 2c 74 6f 74 61 6c 29 5d 7d  ndex(2),total)]}
b310: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73   then {..      s
b320: 65 74 20 69 74 65 72 61 74 69 6f 6e 73 28 24 69  et iterations($i
b330: 6e 64 65 78 28 32 29 2c 74 6f 74 61 6c 29 20 30  ndex(2),total) 0
b340: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69  ..    }....    i
b350: 6e 63 72 20 69 74 65 72 61 74 69 6f 6e 73 28 24  ncr iterations($
b360: 69 6e 64 65 78 28 32 29 2c 24 69 6e 64 65 78 28  index(2),$index(
b370: 33 29 29 0d 0a 20 20 20 20 69 6e 63 72 20 69 74  3))..    incr it
b380: 65 72 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 28  erations($index(
b390: 32 29 2c 74 6f 74 61 6c 29 0d 0a 20 20 7d 0d 0a  2),total)..  }..
b3a0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
b3b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b3c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b3d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b3e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b3f0: 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  #....  #..  # NO
b400: 54 45 3a 20 41 64 76 61 6e 63 65 20 6f 75 74 70  TE: Advance outp
b410: 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6c  ut to the next l
b420: 69 6e 65 20 64 75 65 20 74 6f 20 74 68 65 20 77  ine due to the w
b430: 6f 72 6b 6c 6f 61 64 0d 0a 20 20 23 20 20 20 20  orkload..  #    
b440: 20 20 20 69 74 65 72 61 74 69 6f 6e 20 70 72 6f     iteration pro
b450: 67 72 65 73 73 20 69 6e 64 69 63 61 74 6f 72 73  gress indicators
b460: 20 66 72 6f 6d 20 74 68 65 20 66 69 6e 61 6c 20   from the final 
b470: 72 75 6e 2e 0d 0a 20 20 23 0d 0a 20 20 74 70 75  run...  #..  tpu
b480: 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  ts $test_channel
b490: 20 5c 6e 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   \n....  #######
b4a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b4b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b4c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b4d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b4e0: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 66 6f 72 65  ######....  fore
b4f0: 61 63 68 20 69 6e 64 65 78 28 30 29 20 5b 6c 73  ach index(0) [ls
b500: 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 5b 61 72  ort -integer [ar
b510: 72 61 79 20 6e 61 6d 65 73 20 77 6f 72 6b 6c 6f  ray names worklo
b520: 61 64 5d 5d 20 7b 0d 0a 20 20 20 20 69 66 20 7b  ad]] {..    if {
b530: 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
b540: 24 6e 6f 57 6f 72 6b 6c 6f 61 64 20 24 69 6e 64  $noWorkload $ind
b550: 65 78 28 30 29 5d 20 3d 3d 20 2d 31 7d 20 74 68  ex(0)] == -1} th
b560: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74  en {..      tput
b570: 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  s $test_channel 
b580: 5b 66 6f 72 6d 61 74 57 6f 72 6b 6c 6f 61 64 52  [formatWorkloadR
b590: 65 73 75 6c 74 20 24 69 6e 64 65 78 28 30 29 5d  esult $index(0)]
b5a0: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
b5b0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
b5c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b5d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b5e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b5f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
b600: 0a 0d 0a 20 20 66 6f 72 65 61 63 68 20 69 6e 64  ...  foreach ind
b610: 65 78 28 30 29 20 5b 6c 73 6f 72 74 20 2d 69 6e  ex(0) [lsort -in
b620: 74 65 67 65 72 20 5b 61 72 72 61 79 20 6e 61 6d  teger [array nam
b630: 65 73 20 74 69 6d 65 73 5d 5d 20 7b 0d 0a 20 20  es times]] {..  
b640: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
b650: 61 6e 6e 65 6c 20 5b 66 6f 72 6d 61 74 57 6f 72  annel [formatWor
b660: 6b 6c 6f 61 64 54 69 6d 65 20 24 69 6e 64 65 78  kloadTime $index
b670: 28 30 29 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  (0)]..  }....  #
b680: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b690: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b6a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b6b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b6c0: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
b6d0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 73 71    set result [sq
b6e0: 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
b6f0: 74 65 20 73 63 61 6c 61 72 20 24 73 72 63 44 62  te scalar $srcDb
b700: 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   "PRAGMA integri
b710: 74 79 5f 63 68 65 63 6b 3b 22 5d 0d 0a 0d 0a 20  ty_check;"].... 
b720: 20 69 66 20 7b 24 72 65 73 75 6c 74 20 65 71 20   if {$result eq 
b730: 22 6f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  "ok"} then {..  
b740: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
b750: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 69 6e 74 65  annel "---- inte
b760: 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6b 20 28  grity check ok (
b770: 73 72 63 44 62 29 5c 6e 22 0d 0a 20 20 7d 20 65  srcDb)\n"..  } e
b780: 6c 73 65 20 7b 0d 0a 20 20 20 20 65 72 72 6f 72  lse {..    error
b790: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 69 6e   [appendArgs "in
b7a0: 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 66 61  tegrity check fa
b7b0: 69 6c 65 64 20 28 73 72 63 44 62 29 3a 20 22 20  iled (srcDb): " 
b7c0: 24 72 65 73 75 6c 74 5d 0d 0a 20 20 7d 0d 0a 0d  $result]..  }...
b7d0: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
b7e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b7f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b800: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b810: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b820: 0d 0a 0d 0a 20 20 73 65 74 20 72 65 73 75 6c 74  ....  set result
b830: 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65   [sql execute -e
b840: 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64  xecute scalar $d
b850: 62 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72  b "PRAGMA integr
b860: 69 74 79 5f 63 68 65 63 6b 3b 22 5d 0d 0a 0d 0a  ity_check;"]....
b870: 20 20 69 66 20 7b 24 72 65 73 75 6c 74 20 65 71    if {$result eq
b880: 20 22 6f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20   "ok"} then {.. 
b890: 20 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63     tputs $test_c
b8a0: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 69 6e 74  hannel "---- int
b8b0: 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6b 20  egrity check ok 
b8c0: 28 64 62 29 5c 6e 22 0d 0a 20 20 7d 20 65 6c 73  (db)\n"..  } els
b8d0: 65 20 7b 0d 0a 20 20 20 20 65 72 72 6f 72 20 5b  e {..    error [
b8e0: 61 70 70 65 6e 64 41 72 67 73 20 22 69 6e 74 65  appendArgs "inte
b8f0: 67 72 69 74 79 20 63 68 65 63 6b 20 66 61 69 6c  grity check fail
b900: 65 64 20 28 64 62 29 3a 20 22 20 24 72 65 73 75  ed (db): " $resu
b910: 6c 74 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23  lt]..  }....  ##
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 23 23 23 23 23 23  ################
b940: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b950: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b960: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
b970: 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68   #..  # NOTE: Th
b980: 65 20 6f 76 65 72 61 6c 6c 20 74 65 73 74 20 72  e overall test r
b990: 65 73 75 6c 74 20 69 73 20 74 68 65 20 74 6f 74  esult is the tot
b9a0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 61 69  al number of fai
b9b0: 6c 75 72 65 73 20 28 69 2e 65 2e 0d 0a 20 20 23  lures (i.e...  #
b9c0: 20 20 20 20 20 20 20 22 75 6e 65 78 70 65 63 74         "unexpect
b9d0: 65 64 20 65 72 72 6f 72 73 22 29 20 65 6e 63 6f  ed errors") enco
b9e0: 75 6e 74 65 72 65 64 20 64 75 72 69 6e 67 20 61  untered during a
b9f0: 20 77 6f 72 6b 6c 6f 61 64 20 69 74 65 72 61 74   workload iterat
ba00: 69 6f 6e 2e 0d 0a 20 20 23 0d 0a 20 20 65 78 70  ion...  #..  exp
ba10: 72 20 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 66  r {[array size f
ba20: 61 69 6c 75 72 65 73 5d 20 3e 20 30 20 3f 20 5c  ailures] > 0 ? \
ba30: 0d 0a 20 20 20 20 20 20 5b 65 78 70 72 20 5b 6a  ..      [expr [j
ba40: 6f 69 6e 20 5b 61 72 72 61 79 20 76 61 6c 75 65  oin [array value
ba50: 73 20 66 61 69 6c 75 72 65 73 5d 20 2b 5d 5d 20  s failures] +]] 
ba60: 3a 20 30 7d 0d 0a 7d 20 2d 63 6c 65 61 6e 75 70  : 0}..} -cleanup
ba70: 20 7b 0d 0a 20 20 66 6f 72 65 61 63 68 20 69 6e   {..  foreach in
ba80: 64 65 78 28 30 29 20 5b 61 72 72 61 79 20 6e 61  dex(0) [array na
ba90: 6d 65 73 20 74 68 72 65 61 64 5d 20 7b 0d 0a 20  mes thread] {.. 
baa0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
bab0: 73 74 73 20 74 68 72 65 61 64 28 24 69 6e 64 65  sts thread($inde
bac0: 78 28 30 29 29 5d 20 26 26 20 5c 0d 0a 20 20 20  x(0))] && \..   
bad0: 20 20 20 20 20 5b 63 6c 65 61 6e 75 70 54 68 72       [cleanupThr
bae0: 65 61 64 20 24 74 68 72 65 61 64 28 24 69 6e 64  ead $thread($ind
baf0: 65 78 28 30 29 29 5d 7d 20 74 68 65 6e 20 7b 0d  ex(0))]} then {.
bb00: 0a 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f  .      unset -no
bb10: 63 6f 6d 70 6c 61 69 6e 20 74 68 72 65 61 64 28  complain thread(
bb20: 24 69 6e 64 65 78 28 30 29 29 0d 0a 20 20 20 20  $index(0))..    
bb30: 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 6e 61  }..  }....  rena
bb40: 6d 65 20 66 72 65 65 4d 65 6d 20 22 22 0d 0a 20  me freeMem "".. 
bb50: 20 72 65 6e 61 6d 65 20 75 73 65 4d 65 6d 20 22   rename useMem "
bb60: 22 0d 0a 20 20 72 65 6e 61 6d 65 20 61 6c 6c 6f  "..  rename allo
bb70: 63 4d 65 6d 20 22 22 0d 0a 20 20 72 65 6e 61 6d  cMem ""..  renam
bb80: 65 20 66 61 69 6c 54 65 73 74 20 22 22 0d 0a 20  e failTest "".. 
bb90: 20 72 65 6e 61 6d 65 20 64 6f 6e 65 54 65 73 74   rename doneTest
bba0: 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 73 68   ""..  rename sh
bbb0: 6f 77 54 65 73 74 20 22 22 0d 0a 20 20 72 65 6e  owTest ""..  ren
bbc0: 61 6d 65 20 77 61 69 74 54 65 73 74 20 22 22 0d  ame waitTest "".
bbd0: 0a 20 20 72 65 6e 61 6d 65 20 64 65 6c 61 79 54  .  rename delayT
bbe0: 65 73 74 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65  est ""..  rename
bbf0: 20 69 6e 69 74 54 65 73 74 20 22 22 0d 0a 20 20   initTest ""..  
bc00: 72 65 6e 61 6d 65 20 69 73 45 78 70 65 63 74 65  rename isExpecte
bc10: 64 45 72 72 6f 72 20 22 22 0d 0a 20 20 72 65 6e  dError ""..  ren
bc20: 61 6d 65 20 66 6f 72 6d 61 74 57 6f 72 6b 6c 6f  ame formatWorklo
bc30: 61 64 54 69 6d 65 20 22 22 0d 0a 20 20 72 65 6e  adTime ""..  ren
bc40: 61 6d 65 20 66 6f 72 6d 61 74 57 6f 72 6b 6c 6f  ame formatWorklo
bc50: 61 64 52 65 73 75 6c 74 20 22 22 0d 0a 20 20 72  adResult ""..  r
bc60: 65 6e 61 6d 65 20 73 65 74 75 70 57 6f 72 6b 6c  ename setupWorkl
bc70: 6f 61 64 46 69 6c 65 44 62 20 22 22 0d 0a 20 20  oadFileDb ""..  
bc80: 72 65 6e 61 6d 65 20 73 65 74 75 70 57 6f 72 6b  rename setupWork
bc90: 6c 6f 61 64 4d 65 6d 44 62 20 22 22 0d 0a 0d 0a  loadMemDb ""....
bca0: 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c    cleanupDb $fil
bcb0: 65 4e 61 6d 65 28 32 29 0d 0a 20 20 63 6c 65 61  eName(2)..  clea
bcc0: 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 28  nupDb $fileName(
bcd0: 31 29 20 73 72 63 44 62 0d 0a 0d 0a 20 20 66 6f  1) srcDb....  fo
bce0: 72 65 61 63 68 20 69 6e 64 65 78 28 30 29 20 5b  reach index(0) [
bcf0: 61 72 72 61 79 20 6e 61 6d 65 73 20 77 6f 72 6b  array names work
bd00: 6c 6f 61 64 5d 20 7b 0d 0a 20 20 20 20 63 61 74  load] {..    cat
bd10: 63 68 20 7b 0d 0a 20 20 20 20 20 20 6f 62 6a 65  ch {..      obje
bd20: 63 74 20 72 65 6d 6f 76 65 63 61 6c 6c 62 61 63  ct removecallbac
bd30: 6b 20 5b 6c 69 73 74 20 61 70 70 6c 79 20 24 77  k [list apply $w
bd40: 6f 72 6b 6c 6f 61 64 28 24 69 6e 64 65 78 28 30  orkload($index(0
bd50: 29 29 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  )) $fileName(1) 
bd60: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 66 69  \..          $fi
bd70: 6c 65 4e 61 6d 65 28 32 29 20 74 31 20 24 63 6f  leName(2) t1 $co
bd80: 75 6e 74 28 31 29 20 24 63 6f 75 6e 74 28 33 29  unt(1) $count(3)
bd90: 20 24 63 6f 75 6e 74 28 34 29 5d 0d 0a 20 20 20   $count(4)]..   
bda0: 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 66 72 65   }..  }....  fre
bdb0: 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d  eDbConnection...
bdc0: 0a 20 20 69 66 20 7b 21 24 6e 6f 54 72 61 63 65  .  if {!$noTrace
bdd0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 63 6c  } then {..    cl
bde0: 65 61 6e 75 70 4c 6f 67 67 69 6e 67 20 24 6c 6f  eanupLogging $lo
bdf0: 67 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 7d 0d 0a  gFileName..  }..
be00: 0d 0a 20 20 72 65 6e 61 6d 65 20 63 6c 65 61 6e  ..  rename clean
be10: 75 70 4c 6f 67 67 69 6e 67 20 22 22 0d 0a 20 20  upLogging ""..  
be20: 72 65 6e 61 6d 65 20 73 65 74 75 70 4c 6f 67 67  rename setupLogg
be30: 69 6e 67 20 22 22 0d 0a 0d 0a 20 20 75 6e 73 65  ing ""....  unse
be40: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72 65  t -nocomplain re
be50: 73 75 6c 74 20 74 68 72 65 61 64 20 69 6e 64 65  sult thread inde
be60: 78 20 77 6f 72 6b 6c 6f 61 64 20 70 72 69 6f 72  x workload prior
be70: 69 74 79 20 6e 6f 57 6f 72 6b 6c 6f 61 64 20 5c  ity noWorkload \
be80: 0d 0a 20 20 20 20 20 20 70 72 69 6f 72 69 74 69  ..      prioriti
be90: 65 73 20 73 72 63 44 62 20 64 62 20 66 69 6c 65  es srcDb db file
bea0: 4e 61 6d 65 20 63 6f 6d 70 69 6c 65 64 20 6f 70  Name compiled op
beb0: 74 69 6f 6e 73 20 63 6f 75 6e 74 20 74 69 6d 65  tions count time
bec0: 73 20 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 5c 0d  s logFileName \.
bed0: 0a 20 20 20 20 20 20 6c 6f 67 4c 69 73 74 65 6e  .      logListen
bee0: 65 72 20 65 76 65 6e 74 20 74 69 6d 65 6f 75 74  er event timeout
bef0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 64 69   connection indi
bf00: 63 61 74 6f 72 73 20 69 74 65 72 61 74 69 6f 6e  cators iteration
bf10: 73 20 65 78 69 74 4f 6e 46 61 69 6c 20 5c 0d 0a  s exitOnFail \..
bf20: 20 20 20 20 20 20 63 6f 54 61 73 6b 4d 65 6d 20        coTaskMem 
bf30: 6e 6f 54 72 61 63 65 20 66 61 69 6c 75 72 65 73  noTrace failures
bf40: 20 73 74 61 74 75 73 0d 0a 7d 20 2d 74 69 6d 65   status..} -time
bf50: 20 74 72 75 65 20 2d 63 6f 6e 73 74 72 61 69 6e   true -constrain
bf60: 74 73 20 7b 65 61 67 6c 65 20 6d 6f 6e 6f 42 75  ts {eagle monoBu
bf70: 67 32 38 20 63 6f 6d 6d 61 6e 64 2e 73 71 6c 20  g28 command.sql 
bf80: 63 6f 6d 70 69 6c 65 2e 44 41 54 41 20 53 51 4c  compile.DATA SQL
bf90: 69 74 65 5c 0d 0a 53 79 73 74 65 6d 2e 44 61 74  ite\..System.Dat
bfa0: 61 2e 53 51 4c 69 74 65 20 63 6f 6d 70 69 6c 65  a.SQLite compile
bfb0: 43 53 68 61 72 70 7d 20 2d 72 65 73 75 6c 74 20  CSharp} -result 
bfc0: 7b 30 7d 7d 0d 0a 0d 0a 23 23 23 23 23 23 23 23  {0}}....########
bfd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bfe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c010: 23 23 23 23 23 23 23 0d 0a 0d 0a 23 0d 0a 23 20  #######....#..# 
c020: 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 61 66 74  NOTE: Report aft
c030: 65 72 20 74 65 73 74 2e 0d 0a 23 0d 0a 63 68 65  er test...#..che
c040: 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
c050: 74 6f 72 69 65 73 20 24 74 65 73 74 5f 63 68 61  tories $test_cha
c060: 6e 6e 65 6c 0d 0a 67 65 74 53 51 4c 69 74 65 48  nnel..getSQLiteH
c070: 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24 74 65 73  andleCounts $tes
c080: 74 5f 63 68 61 6e 6e 65 6c 0d 0a 72 65 70 6f 72  t_channel..repor
c090: 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73  tSQLiteResources
c0a0: 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a   $test_channel..
c0b0: 0d 0a 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 23 23 23 23 23 23 23 23 23  ################
c0f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c100: 23 0d 0a 0d 0a 72 75 6e 53 51 4c 69 74 65 54 65  #....runSQLiteTe
c110: 73 74 45 70 69 6c 6f 67 75 65 0d 0a 72 75 6e 54  stEpilogue..runT
c120: 65 73 74 45 70 69 6c 6f 67 75 65 0d 0a           estEpilogue..