System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 763edf3c2a27f63b25201eba8a657ec62d0ebe30:


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: 20 74 72 75 65 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20   true]..  }.... 
08e0: 20 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 23 23 23 23 23 0d 0a  ##############..
0930: 0d 0a 20 20 70 72 6f 63 20 73 65 74 75 70 57 6f  ..  proc setupWo
0940: 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 7b 20 66  rkloadFileDb { f
0950: 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65  ileName {varName
0960: 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 23 0d   db} } {..    #.
0970: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69  .    # NOTE: Ski
0980: 70 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  p attempting to 
0990: 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  delete the under
09a0: 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
09b0: 69 6c 65 2e 20 20 41 6c 73 6f 2c 0d 0a 20 20 20  ile.  Also,..   
09c0: 20 23 20 20 20 20 20 20 20 64 69 73 61 62 6c 65   #       disable
09d0: 20 75 73 65 20 6f 66 20 22 50 52 41 47 4d 41 20   use of "PRAGMA 
09e0: 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
09f0: 74 6f 72 79 22 20 77 68 65 6e 20 73 65 74 74 69  tory" when setti
0a00: 6e 67 20 75 70 0d 0a 20 20 20 20 23 20 20 20 20  ng up..    #    
0a10: 20 20 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65     the new conne
0a20: 63 74 69 6f 6e 20 62 65 63 61 75 73 65 20 69 74  ction because it
0a30: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 2d 73   is not thread-s
0a40: 61 66 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  afe...    #..   
0a50: 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
0a60: 20 73 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61   setupDb $fileNa
0a70: 6d 65 20 22 22 20 22 22 20 22 22 20 22 22 20 22  me "" "" "" "" "
0a80: 22 20 74 72 75 65 20 66 61 6c 73 65 20 66 61 6c  " true false fal
0a90: 73 65 20 66 61 6c 73 65 20 5c 0d 0a 20 20 20 20  se false \..    
0aa0: 20 20 20 20 24 76 61 72 4e 61 6d 65 20 74 72 75      $varName tru
0ab0: 65 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23  e]..  }....  ###
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: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
0b10: 70 72 6f 63 20 66 6f 72 6d 61 74 57 6f 72 6b 6c  proc formatWorkl
0b20: 6f 61 64 52 65 73 75 6c 74 20 7b 20 69 6e 64 65  oadResult { inde
0b30: 78 20 7d 20 7b 0d 0a 20 20 20 20 73 65 74 20 72  x } {..    set r
0b40: 65 73 75 6c 74 20 5b 61 70 70 65 6e 64 41 72 67  esult [appendArg
0b50: 73 20 22 2d 2d 2d 2d 20 69 74 65 72 61 74 69 6f  s "---- iteratio
0b60: 6e 73 20 66 6f 72 20 77 6f 72 6b 6c 6f 61 64 20  ns for workload 
0b70: 28 22 20 24 69 6e 64 65 78 20 22 29 3a 20 22 5d  (" $index "): "]
0b80: 0d 0a 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 72  ....    append r
0b90: 65 73 75 6c 74 20 5b 65 78 70 72 20 7b 5b 69 6e  esult [expr {[in
0ba0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 69 74 65 72  fo exists ::iter
0bb0: 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 2c 74 6f  ations($index,to
0bc0: 74 61 6c 29 5d 20 3f 20 5c 0d 0a 20 20 20 20 20  tal)] ? \..     
0bd0: 20 20 20 24 3a 3a 69 74 65 72 61 74 69 6f 6e 73     $::iterations
0be0: 28 24 69 6e 64 65 78 2c 74 6f 74 61 6c 29 20 3a  ($index,total) :
0bf0: 20 30 7d 5d 20 22 20 74 6f 74 61 6c 2c 20 22 0d   0}] " total, ".
0c00: 0a 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 72 65  ...    append re
0c10: 73 75 6c 74 20 5b 65 78 70 72 20 7b 5b 69 6e 66  sult [expr {[inf
0c20: 6f 20 65 78 69 73 74 73 20 3a 3a 69 74 65 72 61  o exists ::itera
0c30: 74 69 6f 6e 73 28 24 69 6e 64 65 78 2c 6f 6b 29  tions($index,ok)
0c40: 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 24  ] ? \..        $
0c50: 3a 3a 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e  ::iterations($in
0c60: 64 65 78 2c 6f 6b 29 20 3a 20 30 7d 5d 20 22 20  dex,ok) : 0}] " 
0c70: 6f 6b 2c 20 22 0d 0a 0d 0a 20 20 20 20 61 70 70  ok, "....    app
0c80: 65 6e 64 20 72 65 73 75 6c 74 20 5b 65 78 70 72  end result [expr
0c90: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
0ca0: 3a 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e 64  :iterations($ind
0cb0: 65 78 2c 65 72 72 6f 72 29 5d 20 3f 20 5c 0d 0a  ex,error)] ? \..
0cc0: 20 20 20 20 20 20 20 20 24 3a 3a 69 74 65 72 61          $::itera
0cd0: 74 69 6f 6e 73 28 24 69 6e 64 65 78 2c 65 72 72  tions($index,err
0ce0: 6f 72 29 20 3a 20 30 7d 5d 20 22 20 65 72 72 6f  or) : 0}] " erro
0cf0: 72 2c 20 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20  r, "....    #.. 
0d00: 20 20 20 23 20 4e 4f 54 45 3a 20 54 72 61 6e 73     # NOTE: Trans
0d10: 6c 61 74 65 20 74 68 65 20 77 6f 72 6b 6c 6f 61  late the workloa
0d20: 64 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 63  d index to the c
0d30: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 74 65  orresponding ite
0d40: 72 61 74 69 6f 6e 0d 0a 20 20 20 20 23 20 20 20  ration..    #   
0d50: 20 20 20 20 65 72 72 6f 72 20 69 6e 64 69 63 61      error indica
0d60: 74 6f 72 20 73 6f 20 74 68 61 74 20 77 65 20 63  tor so that we c
0d70: 61 6e 20 65 61 73 69 6c 79 20 6c 6f 6f 6b 75 70  an easily lookup
0d80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0d 0a   the number of..
0d90: 20 20 20 20 23 20 20 20 20 20 20 20 66 61 69 6c      #       fail
0da0: 75 72 65 73 20 28 69 2e 65 2e 20 22 75 6e 65 78  ures (i.e. "unex
0db0: 70 65 63 74 65 64 20 65 72 72 6f 72 73 22 29 20  pected errors") 
0dc0: 66 6f 72 20 74 68 65 20 77 6f 72 6b 6c 6f 61 64  for the workload
0dd0: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65  ...    #..    se
0de0: 74 20 69 6e 64 69 63 61 74 6f 72 20 5b 73 74 72  t indicator [str
0df0: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 5b 65  ing character [e
0e00: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6f 72 64  xpr {[string ord
0e10: 69 6e 61 6c 20 61 20 30 5d 20 2b 20 24 69 6e 64  inal a 0] + $ind
0e20: 65 78 20 2d 20 31 7d 5d 5d 0d 0a 0d 0a 20 20 20  ex - 1}]]....   
0e30: 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b   append result [
0e40: 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73  expr {[info exis
0e50: 74 73 20 3a 3a 66 61 69 6c 75 72 65 73 28 24 69  ts ::failures($i
0e60: 6e 64 69 63 61 74 6f 72 29 5d 20 3f 20 5c 0d 0a  ndicator)] ? \..
0e70: 20 20 20 20 20 20 20 20 24 3a 3a 66 61 69 6c 75          $::failu
0e80: 72 65 73 28 24 69 6e 64 69 63 61 74 6f 72 29 20  res($indicator) 
0e90: 3a 20 30 7d 5d 20 22 20 66 61 69 6c 65 64 5c 6e  : 0}] " failed\n
0ea0: 22 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  "....    return 
0eb0: 24 72 65 73 75 6c 74 0d 0a 20 20 7d 0d 0a 0d 0a  $result..  }....
0ec0: 20 20 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 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0f10: 0a 0d 0a 20 20 70 72 6f 63 20 66 6f 72 6d 61 74  ...  proc format
0f20: 57 6f 72 6b 6c 6f 61 64 54 69 6d 65 20 7b 20 69  WorkloadTime { i
0f30: 6e 64 65 78 20 7d 20 7b 0d 0a 20 20 20 20 69 66  ndex } {..    if
0f40: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
0f50: 3a 74 69 6d 65 73 28 24 69 6e 64 65 78 29 5d 7d  :times($index)]}
0f60: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73   then {..      s
0f70: 65 74 20 6c 65 6e 67 74 68 20 5b 6c 6c 65 6e 67  et length [lleng
0f80: 74 68 20 24 3a 3a 74 69 6d 65 73 28 24 69 6e 64  th $::times($ind
0f90: 65 78 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ex)]....      if
0fa0: 20 7b 24 6c 65 6e 67 74 68 20 3e 20 30 7d 20 74   {$length > 0} t
0fb0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
0fc0: 65 74 20 73 75 6d 20 5b 65 78 70 72 20 5b 6a 6f  et sum [expr [jo
0fd0: 69 6e 20 24 3a 3a 74 69 6d 65 73 28 24 69 6e 64  in $::times($ind
0fe0: 65 78 29 20 2b 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ex) +]]....     
0ff0: 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e     return [appen
1000: 64 41 72 67 73 20 22 2d 2d 2d 2d 20 61 76 65 72  dArgs "---- aver
1010: 61 67 65 20 74 69 6d 65 20 66 6f 72 20 77 6f 72  age time for wor
1020: 6b 6c 6f 61 64 20 28 22 20 24 69 6e 64 65 78 20  kload (" $index 
1030: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
1040: 29 20 69 73 20 61 62 6f 75 74 20 22 20 5b 65 78  ) is about " [ex
1050: 70 72 20 7b 69 6e 74 28 24 73 75 6d 20 2f 20 24  pr {int($sum / $
1060: 6c 65 6e 67 74 68 20 2f 20 31 30 30 30 2e 30 29  length / 1000.0)
1070: 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  }] \..          
1080: 20 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73    " milliseconds
1090: 20 28 22 20 5b 65 78 70 72 20 7b 69 6e 74 28 24   (" [expr {int($
10a0: 73 75 6d 20 2f 20 28 5b 69 6e 66 6f 20 65 78 69  sum / ([info exi
10b0: 73 74 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  sts \..         
10c0: 20 20 20 3a 3a 69 74 65 72 61 74 69 6f 6e 73 28     ::iterations(
10d0: 24 69 6e 64 65 78 2c 74 6f 74 61 6c 29 5d 20 3f  $index,total)] ?
10e0: 20 24 3a 3a 69 74 65 72 61 74 69 6f 6e 73 28 24   $::iterations($
10f0: 69 6e 64 65 78 2c 74 6f 74 61 6c 29 20 3a 20 5c  index,total) : \
1100: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 6c  ..            $l
1110: 65 6e 67 74 68 29 20 2f 20 31 30 30 30 2e 30 29  ength) / 1000.0)
1120: 7d 5d 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  }] " millisecond
1130: 73 20 70 65 72 20 69 74 65 72 61 74 69 6f 6e 29  s per iteration)
1140: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  \n"]..      }.. 
1150: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75     }....    retu
1160: 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  rn [appendArgs "
1170: 2d 2d 2d 2d 20 6e 6f 20 74 69 6d 65 73 20 66 6f  ---- no times fo
1180: 72 20 77 6f 72 6b 6c 6f 61 64 20 28 22 20 24 69  r workload (" $i
1190: 6e 64 65 78 20 29 5c 6e 5d 0d 0a 20 20 7d 0d 0a  ndex )\n]..  }..
11a0: 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23  ################
11f0: 23 0d 0a 0d 0a 20 20 70 72 6f 63 20 69 73 45 78  #....  proc isEx
1200: 70 65 63 74 65 64 45 72 72 6f 72 20 7b 20 65 72  pectedError { er
1210: 72 6f 72 20 7d 20 7b 0d 0a 20 20 20 20 72 65 74  ror } {..    ret
1220: 75 72 6e 20 5b 65 78 70 72 20 7b 5b 72 65 67 65  urn [expr {[rege
1230: 78 70 20 2d 2d 20 7b 5c 73 6e 6f 20 73 75 63 68  xp -- {\sno such
1240: 20 74 61 62 6c 65 3a 20 74 31 5c 73 7d 20 24 65   table: t1\s} $e
1250: 72 72 6f 72 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20  rror] || \..    
1260: 20 20 20 20 5b 72 65 67 65 78 70 20 2d 2d 20 7b      [regexp -- {
1270: 5c 73 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  \sdatabase is lo
1280: 63 6b 65 64 5c 73 7d 20 24 65 72 72 6f 72 5d 20  cked\s} $error] 
1290: 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 72  || \..        [r
12a0: 65 67 65 78 70 20 2d 2d 20 7b 5c 73 64 61 74 61  egexp -- {\sdata
12b0: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
12c0: 63 6b 65 64 5c 73 7d 20 24 65 72 72 6f 72 5d 7d  cked\s} $error]}
12d0: 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 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 23  ################
1320: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70  #########....  p
1330: 72 6f 63 20 69 6e 69 74 54 65 73 74 20 7b 20 69  roc initTest { i
1340: 6e 64 69 63 61 74 6f 72 20 7d 20 7b 0d 0a 20 20  ndicator } {..  
1350: 20 20 73 65 74 20 3a 3a 65 61 67 6c 65 5f 74 65    set ::eagle_te
1360: 73 74 73 28 63 6f 6e 73 74 72 61 69 6e 74 73 29  sts(constraints)
1370: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61   $::test_constra
1380: 69 6e 74 73 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  ints..  }....  #
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 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
13e0: 20 20 70 72 6f 63 20 64 65 6c 61 79 54 65 73 74    proc delayTest
13f0: 20 7b 20 7b 65 78 74 72 61 20 30 7d 20 7d 20 7b   { {extra 0} } {
1400: 0d 0a 20 20 20 20 61 66 74 65 72 20 5b 65 78 70  ..    after [exp
1410: 72 20 7b 69 6e 74 28 28 72 61 6e 64 28 29 20 2a  r {int((rand() *
1420: 20 31 30 30 30 29 20 2b 20 24 65 78 74 72 61 29   1000) + $extra)
1430: 7d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 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: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
1490: 70 72 6f 63 20 77 61 69 74 54 65 73 74 20 7b 20  proc waitTest { 
14a0: 69 6e 64 69 63 61 74 6f 72 20 7d 20 7b 0d 0a 20  indicator } {.. 
14b0: 20 20 20 69 66 20 7b 21 5b 24 3a 3a 65 76 65 6e     if {![$::even
14c0: 74 20 57 61 69 74 4f 6e 65 20 24 3a 3a 74 69 6d  t WaitOne $::tim
14d0: 65 6f 75 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  eout]} then {.. 
14e0: 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65       error [appe
14f0: 6e 64 41 72 67 73 20 22 74 69 6d 65 6f 75 74 20  ndArgs "timeout 
1500: 77 68 69 6c 65 20 73 74 61 72 74 69 6e 67 20 77  while starting w
1510: 6f 72 6b 6c 6f 61 64 20 23 22 20 5c 0d 0a 20 20  orkload #" \..  
1520: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b          [expr {[
1530: 73 74 72 69 6e 67 20 6f 72 64 69 6e 61 6c 20 24  string ordinal $
1540: 69 6e 64 69 63 61 74 6f 72 20 30 5d 20 2d 20 5b  indicator 0] - [
1550: 73 74 72 69 6e 67 20 6f 72 64 69 6e 61 6c 20 41  string ordinal A
1560: 20 30 5d 20 2b 20 31 7d 5d 5d 0d 0a 20 20 20 20   0] + 1}]]..    
1570: 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 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 23  ################
15c0: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70  #########....  p
15d0: 72 6f 63 20 73 68 6f 77 54 65 73 74 20 7b 20 69  roc showTest { i
15e0: 6e 64 69 63 61 74 6f 72 20 7d 20 7b 0d 0a 20 20  ndicator } {..  
15f0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1600: 63 68 61 6e 6e 65 6c 20 24 69 6e 64 69 63 61 74  channel $indicat
1610: 6f 72 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 3a  or..    append :
1620: 3a 69 6e 64 69 63 61 74 6f 72 73 20 24 69 6e 64  :indicators $ind
1630: 69 63 61 74 6f 72 0d 0a 20 20 20 20 64 65 6c 61  icator..    dela
1640: 79 54 65 73 74 20 24 3a 3a 63 6f 75 6e 74 28 32  yTest $::count(2
1650: 29 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 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 23  ################
16a0: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70  #########....  p
16b0: 72 6f 63 20 64 6f 6e 65 54 65 73 74 20 7b 20 7b  roc doneTest { {
16c0: 69 6e 64 69 63 61 74 6f 72 20 22 22 7d 20 7d 20  indicator ""} } 
16d0: 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69  {..    if {[stri
16e0: 6e 67 20 6c 65 6e 67 74 68 20 24 69 6e 64 69 63  ng length $indic
16f0: 61 74 6f 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ator] > 0} then 
1700: 7b 0d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64  {..      lappend
1710: 20 3a 3a 73 74 61 74 75 73 28 64 6f 6e 65 29 20   ::status(done) 
1720: 24 69 6e 64 69 63 61 74 6f 72 0d 0a 20 20 20 20  $indicator..    
1730: 7d 0d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  }..    if {[info
1740: 20 65 78 69 73 74 73 20 3a 3a 73 74 61 74 75 73   exists ::status
1750: 28 64 6f 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  (done)]} then {.
1760: 0a 20 20 20 20 20 20 68 6f 73 74 20 74 69 74 6c  .      host titl
1770: 65 20 24 3a 3a 73 74 61 74 75 73 28 64 6f 6e 65  e $::status(done
1780: 29 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  )..    } else {.
1790: 0a 20 20 20 20 20 20 68 6f 73 74 20 74 69 74 6c  .      host titl
17a0: 65 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  e ""..    }..  }
17b0: 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23  ....  ##########
17c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1800: 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20 66 61  ###....  proc fa
1810: 69 6c 54 65 73 74 20 7b 20 69 6e 64 69 63 61 74  ilTest { indicat
1820: 6f 72 20 65 72 72 6f 72 20 7d 20 7b 0d 0a 20 20  or error } {..  
1830: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
1840: 20 48 61 6c 74 20 61 6c 6c 20 74 65 73 74 69 6e   Halt all testin
1850: 67 20 61 6e 64 20 65 78 69 74 20 74 68 65 20 70  g and exit the p
1860: 72 6f 63 65 73 73 20 6e 6f 77 0d 0a 20 20 20 20  rocess now..    
1870: 23 20 20 20 20 20 20 20 2d 4f 52 2d 20 6a 75 73  #       -OR- jus
1880: 74 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 69  t record the fai
1890: 6c 75 72 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75  lure and continu
18a0: 65 3f 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73  e?..    #..    s
18b0: 65 74 20 6c 65 76 65 6c 20 5b 65 78 70 72 20 7b  et level [expr {
18c0: 5b 69 6e 66 6f 20 6c 65 76 65 6c 5d 20 2d 20 31  [info level] - 1
18d0: 7d 5d 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 24 3a  }]....    if {$:
18e0: 3a 65 78 69 74 4f 6e 46 61 69 6c 7d 20 74 68 65  :exitOnFail} the
18f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  n {..      tputs
1900: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1910: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1920: 20 20 20 20 20 20 20 20 20 20 5c 6e 20 5b 69 6e            \n [in
1930: 66 6f 20 6c 65 76 65 6c 20 24 6c 65 76 65 6c 5d  fo level $level]
1940: 20 22 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f   ": " \n\t $erro
1950: 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 65  r \n]....      e
1960: 78 69 74 20 66 61 69 6c 75 72 65 0d 0a 20 20 20  xit failure..   
1970: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1980: 20 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41 72 67   tlog [appendArg
1990: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
19a0: 5c 6e 2d 2d 2d 2d 20 42 45 47 49 4e 20 54 45 53  \n---- BEGIN TES
19b0: 54 20 46 41 49 4c 55 52 45 20 4f 55 54 50 55 54  T FAILURE OUTPUT
19c0: 5c 6e 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \n" \..         
19d0: 20 5c 6e 20 5b 69 6e 66 6f 20 6c 65 76 65 6c 20   \n [info level 
19e0: 24 6c 65 76 65 6c 5d 20 22 3a 20 22 20 5c 6e 5c  $level] ": " \n\
19f0: 74 20 24 65 72 72 6f 72 20 5c 6e 20 5c 0d 0a 20  t $error \n \.. 
1a00: 20 20 20 20 20 20 20 20 20 22 5c 6e 2d 2d 2d 2d           "\n----
1a10: 20 45 4e 44 20 54 45 53 54 20 46 41 49 4c 55 52   END TEST FAILUR
1a20: 45 20 4f 55 54 50 55 54 5c 6e 22 5d 0d 0a 0d 0a  E OUTPUT\n"]....
1a30: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1a40: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 64  est_channel $ind
1a50: 69 63 61 74 6f 72 0d 0a 0d 0a 20 20 20 20 20 20  icator....      
1a60: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1a70: 73 20 3a 3a 66 61 69 6c 75 72 65 73 28 24 69 6e  s ::failures($in
1a80: 64 69 63 61 74 6f 72 29 5d 7d 20 74 68 65 6e 20  dicator)]} then 
1a90: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a  {..        set :
1aa0: 3a 66 61 69 6c 75 72 65 73 28 24 69 6e 64 69 63  :failures($indic
1ab0: 61 74 6f 72 29 20 30 0d 0a 20 20 20 20 20 20 7d  ator) 0..      }
1ac0: 0d 0a 0d 0a 20 20 20 20 20 20 69 6e 63 72 20 3a  ....      incr :
1ad0: 3a 66 61 69 6c 75 72 65 73 28 24 69 6e 64 69 63  :failures($indic
1ae0: 61 74 6f 72 29 0d 0a 20 20 20 20 20 20 64 65 6c  ator)..      del
1af0: 61 79 54 65 73 74 20 24 3a 3a 63 6f 75 6e 74 28  ayTest $::count(
1b00: 32 29 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  2)..    }..  }..
1b10: 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23  ################
1b60: 23 0d 0a 0d 0a 20 20 70 72 6f 63 20 61 6c 6c 6f  #....  proc allo
1b70: 63 4d 65 6d 20 7b 20 73 69 7a 65 20 7d 20 7b 0d  cMem { size } {.
1b80: 0a 20 20 20 20 69 66 20 7b 24 3a 3a 63 6f 54 61  .    if {$::coTa
1b90: 73 6b 4d 65 6d 7d 20 74 68 65 6e 20 7b 0d 0a 20  skMem} then {.. 
1ba0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a       return [obj
1bb0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61  ect invoke -crea
1bc0: 74 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  te \..          
1bd0: 53 79 73 74 65 6d 2e 52 75 6e 74 69 6d 65 2e 49  System.Runtime.I
1be0: 6e 74 65 72 6f 70 53 65 72 76 69 63 65 73 2e 4d  nteropServices.M
1bf0: 61 72 73 68 61 6c 20 5c 0d 0a 20 20 20 20 20 20  arshal \..      
1c00: 20 20 20 20 41 6c 6c 6f 63 43 6f 54 61 73 6b 4d      AllocCoTaskM
1c10: 65 6d 20 24 73 69 7a 65 5d 3b 20 23 20 74 68 72  em $size]; # thr
1c20: 6f 77 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ow..    } else {
1c30: 0d 0a 20 20 20 20 20 20 73 65 74 20 70 74 72 20  ..      set ptr 
1c40: 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
1c50: 63 72 65 61 74 65 20 2d 66 6c 61 67 73 20 2b 4e  create -flags +N
1c60: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
1c70: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1c80: 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
1c90: 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
1ca0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1cb0: 33 5f 6d 61 6c 6c 6f 63 20 24 73 69 7a 65 5d 0d  3_malloc $size].
1cc0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6f 62  ...      if {[ob
1cd0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 70 74 72  ject invoke $ptr
1ce0: 20 54 6f 49 6e 74 36 34 5d 20 21 3d 20 30 7d 20   ToInt64] != 0} 
1cf0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d00: 72 65 74 75 72 6e 20 24 70 74 72 0d 0a 20 20 20  return $ptr..   
1d10: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1d20: 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65       error [appe
1d30: 6e 64 41 72 67 73 20 22 73 71 6c 69 74 65 33 5f  ndArgs "sqlite3_
1d40: 6d 61 6c 6c 6f 63 28 22 20 24 73 69 7a 65 20 22  malloc(" $size "
1d50: 29 20 66 61 69 6c 65 64 22 5d 0d 0a 20 20 20 20  ) failed"]..    
1d60: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d    }..    }..  }.
1d70: 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23  ################
1dc0: 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20 75 73 65  ##....  proc use
1dd0: 4d 65 6d 20 7b 20 70 74 72 20 73 69 7a 65 20 7d  Mem { ptr size }
1de0: 20 7b 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 73   {..    if {![is
1df0: 4d 6f 6e 6f 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Mono]} then {.. 
1e00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1e10: 48 41 43 4b 3a 20 54 68 65 20 74 79 70 65 20 73  HACK: The type s
1e20: 69 67 6e 61 74 75 72 65 20 6f 66 20 74 68 65 20  ignature of the 
1e30: 5a 65 72 6f 4d 65 6d 6f 72 79 20 6d 65 74 68 6f  ZeroMemory metho
1e40: 64 20 63 68 61 6e 67 65 64 20 61 73 20 6f 66 20  d changed as of 
1e50: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
1e60: 20 20 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72     .NET Framewor
1e70: 6b 20 34 2e 35 2e 20 20 54 68 65 20 73 65 63 6f  k 4.5.  The seco
1e80: 6e 64 20 61 72 67 75 6d 65 6e 74 20 77 65 6e 74  nd argument went
1e90: 20 66 72 6f 6d 20 62 65 69 6e 67 20 6f 66 0d 0a   from being of..
1ea0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 79        #       ty
1eb0: 70 65 20 55 49 6e 74 20 74 6f 20 74 79 70 65 20  pe UInt to type 
1ec0: 55 49 6e 74 50 74 72 2e 0d 0a 20 20 20 20 20 20  UIntPtr...      
1ed0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  #..      if {[ha
1ee0: 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 64 6f 74  veConstraint dot
1ef0: 4e 65 74 34 30 5d 20 26 26 20 5c 0d 0a 20 20 20  Net40] && \..   
1f00: 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
1f10: 74 72 61 69 6e 74 20 64 6f 74 4e 65 74 34 35 4f  traint dotNet45O
1f20: 72 48 69 67 68 65 72 5d 7d 20 74 68 65 6e 20 7b  rHigher]} then {
1f30: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 65  ..        set ne
1f40: 77 53 69 7a 65 20 5b 6f 62 6a 65 63 74 20 63 72  wSize [object cr
1f50: 65 61 74 65 20 55 49 6e 74 50 74 72 20 24 73 69  eate UIntPtr $si
1f60: 7a 65 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ze]..      } els
1f70: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
1f80: 20 6e 65 77 53 69 7a 65 20 24 73 69 7a 65 0d 0a   newSize $size..
1f90: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1fa0: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
1fb0: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1fc0: 20 4d 69 63 72 6f 73 6f 66 74 2e 57 69 6e 33 32   Microsoft.Win32
1fd0: 2e 57 69 6e 33 32 4e 61 74 69 76 65 20 5c 0d 0a  .Win32Native \..
1fe0: 20 20 20 20 20 20 20 20 20 20 5a 65 72 6f 4d 65            ZeroMe
1ff0: 6d 6f 72 79 20 24 70 74 72 20 24 6e 65 77 53 69  mory $ptr $newSi
2000: 7a 65 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  ze..    }..  }..
2010: 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2060: 23 0d 0a 0d 0a 20 20 70 72 6f 63 20 66 72 65 65  #....  proc free
2070: 4d 65 6d 20 7b 20 70 74 72 20 7d 20 7b 0d 0a 20  Mem { ptr } {.. 
2080: 20 20 20 69 66 20 7b 24 3a 3a 63 6f 54 61 73 6b     if {$::coTask
2090: 4d 65 6d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  Mem} then {..   
20a0: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
20b0: 20 53 79 73 74 65 6d 2e 52 75 6e 74 69 6d 65 2e   System.Runtime.
20c0: 49 6e 74 65 72 6f 70 53 65 72 76 69 63 65 73 2e  InteropServices.
20d0: 4d 61 72 73 68 61 6c 20 5c 0d 0a 20 20 20 20 20  Marshal \..     
20e0: 20 20 20 20 20 46 72 65 65 43 6f 54 61 73 6b 4d       FreeCoTaskM
20f0: 65 6d 20 24 70 74 72 0d 0a 20 20 20 20 7d 20 65  em $ptr..    } e
2100: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 6f 62 6a  lse {..      obj
2110: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
2120: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
2130: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
2140: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
2150: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
2160: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71   \..          sq
2170: 6c 69 74 65 33 5f 66 72 65 65 20 24 70 74 72 0d  lite3_free $ptr.
2180: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d  .    }....    #.
2190: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 72 65  .    # NOTE: Fre
21a0: 65 20 65 78 74 72 61 20 6f 70 61 71 75 65 20 6f  e extra opaque o
21b0: 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 72 65 66  bject handle ref
21c0: 65 72 65 6e 63 65 20 61 64 64 65 64 20 62 79 20  erence added by 
21d0: 74 68 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20  the..    #      
21e0: 20 5b 72 65 74 75 72 6e 5d 20 63 6f 6d 6d 61 6e   [return] comman
21f0: 64 20 69 6e 20 5b 61 6c 6c 6f 63 4d 65 6d 5d 2e  d in [allocMem].
2200: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 6f 62 6a  ..    #..    obj
2210: 65 63 74 20 64 69 73 70 6f 73 65 20 24 70 74 72  ect dispose $ptr
2220: 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23  ################
2260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2270: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72  ########....  pr
2280: 6f 63 20 73 65 74 75 70 4c 6f 67 67 69 6e 67 20  oc setupLogging 
2290: 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a  { fileName } {..
22a0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
22b0: 78 69 73 74 73 20 3a 3a 6c 6f 67 4c 69 73 74 65  xists ::logListe
22c0: 6e 65 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ner]} then {..  
22d0: 20 20 20 20 73 65 74 20 3a 3a 6c 6f 67 4c 69 73      set ::logLis
22e0: 74 65 6e 65 72 20 5b 6f 62 6a 65 63 74 20 63 72  tener [object cr
22f0: 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  eate -alias \.. 
2300: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
2310: 44 69 61 67 6e 6f 73 74 69 63 73 2e 54 65 78 74  Diagnostics.Text
2320: 57 72 69 74 65 72 54 72 61 63 65 4c 69 73 74 65  WriterTraceListe
2330: 6e 65 72 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ner $fileName]..
2340: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 6f 62 6a      }....    obj
2350: 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65  ect invoke Syste
2360: 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 54 72  m.Diagnostics.Tr
2370: 61 63 65 2e 4c 69 73 74 65 6e 65 72 73 20 41 64  ace.Listeners Ad
2380: 64 20 24 3a 3a 6c 6f 67 4c 69 73 74 65 6e 65 72  d $::logListener
2390: 0d 0a 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76  ..    object inv
23a0: 6f 6b 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  oke System.Data.
23b0: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4c 6f 67  SQLite.SQLiteLog
23c0: 20 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 0d 0a 20   Initialize.... 
23d0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
23e0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
23f0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
2400: 22 2d 2d 2d 2d 20 65 6e 61 62 6c 65 64 20 53 51  "---- enabled SQ
2410: 4c 69 74 65 20 74 72 61 63 65 20 6c 6f 67 67 69  Lite trace loggi
2420: 6e 67 20 74 6f 20 66 69 6c 65 20 5c 22 22 20 24  ng to file \"" $
2430: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
2440: 20 20 7d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23  ################
2480: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2490: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63  ######....  proc
24a0: 20 63 6c 65 61 6e 75 70 4c 6f 67 67 69 6e 67 20   cleanupLogging 
24b0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a  { fileName } {..
24c0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
24d0: 69 73 74 73 20 3a 3a 6c 6f 67 4c 69 73 74 65 6e  ists ::logListen
24e0: 65 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  er]} then {..   
24f0: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
2500: 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
2510: 69 63 73 2e 54 72 61 63 65 2e 4c 69 73 74 65 6e  ics.Trace.Listen
2520: 65 72 73 20 52 65 6d 6f 76 65 20 24 3a 3a 6c 6f  ers Remove $::lo
2530: 67 4c 69 73 74 65 6e 65 72 0d 0a 20 20 20 20 20  gListener..     
2540: 20 24 3a 3a 6c 6f 67 4c 69 73 74 65 6e 65 72 20   $::logListener 
2550: 43 6c 6f 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  Close..    }....
2560: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
2570: 45 3a 20 43 6f 70 79 20 74 68 65 20 74 72 61 63  E: Copy the trac
2580: 65 20 6c 69 73 74 65 6e 65 72 20 6c 6f 67 20 66  e listener log f
2590: 69 6c 65 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  ile to the main 
25a0: 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a  test log file...
25b0: 20 20 20 20 23 0d 0a 20 20 20 20 74 6c 6f 67 20      #..    tlog 
25c0: 22 2d 2d 2d 2d 20 42 45 47 49 4e 20 54 52 41 43  "---- BEGIN TRAC
25d0: 45 20 4c 49 53 54 45 4e 45 52 20 4f 55 54 50 55  E LISTENER OUTPU
25e0: 54 5c 6e 22 0d 0a 20 20 20 20 74 6c 6f 67 20 5b  T\n"..    tlog [
25f0: 72 65 61 64 46 69 6c 65 20 24 66 69 6c 65 4e 61  readFile $fileNa
2600: 6d 65 5d 0d 0a 20 20 20 20 74 6c 6f 67 20 22 5c  me]..    tlog "\
2610: 6e 2d 2d 2d 2d 20 45 4e 44 20 54 52 41 43 45 20  n---- END TRACE 
2620: 4c 49 53 54 45 4e 45 52 20 4f 55 54 50 55 54 5c  LISTENER OUTPUT\
2630: 6e 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20  n"....    #..   
2640: 20 23 20 4e 4f 54 45 3a 20 44 65 6c 65 74 65 20   # NOTE: Delete 
2650: 74 68 65 20 74 72 61 63 65 20 6c 69 73 74 65 6e  the trace listen
2660: 65 72 20 6c 6f 67 20 66 69 6c 65 20 62 65 63 61  er log file beca
2670: 75 73 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  use its contents
2680: 20 68 61 76 65 0d 0a 20 20 20 20 23 20 20 20 20   have..    #    
2690: 20 20 20 62 65 65 6e 20 63 6f 70 69 65 64 20 74     been copied t
26a0: 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 73 74 20  o the main test 
26b0: 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 23  log file...    #
26c0: 0d 0a 20 20 20 20 63 6c 65 61 6e 75 70 46 69 6c  ..    cleanupFil
26d0: 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20  e $fileName.... 
26e0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
26f0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
2700: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
2710: 22 2d 2d 2d 2d 20 64 69 73 61 62 6c 65 64 20 53  "---- disabled S
2720: 51 4c 69 74 65 20 74 72 61 63 65 20 6c 6f 67 67  QLite trace logg
2730: 69 6e 67 20 74 6f 20 66 69 6c 65 20 5c 22 22 20  ing to file \"" 
2740: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  $fileName \"\n].
2750: 0a 20 20 7d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23  ################
2790: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27a0: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a  #######....  #..
27b0: 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20    # NOTE: Setup 
27c0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
27d0: 65 73 20 66 6f 72 20 74 68 65 20 74 75 6e 61 62  es for the tunab
27e0: 6c 65 20 77 6f 72 6b 6c 6f 61 64 20 70 61 72 61  le workload para
27f0: 6d 65 74 65 72 73 2e 20 20 41 6e 79 2c 0d 0a 20  meters.  Any,.. 
2800: 20 23 20 20 20 20 20 20 20 61 6c 6c 2c 20 6f 72   #       all, or
2810: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 6d   none of these m
2820: 61 79 20 62 65 20 6f 76 65 72 72 69 64 65 6e 20  ay be overriden 
2830: 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  via the command 
2840: 6c 69 6e 65 2e 0d 0a 20 20 23 0d 0a 20 20 73 65  line...  #..  se
2850: 74 20 63 6f 75 6e 74 28 30 29 20 33 3b 20 20 20  t count(0) 3;   
2860: 20 20 20 20 20 20 23 20 57 6f 72 6b 6c 6f 61 64        # Workload
2870: 20 72 65 70 65 61 74 20 63 6f 75 6e 74 20 28 69   repeat count (i
2880: 2e 65 2e 20 74 6f 74 61 6c 20 66 75 6c 6c 20 72  .e. total full r
2890: 75 6e 73 29 2e 0d 0a 20 20 73 65 74 20 63 6f 75  uns)...  set cou
28a0: 6e 74 28 31 29 20 35 3b 20 20 20 20 20 20 20 20  nt(1) 5;        
28b0: 20 23 20 57 6f 72 6b 6c 6f 61 64 20 69 74 65 72   # Workload iter
28c0: 61 74 69 6f 6e 20 63 6f 75 6e 74 20 28 69 2e 65  ation count (i.e
28d0: 2e 20 77 69 74 68 69 6e 20 61 20 72 75 6e 29 2e  . within a run).
28e0: 0d 0a 20 20 73 65 74 20 63 6f 75 6e 74 28 32 29  ..  set count(2)
28f0: 20 32 30 30 3b 20 20 20 20 20 20 20 23 20 57 6f   200;       # Wo
2900: 72 6b 6c 6f 61 64 20 69 74 65 72 61 74 69 6f 6e  rkload iteration
2910: 20 64 65 6c 61 79 2c 20 69 6e 20 6d 69 6c 6c 69   delay, in milli
2920: 73 65 63 6f 6e 64 73 2e 0d 0a 20 20 73 65 74 20  seconds...  set 
2930: 63 6f 75 6e 74 28 33 29 20 35 37 3b 20 20 20 20  count(3) 57;    
2940: 20 20 20 20 23 20 57 6f 72 6b 6c 6f 61 64 20 22      # Workload "
2950: 73 6d 61 6c 6c 22 20 64 61 74 61 20 63 68 75 6e  small" data chun
2960: 6b 20 73 69 7a 65 2c 20 69 6e 20 62 79 74 65 73  k size, in bytes
2970: 2e 0d 0a 20 20 73 65 74 20 63 6f 75 6e 74 28 34  ...  set count(4
2980: 29 20 31 30 30 30 30 3b 20 20 20 20 20 23 20 57  ) 10000;     # W
2990: 6f 72 6b 6c 6f 61 64 20 22 62 69 67 22 20 64 61  orkload "big" da
29a0: 74 61 20 63 68 75 6e 6b 20 73 69 7a 65 2c 20 69  ta chunk size, i
29b0: 6e 20 62 79 74 65 73 2e 0d 0a 20 20 73 65 74 20  n bytes...  set 
29c0: 63 6f 75 6e 74 28 35 29 20 32 30 39 37 31 35 32  count(5) 2097152
29d0: 30 30 3b 20 23 20 4d 61 78 69 6d 75 6d 20 68 65  00; # Maximum he
29e0: 61 70 20 6d 65 6d 6f 72 79 20 74 6f 20 65 78 63  ap memory to exc
29f0: 6c 75 64 65 20 61 74 20 6f 6e 65 20 74 69 6d 65  lude at one time
2a00: 2e 0d 0a 20 20 73 65 74 20 6e 6f 57 6f 72 6b 6c  ...  set noWorkl
2a10: 6f 61 64 20 5b 6c 69 73 74 5d 3b 20 20 23 20 57  oad [list];  # W
2a20: 6f 72 6b 6c 6f 61 64 73 20 74 6f 20 62 65 20 6f  orkloads to be o
2a30: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
2a40: 72 75 6e 2c 20 62 79 20 69 6e 64 65 78 2e 0d 0a  run, by index...
2a50: 20 20 73 65 74 20 70 72 69 6f 72 69 74 69 65 73    set priorities
2a60: 20 5b 6c 69 73 74 5d 3b 20 20 23 20 44 69 63 74   [list];  # Dict
2a70: 69 6f 6e 61 72 79 20 6f 66 20 77 6f 72 6b 6c 6f  ionary of worklo
2a80: 61 64 20 74 68 72 65 61 64 20 70 72 69 6f 72 69  ad thread priori
2a90: 74 69 65 73 2e 0d 0a 20 20 73 65 74 20 65 78 69  ties...  set exi
2aa0: 74 4f 6e 46 61 69 6c 20 66 61 6c 73 65 3b 20 20  tOnFail false;  
2ab0: 20 23 20 48 61 6c 74 20 74 65 73 74 69 6e 67 20   # Halt testing 
2ac0: 61 6e 64 20 65 78 69 74 20 70 72 6f 63 65 73 73  and exit process
2ad0: 20 6f 6e 20 74 65 73 74 20 66 61 69 6c 75 72 65   on test failure
2ae0: 3f 0d 0a 20 20 73 65 74 20 63 6f 54 61 73 6b 4d  ?..  set coTaskM
2af0: 65 6d 20 74 72 75 65 3b 20 20 20 20 20 23 20 55  em true;     # U
2b00: 73 65 20 41 6c 6c 6f 63 43 6f 54 61 73 6b 4d 65  se AllocCoTaskMe
2b10: 6d 2f 46 72 65 65 43 6f 54 61 73 6b 4d 65 6d 20  m/FreeCoTaskMem 
2b20: 66 6f 72 20 6d 65 6d 6f 72 79 3f 0d 0a 20 20 73  for memory?..  s
2b30: 65 74 20 6e 6f 54 72 61 63 65 20 66 61 6c 73 65  et noTrace false
2b40: 3b 20 20 20 20 20 20 23 20 44 69 73 61 62 6c 65  ;      # Disable
2b50: 20 53 51 4c 69 74 65 20 74 72 61 63 65 20 6c 6f   SQLite trace lo
2b60: 67 67 69 6e 67 20 74 6f 20 61 20 66 69 6c 65 3f  gging to a file?
2b70: 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23  ################
2bb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2bc0: 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20  ###....  #..  # 
2bd0: 4e 4f 54 45 3a 20 49 66 20 63 6f 6d 6d 61 6e 64  NOTE: If command
2be0: 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20   line arguments 
2bf0: 74 6f 20 74 68 65 20 74 65 73 74 20 73 75 69 74  to the test suit
2c00: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
2c10: 20 70 72 6f 63 65 73 73 0d 0a 20 20 23 20 20 20   process..  #   
2c20: 20 20 20 20 74 68 65 6d 20 66 6f 72 20 61 6e 79      them for any
2c30: 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72   options that ar
2c40: 65 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20  e applicable to 
2c50: 74 68 69 73 20 74 65 73 74 20 28 69 2e 65 2e 20  this test (i.e. 
2c60: 61 6e 79 20 6f 66 0d 0a 20 20 23 20 20 20 20 20  any of..  #     
2c70: 20 20 74 68 65 20 74 75 6e 61 62 6c 65 20 77 6f    the tunable wo
2c80: 72 6b 6c 6f 61 64 20 70 61 72 61 6d 65 74 65 72  rkload parameter
2c90: 73 20 6c 69 73 74 65 64 20 61 62 6f 76 65 29 2e  s listed above).
2ca0: 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 5b 69 6e  ..  #..  if {[in
2cb0: 66 6f 20 65 78 69 73 74 73 20 61 72 67 76 5d 20  fo exists argv] 
2cc0: 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67  && [llength $arg
2cd0: 76 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  v] > 0} then {..
2ce0: 20 20 20 20 70 61 72 73 65 20 6f 70 74 69 6f 6e      parse option
2cf0: 73 20 2d 66 6c 61 67 73 20 5c 0d 0a 20 20 20 20  s -flags \..    
2d00: 20 20 20 20 7b 2d 53 74 6f 70 4f 6e 55 6e 6b 6e      {-StopOnUnkn
2d10: 6f 77 6e 4f 70 74 69 6f 6e 20 2b 49 67 6e 6f 72  ownOption +Ignor
2d20: 65 4f 6e 55 6e 6b 6e 6f 77 6e 4f 70 74 69 6f 6e  eOnUnknownOption
2d30: 20 53 6b 69 70 4f 6e 55 6e 6b 6e 6f 77 6e 4f 70   SkipOnUnknownOp
2d40: 74 69 6f 6e 7d 20 2d 2d 20 5c 0d 0a 20 20 20 20  tion} -- \..    
2d50: 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 73 74 20      [list [list 
2d60: 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 49 6e 74  null MustHaveInt
2d70: 65 67 65 72 56 61 6c 75 65 20 2d 31 20 2d 31 20  egerValue -1 -1 
2d80: 2d 63 6f 75 6e 74 30 20 24 63 6f 75 6e 74 28 30  -count0 $count(0
2d90: 29 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c  )] \..        [l
2da0: 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48 61 76  ist null MustHav
2db0: 65 49 6e 74 65 67 65 72 56 61 6c 75 65 20 2d 31  eIntegerValue -1
2dc0: 20 2d 31 20 2d 63 6f 75 6e 74 31 20 24 63 6f 75   -1 -count1 $cou
2dd0: 6e 74 28 31 29 5d 20 5c 0d 0a 20 20 20 20 20 20  nt(1)] \..      
2de0: 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73    [list null Mus
2df0: 74 48 61 76 65 49 6e 74 65 67 65 72 56 61 6c 75  tHaveIntegerValu
2e00: 65 20 2d 31 20 2d 31 20 2d 63 6f 75 6e 74 32 20  e -1 -1 -count2 
2e10: 24 63 6f 75 6e 74 28 32 29 5d 20 5c 0d 0a 20 20  $count(2)] \..  
2e20: 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c        [list null
2e30: 20 4d 75 73 74 48 61 76 65 49 6e 74 65 67 65 72   MustHaveInteger
2e40: 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 63 6f 75  Value -1 -1 -cou
2e50: 6e 74 33 20 24 63 6f 75 6e 74 28 33 29 5d 20 5c  nt3 $count(3)] \
2e60: 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20  ..        [list 
2e70: 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 49 6e 74  null MustHaveInt
2e80: 65 67 65 72 56 61 6c 75 65 20 2d 31 20 2d 31 20  egerValue -1 -1 
2e90: 2d 63 6f 75 6e 74 34 20 24 63 6f 75 6e 74 28 34  -count4 $count(4
2ea0: 29 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c  )] \..        [l
2eb0: 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48 61 76  ist null MustHav
2ec0: 65 49 6e 74 65 67 65 72 56 61 6c 75 65 20 2d 31  eIntegerValue -1
2ed0: 20 2d 31 20 2d 63 6f 75 6e 74 35 20 24 63 6f 75   -1 -count5 $cou
2ee0: 6e 74 28 35 29 5d 20 5c 0d 0a 20 20 20 20 20 20  nt(5)] \..      
2ef0: 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73    [list null Mus
2f00: 74 48 61 76 65 4c 69 73 74 56 61 6c 75 65 20 2d  tHaveListValue -
2f10: 31 20 2d 31 20 2d 6e 6f 57 6f 72 6b 6c 6f 61 64  1 -1 -noWorkload
2f20: 20 24 6e 6f 57 6f 72 6b 6c 6f 61 64 5d 20 5c 0d   $noWorkload] \.
2f30: 0a 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 6e  .        [list n
2f40: 75 6c 6c 20 4d 75 73 74 48 61 76 65 4c 69 73 74  ull MustHaveList
2f50: 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 70 72 69  Value -1 -1 -pri
2f60: 6f 72 69 74 69 65 73 20 24 70 72 69 6f 72 69 74  orities $priorit
2f70: 69 65 73 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ies] \..        
2f80: 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48  [list null MustH
2f90: 61 76 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65 20  aveBooleanValue 
2fa0: 2d 31 20 2d 31 20 2d 65 78 69 74 4f 6e 46 61 69  -1 -1 -exitOnFai
2fb0: 6c 20 24 65 78 69 74 4f 6e 46 61 69 6c 5d 20 5c  l $exitOnFail] \
2fc0: 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20  ..        [list 
2fd0: 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 42 6f 6f  null MustHaveBoo
2fe0: 6c 65 61 6e 56 61 6c 75 65 20 2d 31 20 2d 31 20  leanValue -1 -1 
2ff0: 2d 63 6f 54 61 73 6b 4d 65 6d 20 24 63 6f 54 61  -coTaskMem $coTa
3000: 73 6b 4d 65 6d 5d 20 5c 0d 0a 20 20 20 20 20 20  skMem] \..      
3010: 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73    [list null Mus
3020: 74 48 61 76 65 42 6f 6f 6c 65 61 6e 56 61 6c 75  tHaveBooleanValu
3030: 65 20 2d 31 20 2d 31 20 2d 6e 6f 54 72 61 63 65  e -1 -1 -noTrace
3040: 20 24 6e 6f 54 72 61 63 65 5d 5d 20 24 61 72 67   $noTrace]] $arg
3050: 76 0d 0a 0d 0a 20 20 20 20 73 65 74 20 63 6f 75  v....    set cou
3060: 6e 74 28 30 29 20 24 6f 70 74 69 6f 6e 73 28 2d  nt(0) $options(-
3070: 63 6f 75 6e 74 30 2c 76 61 6c 75 65 29 0d 0a 20  count0,value).. 
3080: 20 20 20 73 65 74 20 63 6f 75 6e 74 28 31 29 20     set count(1) 
3090: 24 6f 70 74 69 6f 6e 73 28 2d 63 6f 75 6e 74 31  $options(-count1
30a0: 2c 76 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74  ,value)..    set
30b0: 20 63 6f 75 6e 74 28 32 29 20 24 6f 70 74 69 6f   count(2) $optio
30c0: 6e 73 28 2d 63 6f 75 6e 74 32 2c 76 61 6c 75 65  ns(-count2,value
30d0: 29 0d 0a 20 20 20 20 73 65 74 20 63 6f 75 6e 74  )..    set count
30e0: 28 33 29 20 24 6f 70 74 69 6f 6e 73 28 2d 63 6f  (3) $options(-co
30f0: 75 6e 74 33 2c 76 61 6c 75 65 29 0d 0a 20 20 20  unt3,value)..   
3100: 20 73 65 74 20 63 6f 75 6e 74 28 34 29 20 24 6f   set count(4) $o
3110: 70 74 69 6f 6e 73 28 2d 63 6f 75 6e 74 34 2c 76  ptions(-count4,v
3120: 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74 20 63  alue)..    set c
3130: 6f 75 6e 74 28 35 29 20 24 6f 70 74 69 6f 6e 73  ount(5) $options
3140: 28 2d 63 6f 75 6e 74 35 2c 76 61 6c 75 65 29 0d  (-count5,value).
3150: 0a 20 20 20 20 73 65 74 20 6e 6f 57 6f 72 6b 6c  .    set noWorkl
3160: 6f 61 64 20 24 6f 70 74 69 6f 6e 73 28 2d 6e 6f  oad $options(-no
3170: 57 6f 72 6b 6c 6f 61 64 2c 76 61 6c 75 65 29 0d  Workload,value).
3180: 0a 20 20 20 20 73 65 74 20 70 72 69 6f 72 69 74  .    set priorit
3190: 69 65 73 20 24 6f 70 74 69 6f 6e 73 28 2d 70 72  ies $options(-pr
31a0: 69 6f 72 69 74 69 65 73 2c 76 61 6c 75 65 29 0d  iorities,value).
31b0: 0a 20 20 20 20 73 65 74 20 65 78 69 74 4f 6e 46  .    set exitOnF
31c0: 61 69 6c 20 24 6f 70 74 69 6f 6e 73 28 2d 65 78  ail $options(-ex
31d0: 69 74 4f 6e 46 61 69 6c 2c 76 61 6c 75 65 29 0d  itOnFail,value).
31e0: 0a 20 20 20 20 73 65 74 20 63 6f 54 61 73 6b 4d  .    set coTaskM
31f0: 65 6d 20 24 6f 70 74 69 6f 6e 73 28 2d 63 6f 54  em $options(-coT
3200: 61 73 6b 4d 65 6d 2c 76 61 6c 75 65 29 0d 0a 20  askMem,value).. 
3210: 20 20 20 73 65 74 20 6e 6f 54 72 61 63 65 20 24     set noTrace $
3220: 6f 70 74 69 6f 6e 73 28 2d 6e 6f 54 72 61 63 65  options(-noTrace
3230: 2c 76 61 6c 75 65 29 0d 0a 20 20 7d 0d 0a 0d 0a  ,value)..  }....
3240: 20 20 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: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
3290: 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
32a0: 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65  : Load custom pe
32b0: 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
32c0: 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
32d0: 69 6e 67 73 2e 20 20 43 75 72 72 65 6e 74 6c 79  ings.  Currently
32e0: 2c 20 74 68 69 73 0d 0a 20 20 23 20 20 20 20 20  , this..  #     
32f0: 20 20 69 73 20 64 6f 6e 65 20 61 66 74 65 72 20    is done after 
3300: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 63  processing the c
3310: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69  ommand line opti
3320: 6f 6e 73 2e 20 20 54 68 65 20 73 65 74 74 69 6e  ons.  The settin
3330: 67 73 20 66 69 6c 65 0d 0a 20 20 23 20 20 20 20  gs file..  #    
3340: 20 20 20 73 68 6f 75 6c 64 20 74 61 6b 65 20 69     should take i
3350: 6e 74 6f 20 61 63 63 6f 75 6e 74 20 74 68 65 20  nto account the 
3360: 65 78 69 73 74 69 6e 67 20 77 6f 72 6b 6c 6f 61  existing workloa
3370: 64 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e 64  d parameters and
3380: 20 61 76 6f 69 64 0d 0a 20 20 23 20 20 20 20 20   avoid..  #     
3390: 20 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 20 74    changing any t
33a0: 68 61 74 20 6d 61 79 20 68 61 76 65 20 61 6c 72  hat may have alr
33b0: 65 61 64 79 20 62 65 65 6e 20 6f 76 65 72 72 69  eady been overri
33c0: 64 64 65 6e 2e 0d 0a 20 20 23 0d 0a 20 20 6c 6f  dden...  #..  lo
33d0: 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
33e0: 69 6e 67 73 20 24 74 65 73 74 5f 63 68 61 6e 6e  ings $test_chann
33f0: 65 6c 20 2e 73 74 72 65 73 73 0d 0a 0d 0a 20 20  el .stress....  
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 23 23  ################
3430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3440: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
3450: 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20  .  #..  # NOTE: 
3460: 54 68 65 20 74 72 61 63 65 20 6c 69 73 74 65 6e  The trace listen
3470: 65 72 20 75 73 65 64 20 77 69 74 68 20 74 68 65  er used with the
3480: 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73   SQLiteLog class
3490: 20 74 6f 20 63 61 70 74 75 72 65 20 6f 75 74 70   to capture outp
34a0: 75 74 0d 0a 20 20 23 20 20 20 20 20 20 20 66 72  ut..  #       fr
34b0: 6f 6d 20 74 68 65 20 63 6f 72 65 20 53 51 4c 69  om the core SQLi
34c0: 74 65 20 6c 69 62 72 61 72 79 20 72 65 71 75 69  te library requi
34d0: 72 65 73 20 69 74 73 20 6f 77 6e 20 6c 6f 67 20  res its own log 
34e0: 66 69 6c 65 20 62 65 63 61 75 73 65 20 74 68 65  file because the
34f0: 0d 0a 20 20 23 20 20 20 20 20 20 20 54 65 78 74  ..  #       Text
3500: 57 72 69 74 65 72 54 72 61 63 65 4c 69 73 74 65  WriterTraceListe
3510: 6e 65 72 20 63 6c 61 73 73 20 6f 70 65 6e 73 20  ner class opens 
3520: 61 6e 64 20 6c 6f 63 6b 73 20 74 68 65 20 6c 6f  and locks the lo
3530: 67 20 66 69 6c 65 20 69 74 20 75 73 65 73 0d 0a  g file it uses..
3540: 20 20 23 20 20 20 20 20 20 20 61 73 20 74 68 65    #       as the
3550: 20 62 61 73 69 73 20 6f 66 20 74 68 65 20 6f 75   basis of the ou
3560: 74 70 75 74 20 73 74 72 65 61 6d 2e 20 20 42 65  tput stream.  Be
3570: 66 6f 72 65 20 74 68 69 73 20 74 65 73 74 20 69  fore this test i
3580: 73 20 63 6f 6d 70 6c 65 74 65 2c 0d 0a 20 20 23  s complete,..  #
3590: 20 20 20 20 20 20 20 74 68 65 20 65 6e 74 69 72         the entir
35a0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
35b0: 69 73 20 74 72 61 63 65 20 6c 6f 67 20 66 69 6c  is trace log fil
35c0: 65 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64  e will be copied
35d0: 20 69 6e 74 6f 20 74 68 65 0d 0a 20 20 23 20 20   into the..  #  
35e0: 20 20 20 20 20 6d 61 69 6e 20 74 65 73 74 20 6c       main test l
35f0: 6f 67 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e  og file and then
3600: 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 23 0d 0a   deleted...  #..
3610: 20 20 69 66 20 7b 21 24 6e 6f 54 72 61 63 65 7d    if {!$noTrace}
3620: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74   then {..    set
3630: 20 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 5b 61 70   logFileName [ap
3640: 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 72  pendArgs [file r
3650: 6f 6f 74 6e 61 6d 65 20 24 74 65 73 74 5f 6c 6f  ootname $test_lo
3660: 67 5d 20 2e 74 72 61 63 65 2e 6c 6f 67 5d 0d 0a  g] .trace.log]..
3670: 20 20 20 20 73 65 74 75 70 4c 6f 67 67 69 6e 67      setupLogging
3680: 20 24 6c 6f 67 46 69 6c 65 4e 61 6d 65 0d 0a 20   $logFileName.. 
3690: 20 7d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23  ################
36d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
36e0: 23 23 23 23 23 0d 0a 0d 0a 20 20 74 70 75 74 73  #####....  tputs
36f0: 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b   $test_channel [
3700: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
3710: 20 20 20 20 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f      "---- worklo
3720: 61 64 73 20 77 69 6c 6c 20 72 65 70 65 61 74 20  ads will repeat 
3730: 22 20 24 63 6f 75 6e 74 28 30 29 20 22 20 74 69  " $count(0) " ti
3740: 6d 65 28 73 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 74  me(s)\n"]....  t
3750: 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e  puts $test_chann
3760: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
3770: 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77 6f  ..      "---- wo
3780: 72 6b 6c 6f 61 64 73 20 77 69 6c 6c 20 68 61 76  rkloads will hav
3790: 65 20 22 20 24 63 6f 75 6e 74 28 31 29 20 22 20  e " $count(1) " 
37a0: 69 74 65 72 61 74 69 6f 6e 28 73 29 5c 6e 22 5d  iteration(s)\n"]
37b0: 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73  ....  tputs $tes
37c0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
37d0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22  dArgs \..      "
37e0: 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20 77  ---- workloads w
37f0: 69 6c 6c 20 77 61 69 74 20 61 74 20 6c 65 61 73  ill wait at leas
3800: 74 20 22 20 24 63 6f 75 6e 74 28 32 29 20 5c 0d  t " $count(2) \.
3810: 0a 20 20 20 20 20 20 22 20 6d 69 6c 6c 69 73 65  .      " millise
3820: 63 6f 6e 64 28 73 29 20 61 66 74 65 72 20 65 61  cond(s) after ea
3830: 63 68 20 69 74 65 72 61 74 69 6f 6e 5c 6e 22 5d  ch iteration\n"]
3840: 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73  ....  tputs $tes
3850: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
3860: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22  dArgs \..      "
3870: 2d 2d 2d 2d 20 73 6d 61 6c 6c 20 63 68 75 6e 6b  ---- small chunk
3880: 20 73 69 7a 65 20 69 73 20 22 20 24 63 6f 75 6e   size is " $coun
3890: 74 28 33 29 20 22 20 62 79 74 65 28 73 29 5c 6e  t(3) " byte(s)\n
38a0: 22 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74  "]....  tputs $t
38b0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
38c0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
38d0: 20 22 2d 2d 2d 2d 20 62 69 67 20 63 68 75 6e 6b   "---- big chunk
38e0: 20 73 69 7a 65 20 69 73 20 22 20 24 63 6f 75 6e   size is " $coun
38f0: 74 28 34 29 20 22 20 62 79 74 65 28 73 29 5c 6e  t(4) " byte(s)\n
3900: 22 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74  "]....  tputs $t
3910: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
3920: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
3930: 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 65   "---- maximum e
3940: 78 63 6c 75 64 65 64 20 68 65 61 70 20 6d 65 6d  xcluded heap mem
3950: 6f 72 79 20 69 73 20 22 20 24 63 6f 75 6e 74 28  ory is " $count(
3960: 35 29 20 22 20 62 79 74 65 28 73 29 5c 6e 22 5d  5) " byte(s)\n"]
3970: 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73  ....  tputs $tes
3980: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
3990: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22  dArgs \..      "
39a0: 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20 74  ---- workloads t
39b0: 6f 20 62 65 20 73 6b 69 70 70 65 64 2e 2e 2e 20  o be skipped... 
39c0: 22 20 5c 0d 0a 20 20 20 20 20 20 5b 65 78 70 72  " \..      [expr
39d0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6e 6f 57 6f   {[llength $noWo
39e0: 72 6b 6c 6f 61 64 5d 20 3e 20 30 20 3f 20 24 6e  rkload] > 0 ? $n
39f0: 6f 57 6f 72 6b 6c 6f 61 64 20 3a 20 22 6e 6f 6e  oWorkload : "non
3a00: 65 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 74 70  e"}] \n]....  tp
3a10: 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  uts $test_channe
3a20: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
3a30: 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77 6f 72  .      "---- wor
3a40: 6b 6c 6f 61 64 73 20 70 72 69 6f 72 69 74 79 20  kloads priority 
3a50: 6f 76 65 72 72 69 64 65 73 2e 2e 2e 20 22 20 5c  overrides... " \
3a60: 0d 0a 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b  ..      [expr {[
3a70: 6c 6c 65 6e 67 74 68 20 24 70 72 69 6f 72 69 74  llength $priorit
3a80: 69 65 73 5d 20 3e 20 30 20 3f 20 24 70 72 69 6f  ies] > 0 ? $prio
3a90: 72 69 74 69 65 73 20 3a 20 22 6e 6f 6e 65 22 7d  rities : "none"}
3aa0: 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 74 70 75 74 73  ] \n]....  tputs
3ab0: 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b   $test_channel [
3ac0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
3ad0: 20 20 20 20 22 2d 2d 2d 2d 20 75 6e 65 78 70 65      "---- unexpe
3ae0: 63 74 65 64 20 65 72 72 6f 72 73 20 22 20 5c 0d  cted errors " \.
3af0: 0a 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 65  .      [expr {$e
3b00: 78 69 74 4f 6e 46 61 69 6c 20 3f 20 22 77 69 6c  xitOnFail ? "wil
3b10: 6c 22 20 3a 20 22 77 69 6c 6c 20 6e 6f 74 22 7d  l" : "will not"}
3b20: 5d 20 5c 0d 0a 20 20 20 20 20 20 22 20 68 61 6c  ] \..      " hal
3b30: 74 20 74 65 73 74 69 6e 67 20 61 6e 64 20 65 78  t testing and ex
3b40: 69 74 20 74 68 65 20 70 72 6f 63 65 73 73 5c 6e  it the process\n
3b50: 22 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74  "]....  tputs $t
3b60: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
3b70: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
3b80: 20 22 2d 2d 2d 2d 20 74 68 65 20 22 20 5b 65 78   "---- the " [ex
3b90: 70 72 20 7b 24 63 6f 54 61 73 6b 4d 65 6d 20 3f  pr {$coTaskMem ?
3ba0: 20 22 43 6f 54 61 73 6b 4d 65 6d 22 20 3a 20 22   "CoTaskMem" : "
3bb0: 53 51 4c 69 74 65 22 7d 5d 20 5c 0d 0a 20 20 20  SQLite"}] \..   
3bc0: 20 20 20 22 20 61 6c 6c 6f 63 61 74 6f 72 20 77     " allocator w
3bd0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 65  ill be used to e
3be0: 78 63 6c 75 64 65 20 68 65 61 70 20 6d 65 6d 6f  xclude heap memo
3bf0: 72 79 5c 6e 22 5d 0d 0a 0d 0a 20 20 74 70 75 74  ry\n"]....  tput
3c00: 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  s $test_channel 
3c10: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
3c20: 20 20 20 20 20 22 2d 2d 2d 2d 20 74 72 61 63 65       "---- trace
3c30: 20 6c 6f 67 67 69 6e 67 20 74 6f 20 61 20 66 69   logging to a fi
3c40: 6c 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20  le is " \..     
3c50: 20 5b 65 78 70 72 20 7b 24 6e 6f 54 72 61 63 65   [expr {$noTrace
3c60: 20 3f 20 22 64 69 73 61 62 6c 65 64 22 20 3a 20   ? "disabled" : 
3c70: 22 65 6e 61 62 6c 65 64 22 7d 5d 20 5c 6e 5d 0d  "enabled"}] \n].
3c80: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
3c90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ca0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3cb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3cc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3cd0: 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e  ##....  #..  # N
3ce0: 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65 20  OTE: Create the 
3cf0: 77 6f 72 6b 6c 6f 61 64 20 70 72 69 6f 72 69 74  workload priorit
3d00: 79 20 61 72 72 61 79 20 62 61 73 65 64 20 6f 6e  y array based on
3d10: 20 74 68 65 20 70 72 69 6f 72 69 74 79 20 6c 69   the priority li
3d20: 73 74 20 73 65 65 6e 0d 0a 20 20 23 20 20 20 20  st seen..  #    
3d30: 20 20 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e     on the comman
3d40: 64 20 6c 69 6e 65 2c 20 69 66 20 61 6e 79 2e 0d  d line, if any..
3d50: 0a 20 20 23 0d 0a 20 20 61 72 72 61 79 20 73 65  .  #..  array se
3d60: 74 20 70 72 69 6f 72 69 74 79 20 24 70 72 69 6f  t priority $prio
3d70: 72 69 74 69 65 73 0d 0a 0d 0a 20 20 23 23 23 23  rities....  ####
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 23 23 23 23 23 23  ################
3db0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3dc0: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23  #########....  #
3dd0: 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b  ..  # NOTE: Work
3de0: 6c 6f 61 64 73 20 23 31 32 20 61 6e 64 20 23 31  loads #12 and #1
3df0: 33 20 63 6f 6e 74 61 69 6e 20 43 23 20 63 6f 64  3 contain C# cod
3e00: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
3e10: 20 63 6f 6d 70 69 6c 65 64 2c 20 62 75 74 0d 0a   compiled, but..
3e20: 20 20 23 20 20 20 20 20 20 20 6f 6e 6c 79 20 6f    #       only o
3e30: 6e 63 65 2e 20 20 54 68 65 73 65 20 76 61 72 69  nce.  These vari
3e40: 61 62 6c 65 73 20 6b 65 65 70 20 74 72 61 63 6b  ables keep track
3e50: 20 6f 66 20 74 68 61 74 20 73 74 61 74 65 20 69   of that state i
3e60: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 20 20 23  nformation...  #
3e70: 20 20 20 20 20 20 20 41 6e 20 69 6e 74 65 67 65         An intege
3e80: 72 20 76 61 6c 75 65 20 69 6e 20 6f 6e 65 20 6f  r value in one o
3e90: 66 20 74 68 65 73 65 20 76 61 72 69 61 62 6c 65  f these variable
3ea0: 73 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6d 70  s means the comp
3eb0: 69 6c 61 74 69 6f 6e 20 77 61 73 0d 0a 20 20 23  ilation was..  #
3ec0: 20 20 20 20 20 20 20 63 6f 6d 70 6c 65 74 65 64         completed
3ed0: 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 69   and the resulti
3ee0: 6e 67 20 63 6f 6d 70 69 6c 65 64 20 6d 65 74 68  ng compiled meth
3ef0: 6f 64 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65  od may be invoke
3f00: 64 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20 23  d using the..  #
3f10: 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67         following
3f20: 20 63 6f 6d 6d 61 6e 64 20 28 77 68 65 72 65 20   command (where 
3f30: 24 7b 69 64 7d 20 69 73 20 74 68 65 20 76 61 6c  ${id} is the val
3f40: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
3f50: 6c 65 29 3a 0d 0a 20 20 23 0d 0a 20 20 23 20 20  le):..  #..  #  
3f60: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
3f70: 69 6e 76 6f 6b 65 20 5f 44 79 6e 61 6d 69 63 24  invoke _Dynamic$
3f80: 7b 69 64 7d 2e 54 65 73 74 24 7b 69 64 7d 20 42  {id}.Test${id} B
3f90: 61 63 6b 75 70 41 6e 64 47 65 74 44 61 74 61 0d  ackupAndGetData.
3fa0: 0a 20 20 23 0d 0a 20 20 73 65 74 20 63 6f 6d 70  .  #..  set comp
3fb0: 69 6c 65 64 28 31 32 29 20 22 22 0d 0a 20 20 73  iled(12) ""..  s
3fc0: 65 74 20 63 6f 6d 70 69 6c 65 64 28 31 33 29 20  et compiled(13) 
3fd0: 22 22 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23  ################
4010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4020: 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20  #####....  #..  
4030: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20  # NOTE: This is 
4040: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
4050: 61 62 61 73 65 20 77 69 74 68 20 73 68 61 72 65  abase with share
4060: 64 20 63 61 63 68 65 20 65 6e 61 62 6c 65 64 2e  d cache enabled.
4070: 0d 0a 20 20 23 0d 0a 20 20 73 65 74 20 66 69 6c  ..  #..  set fil
4080: 65 4e 61 6d 65 28 31 29 20 66 69 6c 65 3a 3a 6d  eName(1) file::m
4090: 65 6d 6f 72 79 3a 3f 63 61 63 68 65 3d 73 68 61  emory:?cache=sha
40a0: 72 65 64 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23  red....  #######
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 23 23 23 23 23 23 23 23 23  ################
40e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
40f0: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20  ######....  #.. 
4100: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73   # NOTE: This is
4110: 20 61 20 6e 6f 72 6d 61 6c 20 6f 6e 2d 64 69 73   a normal on-dis
4120: 6b 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 23  k database...  #
4130: 0d 0a 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65  ..  set fileName
4140: 28 32 29 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  (2) [file join [
4150: 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
4160: 74 6f 72 79 5d 20 5b 61 70 70 65 6e 64 41 72 67  tory] [appendArg
4170: 73 20 5c 0d 0a 20 20 20 20 20 20 73 74 72 65 73  s \..      stres
4180: 73 2d 20 5b 70 69 64 5d 20 2d 20 5b 73 74 72 69  s- [pid] - [stri
4190: 6e 67 20 74 72 69 6d 20 5b 63 6c 6f 63 6b 20 73  ng trim [clock s
41a0: 65 63 6f 6e 64 73 5d 20 2d 5d 20 2e 64 62 5d 5d  econds] -] .db]]
41b0: 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23  ################
41f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4200: 23 23 23 0d 0a 0d 0a 20 20 73 65 74 75 70 57 6f  ###....  setupWo
4210: 72 6b 6c 6f 61 64 4d 65 6d 44 62 20 24 66 69 6c  rkloadMemDb $fil
4220: 65 4e 61 6d 65 28 31 29 20 73 72 63 44 62 0d 0a  eName(1) srcDb..
4230: 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46    setupWorkloadF
4240: 69 6c 65 44 62 20 24 66 69 6c 65 4e 61 6d 65 28  ileDb $fileName(
4250: 32 29 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23  2)....  ########
4260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
42a0: 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20  #####....  #..  
42b0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 73 65 72  # NOTE: This ser
42c0: 76 65 73 20 74 77 6f 20 70 75 72 70 6f 73 65 73  ves two purposes
42d0: 2e 20 20 46 69 72 73 74 2c 20 69 74 20 61 6c 6c  .  First, it all
42e0: 6f 77 73 20 75 73 20 74 6f 20 76 65 72 69 66 79  ows us to verify
42f0: 20 74 68 65 20 74 72 61 63 65 0d 0a 20 20 23 20   the trace..  # 
4300: 20 20 20 20 20 20 6c 6f 67 67 69 6e 67 20 73 75        logging su
4310: 62 73 79 73 74 65 6d 20 69 73 20 77 6f 72 6b 69  bsystem is worki
4320: 6e 67 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 65  ng properly.  Se
4330: 63 6f 6e 64 2c 20 69 74 20 70 6c 61 63 65 73 20  cond, it places 
4340: 74 68 65 20 66 69 6c 65 0d 0a 20 20 23 20 20 20  the file..  #   
4350: 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68 65      name for the
4360: 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
4370: 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
4380: 68 65 20 74 72 61 63 65 20 6c 6f 67 20 66 69 6c  he trace log fil
4390: 65 2e 0d 0a 20 20 23 0d 0a 20 20 73 65 74 20 63  e...  #..  set c
43a0: 6f 6e 6e 65 63 74 69 6f 6e 20 5b 67 65 74 44 62  onnection [getDb
43b0: 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 0d 0a 20  Connection].... 
43c0: 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 4c 6f 67   $connection Log
43d0: 4d 65 73 73 61 67 65 20 30 20 5b 61 70 70 65 6e  Message 0 [appen
43e0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22  dArgs \..      "
43f0: 73 74 61 72 74 69 6e 67 20 73 74 72 65 73 73 20  starting stress 
4400: 74 65 73 74 20 75 73 69 6e 67 20 64 61 74 61 62  test using datab
4410: 61 73 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ase \"" $fileNam
4420: 65 28 32 29 20 5c 22 2e 2e 2e 5d 0d 0a 0d 0a 20  e(2) \"...].... 
4430: 20 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 23  ################
4460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4470: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
4480: 0d 0a 20 20 73 65 74 20 74 69 6d 65 6f 75 74 20  ..  set timeout 
4490: 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
44a0: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
44b0: 20 5c 0d 0a 20 20 20 20 20 20 45 61 67 6c 65 2e   \..      Eagle.
44c0: 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76  _Components.Priv
44d0: 61 74 65 2e 54 68 72 65 61 64 4f 70 73 20 44 65  ate.ThreadOps De
44e0: 66 61 75 6c 74 4a 6f 69 6e 54 69 6d 65 6f 75 74  faultJoinTimeout
44f0: 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65  ]....  tputs $te
4500: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
4510: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
4520: 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20  "---- workloads 
4530: 77 69 6c 6c 20 73 74 61 72 74 20 62 65 66 6f 72  will start befor
4540: 65 20 6f 72 20 74 69 6d 65 6f 75 74 20 61 66 74  e or timeout aft
4550: 65 72 20 22 20 24 74 69 6d 65 6f 75 74 20 5c 0d  er " $timeout \.
4560: 0a 20 20 20 20 20 20 22 20 6d 69 6c 6c 69 73 65  .      " millise
4570: 63 6f 6e 64 28 73 29 5c 6e 22 5d 0d 0a 0d 0a 20  cond(s)\n"].... 
4580: 20 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 23  ################
45b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
45c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
45d0: 0d 0a 20 20 73 65 74 20 65 76 65 6e 74 20 5b 6f  ..  set event [o
45e0: 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c  bject create -al
45f0: 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 53 79 73  ias \..      Sys
4600: 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 45 76  tem.Threading.Ev
4610: 65 6e 74 57 61 69 74 48 61 6e 64 6c 65 20 66 61  entWaitHandle fa
4620: 6c 73 65 20 4d 61 6e 75 61 6c 52 65 73 65 74 5d  lse ManualReset]
4630: 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23  ################
4670: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4680: 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20  ###..  #        
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23        WORKLOAD #
46b0: 31 20 28 41 29 20 20 20 20 20 20 20 20 20 20 20  1 (A)           
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 23 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23  ################
4710: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4720: 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77  #####....  set w
4730: 6f 72 6b 6c 6f 61 64 28 31 29 20 5b 6c 69 73 74  orkload(1) [list
4740: 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20   \..      [list 
4750: 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46  srcFileName dstF
4760: 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f  ileName table co
4770: 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e  unt1 count2 coun
4780: 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  t3] {..    #..  
4790: 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f    # NOTE: Worklo
47a0: 61 64 20 23 31 2c 20 43 52 45 41 54 45 20 54 41  ad #1, CREATE TA
47b0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d  BLE statements..
47c0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69 74  .    #..    wait
47d0: 54 65 73 74 20 41 0d 0a 20 20 20 20 6c 61 70 70  Test A..    lapp
47e0: 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 29 20 5b  end ::times(1) [
47f0: 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a  lindex [time {..
4800: 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20 41        initTest A
4810: 0d 0a 20 20 20 20 20 20 73 65 74 75 70 57 6f 72  ..      setupWor
4820: 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24 64 73 74  kloadFileDb $dst
4830: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
4840: 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 32  for {set index 2
4850: 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f  } {$index <= $co
4860: 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65  unt1} {incr inde
4870: 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  x} {..        if
4880: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
4890: 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
48a0: 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67  e $db [appendArg
48b0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
48c0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
48d0: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74   IF NOT EXISTS t
48e0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
48f0: 20 20 20 24 69 6e 64 65 78 20 22 28 78 20 50 52     $index "(x PR
4900: 49 4d 41 52 59 20 4b 45 59 2c 20 79 2c 20 7a 29  IMARY KEY, y, z)
4910: 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ;"]..          s
4920: 68 6f 77 54 65 73 74 20 41 0d 0a 20 20 20 20 20  howTest A..     
4930: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
4940: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
4950: 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72  f {[isExpectedEr
4960: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
4970: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
4980: 20 73 68 6f 77 54 65 73 74 20 61 0d 0a 20 20 20   showTest a..   
4990: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
49a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69  .            fai
49b0: 6c 54 65 73 74 20 61 20 24 65 72 72 6f 72 0d 0a  lTest a $error..
49c0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
49d0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
49e0: 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62  .      cleanupDb
49f0: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62   $dstFileName db
4a00: 20 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73   false true fals
4a10: 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73  e..      doneTes
4a20: 74 20 41 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a  t A..    }] 0]..
4a30: 20 20 7d 5d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23  ################
4a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a80: 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20  #######..  #    
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f            WORKLO
4ab0: 41 44 20 23 32 20 28 42 29 20 20 20 20 20 20 20  AD #2 (B)       
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ad0: 20 20 20 20 20 20 20 23 0d 0a 20 20 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 23 23 23 23 23 23  ################
4b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b20: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73  #########....  s
4b30: 65 74 20 77 6f 72 6b 6c 6f 61 64 28 32 29 20 5b  et workload(2) [
4b40: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c  list \..      [l
4b50: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
4b60: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
4b70: 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20  e count1 count2 
4b80: 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23  count3] {..    #
4b90: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f  ..    # NOTE: Wo
4ba0: 72 6b 6c 6f 61 64 20 23 32 2c 20 44 52 4f 50 20  rkload #2, DROP 
4bb0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73  TABLE statements
4bc0: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61  ...    #..    wa
4bd0: 69 74 54 65 73 74 20 42 0d 0a 20 20 20 20 6c 61  itTest B..    la
4be0: 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 32 29  ppend ::times(2)
4bf0: 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b   [lindex [time {
4c00: 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73 74  ..      initTest
4c10: 20 42 0d 0a 20 20 20 20 20 20 73 65 74 75 70 57   B..      setupW
4c20: 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24 64  orkloadFileDb $d
4c30: 73 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20  stFileName..    
4c40: 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
4c50: 20 32 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24   2} {$index <= $
4c60: 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e  count1} {incr in
4c70: 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  dex} {..        
4c80: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
4c90: 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
4ca0: 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41  ute $db [appendA
4cb0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
4cc0: 20 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45       "DROP TABLE
4cd0: 20 49 46 20 45 58 49 53 54 53 20 74 22 20 24 69   IF EXISTS t" $i
4ce0: 6e 64 65 78 20 5c 3b 5d 0d 0a 20 20 20 20 20 20  ndex \;]..      
4cf0: 20 20 20 20 73 68 6f 77 54 65 73 74 20 42 0d 0a      showTest B..
4d00: 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
4d10: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4d20: 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63      if {[isExpec
4d30: 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d  tedError $error]
4d40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4d50: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 62        showTest b
4d60: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
4d70: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
4d80: 20 20 66 61 69 6c 54 65 73 74 20 62 20 24 65 72    failTest b $er
4d90: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ror..          }
4da0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
4db0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61     }..      clea
4dc0: 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61  nupDb $dstFileNa
4dd0: 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72 75 65  me db false true
4de0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f   false..      do
4df0: 6e 65 54 65 73 74 20 42 0d 0a 20 20 20 20 7d 5d  neTest B..    }]
4e00: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23   0]..  }]....  #
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 23 23 23  ################
4e40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e50: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
4e60: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
4e80: 4f 52 4b 4c 4f 41 44 20 23 33 20 28 43 29 20 20  ORKLOAD #3 (C)  
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
4eb0: 20 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 23  ################
4ee0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ef0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
4f00: 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64  ..  set workload
4f10: 28 33 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  (3) [list \..   
4f20: 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65     [list srcFile
4f30: 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65  Name dstFileName
4f40: 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f   table count1 co
4f50: 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a  unt2 count3] {..
4f60: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
4f70: 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 33 2c 20  E: Workload #3, 
4f80: 22 73 6d 61 6c 6c 22 20 53 45 4c 45 43 54 20 73  "small" SELECT s
4f90: 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20  tatements...    
4fa0: 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74 20  #..    waitTest 
4fb0: 43 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a  C..    lappend :
4fc0: 3a 74 69 6d 65 73 28 33 29 20 5b 6c 69 6e 64 65  :times(3) [linde
4fd0: 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20  x [time {..     
4fe0: 20 69 6e 69 74 54 65 73 74 20 43 0d 0a 20 20 20   initTest C..   
4ff0: 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64     setupWorkload
5000: 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c 65 4e  FileDb $dstFileN
5010: 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b  ame..      for {
5020: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
5030: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
5040: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
5050: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
5060: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
5070: 20 73 65 74 20 72 65 61 64 65 72 20 5b 73 71 6c   set reader [sql
5080: 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74   execute -execut
5090: 65 20 72 65 61 64 65 72 20 5c 0d 0a 20 20 20 20  e reader \..    
50a0: 20 20 20 20 20 20 20 20 20 20 2d 66 6f 72 6d 61            -forma
50b0: 74 20 64 61 74 61 52 65 61 64 65 72 20 2d 61 6c  t dataReader -al
50c0: 69 61 73 20 24 64 62 20 5b 61 70 70 65 6e 64 41  ias $db [appendA
50d0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
50e0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 2c 20       "SELECT x, 
50f0: 79 20 46 52 4f 4d 20 22 20 24 74 61 62 6c 65 20  y FROM " $table 
5100: 22 20 57 48 45 52 45 20 7a 20 3d 20 27 73 6d 61  " WHERE z = 'sma
5110: 6c 6c 27 3b 22 5d 5d 0d 0a 20 20 20 20 20 20 20  ll';"]]..       
5120: 20 20 20 77 68 69 6c 65 20 7b 5b 24 72 65 61 64     while {[$read
5130: 65 72 20 52 65 61 64 5d 7d 20 7b 0d 0a 20 20 20  er Read]} {..   
5140: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
5150: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
5160: 44 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20  Do nothing...   
5170: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
5180: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5190: 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
51a0: 6c 61 69 6e 20 72 65 61 64 65 72 0d 0a 20 20 20  lain reader..   
51b0: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
51c0: 43 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  C..        } err
51d0: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
51e0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78         if {[isEx
51f0: 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72  pectedError $err
5200: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
5210: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
5220: 74 20 63 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  t c..          }
5230: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
5240: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 63 20       failTest c 
5250: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
5260: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
5270: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63        }..      c
5280: 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c  leanupDb $dstFil
5290: 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74  eName db false t
52a0: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
52b0: 20 64 6f 6e 65 54 65 73 74 20 43 0d 0a 20 20 20   doneTest C..   
52c0: 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a   }] 0]..  }]....
52d0: 20 20 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: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
5320: 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20  .  #            
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 20 20 57 4f 52 4b 4c 4f 41 44 20 23 34 20 28 44    WORKLOAD #4 (D
5350: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
5370: 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
53b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
53c0: 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  #....  set workl
53d0: 6f 61 64 28 34 29 20 5b 6c 69 73 74 20 5c 0d 0a  oad(4) [list \..
53e0: 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46        [list srcF
53f0: 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e  ileName dstFileN
5400: 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31  ame table count1
5410: 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20   count2 count3] 
5420: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
5430: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
5440: 34 2c 20 22 62 69 67 22 20 53 45 4c 45 43 54 20  4, "big" SELECT 
5450: 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20  statements...   
5460: 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74   #..    waitTest
5470: 20 44 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20   D..    lappend 
5480: 3a 3a 74 69 6d 65 73 28 34 29 20 5b 6c 69 6e 64  ::times(4) [lind
5490: 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20  ex [time {..    
54a0: 20 20 69 6e 69 74 54 65 73 74 20 44 0d 0a 20 20    initTest D..  
54b0: 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61      setupWorkloa
54c0: 64 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c 65  dFileDb $dstFile
54d0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f 72 20  Name..      for 
54e0: 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24  {set index 1} {$
54f0: 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31  index <= $count1
5500: 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
5510: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
5520: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
5530: 20 20 73 65 74 20 72 65 61 64 65 72 20 5b 73 71    set reader [sq
5540: 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
5550: 74 65 20 72 65 61 64 65 72 20 5c 0d 0a 20 20 20  te reader \..   
5560: 20 20 20 20 20 20 20 20 20 20 20 2d 66 6f 72 6d             -form
5570: 61 74 20 64 61 74 61 52 65 61 64 65 72 20 2d 61  at dataReader -a
5580: 6c 69 61 73 20 24 64 62 20 5b 61 70 70 65 6e 64  lias $db [append
5590: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
55a0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 2c        "SELECT x,
55b0: 20 79 20 46 52 4f 4d 20 22 20 24 74 61 62 6c 65   y FROM " $table
55c0: 20 22 20 57 48 45 52 45 20 7a 20 3d 20 27 62 69   " WHERE z = 'bi
55d0: 67 27 3b 22 5d 5d 0d 0a 20 20 20 20 20 20 20 20  g';"]]..        
55e0: 20 20 77 68 69 6c 65 20 7b 5b 24 72 65 61 64 65    while {[$reade
55f0: 72 20 52 65 61 64 5d 7d 20 7b 0d 0a 20 20 20 20  r Read]} {..    
5600: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5610: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
5620: 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20  o nothing...    
5630: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5640: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
5650: 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
5660: 61 69 6e 20 72 65 61 64 65 72 0d 0a 20 20 20 20  ain reader..    
5670: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 44        showTest D
5680: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f  ..        } erro
5690: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
56a0: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70        if {[isExp
56b0: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
56c0: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
56d0: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
56e0: 20 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   d..          } 
56f0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
5700: 20 20 20 20 66 61 69 6c 54 65 73 74 20 64 20 24      failTest d $
5710: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
5720: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
5730: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c       }..      cl
5740: 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65  eanupDb $dstFile
5750: 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72  Name db false tr
5760: 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ue false..      
5770: 64 6f 6e 65 54 65 73 74 20 44 0d 0a 20 20 20 20  doneTest D..    
5780: 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20  }] 0]..  }].... 
5790: 20 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 23  ################
57c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
57d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
57e0: 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20    #             
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5800: 20 57 4f 52 4b 4c 4f 41 44 20 23 35 20 28 45 29   WORKLOAD #5 (E)
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
5830: 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5870: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5880: 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f  ....  set worklo
5890: 61 64 28 35 29 20 5b 6c 69 73 74 20 5c 0d 0a 20  ad(5) [list \.. 
58a0: 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69       [list srcFi
58b0: 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61  leName dstFileNa
58c0: 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20  me table count1 
58d0: 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b  count2 count3] {
58e0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
58f0: 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 35  OTE: Workload #5
5900: 2c 20 22 73 6d 61 6c 6c 22 20 49 4e 53 45 52 54  , "small" INSERT
5910: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20   statements...  
5920: 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73    #..    waitTes
5930: 74 20 45 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  t E..    lappend
5940: 20 3a 3a 74 69 6d 65 73 28 35 29 20 5b 6c 69 6e   ::times(5) [lin
5950: 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20  dex [time {..   
5960: 20 20 20 69 6e 69 74 54 65 73 74 20 45 0d 0a 20     initTest E.. 
5970: 20 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f       setupWorklo
5980: 61 64 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c  adFileDb $dstFil
5990: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f 72  eName..      for
59a0: 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b   {set index 1} {
59b0: 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74  $index <= $count
59c0: 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  1} {incr index} 
59d0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
59e0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
59f0: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
5a00: 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  db [appendArgs "
5a10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 20 24 74  INSERT INTO " $t
5a20: 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  able \..        
5a30: 20 20 20 20 20 20 22 28 78 2c 20 79 2c 20 7a 29        "(x, y, z)
5a40: 20 56 41 4c 55 45 53 28 27 22 20 5b 66 6f 72 6d   VALUES('" [form
5a50: 61 74 20 25 6c 58 20 5b 65 78 70 72 20 7b 72 61  at %lX [expr {ra
5a60: 6e 64 6f 6d 28 29 7d 5d 5d 20 5c 0d 0a 20 20 20  ndom()}]] \..   
5a70: 20 20 20 20 20 20 20 20 20 20 20 22 27 2c 20 27             "', '
5a80: 22 20 5b 62 61 73 65 36 34 20 65 6e 63 6f 64 65  " [base64 encode
5a90: 20 2d 2d 20 5b 65 78 70 72 20 7b 72 61 6e 64 73   -- [expr {rands
5aa0: 74 72 28 24 63 6f 75 6e 74 32 29 7d 5d 5d 20 5c  tr($count2)}]] \
5ab0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5ac0: 22 27 2c 20 27 73 6d 61 6c 6c 27 29 3b 22 5d 0d  "', 'small');"].
5ad0: 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54  .          showT
5ae0: 65 73 74 20 45 0d 0a 20 20 20 20 20 20 20 20 7d  est E..        }
5af0: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
5b00: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
5b10: 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20  isExpectedError 
5b20: 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d  $error]} then {.
5b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f  .            sho
5b40: 77 54 65 73 74 20 65 0d 0a 20 20 20 20 20 20 20  wTest e..       
5b50: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
5b60: 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65 73           failTes
5b70: 74 20 65 20 24 65 72 72 6f 72 0d 0a 20 20 20 20  t e $error..    
5b80: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5b90: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
5ba0: 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64 73     cleanupDb $ds
5bb0: 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c  tFileName db fal
5bc0: 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20  se true false.. 
5bd0: 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20 45 0d       doneTest E.
5be0: 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d  .    }] 0]..  }]
5bf0: 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23  ################
5c30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5c40: 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20  ###..  #        
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23        WORKLOAD #
5c70: 36 20 28 46 29 20 20 20 20 20 20 20 20 20 20 20  6 (F)           
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23     #..  ########
5ca0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5cb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5cc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ce0: 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77  #####....  set w
5cf0: 6f 72 6b 6c 6f 61 64 28 36 29 20 5b 6c 69 73 74  orkload(6) [list
5d00: 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20   \..      [list 
5d10: 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46  srcFileName dstF
5d20: 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f  ileName table co
5d30: 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e  unt1 count2 coun
5d40: 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  t3] {..    #..  
5d50: 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f    # NOTE: Worklo
5d60: 61 64 20 23 36 2c 20 22 62 69 67 22 20 49 4e 53  ad #6, "big" INS
5d70: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d  ERT statements..
5d80: 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61 69 74  .    #..    wait
5d90: 54 65 73 74 20 46 0d 0a 20 20 20 20 6c 61 70 70  Test F..    lapp
5da0: 65 6e 64 20 3a 3a 74 69 6d 65 73 28 36 29 20 5b  end ::times(6) [
5db0: 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a  lindex [time {..
5dc0: 20 20 20 20 20 20 69 6e 69 74 54 65 73 74 20 46        initTest F
5dd0: 0d 0a 20 20 20 20 20 20 73 65 74 75 70 57 6f 72  ..      setupWor
5de0: 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24 64 73 74  kloadFileDb $dst
5df0: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
5e00: 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31  for {set index 1
5e10: 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f  } {$index <= $co
5e20: 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65  unt1} {incr inde
5e30: 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  x} {..        if
5e40: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
5e50: 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
5e60: 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67  e $db [appendArg
5e70: 73 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 22  s "INSERT INTO "
5e80: 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20   $table \..     
5e90: 20 20 20 20 20 20 20 20 20 22 28 78 2c 20 79 2c           "(x, y,
5ea0: 20 7a 29 20 56 41 4c 55 45 53 28 27 22 20 5b 66   z) VALUES('" [f
5eb0: 6f 72 6d 61 74 20 25 6c 58 20 5b 65 78 70 72 20  ormat %lX [expr 
5ec0: 7b 72 61 6e 64 6f 6d 28 29 7d 5d 5d 20 5c 0d 0a  {random()}]] \..
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27                "'
5ee0: 2c 20 52 41 4e 44 4f 4d 42 4c 4f 42 28 22 20 24  , RANDOMBLOB(" $
5ef0: 63 6f 75 6e 74 33 20 22 29 2c 20 27 62 69 67 27  count3 "), 'big'
5f00: 29 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  );"]..          
5f10: 73 68 6f 77 54 65 73 74 20 46 0d 0a 20 20 20 20  showTest F..    
5f20: 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
5f30: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
5f40: 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45  if {[isExpectedE
5f50: 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68  rror $error]} th
5f60: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
5f70: 20 20 73 68 6f 77 54 65 73 74 20 66 0d 0a 20 20    showTest f..  
5f80: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
5f90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61  ..            fa
5fa0: 69 6c 54 65 73 74 20 66 20 24 65 72 72 6f 72 0d  ilTest f $error.
5fb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
5fc0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
5fd0: 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44  ..      cleanupD
5fe0: 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64  b $dstFileName d
5ff0: 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c  b false true fal
6000: 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65  se..      doneTe
6010: 73 74 20 46 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d  st F..    }] 0].
6020: 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23  ################
6060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6070: 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20  ########..  #   
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6090: 20 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c             WORKL
60a0: 4f 41 44 20 23 37 20 28 47 29 20 20 20 20 20 20  OAD #7 (G)      
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 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 23 23 23 23 23  ################
6100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6110: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
6120: 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 37 29 20  set workload(7) 
6130: 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b  [list \..      [
6140: 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65  list srcFileName
6150: 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62   dstFileName tab
6160: 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32  le count1 count2
6170: 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20   count3] {..    
6180: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  #..    # NOTE: W
6190: 6f 72 6b 6c 6f 61 64 20 23 37 2c 20 22 73 6d 61  orkload #7, "sma
61a0: 6c 6c 22 20 55 50 44 41 54 45 20 73 74 61 74 65  ll" UPDATE state
61b0: 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20  ments...    #.. 
61c0: 20 20 20 77 61 69 74 54 65 73 74 20 47 0d 0a 20     waitTest G.. 
61d0: 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d     lappend ::tim
61e0: 65 73 28 37 29 20 5b 6c 69 6e 64 65 78 20 5b 74  es(7) [lindex [t
61f0: 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69  ime {..      ini
6200: 74 54 65 73 74 20 47 0d 0a 20 20 20 20 20 20 73  tTest G..      s
6210: 65 74 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65  etupWorkloadFile
6220: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 0d  Db $dstFileName.
6230: 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20  .      for {set 
6240: 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78  index 1} {$index
6250: 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e   <= $count1} {in
6260: 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
6270: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
6280: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  {..          sql
6290: 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70   execute $db [ap
62a0: 70 65 6e 64 41 72 67 73 20 22 55 50 44 41 54 45  pendArgs "UPDATE
62b0: 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20   " $table \..   
62c0: 20 20 20 20 20 20 20 20 20 20 20 22 20 53 45 54             " SET
62d0: 20 79 20 3d 20 27 22 20 5b 62 61 73 65 36 34 20   y = '" [base64 
62e0: 65 6e 63 6f 64 65 20 2d 2d 20 5b 65 78 70 72 20  encode -- [expr 
62f0: 7b 72 61 6e 64 73 74 72 28 24 63 6f 75 6e 74 32  {randstr($count2
6300: 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  )}]] \..        
6310: 20 20 20 20 20 20 22 27 20 57 48 45 52 45 20 78        "' WHERE x
6320: 20 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74   LIKE '" [format
6330: 20 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20   %X $index] "%' 
6340: 41 4e 44 20 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b  AND z = 'small';
6350: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68  "]..          sh
6360: 6f 77 54 65 73 74 20 47 0d 0a 20 20 20 20 20 20  owTest G..      
6370: 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
6380: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
6390: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
63a0: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
63b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
63c0: 73 68 6f 77 54 65 73 74 20 67 0d 0a 20 20 20 20  showTest g..    
63d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
63f0: 54 65 73 74 20 67 20 24 65 72 72 6f 72 0d 0a 20  Test g $error.. 
6400: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
6410: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
6420: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
6430: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20  $dstFileName db 
6440: 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65  false true false
6450: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
6460: 20 47 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   G..    }] 0].. 
6470: 20 7d 5d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23  ################
64b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
64c0: 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20  ######..  #     
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41           WORKLOA
64f0: 44 20 23 38 20 28 48 29 20 20 20 20 20 20 20 20  D #8 (H)        
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 20 20 23 0d 0a 20 20 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 23 23 23 23 23 23 23  ################
6550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6560: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
6570: 74 20 77 6f 72 6b 6c 6f 61 64 28 38 29 20 5b 6c  t workload(8) [l
6580: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69  ist \..      [li
6590: 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64  st srcFileName d
65a0: 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65  stFileName table
65b0: 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63   count1 count2 c
65c0: 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d  ount3] {..    #.
65d0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
65e0: 6b 6c 6f 61 64 20 23 38 2c 20 22 62 69 67 22 20  kload #8, "big" 
65f0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
6600: 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77  s...    #..    w
6610: 61 69 74 54 65 73 74 20 48 0d 0a 20 20 20 20 6c  aitTest H..    l
6620: 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 38  append ::times(8
6630: 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20  ) [lindex [time 
6640: 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73  {..      initTes
6650: 74 20 48 0d 0a 20 20 20 20 20 20 73 65 74 75 70  t H..      setup
6660: 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20 24  WorkloadFileDb $
6670: 64 73 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  dstFileName..   
6680: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65     for {set inde
6690: 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20  x 1} {$index <= 
66a0: 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69  $count1} {incr i
66b0: 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ndex} {..       
66c0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
66d0: 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65           sql exe
66e0: 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64  cute $db [append
66f0: 41 72 67 73 20 22 55 50 44 41 54 45 20 22 20 24  Args "UPDATE " $
6700: 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  table \..       
6710: 20 20 20 20 20 20 20 22 20 53 45 54 20 79 20 3d         " SET y =
6720: 20 52 41 4e 44 4f 4d 42 4c 4f 42 28 22 20 24 63   RANDOMBLOB(" $c
6730: 6f 75 6e 74 33 20 22 29 20 57 48 45 52 45 20 78  ount3 ") WHERE x
6740: 20 4c 49 4b 45 20 27 22 20 5c 0d 0a 20 20 20 20   LIKE '" \..    
6750: 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61            [forma
6760: 74 20 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27  t %X $index] "%'
6770: 20 41 4e 44 20 7a 20 3d 20 27 62 69 67 27 3b 22   AND z = 'big';"
6780: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f  ]..          sho
6790: 77 54 65 73 74 20 48 0d 0a 20 20 20 20 20 20 20  wTest H..       
67a0: 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
67b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
67c0: 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72 6f  {[isExpectedErro
67d0: 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  r $error]} then 
67e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
67f0: 68 6f 77 54 65 73 74 20 68 0d 0a 20 20 20 20 20  howTest h..     
6800: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
6810: 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 54             failT
6820: 65 73 74 20 68 20 24 65 72 72 6f 72 0d 0a 20 20  est h $error..  
6830: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
6840: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
6850: 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24       cleanupDb $
6860: 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66  dstFileName db f
6870: 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d  alse true false.
6880: 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20  .      doneTest 
6890: 48 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20  H..    }] 0]..  
68a0: 7d 5d 0d 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23  ################
68e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
68f0: 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20  #####..  #      
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6910: 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44          WORKLOAD
6920: 20 23 39 20 28 49 29 20 20 20 20 20 20 20 20 20   #9 (I)         
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 20 20 23 0d 0a 20 20 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 23 23 23 23 23 23 23 23  ################
6980: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6990: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
69a0: 20 77 6f 72 6b 6c 6f 61 64 28 39 29 20 5b 6c 69   workload(9) [li
69b0: 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73  st \..      [lis
69c0: 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73  t srcFileName ds
69d0: 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20  tFileName table 
69e0: 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f  count1 count2 co
69f0: 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a  unt3] {..    #..
6a00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b      # NOTE: Work
6a10: 6c 6f 61 64 20 23 39 2c 20 22 73 6d 61 6c 6c 22  load #9, "small"
6a20: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
6a30: 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ts...    #..    
6a40: 77 61 69 74 54 65 73 74 20 49 0d 0a 20 20 20 20  waitTest I..    
6a50: 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28  lappend ::times(
6a60: 39 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65  9) [lindex [time
6a70: 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65   {..      initTe
6a80: 73 74 20 49 0d 0a 20 20 20 20 20 20 73 65 74 75  st I..      setu
6a90: 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62 20  pWorkloadFileDb 
6aa0: 24 64 73 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20  $dstFileName..  
6ab0: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64      for {set ind
6ac0: 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d  ex 1} {$index <=
6ad0: 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20   $count1} {incr 
6ae0: 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
6af0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
6b00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78            sql ex
6b10: 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e  ecute $db [appen
6b20: 64 41 72 67 73 20 22 44 45 4c 45 54 45 20 46 52  dArgs "DELETE FR
6b30: 4f 4d 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20  OM " $table \.. 
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
6b50: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 22 20 5b  HERE x LIKE '" [
6b60: 66 6f 72 6d 61 74 20 25 58 20 24 69 6e 64 65 78  format %X $index
6b70: 5d 20 22 25 27 20 41 4e 44 20 7a 20 3d 20 27 73  ] "%' AND z = 's
6b80: 6d 61 6c 6c 27 3b 22 5d 0d 0a 20 20 20 20 20 20  mall';"]..      
6b90: 20 20 20 20 73 68 6f 77 54 65 73 74 20 49 0d 0a      showTest I..
6ba0: 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
6bb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6bc0: 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63      if {[isExpec
6bd0: 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d  tedError $error]
6be0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6bf0: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 69        showTest i
6c00: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
6c10: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
6c20: 20 20 66 61 69 6c 54 65 73 74 20 69 20 24 65 72    failTest i $er
6c30: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ror..          }
6c40: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
6c50: 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61     }..      clea
6c60: 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61  nupDb $dstFileNa
6c70: 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72 75 65  me db false true
6c80: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f   false..      do
6c90: 6e 65 54 65 73 74 20 49 0d 0a 20 20 20 20 7d 5d  neTest I..    }]
6ca0: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23   0]..  }]....  #
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 23 23 23  ################
6ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6cf0: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
6d00: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
6d20: 4f 52 4b 4c 4f 41 44 20 23 31 30 20 28 4a 29 20  ORKLOAD #10 (J) 
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
6d50: 20 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 23  ################
6d80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6d90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
6da0: 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64  ..  set workload
6db0: 28 31 30 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  (10) [list \..  
6dc0: 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c      [list srcFil
6dd0: 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d  eName dstFileNam
6de0: 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63  e table count1 c
6df0: 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d  ount2 count3] {.
6e00: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
6e10: 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 30  TE: Workload #10
6e20: 2c 20 22 62 69 67 22 20 44 45 4c 45 54 45 20 73  , "big" DELETE s
6e30: 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20  tatements...    
6e40: 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74 20  #..    waitTest 
6e50: 4a 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a  J..    lappend :
6e60: 3a 74 69 6d 65 73 28 31 30 29 20 5b 6c 69 6e 64  :times(10) [lind
6e70: 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20  ex [time {..    
6e80: 20 20 69 6e 69 74 54 65 73 74 20 4a 0d 0a 20 20    initTest J..  
6e90: 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61      setupWorkloa
6ea0: 64 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c 65  dFileDb $dstFile
6eb0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f 72 20  Name..      for 
6ec0: 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24  {set index 1} {$
6ed0: 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31  index <= $count1
6ee0: 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
6ef0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
6f00: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
6f10: 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64    sql execute $d
6f20: 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 44  b [appendArgs "D
6f30: 45 4c 45 54 45 20 46 52 4f 4d 20 22 20 24 74 61  ELETE FROM " $ta
6f40: 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ble \..         
6f50: 20 20 20 20 20 22 20 57 48 45 52 45 20 78 20 4c       " WHERE x L
6f60: 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74 20 25  IKE '" [format %
6f70: 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20 41 4e  X $index] "%' AN
6f80: 44 20 7a 20 3d 20 27 62 69 67 27 3b 22 5d 0d 0a  D z = 'big';"]..
6f90: 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65            showTe
6fa0: 73 74 20 4a 0d 0a 20 20 20 20 20 20 20 20 7d 20  st J..        } 
6fb0: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
6fc0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69            if {[i
6fd0: 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20 24  sExpectedError $
6fe0: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77              show
7000: 54 65 73 74 20 6a 0d 0a 20 20 20 20 20 20 20 20  Test j..        
7010: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
7020: 20 20 20 20 20 20 20 20 66 61 69 6c 54 65 73 74          failTest
7030: 20 6a 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20   j $error..     
7040: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
7050: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
7060: 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64 73 74    cleanupDb $dst
7070: 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73  FileName db fals
7080: 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20  e true false..  
7090: 20 20 20 20 64 6f 6e 65 54 65 73 74 20 4a 0d 0a      doneTest J..
70a0: 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d      }] 0]..  }].
70b0: 0a 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
70f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7100: 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20  ##..  #         
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31       WORKLOAD #1
7130: 31 20 28 4b 29 20 20 20 20 20 20 20 20 20 20 20  1 (K)           
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 23 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23  ################
7190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
71a0: 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f  ####....  set wo
71b0: 72 6b 6c 6f 61 64 28 31 31 29 20 5b 6c 69 73 74  rkload(11) [list
71c0: 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20   \..      [list 
71d0: 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46  srcFileName dstF
71e0: 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f  ileName table co
71f0: 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e  unt1 count2 coun
7200: 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  t3] {..    #..  
7210: 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f    # NOTE: Worklo
7220: 61 64 20 23 31 31 2c 20 56 41 43 55 55 4d 20 73  ad #11, VACUUM s
7230: 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 23  tatement...    #
7240: 0d 0a 20 20 20 20 77 61 69 74 54 65 73 74 20 4b  ..    waitTest K
7250: 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a  ..    lappend ::
7260: 74 69 6d 65 73 28 31 31 29 20 5b 6c 69 6e 64 65  times(11) [linde
7270: 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20  x [time {..     
7280: 20 69 6e 69 74 54 65 73 74 20 4b 0d 0a 20 20 20   initTest K..   
7290: 20 20 20 73 65 74 75 70 57 6f 72 6b 6c 6f 61 64     setupWorkload
72a0: 46 69 6c 65 44 62 20 24 64 73 74 46 69 6c 65 4e  FileDb $dstFileN
72b0: 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b  ame..      for {
72c0: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
72d0: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
72e0: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
72f0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
7300: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
7310: 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
7320: 20 22 56 41 43 55 55 4d 3b 22 0d 0a 20 20 20 20   "VACUUM;"..    
7330: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 4b        showTest K
7340: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f  ..        } erro
7350: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
7360: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70        if {[isExp
7370: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
7380: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
7390: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
73a0: 20 6b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   k..          } 
73b0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
73c0: 20 20 20 20 66 61 69 6c 54 65 73 74 20 6b 20 24      failTest k $
73d0: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
73e0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
73f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c       }..      cl
7400: 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65  eanupDb $dstFile
7410: 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72  Name db false tr
7420: 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ue false..      
7430: 64 6f 6e 65 54 65 73 74 20 4b 0d 0a 20 20 20 20  doneTest K..    
7440: 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20  }] 0]..  }].... 
7450: 20 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 23  ################
7480: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
74a0: 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20    #             
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 57 4f 52 4b 4c 4f 41 44 20 23 31 32 20 28 4c   WORKLOAD #12 (L
74d0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
74f0: 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7540: 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f  ....  set worklo
7550: 61 64 28 31 32 29 20 5b 6c 69 73 74 20 5c 0d 0a  ad(12) [list \..
7560: 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46        [list srcF
7570: 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e  ileName dstFileN
7580: 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31  ame table count1
7590: 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20   count2 count3] 
75a0: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
75b0: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
75c0: 31 32 2c 20 62 61 63 6b 75 70 20 74 6f 20 69 6e  12, backup to in
75d0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
75e0: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 77 61  ...    #..    wa
75f0: 69 74 54 65 73 74 20 4c 0d 0a 20 20 20 20 6c 61  itTest L..    la
7600: 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 32  ppend ::times(12
7610: 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20  ) [lindex [time 
7620: 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54 65 73  {..      initTes
7630: 74 20 4c 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b  t L..      for {
7640: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
7650: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
7660: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
7670: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
7680: 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20  ring is integer 
7690: 2d 73 74 72 69 63 74 20 24 3a 3a 63 6f 6d 70 69  -strict $::compi
76a0: 6c 65 64 28 31 32 29 5d 7d 20 74 68 65 6e 20 7b  led(12)]} then {
76b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
76c0: 69 64 20 24 3a 3a 63 6f 6d 70 69 6c 65 64 28 31  id $::compiled(1
76d0: 32 29 3b 20 23 20 4e 4f 54 45 3a 20 41 6c 72 65  2); # NOTE: Alre
76e0: 61 64 79 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20  ady compiled... 
76f0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
7700: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
7710: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
7720: 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54   _Dynamic${id}.T
7730: 65 73 74 24 7b 69 64 7d 20 42 61 63 6b 75 70 41  est${id} BackupA
7740: 6e 64 47 65 74 44 61 74 61 0d 0a 20 20 20 20 20  ndGetData..     
7750: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
7760: 4c 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  L..          } e
7770: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
7780: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
7790: 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20  isExpectedError 
77a0: 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d  $error]} then {.
77b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
77c0: 68 6f 77 54 65 73 74 20 6c 0d 0a 20 20 20 20 20  howTest l..     
77d0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
77e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
77f0: 61 69 6c 54 65 73 74 20 6c 20 24 65 72 72 6f 72  ailTest l $error
7800: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
7810: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
7820: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7830: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69 64            set id
7840: 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
7850: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
7860: 63 74 69 76 65 20 4e 65 78 74 49 64 5d 0d 0a 20  ctive NextId].. 
7870: 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64           set cod
7880: 65 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72 70  e [compileCSharp
7890: 57 69 74 68 20 5b 73 75 62 73 74 20 7b 0d 0a 20  With [subst {.. 
78a0: 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
78b0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
78c0: 69 74 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ite;....        
78d0: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 5f 44      namespace _D
78e0: 79 6e 61 6d 69 63 24 7b 69 64 7d 0d 0a 20 20 20  ynamic${id}..   
78f0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
7900: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
7910: 20 73 74 61 74 69 63 20 63 6c 61 73 73 20 54 65   static class Te
7920: 73 74 24 7b 69 64 7d 0d 0a 20 20 20 20 20 20 20  st${id}..       
7930: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
7940: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
7950: 20 73 74 61 74 69 63 20 76 6f 69 64 20 42 61 63   static void Bac
7960: 6b 75 70 41 6e 64 47 65 74 44 61 74 61 28 29 0d  kupAndGetData().
7970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7980: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7990: 20 20 20 20 20 20 75 73 69 6e 67 20 28 53 51 4c        using (SQL
79a0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f  iteConnection so
79b0: 75 72 63 65 20 3d 20 6e 65 77 20 53 51 4c 69 74  urce = new SQLit
79c0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d 0a 20 20  eConnection(..  
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 20 20 22 46 75 6c 6c 55 72 69 3d 24 7b 64      "FullUri=${d
79f0: 73 74 46 69 6c 65 4e 61 6d 65 7d 3b 5b 67 65 74  stFileName};[get
7a00: 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b 7d  FlagsProperty {}
7a10: 20 74 72 75 65 5d 22 29 29 0d 0a 20 20 20 20 20   true]"))..     
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a40: 20 20 20 20 73 6f 75 72 63 65 2e 4f 70 65 6e 28      source.Open(
7a50: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
7a60: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
7a70: 28 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  (SQLiteConnectio
7a80: 6e 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 3d 20  n destination = 
7a90: 6e 65 77 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  new SQLiteConnec
7aa0: 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20  tion(..         
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
7ac0: 46 75 6c 6c 55 72 69 3d 24 7b 73 72 63 46 69 6c  FullUri=${srcFil
7ad0: 65 4e 61 6d 65 7d 3b 5b 67 65 74 46 6c 61 67 73  eName};[getFlags
7ae0: 50 72 6f 70 65 72 74 79 20 7b 7d 20 74 72 75 65  Property {} true
7af0: 5d 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ]"))..          
7b00: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 4f     destination.O
7b30: 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  pen();....      
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 73 6f 75 72 63 65 2e 42 61 63 6b 75 70 44 61 74  source.BackupDat
7b60: 61 62 61 73 65 28 0d 0a 20 20 20 20 20 20 20 20  abase(..        
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 20 22    destination, "
7b90: 6d 61 69 6e 22 2c 20 22 6d 61 69 6e 22 2c 20 2d  main", "main", -
7ba0: 31 2c 20 6e 75 6c 6c 2c 20 30 29 3b 0d 0a 20 20  1, null, 0);..  
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
7bd0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7be0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7c10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7c20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7c30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
7c40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7c50: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
7c60: 76 6f 69 64 20 4d 61 69 6e 28 29 0d 0a 20 20 20  void Main()..   
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e    // do nothing.
7ca0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7cb0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
7cc0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
7cd0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
7ce0: 5d 20 74 72 75 65 20 74 72 75 65 20 74 72 75 65  ] true true true
7cf0: 20 72 65 73 75 6c 74 73 20 65 72 72 6f 72 73 20   results errors 
7d00: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
7d10: 74 65 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 20  te.dll]..       
7d20: 20 20 20 69 66 20 7b 24 63 6f 64 65 20 65 71 20     if {$code eq 
7d30: 22 4f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  "Ok"} then {..  
7d40: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
7d50: 63 6f 6d 70 69 6c 65 64 28 31 32 29 20 24 69 64  compiled(12) $id
7d60: 3b 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 70 69 6c  ; # NOTE: Compil
7d70: 65 64 20 4f 4b 2e 0d 0a 20 20 20 20 20 20 20 20  ed OK...        
7d80: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
7d90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7da0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5f 44  object invoke _D
7db0: 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54 65 73 74  ynamic${id}.Test
7dc0: 24 7b 69 64 7d 20 42 61 63 6b 75 70 41 6e 64 47  ${id} BackupAndG
7dd0: 65 74 44 61 74 61 0d 0a 20 20 20 20 20 20 20 20  etData..        
7de0: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 4c        showTest L
7df0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
7e00: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
7e20: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
7e30: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
7e40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7e50: 20 20 20 20 73 68 6f 77 54 65 73 74 20 6c 0d 0a      showTest l..
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
7e70: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
7e80: 20 20 20 20 20 20 20 20 66 61 69 6c 54 65 73 74          failTest
7e90: 20 6c 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20   l $error..     
7ea0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
7eb0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7ec0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
7ed0: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
7ee0: 20 24 65 72 72 6f 72 73 0d 0a 20 20 20 20 20 20   $errors..      
7ef0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
7f00: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
7f10: 20 64 6f 6e 65 54 65 73 74 20 4c 0d 0a 20 20 20   doneTest L..   
7f20: 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a   }] 0]..  }]....
7f30: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
7f40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7f50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7f60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7f70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
7f80: 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20  .  #            
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 33 20 28    WORKLOAD #13 (
7fb0: 4d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M)              
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
7fd0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
7fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8020: 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c  #....  set workl
8030: 6f 61 64 28 31 33 29 20 5b 6c 69 73 74 20 5c 0d  oad(13) [list \.
8040: 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63  .      [list src
8050: 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65  FileName dstFile
8060: 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74  Name table count
8070: 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d  1 count2 count3]
8080: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
8090: 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20   NOTE: Workload 
80a0: 23 31 33 2c 20 62 61 63 6b 75 70 20 66 72 6f 6d  #13, backup from
80b0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
80c0: 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 23 0d 0a  tabase...    #..
80d0: 20 20 20 20 77 61 69 74 54 65 73 74 20 4d 0d 0a      waitTest M..
80e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69      lappend ::ti
80f0: 6d 65 73 28 31 33 29 20 5b 6c 69 6e 64 65 78 20  mes(13) [lindex 
8100: 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 69  [time {..      i
8110: 6e 69 74 54 65 73 74 20 4d 0d 0a 20 20 20 20 20  nitTest M..     
8120: 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
8130: 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63  1} {$index <= $c
8140: 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64  ount1} {incr ind
8150: 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ex} {..        i
8160: 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e  f {[string is in
8170: 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 3a  teger -strict $:
8180: 3a 63 6f 6d 70 69 6c 65 64 28 31 33 29 5d 7d 20  :compiled(13)]} 
8190: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
81a0: 20 20 73 65 74 20 69 64 20 24 3a 3a 63 6f 6d 70    set id $::comp
81b0: 69 6c 65 64 28 31 33 29 3b 20 23 20 4e 4f 54 45  iled(13); # NOTE
81c0: 3a 20 41 6c 72 65 61 64 79 20 63 6f 6d 70 69 6c  : Already compil
81d0: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ed...          i
81e0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
81f0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
8200: 69 6e 76 6f 6b 65 20 5f 44 79 6e 61 6d 69 63 24  invoke _Dynamic$
8210: 7b 69 64 7d 2e 54 65 73 74 24 7b 69 64 7d 20 42  {id}.Test${id} B
8220: 61 63 6b 75 70 41 6e 64 47 65 74 44 61 74 61 0d  ackupAndGetData.
8230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f  .            sho
8240: 77 54 65 73 74 20 4d 0d 0a 20 20 20 20 20 20 20  wTest M..       
8250: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
8260: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
8270: 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64   if {[isExpected
8280: 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74  Error $error]} t
8290: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
82a0: 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 6d 0d       showTest m.
82b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
82c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
82d0: 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 6d 20       failTest m 
82e0: 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20  $error..        
82f0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
8300: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
8310: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
8320: 73 65 74 20 69 64 20 5b 6f 62 6a 65 63 74 20 69  set id [object i
8330: 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
8340: 72 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78 74  r.GetActive Next
8350: 49 64 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  Id]..          s
8360: 65 74 20 63 6f 64 65 20 5b 63 6f 6d 70 69 6c 65  et code [compile
8370: 43 53 68 61 72 70 57 69 74 68 20 5b 73 75 62 73  CSharpWith [subs
8380: 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t {..           
8390: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61   using System.Da
83a0: 74 61 2e 53 51 4c 69 74 65 3b 0d 0a 0d 0a 20 20  ta.SQLite;....  
83b0: 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 73 70            namesp
83c0: 61 63 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64  ace _Dynamic${id
83d0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  }..            {
83e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
83f0: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 63 6c  public static cl
8400: 61 73 73 20 54 65 73 74 24 7b 69 64 7d 0d 0a 20  ass Test${id}.. 
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 76 6f  public static vo
8440: 69 64 20 42 61 63 6b 75 70 41 6e 64 47 65 74 44  id BackupAndGetD
8450: 61 74 61 28 29 0d 0a 20 20 20 20 20 20 20 20 20  ata()..         
8460: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
8470: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
8480: 67 20 28 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  g (SQLiteConnect
8490: 69 6f 6e 20 73 6f 75 72 63 65 20 3d 20 6e 65 77  ion source = new
84a0: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
84b0: 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n(..            
84c0: 20 20 20 20 20 20 20 20 20 20 22 46 75 6c 6c 55            "FullU
84d0: 72 69 3d 24 7b 73 72 63 46 69 6c 65 4e 61 6d 65  ri=${srcFileName
84e0: 7d 3b 5b 67 65 74 46 6c 61 67 73 50 72 6f 70 65  };[getFlagsPrope
84f0: 72 74 79 20 7b 7d 20 74 72 75 65 5d 22 29 29 0d  rty {} true]")).
8500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8510: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
8520: 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65            source
8530: 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20  .Open();....    
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 75 73 69 6e 67 20 28 53 51 4c 69 74 65 43 6f 6e  using (SQLiteCon
8560: 6e 65 63 74 69 6f 6e 20 64 65 73 74 69 6e 61 74  nection destinat
8570: 69 6f 6e 20 3d 20 6e 65 77 20 53 51 4c 69 74 65  ion = new SQLite
8580: 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d 0a 20 20 20  Connection(..   
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 20 20 20 20 20 22 46 75 6c 6c 55 72 69 3d 24 7b       "FullUri=${
85b0: 64 73 74 46 69 6c 65 4e 61 6d 65 7d 3b 5b 67 65  dstFileName};[ge
85c0: 74 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b  tFlagsProperty {
85d0: 7d 20 74 72 75 65 5d 22 29 29 0d 0a 20 20 20 20  } true]"))..    
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
8600: 20 20 20 20 20 20 20 20 20 64 65 73 74 69 6e 61           destina
8610: 74 69 6f 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a  tion.Open();....
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8630: 20 20 20 20 20 20 73 6f 75 72 63 65 2e 42 61 63        source.Bac
8640: 6b 75 70 44 61 74 61 62 61 73 65 28 0d 0a 20 20  kupDatabase(..  
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 20 20 20 20 20 20 64 65 73 74 69 6e 61 74          destinat
8670: 69 6f 6e 2c 20 22 6d 61 69 6e 22 2c 20 22 6d 61  ion, "main", "ma
8680: 69 6e 22 2c 20 2d 31 2c 20 6e 75 6c 6c 2c 20 30  in", -1, null, 0
8690: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
86a0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
86e0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
86f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8710: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8720: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
8730: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
8740: 74 61 74 69 63 20 76 6f 69 64 20 4d 61 69 6e 28  tatic void Main(
8750: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
8760: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
8770: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
8780: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
8790: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
87a0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
87b0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
87c0: 20 20 20 20 20 7d 5d 20 74 72 75 65 20 74 72 75       }] true tru
87d0: 65 20 74 72 75 65 20 72 65 73 75 6c 74 73 20 65  e true results e
87e0: 72 72 6f 72 73 20 53 79 73 74 65 6d 2e 44 61 74  rrors System.Dat
87f0: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 20  a.SQLite.dll].. 
8800: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 63 6f           if {$co
8810: 64 65 20 65 71 20 22 4f 6b 22 7d 20 74 68 65 6e  de eq "Ok"} then
8820: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8830: 73 65 74 20 3a 3a 63 6f 6d 70 69 6c 65 64 28 31  set ::compiled(1
8840: 33 29 20 24 69 64 3b 20 23 20 4e 4f 54 45 3a 20  3) $id; # NOTE: 
8850: 43 6f 6d 70 69 6c 65 64 20 4f 4b 2e 0d 0a 20 20  Compiled OK...  
8860: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
8870: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
8880: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
8890: 6f 6b 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69 64  oke _Dynamic${id
88a0: 7d 2e 54 65 73 74 24 7b 69 64 7d 20 42 61 63 6b  }.Test${id} Back
88b0: 75 70 41 6e 64 47 65 74 44 61 74 61 0d 0a 20 20  upAndGetData..  
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77              show
88d0: 54 65 73 74 20 4d 0d 0a 20 20 20 20 20 20 20 20  Test M..        
88e0: 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
88f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
8900: 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63      if {[isExpec
8910: 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d  tedError $error]
8920: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8930: 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65            showTe
8940: 73 74 20 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  st m..          
8950: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
8970: 69 6c 54 65 73 74 20 6d 20 24 65 72 72 6f 72 0d  ilTest m $error.
8980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8990: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
89a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
89b0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
89c0: 20 65 72 72 6f 72 20 24 65 72 72 6f 72 73 0d 0a   error $errors..
89d0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
89e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
89f0: 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20  .      doneTest 
8a00: 4d 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20  M..    }] 0]..  
8a10: 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23  }]....  ########
8a20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8a30: 23 23 23 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 0d 0a 20 20 23 20 20 20 20 20 20  #####..  #      
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44          WORKLOAD
8a90: 20 23 31 34 20 28 4e 29 20 20 20 20 20 20 20 20   #14 (N)        
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ab0: 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23       #..  ######
8ac0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8ad0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8ae0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8af0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8b00: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
8b10: 20 77 6f 72 6b 6c 6f 61 64 28 31 34 29 20 5b 6c   workload(14) [l
8b20: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69  ist \..      [li
8b30: 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64  st srcFileName d
8b40: 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65  stFileName table
8b50: 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63   count1 count2 c
8b60: 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d  ount3] {..    #.
8b70: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
8b80: 6b 6c 6f 61 64 20 23 31 34 2c 20 50 52 41 47 4d  kload #14, PRAGM
8b90: 41 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  A integrity chec
8ba0: 6b 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20  k statement...  
8bb0: 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73    #..    waitTes
8bc0: 74 20 4e 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  t N..    lappend
8bd0: 20 3a 3a 74 69 6d 65 73 28 31 34 29 20 5b 6c 69   ::times(14) [li
8be0: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
8bf0: 20 20 20 20 69 6e 69 74 54 65 73 74 20 4e 0d 0a      initTest N..
8c00: 20 20 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c        setupWorkl
8c10: 6f 61 64 46 69 6c 65 44 62 20 24 64 73 74 46 69  oadFileDb $dstFi
8c20: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f  leName..      fo
8c30: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
8c40: 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e  {$index <= $coun
8c50: 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  t1} {incr index}
8c60: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
8c70: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
8c80: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
8c90: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
8ca0: 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20  cute scalar $db 
8cb0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
8cc0: 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   "PRAGMA integri
8cd0: 74 79 5f 63 68 65 63 6b 3b 22 5d 0d 0a 20 20 20  ty_check;"]..   
8ce0: 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 75         if {$resu
8cf0: 6c 74 20 6e 65 20 22 6f 6b 22 7d 20 74 68 65 6e  lt ne "ok"} then
8d00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8d10: 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67  error [appendArg
8d20: 73 20 22 69 6e 74 65 67 72 69 74 79 20 63 68 65  s "integrity che
8d30: 63 6b 20 66 61 69 6c 65 64 3a 20 22 20 24 72 65  ck failed: " $re
8d40: 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 20 20 20  sult]..         
8d50: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68   }..          sh
8d60: 6f 77 54 65 73 74 20 4e 0d 0a 20 20 20 20 20 20  owTest N..      
8d70: 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
8d80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
8d90: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
8da0: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
8db0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8dc0: 73 68 6f 77 54 65 73 74 20 6e 0d 0a 20 20 20 20  showTest n..    
8dd0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
8df0: 54 65 73 74 20 6e 20 24 65 72 72 6f 72 0d 0a 20  Test n $error.. 
8e00: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
8e10: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
8e20: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
8e30: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20  $dstFileName db 
8e40: 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65  false true false
8e50: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
8e60: 20 4e 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   N..    }] 0].. 
8e70: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
8e80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8e90: 23 23 23 23 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 0d 0a 20 20 23 20 20 20 20 20  ######..  #     
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ee0: 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41           WORKLOA
8ef0: 44 20 23 31 35 20 28 4f 29 20 20 20 20 20 20 20  D #15 (O)       
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23        #..  #####
8f20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f60: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
8f70: 74 20 77 6f 72 6b 6c 6f 61 64 28 31 35 29 20 5b  t workload(15) [
8f80: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c  list \..      [l
8f90: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
8fa0: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
8fb0: 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20  e count1 count2 
8fc0: 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23  count3] {..    #
8fd0: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f  ..    # NOTE: Wo
8fe0: 72 6b 6c 6f 61 64 20 23 31 35 2c 20 66 6f 72 63  rkload #15, forc
8ff0: 65 20 6d 61 6e 61 67 65 64 20 67 61 72 62 61 67  e managed garbag
9000: 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 0d 0a 20 20  e collection..  
9010: 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73    #..    waitTes
9020: 74 20 4f 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  t O..    lappend
9030: 20 3a 3a 74 69 6d 65 73 28 31 35 29 20 5b 6c 69   ::times(15) [li
9040: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
9050: 20 20 20 20 69 6e 69 74 54 65 73 74 20 4f 0d 0a      initTest O..
9060: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
9070: 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
9080: 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63  <= $count1} {inc
9090: 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
90a0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
90b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 6c  ..          coll
90c0: 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65  ectGarbage $::te
90d0: 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
90e0: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 4f        showTest O
90f0: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f  ..        } erro
9100: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
9110: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70        if {[isExp
9120: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
9130: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
9140: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
9150: 20 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   o..          } 
9160: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
9170: 20 20 20 20 66 61 69 6c 54 65 73 74 20 6f 20 24      failTest o $
9180: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
9190: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
91a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 64 6f       }..      do
91b0: 6e 65 54 65 73 74 20 4f 0d 0a 20 20 20 20 7d 5d  neTest O..    }]
91c0: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23   0]..  }]....  #
91d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
91e0: 23 23 23 23 23 23 23 23 23 23 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 0d 0a 20 20  ############..  
9220: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
9240: 4f 52 4b 4c 4f 41 44 20 23 31 36 20 28 50 29 20  ORKLOAD #16 (P) 
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
9270: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
9280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
92a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
92b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
92c0: 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64  ..  set workload
92d0: 28 31 36 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  (16) [list \..  
92e0: 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c      [list srcFil
92f0: 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d  eName dstFileNam
9300: 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63  e table count1 c
9310: 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d  ount2 count3] {.
9320: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
9330: 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 36  TE: Workload #16
9340: 2c 20 61 6c 6c 6f 63 61 74 65 20 28 65 78 63 6c  , allocate (excl
9350: 75 64 65 29 20 73 6f 6d 65 20 6e 61 74 69 76 65  ude) some native
9360: 20 68 65 61 70 20 6d 65 6d 6f 72 79 0d 0a 20 20   heap memory..  
9370: 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73    #..    waitTes
9380: 74 20 50 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  t P..    lappend
9390: 20 3a 3a 74 69 6d 65 73 28 31 36 29 20 5b 6c 69   ::times(16) [li
93a0: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
93b0: 20 20 20 20 69 6e 69 74 54 65 73 74 20 50 0d 0a      initTest P..
93c0: 20 20 20 20 20 20 73 65 74 20 6d 61 78 53 69 7a        set maxSiz
93d0: 65 20 24 3a 3a 63 6f 75 6e 74 28 35 29 0d 0a 20  e $::count(5).. 
93e0: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
93f0: 6b 65 20 47 43 20 41 64 64 4d 65 6d 6f 72 79 50  ke GC AddMemoryP
9400: 72 65 73 73 75 72 65 20 24 6d 61 78 53 69 7a 65  ressure $maxSize
9410: 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20  ..      try {.. 
9420: 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20         for {set 
9430: 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78  index 1} {$index
9440: 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e   <= $count1} {in
9450: 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
9460: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
9470: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
9480: 20 73 65 74 20 73 69 7a 65 20 5b 65 78 70 72 20   set size [expr 
9490: 7b 69 6e 74 28 6d 69 6e 28 24 6d 61 78 53 69 7a  {int(min($maxSiz
94a0: 65 2c 20 61 62 73 28 24 63 6f 75 6e 74 33 20 2a  e, abs($count3 *
94b0: 20 24 69 6e 64 65 78 20 2a 20 35 2e 30 29 29 29   $index * 5.0)))
94c0: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  }]..            
94d0: 73 65 74 20 70 74 72 20 5b 61 6c 6c 6f 63 4d 65  set ptr [allocMe
94e0: 6d 20 24 73 69 7a 65 5d 3b 20 23 20 74 68 72 6f  m $size]; # thro
94f0: 77 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  w..            u
9500: 73 65 4d 65 6d 20 24 70 74 72 20 24 73 69 7a 65  seMem $ptr $size
9510: 3b 20 64 65 6c 61 79 54 65 73 74 20 24 63 6f 75  ; delayTest $cou
9520: 6e 74 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nt2..           
9530: 20 66 72 65 65 4d 65 6d 20 24 70 74 72 3b 20 75   freeMem $ptr; u
9540: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
9550: 20 70 74 72 0d 0a 20 20 20 20 20 20 20 20 20 20   ptr..          
9560: 20 20 73 68 6f 77 54 65 73 74 20 50 0d 0a 20 20    showTest P..  
9570: 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
9580: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9590: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70        if {[isExp
95a0: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
95b0: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
95c0: 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65            showTe
95d0: 73 74 20 70 0d 0a 20 20 20 20 20 20 20 20 20 20  st p..          
95e0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
95f0: 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65            failTe
9600: 73 74 20 70 20 24 65 72 72 6f 72 0d 0a 20 20 20  st p $error..   
9610: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9620: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
9630: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61   }..      } fina
9640: 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  lly {..        i
9650: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
9660: 70 74 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ptr]} then {..  
9670: 20 20 20 20 20 20 20 20 66 72 65 65 4d 65 6d 20          freeMem 
9680: 24 70 74 72 3b 20 75 6e 73 65 74 20 2d 6e 6f 63  $ptr; unset -noc
9690: 6f 6d 70 6c 61 69 6e 20 70 74 72 0d 0a 20 20 20  omplain ptr..   
96a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
96b0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43  object invoke GC
96c0: 20 52 65 6d 6f 76 65 4d 65 6d 6f 72 79 50 72 65   RemoveMemoryPre
96d0: 73 73 75 72 65 20 24 6d 61 78 53 69 7a 65 0d 0a  ssure $maxSize..
96e0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 64        }..      d
96f0: 6f 6e 65 54 65 73 74 20 50 0d 0a 20 20 20 20 7d  oneTest P..    }
9700: 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20  ] 0]..  }]....  
9710: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9720: 23 23 23 23 23 23 23 23 23 23 23 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 0d 0a 20  #############.. 
9760: 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20   #              
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 57 4f 52 4b 4c 4f 41 44 20 23 31 37 20 28 51 29  WORKLOAD #17 (Q)
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
97b0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
97c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
97d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
97e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
97f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
9800: 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61  ...  set workloa
9810: 64 28 31 37 29 20 5b 6c 69 73 74 20 5c 0d 0a 20  d(17) [list \.. 
9820: 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69       [list srcFi
9830: 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61  leName dstFileNa
9840: 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20  me table count1 
9850: 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b  count2 count3] {
9860: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
9870: 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31  OTE: Workload #1
9880: 37 2c 20 63 68 61 6e 67 65 20 74 68 65 20 64 61  7, change the da
9890: 74 61 62 61 73 65 20 6a 6f 75 72 6e 61 6c 20 6d  tabase journal m
98a0: 6f 64 65 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ode..    #..    
98b0: 77 61 69 74 54 65 73 74 20 51 0d 0a 20 20 20 20  waitTest Q..    
98c0: 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28  lappend ::times(
98d0: 31 37 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d  17) [lindex [tim
98e0: 65 20 7b 0d 0a 20 20 20 20 20 20 69 6e 69 74 54  e {..      initT
98f0: 65 73 74 20 51 0d 0a 20 20 20 20 20 20 73 65 74  est Q..      set
9900: 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62  upWorkloadFileDb
9910: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 0d 0a 20   $dstFileName.. 
9920: 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e       for {set in
9930: 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c  dex 1} {$index <
9940: 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72  = $count1} {incr
9950: 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20   index} {..     
9960: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
9970: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65  .          sql e
9980: 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65  xecute $db [appe
9990: 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41 20 6a  ndArgs "PRAGMA j
99a0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 5c 22  ournal_mode = \"
99b0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
99c0: 20 20 20 5b 65 78 70 72 20 7b 24 69 6e 64 65 78     [expr {$index
99d0: 20 25 20 32 20 3d 3d 20 30 20 3f 20 22 64 65 6c   % 2 == 0 ? "del
99e0: 65 74 65 22 20 3a 20 22 77 61 6c 22 7d 5d 20 5c  ete" : "wal"}] \
99f0: 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\;]..          
9a00: 73 68 6f 77 54 65 73 74 20 51 0d 0a 20 20 20 20  showTest Q..    
9a10: 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
9a20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9a30: 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45  if {[isExpectedE
9a40: 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68  rror $error]} th
9a50: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9a60: 20 20 73 68 6f 77 54 65 73 74 20 71 0d 0a 20 20    showTest q..  
9a70: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
9a80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61  ..            fa
9a90: 69 6c 54 65 73 74 20 71 20 24 65 72 72 6f 72 0d  ilTest q $error.
9aa0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
9ab0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
9ac0: 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44  ..      cleanupD
9ad0: 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64  b $dstFileName d
9ae0: 62 20 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c  b false true fal
9af0: 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65  se..      doneTe
9b00: 73 74 20 51 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d  st Q..    }] 0].
9b10: 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23  .  }]....  #####
9b20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9b30: 23 23 23 23 23 23 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 0d 0a 20 20 23 20 20 20  ########..  #   
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c             WORKL
9b90: 4f 41 44 20 23 31 38 20 28 52 29 20 20 20 20 20  OAD #18 (R)     
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23          #..  ###
9bc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9bd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9be0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9bf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9c00: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
9c10: 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 31 38 29  set workload(18)
9c20: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
9c30: 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d  [list srcFileNam
9c40: 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61  e dstFileName ta
9c50: 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74  ble count1 count
9c60: 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20  2 count3] {..   
9c70: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
9c80: 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2c 20 65 78  Workload #18, ex
9c90: 65 63 75 74 65 20 71 75 65 72 69 65 73 20 61 67  ecute queries ag
9ca0: 61 69 6e 73 74 20 74 68 65 20 69 6e 2d 6d 65 6d  ainst the in-mem
9cb0: 6f 72 79 20 64 61 74 61 62 61 73 65 0d 0a 20 20  ory database..  
9cc0: 20 20 23 0d 0a 20 20 20 20 77 61 69 74 54 65 73    #..    waitTes
9cd0: 74 20 52 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  t R..    lappend
9ce0: 20 3a 3a 74 69 6d 65 73 28 31 38 29 20 5b 6c 69   ::times(18) [li
9cf0: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
9d00: 20 20 20 20 69 6e 69 74 54 65 73 74 20 52 0d 0a      initTest R..
9d10: 20 20 20 20 20 20 73 65 74 75 70 57 6f 72 6b 6c        setupWorkl
9d20: 6f 61 64 4d 65 6d 44 62 20 24 73 72 63 46 69 6c  oadMemDb $srcFil
9d30: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 66 6f 72  eName..      for
9d40: 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b   {set index 1} {
9d50: 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74  $index <= $count
9d60: 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  1} {incr index} 
9d70: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
9d80: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
9d90: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
9da0: 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64  # NOTE: Workload
9db0: 20 23 31 38 2e 33 2c 20 22 73 6d 61 6c 6c 22 20   #18.3, "small" 
9dc0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9dd0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  s...          #.
9de0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 72  .          set r
9df0: 65 61 64 65 72 20 5b 73 71 6c 20 65 78 65 63 75  eader [sql execu
9e00: 74 65 20 2d 65 78 65 63 75 74 65 20 72 65 61 64  te -execute read
9e10: 65 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  er \..          
9e20: 20 20 20 20 2d 66 6f 72 6d 61 74 20 64 61 74 61      -format data
9e30: 52 65 61 64 65 72 20 2d 61 6c 69 61 73 20 24 64  Reader -alias $d
9e40: 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  b [appendArgs \.
9e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
9e60: 53 45 4c 45 43 54 20 78 2c 20 79 20 46 52 4f 4d  SELECT x, y FROM
9e70: 20 22 20 24 74 61 62 6c 65 20 22 20 57 48 45 52   " $table " WHER
9e80: 45 20 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b 22 5d  E z = 'small';"]
9e90: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ]..          whi
9ea0: 6c 65 20 7b 5b 24 72 65 61 64 65 72 20 52 65 61  le {[$reader Rea
9eb0: 64 5d 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  d]} {..         
9ec0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
9ed0: 20 20 23 20 4e 4f 54 45 3a 20 44 6f 20 6e 6f 74    # NOTE: Do not
9ee0: 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  hing...         
9ef0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
9f00: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73  }..          uns
9f10: 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72  et -nocomplain r
9f20: 65 61 64 65 72 0d 0a 20 20 20 20 20 20 20 20 20  eader..         
9f30: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
9f40: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
9f50: 31 38 2e 34 2c 20 22 62 69 67 22 20 53 45 4c 45  18.4, "big" SELE
9f60: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a  CT statements...
9f70: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
9f80: 20 20 20 20 20 20 20 73 65 74 20 72 65 61 64 65         set reade
9f90: 72 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d  r [sql execute -
9fa0: 65 78 65 63 75 74 65 20 72 65 61 64 65 72 20 5c  execute reader \
9fb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9fc0: 2d 66 6f 72 6d 61 74 20 64 61 74 61 52 65 61 64  -format dataRead
9fd0: 65 72 20 2d 61 6c 69 61 73 20 24 64 62 20 5b 61  er -alias $db [a
9fe0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
9ff0: 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
a000: 43 54 20 78 2c 20 79 20 46 52 4f 4d 20 22 20 24  CT x, y FROM " $
a010: 74 61 62 6c 65 20 22 20 57 48 45 52 45 20 7a 20  table " WHERE z 
a020: 3d 20 27 62 69 67 27 3b 22 5d 5d 0d 0a 20 20 20  = 'big';"]]..   
a030: 20 20 20 20 20 20 20 77 68 69 6c 65 20 7b 5b 24         while {[$
a040: 72 65 61 64 65 72 20 52 65 61 64 5d 7d 20 7b 0d  reader Read]} {.
a050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
a060: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
a070: 54 45 3a 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 0d  TE: Do nothing..
a080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
a090: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
a0a0: 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
a0b0: 63 6f 6d 70 6c 61 69 6e 20 72 65 61 64 65 72 0d  complain reader.
a0c0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
a0d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
a0e0: 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 35 2c 20  Workload #18.5, 
a0f0: 22 73 6d 61 6c 6c 22 20 49 4e 53 45 52 54 20 73  "small" INSERT s
a100: 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20  tatements...    
a110: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a120: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
a130: 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  db [appendArgs "
a140: 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 20 24 74  INSERT INTO " $t
a150: 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  able \..        
a160: 20 20 20 20 20 20 22 28 78 2c 20 79 2c 20 7a 29        "(x, y, z)
a170: 20 56 41 4c 55 45 53 28 27 22 20 5b 66 6f 72 6d   VALUES('" [form
a180: 61 74 20 25 6c 58 20 5b 65 78 70 72 20 7b 72 61  at %lX [expr {ra
a190: 6e 64 6f 6d 28 29 7d 5d 5d 20 5c 0d 0a 20 20 20  ndom()}]] \..   
a1a0: 20 20 20 20 20 20 20 20 20 20 20 22 27 2c 20 27             "', '
a1b0: 22 20 5b 62 61 73 65 36 34 20 65 6e 63 6f 64 65  " [base64 encode
a1c0: 20 2d 2d 20 5b 65 78 70 72 20 7b 72 61 6e 64 73   -- [expr {rands
a1d0: 74 72 28 24 63 6f 75 6e 74 32 29 7d 5d 5d 20 5c  tr($count2)}]] \
a1e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a1f0: 22 27 2c 20 27 73 6d 61 6c 6c 27 29 3b 22 5d 0d  "', 'small');"].
a200: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
a210: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
a220: 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 36 2c 20  Workload #18.6, 
a230: 22 62 69 67 22 20 49 4e 53 45 52 54 20 73 74 61  "big" INSERT sta
a240: 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20  tements...      
a250: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a260: 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
a270: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 49 4e   [appendArgs "IN
a280: 53 45 52 54 20 49 4e 54 4f 20 22 20 24 74 61 62  SERT INTO " $tab
a290: 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
a2a0: 20 20 20 20 22 28 78 2c 20 79 2c 20 7a 29 20 56      "(x, y, z) V
a2b0: 41 4c 55 45 53 28 27 22 20 5b 66 6f 72 6d 61 74  ALUES('" [format
a2c0: 20 25 6c 58 20 5b 65 78 70 72 20 7b 72 61 6e 64   %lX [expr {rand
a2d0: 6f 6d 28 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20  om()}]] \..     
a2e0: 20 20 20 20 20 20 20 20 20 22 27 2c 20 52 41 4e           "', RAN
a2f0: 44 4f 4d 42 4c 4f 42 28 22 20 24 63 6f 75 6e 74  DOMBLOB(" $count
a300: 33 20 22 29 2c 20 27 62 69 67 27 29 3b 22 5d 0d  3 "), 'big');"].
a310: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
a320: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
a330: 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 37 2c 20  Workload #18.7, 
a340: 22 73 6d 61 6c 6c 22 20 55 50 44 41 54 45 20 73  "small" UPDATE s
a350: 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20  tatements...    
a360: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a370: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
a380: 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  db [appendArgs "
a390: 55 50 44 41 54 45 20 22 20 24 74 61 62 6c 65 20  UPDATE " $table 
a3a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a3b0: 20 22 20 53 45 54 20 79 20 3d 20 27 22 20 5b 62   " SET y = '" [b
a3c0: 61 73 65 36 34 20 65 6e 63 6f 64 65 20 2d 2d 20  ase64 encode -- 
a3d0: 5b 65 78 70 72 20 7b 72 61 6e 64 73 74 72 28 24  [expr {randstr($
a3e0: 63 6f 75 6e 74 32 29 7d 5d 5d 20 5c 0d 0a 20 20  count2)}]] \..  
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 27 20 57              "' W
a400: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 22 20 5b  HERE x LIKE '" [
a410: 66 6f 72 6d 61 74 20 25 58 20 24 69 6e 64 65 78  format %X $index
a420: 5d 20 22 25 27 20 41 4e 44 20 7a 20 3d 20 27 73  ] "%' AND z = 's
a430: 6d 61 6c 6c 27 3b 22 5d 0d 0a 20 20 20 20 20 20  mall';"]..      
a440: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a450: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
a460: 64 20 23 31 38 2e 38 2c 20 22 62 69 67 22 20 55  d #18.8, "big" U
a470: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
a480: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
a490: 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78            sql ex
a4a0: 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e  ecute $db [appen
a4b0: 64 41 72 67 73 20 22 55 50 44 41 54 45 20 22 20  dArgs "UPDATE " 
a4c0: 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20  $table \..      
a4d0: 20 20 20 20 20 20 20 20 22 20 53 45 54 20 79 20          " SET y 
a4e0: 3d 20 52 41 4e 44 4f 4d 42 4c 4f 42 28 22 20 24  = RANDOMBLOB(" $
a4f0: 63 6f 75 6e 74 33 20 22 29 20 57 48 45 52 45 20  count3 ") WHERE 
a500: 78 20 4c 49 4b 45 20 27 22 20 5c 0d 0a 20 20 20  x LIKE '" \..   
a510: 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d             [form
a520: 61 74 20 25 58 20 24 69 6e 64 65 78 5d 20 22 25  at %X $index] "%
a530: 27 20 41 4e 44 20 7a 20 3d 20 27 62 69 67 27 3b  ' AND z = 'big';
a540: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  "]..          #.
a550: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
a560: 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e  E: Workload #18.
a570: 39 2c 20 22 73 6d 61 6c 6c 22 20 44 45 4c 45 54  9, "small" DELET
a580: 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20  E statements... 
a590: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a5a0: 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
a5b0: 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67  e $db [appendArg
a5c0: 73 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 22  s "DELETE FROM "
a5d0: 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20   $table \..     
a5e0: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
a5f0: 20 78 20 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d   x LIKE '" [form
a600: 61 74 20 25 58 20 24 69 6e 64 65 78 5d 20 22 25  at %X $index] "%
a610: 27 20 41 4e 44 20 7a 20 3d 20 27 73 6d 61 6c 6c  ' AND z = 'small
a620: 27 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ';"]..          
a630: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
a640: 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31  OTE: Workload #1
a650: 38 2e 31 30 2c 20 22 62 69 67 22 20 44 45 4c 45  8.10, "big" DELE
a660: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a  TE statements...
a670: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
a680: 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
a690: 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  te $db [appendAr
a6a0: 67 73 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  gs "DELETE FROM 
a6b0: 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20  " $table \..    
a6c0: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
a6d0: 45 20 78 20 4c 49 4b 45 20 27 22 20 5b 66 6f 72  E x LIKE '" [for
a6e0: 6d 61 74 20 25 58 20 24 69 6e 64 65 78 5d 20 22  mat %X $index] "
a6f0: 25 27 20 41 4e 44 20 7a 20 3d 20 27 62 69 67 27  %' AND z = 'big'
a700: 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ;"]..          #
a710: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
a720: 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38  TE: Workload #18
a730: 2e 31 31 2c 20 56 41 43 55 55 4d 20 73 74 61 74  .11, VACUUM stat
a740: 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20  ement...        
a750: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
a760: 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 22  ql execute $db "
a770: 56 41 43 55 55 4d 3b 22 0d 0a 20 20 20 20 20 20  VACUUM;"..      
a780: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a790: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
a7a0: 64 20 23 31 38 2e 31 34 2c 20 50 52 41 47 4d 41  d #18.14, PRAGMA
a7b0: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
a7c0: 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20   statement...   
a7d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a7e0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
a7f0: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
a800: 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20  cute scalar $db 
a810: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a820: 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   "PRAGMA integri
a830: 74 79 5f 63 68 65 63 6b 3b 22 5d 0d 0a 20 20 20  ty_check;"]..   
a840: 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 75         if {$resu
a850: 6c 74 20 6e 65 20 22 6f 6b 22 7d 20 74 68 65 6e  lt ne "ok"} then
a860: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
a870: 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67  error [appendArg
a880: 73 20 22 69 6e 74 65 67 72 69 74 79 20 63 68 65  s "integrity che
a890: 63 6b 20 66 61 69 6c 65 64 3a 20 22 20 24 72 65  ck failed: " $re
a8a0: 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 20 20 20  sult]..         
a8b0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68   }..          sh
a8c0: 6f 77 54 65 73 74 20 52 0d 0a 20 20 20 20 20 20  owTest R..      
a8d0: 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
a8e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
a8f0: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
a900: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
a910: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
a920: 73 68 6f 77 54 65 73 74 20 72 0d 0a 20 20 20 20  showTest r..    
a930: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
a940: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
a950: 54 65 73 74 20 72 20 24 65 72 72 6f 72 0d 0a 20  Test r $error.. 
a960: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a970: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
a980: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
a990: 24 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 62 20  $srcFileName db 
a9a0: 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65  false true false
a9b0: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
a9c0: 20 52 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   R..    }] 0].. 
a9d0: 20 7d 5d 0d 0a 7d 20 2d 62 6f 64 79 20 7b 0d 0a   }]..} -body {..
a9e0: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
a9f0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
aa00: 73 20 5c 0d 0a 20 20 20 20 20 20 22 3d 3d 3d 3d  s \..      "====
aa10: 20 57 41 52 4e 49 4e 47 3a 20 74 68 69 73 20 73   WARNING: this s
aa20: 74 72 65 73 73 20 74 65 73 74 20 6d 61 79 20 74  tress test may t
aa30: 61 6b 65 20 73 65 76 65 72 61 6c 20 6d 69 6e 75  ake several minu
aa40: 74 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 0d 0a 20 20  tes...\n"]....  
aa50: 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 28 30  for {set index(0
aa60: 29 20 31 7d 20 7b 24 69 6e 64 65 78 28 30 29 20  ) 1} {$index(0) 
aa70: 3c 3d 20 24 63 6f 75 6e 74 28 30 29 7d 20 7b 69  <= $count(0)} {i
aa80: 6e 63 72 20 69 6e 64 65 78 28 30 29 7d 20 7b 0d  ncr index(0)} {.
aa90: 0a 20 20 20 20 69 66 20 7b 24 69 6e 64 65 78 28  .    if {$index(
aaa0: 30 29 20 3e 20 31 7d 20 74 68 65 6e 20 7b 0d 0a  0) > 1} then {..
aab0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
aac0: 20 4e 4f 54 45 3a 20 41 64 76 61 6e 63 65 20 6f   NOTE: Advance o
aad0: 75 74 70 75 74 20 74 6f 20 74 68 65 20 6e 65 78  utput to the nex
aae0: 74 20 6c 69 6e 65 20 64 75 65 20 74 6f 20 74 68  t line due to th
aaf0: 65 20 77 6f 72 6b 6c 6f 61 64 0d 0a 20 20 20 20  e workload..    
ab00: 20 20 23 20 20 20 20 20 20 20 69 74 65 72 61 74    #       iterat
ab10: 69 6f 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 64  ion progress ind
ab20: 69 63 61 74 6f 72 73 20 66 72 6f 6d 20 74 68 65  icators from the
ab30: 20 70 72 65 76 69 6f 75 73 20 72 75 6e 2e 0d 0a   previous run...
ab40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74        #..      t
ab50: 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e  puts $test_chann
ab60: 65 6c 20 5c 6e 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  el \n..    }....
ab70: 20 20 20 20 74 70 75 74 73 20 24 74 65 73 74 5f      tputs $test_
ab80: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
ab90: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 22  rgs \..        "
aba0: 2d 2d 2d 2d 20 73 74 61 72 74 69 6e 67 20 77 6f  ---- starting wo
abb0: 72 6b 6c 6f 61 64 20 72 75 6e 20 23 22 20 24 69  rkload run #" $i
abc0: 6e 64 65 78 28 30 29 20 2e 2e 2e 5c 6e 5d 0d 0a  ndex(0) ...\n]..
abd0: 0d 0a 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63  ..    unset -noc
abe0: 6f 6d 70 6c 61 69 6e 20 74 68 72 65 61 64 20 73  omplain thread s
abf0: 74 61 74 75 73 3b 20 64 6f 6e 65 54 65 73 74 0d  tatus; doneTest.
ac00: 0a 0d 0a 20 20 20 20 73 71 6c 20 65 78 65 63 75  ...    sql execu
ac10: 74 65 20 24 73 72 63 44 62 20 22 43 52 45 41 54  te $srcDb "CREAT
ac20: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
ac30: 58 49 53 54 53 20 74 31 28 78 20 50 52 49 4d 41  XISTS t1(x PRIMA
ac40: 52 59 20 4b 45 59 2c 20 79 2c 20 7a 29 3b 22 0d  RY KEY, y, z);".
ac50: 0a 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65  .    sql execute
ac60: 20 24 64 62 20 22 43 52 45 41 54 45 20 54 41 42   $db "CREATE TAB
ac70: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
ac80: 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45   t1(x PRIMARY KE
ac90: 59 2c 20 79 2c 20 7a 29 3b 22 0d 0a 0d 0a 20 20  Y, y, z);"....  
aca0: 20 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78 28    foreach index(
acb0: 31 29 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67  1) [lsort -integ
acc0: 65 72 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20  er [array names 
acd0: 77 6f 72 6b 6c 6f 61 64 5d 5d 20 7b 0d 0a 20 20  workload]] {..  
ace0: 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68      if {[lsearch
acf0: 20 2d 65 78 61 63 74 20 24 6e 6f 57 6f 72 6b 6c   -exact $noWorkl
ad00: 6f 61 64 20 24 69 6e 64 65 78 28 31 29 5d 20 3d  oad $index(1)] =
ad10: 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  = -1} then {..  
ad20: 20 20 20 20 20 20 73 65 74 20 74 68 72 65 61 64        set thread
ad30: 28 24 69 6e 64 65 78 28 31 29 29 20 5b 6f 62 6a  ($index(1)) [obj
ad40: 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61  ect create -alia
ad50: 73 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69  s System.Threadi
ad60: 6e 67 2e 54 68 72 65 61 64 20 5c 0d 0a 20 20 20  ng.Thread \..   
ad70: 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 61           [list a
ad80: 70 70 6c 79 20 24 77 6f 72 6b 6c 6f 61 64 28 24  pply $workload($
ad90: 69 6e 64 65 78 28 31 29 29 20 24 66 69 6c 65 4e  index(1)) $fileN
ada0: 61 6d 65 28 31 29 20 24 66 69 6c 65 4e 61 6d 65  ame(1) $fileName
adb0: 28 32 29 20 74 31 20 5c 0d 0a 20 20 20 20 20 20  (2) t1 \..      
adc0: 20 20 20 20 20 20 24 63 6f 75 6e 74 28 31 29 20        $count(1) 
add0: 24 63 6f 75 6e 74 28 33 29 20 24 63 6f 75 6e 74  $count(3) $count
ade0: 28 34 29 5d 20 31 30 34 38 35 37 36 5d 0d 0a 0d  (4)] 1048576]...
adf0: 0a 20 20 20 20 20 20 20 20 24 74 68 72 65 61 64  .        $thread
ae00: 28 24 69 6e 64 65 78 28 31 29 29 20 4e 61 6d 65  ($index(1)) Name
ae10: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
ae30: 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65  e rootname [file
ae40: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 28   tail $fileName(
ae50: 32 29 5d 5d 20 22 20 23 22 20 24 69 6e 64 65 78  2)]] " #" $index
ae60: 28 31 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  (1)]....        
ae70: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
ae80: 20 70 72 69 6f 72 69 74 79 28 24 69 6e 64 65 78   priority($index
ae90: 28 31 29 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  (1))]} then {.. 
aea0: 20 20 20 20 20 20 20 20 20 24 74 68 72 65 61 64           $thread
aeb0: 28 24 69 6e 64 65 78 28 31 29 29 20 50 72 69 6f  ($index(1)) Prio
aec0: 72 69 74 79 20 24 70 72 69 6f 72 69 74 79 28 24  rity $priority($
aed0: 69 6e 64 65 78 28 31 29 29 0d 0a 20 20 20 20 20  index(1))..     
aee0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
aef0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 66 6f 72 65     }....    fore
af00: 61 63 68 20 69 6e 64 65 78 28 31 29 20 5b 61 72  ach index(1) [ar
af10: 72 61 79 20 6e 61 6d 65 73 20 74 68 72 65 61 64  ray names thread
af20: 5d 20 7b 0d 0a 20 20 20 20 20 20 24 74 68 72 65  ] {..      $thre
af30: 61 64 28 24 69 6e 64 65 78 28 31 29 29 20 53 74  ad($index(1)) St
af40: 61 72 74 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  art..    }....  
af50: 20 20 24 65 76 65 6e 74 20 53 65 74 3b 20 23 20    $event Set; # 
af60: 47 4f 0d 0a 0d 0a 20 20 20 20 66 6f 72 65 61 63  GO....    foreac
af70: 68 20 69 6e 64 65 78 28 31 29 20 5b 61 72 72 61  h index(1) [arra
af80: 79 20 6e 61 6d 65 73 20 74 68 72 65 61 64 5d 20  y names thread] 
af90: 7b 0d 0a 20 20 20 20 20 20 24 74 68 72 65 61 64  {..      $thread
afa0: 28 24 69 6e 64 65 78 28 31 29 29 20 4a 6f 69 6e  ($index(1)) Join
afb0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 66  ..    }....    f
afc0: 6f 72 65 61 63 68 20 69 6e 64 65 78 28 31 29 20  oreach index(1) 
afd0: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 74 68 72  [array names thr
afe0: 65 61 64 5d 20 7b 0d 0a 20 20 20 20 20 20 69 66  ead] {..      if
aff0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 74   {[info exists t
b000: 68 72 65 61 64 28 24 69 6e 64 65 78 28 31 29 29  hread($index(1))
b010: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
b020: 20 20 5b 63 6c 65 61 6e 75 70 54 68 72 65 61 64    [cleanupThread
b030: 20 24 74 68 72 65 61 64 28 24 69 6e 64 65 78 28   $thread($index(
b040: 31 29 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  1))]} then {..  
b050: 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
b060: 6f 6d 70 6c 61 69 6e 20 74 68 72 65 61 64 28 24  omplain thread($
b070: 69 6e 64 65 78 28 31 29 29 0d 0a 20 20 20 20 20  index(1))..     
b080: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
b090: 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
b0a0: 69 6e 20 74 68 72 65 61 64 20 73 74 61 74 75 73  in thread status
b0b0: 3b 20 64 6f 6e 65 54 65 73 74 0d 0a 20 20 7d 0d  ; doneTest..  }.
b0c0: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
b0d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b0e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b0f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b110: 23 23 0d 0a 0d 0a 20 20 66 6f 72 65 61 63 68 20  ##....  foreach 
b120: 69 6e 64 65 78 28 30 29 20 5b 73 70 6c 69 74 20  index(0) [split 
b130: 24 69 6e 64 69 63 61 74 6f 72 73 20 22 22 5d 20  $indicators ""] 
b140: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
b150: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 69  NOTE: See if thi
b160: 73 20 77 6f 72 6b 6c 6f 61 64 20 69 74 65 72 61  s workload itera
b170: 74 69 6f 6e 20 72 61 69 73 65 64 20 61 6e 20 65  tion raised an e
b180: 72 72 6f 72 2e 20 20 49 66 20 73 6f 2c 20 74 68  rror.  If so, th
b190: 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 69  e..    #       i
b1a0: 6e 64 69 63 61 74 6f 72 20 6c 65 74 74 65 72 20  ndicator letter 
b1b0: 77 69 6c 6c 20 62 65 20 69 6e 20 6c 6f 77 65 72  will be in lower
b1c0: 20 63 61 73 65 3b 20 6f 74 68 65 72 77 69 73 65   case; otherwise
b1d0: 2c 20 69 74 20 77 69 6c 6c 0d 0a 20 20 20 20 23  , it will..    #
b1e0: 20 20 20 20 20 20 20 62 65 20 69 6e 20 75 70 70         be in upp
b1f0: 65 72 20 63 61 73 65 2e 0d 0a 20 20 20 20 23 0d  er case...    #.
b200: 0a 20 20 20 20 73 65 74 20 69 6e 64 65 78 28 31  .    set index(1
b210: 29 20 5b 73 74 72 69 6e 67 20 69 73 20 75 70 70  ) [string is upp
b220: 65 72 20 2d 73 74 72 69 63 74 20 24 69 6e 64 65  er -strict $inde
b230: 78 28 30 29 5d 0d 0a 0d 0a 20 20 20 20 73 65 74  x(0)]....    set
b240: 20 69 6e 64 65 78 28 32 29 20 5b 65 78 70 72 20   index(2) [expr 
b250: 7b 5b 73 74 72 69 6e 67 20 6f 72 64 69 6e 61 6c  {[string ordinal
b260: 20 24 69 6e 64 65 78 28 30 29 20 30 5d 20 2d 20   $index(0) 0] - 
b270: 5c 0d 0a 20 20 20 20 20 20 20 20 5b 73 74 72 69  \..        [stri
b280: 6e 67 20 6f 72 64 69 6e 61 6c 20 5b 65 78 70 72  ng ordinal [expr
b290: 20 7b 24 69 6e 64 65 78 28 31 29 20 3f 20 22 41   {$index(1) ? "A
b2a0: 22 20 3a 20 22 61 22 7d 5d 20 30 5d 20 2b 20 31  " : "a"}] 0] + 1
b2b0: 7d 5d 0d 0a 0d 0a 20 20 20 20 73 65 74 20 69 6e  }]....    set in
b2c0: 64 65 78 28 33 29 20 5b 65 78 70 72 20 7b 24 69  dex(3) [expr {$i
b2d0: 6e 64 65 78 28 31 29 20 3f 20 22 6f 6b 22 20 3a  ndex(1) ? "ok" :
b2e0: 20 22 65 72 72 6f 72 22 7d 5d 0d 0a 0d 0a 20 20   "error"}]....  
b2f0: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
b300: 73 74 73 20 69 74 65 72 61 74 69 6f 6e 73 28 24  sts iterations($
b310: 69 6e 64 65 78 28 32 29 2c 24 69 6e 64 65 78 28  index(2),$index(
b320: 33 29 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  3))]} then {..  
b330: 20 20 20 20 73 65 74 20 69 74 65 72 61 74 69 6f      set iteratio
b340: 6e 73 28 24 69 6e 64 65 78 28 32 29 2c 24 69 6e  ns($index(2),$in
b350: 64 65 78 28 33 29 29 20 30 0d 0a 20 20 20 20 7d  dex(3)) 0..    }
b360: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e  ....    if {![in
b370: 66 6f 20 65 78 69 73 74 73 20 69 74 65 72 61 74  fo exists iterat
b380: 69 6f 6e 73 28 24 69 6e 64 65 78 28 32 29 2c 74  ions($index(2),t
b390: 6f 74 61 6c 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  otal)]} then {..
b3a0: 20 20 20 20 20 20 73 65 74 20 69 74 65 72 61 74        set iterat
b3b0: 69 6f 6e 73 28 24 69 6e 64 65 78 28 32 29 2c 74  ions($index(2),t
b3c0: 6f 74 61 6c 29 20 30 0d 0a 20 20 20 20 7d 0d 0a  otal) 0..    }..
b3d0: 0d 0a 20 20 20 20 69 6e 63 72 20 69 74 65 72 61  ..    incr itera
b3e0: 74 69 6f 6e 73 28 24 69 6e 64 65 78 28 32 29 2c  tions($index(2),
b3f0: 24 69 6e 64 65 78 28 33 29 29 0d 0a 20 20 20 20  $index(3))..    
b400: 69 6e 63 72 20 69 74 65 72 61 74 69 6f 6e 73 28  incr iterations(
b410: 24 69 6e 64 65 78 28 32 29 2c 74 6f 74 61 6c 29  $index(2),total)
b420: 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23  ..  }....  #####
b430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b470: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d  ########....  #.
b480: 0a 20 20 23 20 4e 4f 54 45 3a 20 41 64 76 61 6e  .  # NOTE: Advan
b490: 63 65 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  ce output to the
b4a0: 20 6e 65 78 74 20 6c 69 6e 65 20 64 75 65 20 74   next line due t
b4b0: 6f 20 74 68 65 20 77 6f 72 6b 6c 6f 61 64 0d 0a  o the workload..
b4c0: 20 20 23 20 20 20 20 20 20 20 69 74 65 72 61 74    #       iterat
b4d0: 69 6f 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 64  ion progress ind
b4e0: 69 63 61 74 6f 72 73 20 66 72 6f 6d 20 74 68 65  icators from the
b4f0: 20 66 69 6e 61 6c 20 72 75 6e 2e 0d 0a 20 20 23   final run...  #
b500: 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f  ..  tputs $test_
b510: 63 68 61 6e 6e 65 6c 20 5c 6e 0d 0a 0d 0a 20 20  channel \n....  
b520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b560: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
b570: 0a 20 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78  .  foreach index
b580: 28 30 29 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65  (0) [lsort -inte
b590: 67 65 72 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  ger [array names
b5a0: 20 77 6f 72 6b 6c 6f 61 64 5d 5d 20 7b 0d 0a 20   workload]] {.. 
b5b0: 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20     if {[lsearch 
b5c0: 2d 65 78 61 63 74 20 24 6e 6f 57 6f 72 6b 6c 6f  -exact $noWorklo
b5d0: 61 64 20 24 69 6e 64 65 78 28 30 29 5d 20 3d 3d  ad $index(0)] ==
b5e0: 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
b5f0: 20 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63     tputs $test_c
b600: 68 61 6e 6e 65 6c 20 5b 66 6f 72 6d 61 74 57 6f  hannel [formatWo
b610: 72 6b 6c 6f 61 64 52 65 73 75 6c 74 20 24 69 6e  rkloadResult $in
b620: 64 65 78 28 30 29 5d 0d 0a 20 20 20 20 7d 0d 0a  dex(0)]..    }..
b630: 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23    }....  #######
b640: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b650: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b660: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b670: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b680: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 66 6f 72 65  ######....  fore
b690: 61 63 68 20 69 6e 64 65 78 28 30 29 20 5b 6c 73  ach index(0) [ls
b6a0: 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 5b 61 72  ort -integer [ar
b6b0: 72 61 79 20 6e 61 6d 65 73 20 74 69 6d 65 73 5d  ray names times]
b6c0: 5d 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24  ] {..    tputs $
b6d0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 66 6f  test_channel [fo
b6e0: 72 6d 61 74 57 6f 72 6b 6c 6f 61 64 54 69 6d 65  rmatWorkloadTime
b6f0: 20 24 69 6e 64 65 78 28 30 29 5d 0d 0a 20 20 7d   $index(0)]..  }
b700: 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23  ....  ##########
b710: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b720: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b750: 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 72 65 73  ###....  set res
b760: 75 6c 74 20 5b 73 71 6c 20 65 78 65 63 75 74 65  ult [sql execute
b770: 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72   -execute scalar
b780: 20 24 73 72 63 44 62 20 22 50 52 41 47 4d 41 20   $srcDb "PRAGMA 
b790: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
b7a0: 22 5d 0d 0a 0d 0a 20 20 69 66 20 7b 24 72 65 73  "]....  if {$res
b7b0: 75 6c 74 20 65 71 20 22 6f 6b 22 7d 20 74 68 65  ult eq "ok"} the
b7c0: 6e 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20 24  n {..    tputs $
b7d0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d  test_channel "--
b7e0: 2d 2d 20 69 6e 74 65 67 72 69 74 79 20 63 68 65  -- integrity che
b7f0: 63 6b 20 6f 6b 20 28 73 72 63 44 62 29 5c 6e 22  ck ok (srcDb)\n"
b800: 0d 0a 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20  ..  } else {..  
b810: 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41    error [appendA
b820: 72 67 73 20 22 69 6e 74 65 67 72 69 74 79 20 63  rgs "integrity c
b830: 68 65 63 6b 20 66 61 69 6c 65 64 20 28 73 72 63  heck failed (src
b840: 44 62 29 3a 20 22 20 24 72 65 73 75 6c 74 5d 0d  Db): " $result].
b850: 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23  .  }....  ######
b860: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b870: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b880: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b890: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b8a0: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
b8b0: 20 72 65 73 75 6c 74 20 5b 73 71 6c 20 65 78 65   result [sql exe
b8c0: 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63  cute -execute sc
b8d0: 61 6c 61 72 20 24 64 62 20 22 50 52 41 47 4d 41  alar $db "PRAGMA
b8e0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b8f0: 3b 22 5d 0d 0a 0d 0a 20 20 69 66 20 7b 24 72 65  ;"]....  if {$re
b900: 73 75 6c 74 20 65 71 20 22 6f 6b 22 7d 20 74 68  sult eq "ok"} th
b910: 65 6e 20 7b 0d 0a 20 20 20 20 74 70 75 74 73 20  en {..    tputs 
b920: 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d  $test_channel "-
b930: 2d 2d 2d 20 69 6e 74 65 67 72 69 74 79 20 63 68  --- integrity ch
b940: 65 63 6b 20 6f 6b 20 28 64 62 29 5c 6e 22 0d 0a  eck ok (db)\n"..
b950: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b960: 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67  error [appendArg
b970: 73 20 22 69 6e 74 65 67 72 69 74 79 20 63 68 65  s "integrity che
b980: 63 6b 20 66 61 69 6c 65 64 20 28 64 62 29 3a 20  ck failed (db): 
b990: 22 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 7d 0d  " $result]..  }.
b9a0: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
b9b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b9c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b9d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b9e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b9f0: 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e  ##....  #..  # N
ba00: 4f 54 45 3a 20 54 68 65 20 6f 76 65 72 61 6c 6c  OTE: The overall
ba10: 20 74 65 73 74 20 72 65 73 75 6c 74 20 69 73 20   test result is 
ba20: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
ba30: 20 6f 66 20 66 61 69 6c 75 72 65 73 20 28 69 2e   of failures (i.
ba40: 65 2e 0d 0a 20 20 23 20 20 20 20 20 20 20 22 75  e...  #       "u
ba50: 6e 65 78 70 65 63 74 65 64 20 65 72 72 6f 72 73  nexpected errors
ba60: 22 29 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 64  ") encountered d
ba70: 75 72 69 6e 67 20 61 20 77 6f 72 6b 6c 6f 61 64  uring a workload
ba80: 20 69 74 65 72 61 74 69 6f 6e 2e 0d 0a 20 20 23   iteration...  #
ba90: 0d 0a 20 20 65 78 70 72 20 7b 5b 61 72 72 61 79  ..  expr {[array
baa0: 20 73 69 7a 65 20 66 61 69 6c 75 72 65 73 5d 20   size failures] 
bab0: 3e 20 30 20 3f 20 5c 0d 0a 20 20 20 20 20 20 5b  > 0 ? \..      [
bac0: 65 78 70 72 20 5b 6a 6f 69 6e 20 5b 61 72 72 61  expr [join [arra
bad0: 79 20 76 61 6c 75 65 73 20 66 61 69 6c 75 72 65  y values failure
bae0: 73 5d 20 2b 5d 5d 20 3a 20 30 7d 0d 0a 7d 20 2d  s] +]] : 0}..} -
baf0: 63 6c 65 61 6e 75 70 20 7b 0d 0a 20 20 66 6f 72  cleanup {..  for
bb00: 65 61 63 68 20 69 6e 64 65 78 28 30 29 20 5b 61  each index(0) [a
bb10: 72 72 61 79 20 6e 61 6d 65 73 20 74 68 72 65 61  rray names threa
bb20: 64 5d 20 7b 0d 0a 20 20 20 20 69 66 20 7b 5b 69  d] {..    if {[i
bb30: 6e 66 6f 20 65 78 69 73 74 73 20 74 68 72 65 61  nfo exists threa
bb40: 64 28 24 69 6e 64 65 78 28 30 29 29 5d 20 26 26  d($index(0))] &&
bb50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 63 6c 65   \..        [cle
bb60: 61 6e 75 70 54 68 72 65 61 64 20 24 74 68 72 65  anupThread $thre
bb70: 61 64 28 24 69 6e 64 65 78 28 30 29 29 5d 7d 20  ad($index(0))]} 
bb80: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 75 6e  then {..      un
bb90: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
bba0: 74 68 72 65 61 64 28 24 69 6e 64 65 78 28 30 29  thread($index(0)
bbb0: 29 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  )..    }..  }...
bbc0: 0a 20 20 72 65 6e 61 6d 65 20 66 72 65 65 4d 65  .  rename freeMe
bbd0: 6d 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 75  m ""..  rename u
bbe0: 73 65 4d 65 6d 20 22 22 0d 0a 20 20 72 65 6e 61  seMem ""..  rena
bbf0: 6d 65 20 61 6c 6c 6f 63 4d 65 6d 20 22 22 0d 0a  me allocMem ""..
bc00: 20 20 72 65 6e 61 6d 65 20 66 61 69 6c 54 65 73    rename failTes
bc10: 74 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 64  t ""..  rename d
bc20: 6f 6e 65 54 65 73 74 20 22 22 0d 0a 20 20 72 65  oneTest ""..  re
bc30: 6e 61 6d 65 20 73 68 6f 77 54 65 73 74 20 22 22  name showTest ""
bc40: 0d 0a 20 20 72 65 6e 61 6d 65 20 77 61 69 74 54  ..  rename waitT
bc50: 65 73 74 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65  est ""..  rename
bc60: 20 64 65 6c 61 79 54 65 73 74 20 22 22 0d 0a 20   delayTest "".. 
bc70: 20 72 65 6e 61 6d 65 20 69 6e 69 74 54 65 73 74   rename initTest
bc80: 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 69 73   ""..  rename is
bc90: 45 78 70 65 63 74 65 64 45 72 72 6f 72 20 22 22  ExpectedError ""
bca0: 0d 0a 20 20 72 65 6e 61 6d 65 20 66 6f 72 6d 61  ..  rename forma
bcb0: 74 57 6f 72 6b 6c 6f 61 64 54 69 6d 65 20 22 22  tWorkloadTime ""
bcc0: 0d 0a 20 20 72 65 6e 61 6d 65 20 66 6f 72 6d 61  ..  rename forma
bcd0: 74 57 6f 72 6b 6c 6f 61 64 52 65 73 75 6c 74 20  tWorkloadResult 
bce0: 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 73 65 74  ""..  rename set
bcf0: 75 70 57 6f 72 6b 6c 6f 61 64 46 69 6c 65 44 62  upWorkloadFileDb
bd00: 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 73 65   ""..  rename se
bd10: 74 75 70 57 6f 72 6b 6c 6f 61 64 4d 65 6d 44 62  tupWorkloadMemDb
bd20: 20 22 22 0d 0a 0d 0a 20 20 63 6c 65 61 6e 75 70   ""....  cleanup
bd30: 44 62 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 0d  Db $fileName(2).
bd40: 0a 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66 69  .  cleanupDb $fi
bd50: 6c 65 4e 61 6d 65 28 31 29 20 73 72 63 44 62 0d  leName(1) srcDb.
bd60: 0a 0d 0a 20 20 66 6f 72 65 61 63 68 20 69 6e 64  ...  foreach ind
bd70: 65 78 28 30 29 20 5b 61 72 72 61 79 20 6e 61 6d  ex(0) [array nam
bd80: 65 73 20 77 6f 72 6b 6c 6f 61 64 5d 20 7b 0d 0a  es workload] {..
bd90: 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
bda0: 20 20 20 6f 62 6a 65 63 74 20 72 65 6d 6f 76 65     object remove
bdb0: 63 61 6c 6c 62 61 63 6b 20 5b 6c 69 73 74 20 61  callback [list a
bdc0: 70 70 6c 79 20 24 77 6f 72 6b 6c 6f 61 64 28 24  pply $workload($
bdd0: 69 6e 64 65 78 28 30 29 29 20 24 66 69 6c 65 4e  index(0)) $fileN
bde0: 61 6d 65 28 31 29 20 5c 0d 0a 20 20 20 20 20 20  ame(1) \..      
bdf0: 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 32 29      $fileName(2)
be00: 20 74 31 20 24 63 6f 75 6e 74 28 31 29 20 24 63   t1 $count(1) $c
be10: 6f 75 6e 74 28 33 29 20 24 63 6f 75 6e 74 28 34  ount(3) $count(4
be20: 29 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  )]..    }..  }..
be30: 0d 0a 20 20 66 72 65 65 44 62 43 6f 6e 6e 65 63  ..  freeDbConnec
be40: 74 69 6f 6e 0d 0a 0d 0a 20 20 69 66 20 7b 21 24  tion....  if {!$
be50: 6e 6f 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d  noTrace} then {.
be60: 0a 20 20 20 20 63 6c 65 61 6e 75 70 4c 6f 67 67  .    cleanupLogg
be70: 69 6e 67 20 24 6c 6f 67 46 69 6c 65 4e 61 6d 65  ing $logFileName
be80: 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 6e 61 6d  ..  }....  renam
be90: 65 20 63 6c 65 61 6e 75 70 4c 6f 67 67 69 6e 67  e cleanupLogging
bea0: 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 73 65   ""..  rename se
beb0: 74 75 70 4c 6f 67 67 69 6e 67 20 22 22 0d 0a 0d  tupLogging ""...
bec0: 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70  .  unset -nocomp
bed0: 6c 61 69 6e 20 72 65 73 75 6c 74 20 74 68 72 65  lain result thre
bee0: 61 64 20 69 6e 64 65 78 20 77 6f 72 6b 6c 6f 61  ad index workloa
bef0: 64 20 70 72 69 6f 72 69 74 79 20 6e 6f 57 6f 72  d priority noWor
bf00: 6b 6c 6f 61 64 20 5c 0d 0a 20 20 20 20 20 20 70  kload \..      p
bf10: 72 69 6f 72 69 74 69 65 73 20 73 72 63 44 62 20  riorities srcDb 
bf20: 64 62 20 66 69 6c 65 4e 61 6d 65 20 63 6f 6d 70  db fileName comp
bf30: 69 6c 65 64 20 6f 70 74 69 6f 6e 73 20 63 6f 75  iled options cou
bf40: 6e 74 20 74 69 6d 65 73 20 6c 6f 67 46 69 6c 65  nt times logFile
bf50: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 6c 6f  Name \..      lo
bf60: 67 4c 69 73 74 65 6e 65 72 20 65 76 65 6e 74 20  gListener event 
bf70: 74 69 6d 65 6f 75 74 20 63 6f 6e 6e 65 63 74 69  timeout connecti
bf80: 6f 6e 20 69 6e 64 69 63 61 74 6f 72 73 20 69 74  on indicators it
bf90: 65 72 61 74 69 6f 6e 73 20 65 78 69 74 4f 6e 46  erations exitOnF
bfa0: 61 69 6c 20 5c 0d 0a 20 20 20 20 20 20 63 6f 54  ail \..      coT
bfb0: 61 73 6b 4d 65 6d 20 6e 6f 54 72 61 63 65 20 66  askMem noTrace f
bfc0: 61 69 6c 75 72 65 73 20 73 74 61 74 75 73 0d 0a  ailures status..
bfd0: 7d 20 2d 74 69 6d 65 20 74 72 75 65 20 2d 63 6f  } -time true -co
bfe0: 6e 73 74 72 61 69 6e 74 73 20 7b 65 61 67 6c 65  nstraints {eagle
bff0: 20 6d 6f 6e 6f 42 75 67 32 38 20 63 6f 6d 6d 61   monoBug28 comma
c000: 6e 64 2e 73 71 6c 20 63 6f 6d 70 69 6c 65 2e 44  nd.sql compile.D
c010: 41 54 41 20 53 51 4c 69 74 65 5c 0d 0a 53 79 73  ATA SQLite\..Sys
c020: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
c030: 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 7d 20 2d  compileCSharp} -
c040: 72 65 73 75 6c 74 20 7b 30 7d 7d 0d 0a 0d 0a 23  result {0}}....#
c050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c070: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c080: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c090: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
c0a0: 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a 20 52 65 70  ..#..# NOTE: Rep
c0b0: 6f 72 74 20 61 66 74 65 72 20 74 65 73 74 2e 0d  ort after test..
c0c0: 0a 23 0d 0a 63 68 65 63 6b 46 6f 72 53 51 4c 69  .#..checkForSQLi
c0d0: 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 74  teDirectories $t
c0e0: 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 67 65 74  est_channel..get
c0f0: 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e  SQLiteHandleCoun
c100: 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  ts $test_channel
c110: 0d 0a 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65  ..reportSQLiteRe
c120: 73 6f 75 72 63 65 73 20 24 74 65 73 74 5f 63 68  sources $test_ch
c130: 61 6e 6e 65 6c 0d 0a 0d 0a 23 23 23 23 23 23 23  annel....#######
c140: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c150: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c160: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c180: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 72 75 6e 53  ########....runS
c190: 51 4c 69 74 65 54 65 73 74 45 70 69 6c 6f 67 75  QLiteTestEpilogu
c1a0: 65 0d 0a 72 75 6e 54 65 73 74 45 70 69 6c 6f 67  e..runTestEpilog
c1b0: 75 65 0d 0a                                      ue..