System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 64ec58bd9d0718623278ac25d704d8c87a86ceab:


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: 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 53  Make sure that S
0280: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
0290: 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  ry is completely
02a0: 20 73 68 75 74 64 6f 77 6e 20 70 72 69 6f 72 20   shutdown prior 
02b0: 74 6f 0d 0a 23 20 20 20 20 20 20 20 73 74 61 72  to..#       star
02c0: 74 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20  ting any of the 
02d0: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
02e0: 6c 65 2e 0d 0a 23 0d 0a 73 68 75 74 64 6f 77 6e  le...#..shutdown
02f0: 53 51 4c 69 74 65 20 24 74 65 73 74 5f 63 68 61  SQLite $test_cha
0300: 6e 6e 65 6c 0d 0a 0d 0a 23 23 23 23 23 23 23 23  nnel....########
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 0d 0a 0d 0a 72 75 6e 54 65  #######....runTe
0360: 73 74 20 7b 74 65 73 74 20 73 74 72 65 73 73 2d  st {test stress-
0370: 31 2e 31 20 7b 6d 75 6c 74 69 74 68 72 65 61 64  1.1 {multithread
0380: 65 64 20 73 74 72 65 73 73 20 74 65 73 74 69 6e  ed stress testin
0390: 67 7d 20 2d 73 65 74 75 70 20 7b 0d 0a 20 20 75  g} -setup {..  u
03a0: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
03b0: 20 72 65 73 75 6c 74 20 74 68 72 65 61 64 20 69   result thread i
03c0: 6e 64 65 78 20 77 6f 72 6b 6c 6f 61 64 20 70 72  ndex workload pr
03d0: 69 6f 72 69 74 79 20 6e 6f 57 6f 72 6b 6c 6f 61  iority noWorkloa
03e0: 64 20 5c 0d 0a 20 20 20 20 20 20 70 72 69 6f 72  d \..      prior
03f0: 69 74 69 65 73 20 73 72 63 44 62 20 64 62 20 66  ities srcDb db f
0400: 69 6c 65 4e 61 6d 65 20 63 6f 6d 70 69 6c 65 64  ileName compiled
0410: 20 6f 70 74 69 6f 6e 73 20 63 6f 75 6e 74 20 74   options count t
0420: 69 6d 65 73 20 6c 6f 67 46 69 6c 65 4e 61 6d 65  imes logFileName
0430: 20 5c 0d 0a 20 20 20 20 20 20 6c 6f 67 4c 69 73   \..      logLis
0440: 74 65 6e 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  tener connection
0450: 20 69 6e 64 69 63 61 74 6f 72 73 20 69 74 65 72   indicators iter
0460: 61 74 69 6f 6e 73 20 65 78 69 74 4f 6e 46 61 69  ations exitOnFai
0470: 6c 20 63 6f 54 61 73 6b 4d 65 6d 20 5c 0d 0a 20  l coTaskMem \.. 
0480: 20 20 20 20 20 6e 6f 54 72 61 63 65 20 66 61 69       noTrace fai
0490: 6c 75 72 65 73 20 73 74 61 74 75 73 0d 0a 0d 0a  lures status....
04a0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
04b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
04f0: 0a 0d 0a 20 20 70 72 6f 63 20 66 6f 72 6d 61 74  ...  proc format
0500: 57 6f 72 6b 6c 6f 61 64 52 65 73 75 6c 74 20 7b  WorkloadResult {
0510: 20 69 6e 64 65 78 20 7d 20 7b 0d 0a 20 20 20 20   index } {..    
0520: 73 65 74 20 72 65 73 75 6c 74 20 5b 61 70 70 65  set result [appe
0530: 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 69 74 65  ndArgs "---- ite
0540: 72 61 74 69 6f 6e 73 20 66 6f 72 20 77 6f 72 6b  rations for work
0550: 6c 6f 61 64 20 28 22 20 24 69 6e 64 65 78 20 22  load (" $index "
0560: 29 3a 20 22 5d 0d 0a 0d 0a 20 20 20 20 61 70 70  ): "]....    app
0570: 65 6e 64 20 72 65 73 75 6c 74 20 5b 65 78 70 72  end result [expr
0580: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
0590: 3a 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e 64  :iterations($ind
05a0: 65 78 2c 6f 6b 29 5d 20 3f 20 5c 0d 0a 20 20 20  ex,ok)] ? \..   
05b0: 20 20 20 20 20 24 3a 3a 69 74 65 72 61 74 69 6f       $::iteratio
05c0: 6e 73 28 24 69 6e 64 65 78 2c 6f 6b 29 20 3a 20  ns($index,ok) : 
05d0: 30 7d 5d 20 22 20 6f 6b 2c 20 22 0d 0a 0d 0a 20  0}] " ok, ".... 
05e0: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
05f0: 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78   [expr {[info ex
0600: 69 73 74 73 20 3a 3a 69 74 65 72 61 74 69 6f 6e  ists ::iteration
0610: 73 28 24 69 6e 64 65 78 2c 65 72 72 6f 72 29 5d  s($index,error)]
0620: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 3a   ? \..        $:
0630: 3a 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e 64  :iterations($ind
0640: 65 78 2c 65 72 72 6f 72 29 20 3a 20 30 7d 5d 20  ex,error) : 0}] 
0650: 22 20 65 72 72 6f 72 2c 20 22 0d 0a 0d 0a 20 20  " error, "....  
0660: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
0670: 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 77   Translate the w
0680: 6f 72 6b 6c 6f 61 64 20 69 6e 64 65 78 20 74 6f  orkload index to
0690: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
06a0: 6e 67 20 69 74 65 72 61 74 69 6f 6e 0d 0a 20 20  ng iteration..  
06b0: 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20    #       error 
06c0: 69 6e 64 69 63 61 74 6f 72 20 73 6f 20 74 68 61  indicator so tha
06d0: 74 20 77 65 20 63 61 6e 20 65 61 73 69 6c 79 20  t we can easily 
06e0: 6c 6f 6f 6b 75 70 20 74 68 65 20 6e 75 6d 62 65  lookup the numbe
06f0: 72 20 6f 66 0d 0a 20 20 20 20 23 20 20 20 20 20  r of..    #     
0700: 20 20 66 61 69 6c 75 72 65 73 20 28 69 2e 65 2e    failures (i.e.
0710: 20 22 75 6e 65 78 70 65 63 74 65 64 20 65 72 72   "unexpected err
0720: 6f 72 73 22 29 20 66 6f 72 20 74 68 65 20 77 6f  ors") for the wo
0730: 72 6b 6c 6f 61 64 2e 0d 0a 20 20 20 20 23 0d 0a  rkload...    #..
0740: 20 20 20 20 73 65 74 20 69 6e 64 69 63 61 74 6f      set indicato
0750: 72 20 5b 73 74 72 69 6e 67 20 63 68 61 72 61 63  r [string charac
0760: 74 65 72 20 5b 65 78 70 72 20 7b 5b 73 74 72 69  ter [expr {[stri
0770: 6e 67 20 6f 72 64 69 6e 61 6c 20 61 20 30 5d 20  ng ordinal a 0] 
0780: 2b 20 24 69 6e 64 65 78 20 2d 20 31 7d 5d 5d 0d  + $index - 1}]].
0790: 0a 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 72 65  ...    append re
07a0: 73 75 6c 74 20 5b 65 78 70 72 20 7b 5b 69 6e 66  sult [expr {[inf
07b0: 6f 20 65 78 69 73 74 73 20 3a 3a 66 61 69 6c 75  o exists ::failu
07c0: 72 65 73 28 24 69 6e 64 69 63 61 74 6f 72 29 5d  res($indicator)]
07d0: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 24 3a   ? \..        $:
07e0: 3a 66 61 69 6c 75 72 65 73 28 24 69 6e 64 69 63  :failures($indic
07f0: 61 74 6f 72 29 20 3a 20 30 7d 5d 20 22 20 66 61  ator) : 0}] " fa
0800: 69 6c 65 64 5c 6e 22 0d 0a 0d 0a 20 20 20 20 72  iled\n"....    r
0810: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
0820: 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23   }....  ########
0830: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0840: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0860: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0870: 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f 63 20  #####....  proc 
0880: 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20  isExpectedError 
0890: 7b 20 65 72 72 6f 72 20 7d 20 7b 0d 0a 20 20 20  { error } {..   
08a0: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b   return [expr {[
08b0: 72 65 67 65 78 70 20 2d 2d 20 7b 5c 73 6e 6f 20  regexp -- {\sno 
08c0: 73 75 63 68 20 74 61 62 6c 65 3a 20 74 31 5c 73  such table: t1\s
08d0: 7d 20 24 65 72 72 6f 72 5d 20 7c 7c 20 5c 0d 0a  } $error] || \..
08e0: 20 20 20 20 20 20 20 20 5b 72 65 67 65 78 70 20          [regexp 
08f0: 2d 2d 20 7b 5c 73 64 61 74 61 62 61 73 65 20 69  -- {\sdatabase i
0900: 73 20 6c 6f 63 6b 65 64 5c 73 7d 20 24 65 72 72  s locked\s} $err
0910: 6f 72 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  or] || \..      
0920: 20 20 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5c 73    [regexp -- {\s
0930: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
0940: 73 20 6c 6f 63 6b 65 64 5c 73 7d 20 24 65 72 72  s locked\s} $err
0950: 6f 72 5d 7d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  or]}]..  }....  
0960: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0970: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0980: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0990: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
09a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
09b0: 0a 20 20 70 72 6f 63 20 77 61 69 74 46 6f 72 54  .  proc waitForT
09c0: 65 73 74 20 7b 20 7b 65 78 74 72 61 20 30 7d 20  est { {extra 0} 
09d0: 7d 20 7b 0d 0a 20 20 20 20 61 66 74 65 72 20 5b  } {..    after [
09e0: 65 78 70 72 20 7b 69 6e 74 28 28 72 61 6e 64 28  expr {int((rand(
09f0: 29 20 2a 20 31 30 30 30 29 20 2b 20 24 65 78 74  ) * 1000) + $ext
0a00: 72 61 29 7d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  ra)}]..  }....  
0a10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0a20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0a30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0a40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0a50: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
0a60: 0a 20 20 70 72 6f 63 20 73 68 6f 77 54 65 73 74  .  proc showTest
0a70: 20 7b 20 69 6e 64 69 63 61 74 6f 72 20 7d 20 7b   { indicator } {
0a80: 0d 0a 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74  ..    tputs $::t
0a90: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 64  est_channel $ind
0aa0: 69 63 61 74 6f 72 0d 0a 20 20 20 20 61 70 70 65  icator..    appe
0ab0: 6e 64 20 3a 3a 69 6e 64 69 63 61 74 6f 72 73 20  nd ::indicators 
0ac0: 24 69 6e 64 69 63 61 74 6f 72 0d 0a 20 20 20 20  $indicator..    
0ad0: 77 61 69 74 46 6f 72 54 65 73 74 20 24 3a 3a 63  waitForTest $::c
0ae0: 6f 75 6e 74 28 32 29 0d 0a 20 20 7d 0d 0a 0d 0a  ount(2)..  }....
0af0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
0b00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0b40: 0a 0d 0a 20 20 70 72 6f 63 20 64 6f 6e 65 54 65  ...  proc doneTe
0b50: 73 74 20 7b 20 69 6e 64 69 63 61 74 6f 72 20 7d  st { indicator }
0b60: 20 7b 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
0b70: 3a 3a 73 74 61 74 75 73 28 64 6f 6e 65 29 20 24  ::status(done) $
0b80: 69 6e 64 69 63 61 74 6f 72 0d 0a 20 20 20 20 68  indicator..    h
0b90: 6f 73 74 20 74 69 74 6c 65 20 24 3a 3a 73 74 61  ost title $::sta
0ba0: 74 75 73 28 64 6f 6e 65 29 0d 0a 20 20 7d 0d 0a  tus(done)..  }..
0bb0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
0bc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0bd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0be0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0bf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0c00: 23 0d 0a 0d 0a 20 20 70 72 6f 63 20 66 61 69 6c  #....  proc fail
0c10: 54 65 73 74 20 7b 20 69 6e 64 69 63 61 74 6f 72  Test { indicator
0c20: 20 65 72 72 6f 72 20 7d 20 7b 0d 0a 20 20 20 20   error } {..    
0c30: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 48  #..    # NOTE: H
0c40: 61 6c 74 20 61 6c 6c 20 74 65 73 74 69 6e 67 20  alt all testing 
0c50: 61 6e 64 20 65 78 69 74 20 74 68 65 20 70 72 6f  and exit the pro
0c60: 63 65 73 73 20 6e 6f 77 0d 0a 20 20 20 20 23 20  cess now..    # 
0c70: 20 20 20 20 20 20 2d 4f 52 2d 20 6a 75 73 74 20        -OR- just 
0c80: 72 65 63 6f 72 64 20 74 68 65 20 66 61 69 6c 75  record the failu
0c90: 72 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 3f  re and continue?
0ca0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 69 66 20  ..    #..    if 
0cb0: 7b 24 3a 3a 65 78 69 74 4f 6e 46 61 69 6c 7d 20  {$::exitOnFail} 
0cc0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 73 65  then {..      se
0cd0: 74 20 6c 65 76 65 6c 20 5b 65 78 70 72 20 7b 5b  t level [expr {[
0ce0: 69 6e 66 6f 20 6c 65 76 65 6c 5d 20 2d 20 31 7d  info level] - 1}
0cf0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73  ]....      tputs
0d00: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
0d10: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
0d20: 20 20 20 20 20 20 20 20 20 20 5c 6e 20 5b 69 6e            \n [in
0d30: 66 6f 20 6c 65 76 65 6c 20 24 6c 65 76 65 6c 5d  fo level $level]
0d40: 20 22 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f   ": " \n\t $erro
0d50: 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 65  r \n]....      e
0d60: 78 69 74 20 46 61 69 6c 75 72 65 0d 0a 20 20 20  xit Failure..   
0d70: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
0d80: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
0d90: 68 61 6e 6e 65 6c 20 24 69 6e 64 69 63 61 74 6f  hannel $indicato
0da0: 72 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  r....      if {!
0db0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 66  [info exists ::f
0dc0: 61 69 6c 75 72 65 73 28 24 69 6e 64 69 63 61 74  ailures($indicat
0dd0: 6f 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  or)]} then {..  
0de0: 20 20 20 20 20 20 73 65 74 20 3a 3a 66 61 69 6c        set ::fail
0df0: 75 72 65 73 28 24 69 6e 64 69 63 61 74 6f 72 29  ures($indicator)
0e00: 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   0..      }.... 
0e10: 20 20 20 20 20 69 6e 63 72 20 3a 3a 66 61 69 6c       incr ::fail
0e20: 75 72 65 73 28 24 69 6e 64 69 63 61 74 6f 72 29  ures($indicator)
0e30: 0d 0a 20 20 20 20 20 20 77 61 69 74 46 6f 72 54  ..      waitForT
0e40: 65 73 74 20 24 3a 3a 63 6f 75 6e 74 28 32 29 0d  est $::count(2).
0e50: 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20  .    }..  }.... 
0e60: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
0e70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0e80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0e90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0ea0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
0eb0: 0d 0a 20 20 70 72 6f 63 20 61 6c 6c 6f 63 4d 65  ..  proc allocMe
0ec0: 6d 20 7b 20 73 69 7a 65 20 7d 20 7b 0d 0a 20 20  m { size } {..  
0ed0: 20 20 69 66 20 7b 24 3a 3a 63 6f 54 61 73 6b 4d    if {$::coTaskM
0ee0: 65 6d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  em} then {..    
0ef0: 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74    return [object
0f00: 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65 20   invoke -create 
0f10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79 73  \..          Sys
0f20: 74 65 6d 2e 52 75 6e 74 69 6d 65 2e 49 6e 74 65  tem.Runtime.Inte
0f30: 72 6f 70 53 65 72 76 69 63 65 73 2e 4d 61 72 73  ropServices.Mars
0f40: 68 61 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  hal \..         
0f50: 20 41 6c 6c 6f 63 43 6f 54 61 73 6b 4d 65 6d 20   AllocCoTaskMem 
0f60: 24 73 69 7a 65 5d 3b 20 23 20 74 68 72 6f 77 0d  $size]; # throw.
0f70: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
0f80: 20 20 20 20 20 73 65 74 20 70 74 72 20 5b 6f 62       set ptr [ob
0f90: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 63 72 65  ject invoke -cre
0fa0: 61 74 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  ate -flags +NonP
0fb0: 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
0fc0: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
0fd0: 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
0fe0: 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
0ff0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
1000: 61 6c 6c 6f 63 20 24 73 69 7a 65 5d 0d 0a 0d 0a  alloc $size]....
1010: 20 20 20 20 20 20 69 66 20 7b 5b 6f 62 6a 65 63        if {[objec
1020: 74 20 69 6e 76 6f 6b 65 20 24 70 74 72 20 54 6f  t invoke $ptr To
1030: 49 6e 74 36 34 5d 20 21 3d 20 30 7d 20 74 68 65  Int64] != 0} the
1040: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
1050: 75 72 6e 20 24 70 74 72 0d 0a 20 20 20 20 20 20  urn $ptr..      
1060: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1070: 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41    error [appendA
1080: 72 67 73 20 22 73 71 6c 69 74 65 33 5f 6d 61 6c  rgs "sqlite3_mal
1090: 6c 6f 63 28 22 20 24 73 69 7a 65 20 22 29 20 66  loc(" $size ") f
10a0: 61 69 6c 65 64 22 5d 0d 0a 20 20 20 20 20 20 7d  ailed"]..      }
10b0: 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
10c0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
10d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
1110: 0a 0d 0a 20 20 70 72 6f 63 20 75 73 65 4d 65 6d  ...  proc useMem
1120: 20 7b 20 70 74 72 20 73 69 7a 65 20 7d 20 7b 0d   { ptr size } {.
1130: 0a 20 20 20 20 69 66 20 7b 21 5b 69 73 4d 6f 6e  .    if {![isMon
1140: 6f 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  o]} then {..    
1150: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1160: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1170: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 4d  c \..          M
1180: 69 63 72 6f 73 6f 66 74 2e 57 69 6e 33 32 2e 57  icrosoft.Win32.W
1190: 69 6e 33 32 4e 61 74 69 76 65 20 5a 65 72 6f 4d  in32Native ZeroM
11a0: 65 6d 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  emory \..       
11b0: 20 20 20 24 70 74 72 20 24 73 69 7a 65 0d 0a 20     $ptr $size.. 
11c0: 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23     }..  }....  #
11d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1200: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1210: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
1220: 20 20 70 72 6f 63 20 66 72 65 65 4d 65 6d 20 7b    proc freeMem {
1230: 20 70 74 72 20 7d 20 7b 0d 0a 20 20 20 20 69 66   ptr } {..    if
1240: 20 7b 24 3a 3a 63 6f 54 61 73 6b 4d 65 6d 7d 20   {$::coTaskMem} 
1250: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 6f 62  then {..      ob
1260: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74  ject invoke Syst
1270: 65 6d 2e 52 75 6e 74 69 6d 65 2e 49 6e 74 65 72  em.Runtime.Inter
1280: 6f 70 53 65 72 76 69 63 65 73 2e 4d 61 72 73 68  opServices.Marsh
1290: 61 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  al \..          
12a0: 46 72 65 65 43 6f 54 61 73 6b 4d 65 6d 20 24 70  FreeCoTaskMem $p
12b0: 74 72 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  tr..    } else {
12c0: 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69  ..      object i
12d0: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
12e0: 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
12f0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1300: 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
1310: 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
1320: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1330: 5f 66 72 65 65 20 24 70 74 72 0d 0a 20 20 20 20  _free $ptr..    
1340: 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23  }..  }....  ####
1350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1360: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1370: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1390: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70  #########....  p
13a0: 72 6f 63 20 73 65 74 75 70 4c 6f 67 67 69 6e 67  roc setupLogging
13b0: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
13c0: 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20  .    if {![info 
13d0: 65 78 69 73 74 73 20 3a 3a 6c 6f 67 4c 69 73 74  exists ::logList
13e0: 65 6e 65 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ener]} then {.. 
13f0: 20 20 20 20 20 73 65 74 20 3a 3a 6c 6f 67 4c 69       set ::logLi
1400: 73 74 65 6e 65 72 20 5b 6f 62 6a 65 63 74 20 63  stener [object c
1410: 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a  reate -alias \..
1420: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1430: 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 54 65 78  .Diagnostics.Tex
1440: 74 57 72 69 74 65 72 54 72 61 63 65 4c 69 73 74  tWriterTraceList
1450: 65 6e 65 72 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ener $fileName].
1460: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 6f 62  .    }....    ob
1470: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74  ject invoke Syst
1480: 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 54  em.Diagnostics.T
1490: 72 61 63 65 2e 4c 69 73 74 65 6e 65 72 73 20 41  race.Listeners A
14a0: 64 64 20 24 3a 3a 6c 6f 67 4c 69 73 74 65 6e 65  dd $::logListene
14b0: 72 0d 0a 20 20 20 20 6f 62 6a 65 63 74 20 69 6e  r..    object in
14c0: 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44 61 74 61  voke System.Data
14d0: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4c 6f  .SQLite.SQLiteLo
14e0: 67 20 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 0d 0a  g Initialize....
14f0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1500: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1510: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1520: 20 22 2d 2d 2d 2d 20 65 6e 61 62 6c 65 64 20 53   "---- enabled S
1530: 51 4c 69 74 65 20 74 72 61 63 65 20 6c 6f 67 67  QLite trace logg
1540: 69 6e 67 20 74 6f 20 66 69 6c 65 20 5c 22 22 20  ing to file \"" 
1550: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  $fileName \"\n].
1560: 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23  .  }....  ######
1570: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1580: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15b0: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 70 72 6f  #######....  pro
15c0: 63 20 63 6c 65 61 6e 75 70 4c 6f 67 67 69 6e 67  c cleanupLogging
15d0: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
15e0: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
15f0: 78 69 73 74 73 20 3a 3a 6c 6f 67 4c 69 73 74 65  xists ::logListe
1600: 6e 65 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ner]} then {..  
1610: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
1620: 65 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73  e System.Diagnos
1630: 74 69 63 73 2e 54 72 61 63 65 2e 4c 69 73 74 65  tics.Trace.Liste
1640: 6e 65 72 73 20 52 65 6d 6f 76 65 20 24 3a 3a 6c  ners Remove $::l
1650: 6f 67 4c 69 73 74 65 6e 65 72 0d 0a 20 20 20 20  ogListener..    
1660: 20 20 24 3a 3a 6c 6f 67 4c 69 73 74 65 6e 65 72    $::logListener
1670: 20 43 6c 6f 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d   Close..    }...
1680: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
1690: 54 45 3a 20 43 6f 70 79 20 74 68 65 20 74 72 61  TE: Copy the tra
16a0: 63 65 20 6c 69 73 74 65 6e 65 72 20 6c 6f 67 20  ce listener log 
16b0: 66 69 6c 65 20 74 6f 20 74 68 65 20 6d 61 69 6e  file to the main
16c0: 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d   test log file..
16d0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 74 6c 6f 67  .    #..    tlog
16e0: 20 22 2d 2d 2d 2d 20 42 45 47 49 4e 20 54 52 41   "---- BEGIN TRA
16f0: 43 45 20 4c 49 53 54 45 4e 45 52 20 4f 55 54 50  CE LISTENER OUTP
1700: 55 54 5c 6e 22 0d 0a 20 20 20 20 74 6c 6f 67 20  UT\n"..    tlog 
1710: 5b 72 65 61 64 46 69 6c 65 20 24 66 69 6c 65 4e  [readFile $fileN
1720: 61 6d 65 5d 0d 0a 20 20 20 20 74 6c 6f 67 20 22  ame]..    tlog "
1730: 5c 6e 2d 2d 2d 2d 20 45 4e 44 20 54 52 41 43 45  \n---- END TRACE
1740: 20 4c 49 53 54 45 4e 45 52 20 4f 55 54 50 55 54   LISTENER OUTPUT
1750: 5c 6e 22 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20  \n"....    #..  
1760: 20 20 23 20 4e 4f 54 45 3a 20 44 65 6c 65 74 65    # NOTE: Delete
1770: 20 74 68 65 20 74 72 61 63 65 20 6c 69 73 74 65   the trace liste
1780: 6e 65 72 20 6c 6f 67 20 66 69 6c 65 20 62 65 63  ner log file bec
1790: 61 75 73 65 20 69 74 73 20 63 6f 6e 74 65 6e 74  ause its content
17a0: 73 20 68 61 76 65 0d 0a 20 20 20 20 23 20 20 20  s have..    #   
17b0: 20 20 20 20 62 65 65 6e 20 63 6f 70 69 65 64 20      been copied 
17c0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 73 74  to the main test
17d0: 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20   log file...    
17e0: 23 0d 0a 20 20 20 20 63 6c 65 61 6e 75 70 46 69  #..    cleanupFi
17f0: 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a  le $fileName....
1800: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1810: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1820: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1830: 20 22 2d 2d 2d 2d 20 64 69 73 61 62 6c 65 64 20   "---- disabled 
1840: 53 51 4c 69 74 65 20 74 72 61 63 65 20 6c 6f 67  SQLite trace log
1850: 67 69 6e 67 20 74 6f 20 66 69 6c 65 20 5c 22 22  ging to file \""
1860: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
1870: 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23  ..  }....  #####
1880: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1890: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18c0: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d  ########....  #.
18d0: 0a 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70  .  # NOTE: Setup
18e0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
18f0: 75 65 73 20 66 6f 72 20 74 68 65 20 74 75 6e 61  ues for the tuna
1900: 62 6c 65 20 77 6f 72 6b 6c 6f 61 64 20 70 61 72  ble workload par
1910: 61 6d 65 74 65 72 73 2e 20 20 41 6e 79 2c 0d 0a  ameters.  Any,..
1920: 20 20 23 20 20 20 20 20 20 20 61 6c 6c 2c 20 6f    #       all, o
1930: 72 20 6e 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  r none of these 
1940: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 65 6e  may be overriden
1950: 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64   via the command
1960: 20 6c 69 6e 65 2e 0d 0a 20 20 23 0d 0a 20 20 73   line...  #..  s
1970: 65 74 20 63 6f 75 6e 74 28 30 29 20 31 3b 20 20  et count(0) 1;  
1980: 20 20 20 20 20 20 20 23 20 57 6f 72 6b 6c 6f 61         # Workloa
1990: 64 20 72 65 70 65 61 74 20 63 6f 75 6e 74 20 28  d repeat count (
19a0: 69 2e 65 2e 20 74 6f 74 61 6c 20 66 75 6c 6c 20  i.e. total full 
19b0: 72 75 6e 73 29 2e 0d 0a 20 20 73 65 74 20 63 6f  runs)...  set co
19c0: 75 6e 74 28 31 29 20 32 30 3b 20 20 20 20 20 20  unt(1) 20;      
19d0: 20 20 23 20 57 6f 72 6b 6c 6f 61 64 20 69 74 65    # Workload ite
19e0: 72 61 74 69 6f 6e 20 63 6f 75 6e 74 20 28 69 2e  ration count (i.
19f0: 65 2e 20 77 69 74 68 69 6e 20 61 20 72 75 6e 29  e. within a run)
1a00: 2e 0d 0a 20 20 73 65 74 20 63 6f 75 6e 74 28 32  ...  set count(2
1a10: 29 20 35 30 30 3b 20 20 20 20 20 20 20 23 20 57  ) 500;       # W
1a20: 6f 72 6b 6c 6f 61 64 20 69 74 65 72 61 74 69 6f  orkload iteratio
1a30: 6e 20 64 65 6c 61 79 2c 20 69 6e 20 6d 69 6c 6c  n delay, in mill
1a40: 69 73 65 63 6f 6e 64 73 2e 0d 0a 20 20 73 65 74  iseconds...  set
1a50: 20 63 6f 75 6e 74 28 33 29 20 32 30 30 30 3b 20   count(3) 2000; 
1a60: 20 20 20 20 20 23 20 57 6f 72 6b 6c 6f 61 64 20       # Workload 
1a70: 22 73 6d 61 6c 6c 22 20 64 61 74 61 20 63 68 75  "small" data chu
1a80: 6e 6b 20 73 69 7a 65 2c 20 69 6e 20 62 79 74 65  nk size, in byte
1a90: 73 2e 0d 0a 20 20 73 65 74 20 63 6f 75 6e 74 28  s...  set count(
1aa0: 34 29 20 31 30 30 30 30 30 30 30 3b 20 20 23 20  4) 10000000;  # 
1ab0: 57 6f 72 6b 6c 6f 61 64 20 22 62 69 67 22 20 64  Workload "big" d
1ac0: 61 74 61 20 63 68 75 6e 6b 20 73 69 7a 65 2c 20  ata chunk size, 
1ad0: 69 6e 20 62 79 74 65 73 2e 0d 0a 20 20 73 65 74  in bytes...  set
1ae0: 20 63 6f 75 6e 74 28 35 29 20 33 31 34 35 37 32   count(5) 314572
1af0: 38 30 30 3b 20 23 20 4d 61 78 69 6d 75 6d 20 68  800; # Maximum h
1b00: 65 61 70 20 6d 65 6d 6f 72 79 20 74 6f 20 65 78  eap memory to ex
1b10: 63 6c 75 64 65 20 61 74 20 6f 6e 65 20 74 69 6d  clude at one tim
1b20: 65 2e 0d 0a 20 20 73 65 74 20 6e 6f 57 6f 72 6b  e...  set noWork
1b30: 6c 6f 61 64 20 5b 6c 69 73 74 5d 3b 20 20 23 20  load [list];  # 
1b40: 57 6f 72 6b 6c 6f 61 64 73 20 74 6f 20 62 65 20  Workloads to be 
1b50: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
1b60: 20 72 75 6e 2c 20 62 79 20 69 6e 64 65 78 2e 0d   run, by index..
1b70: 0a 20 20 73 65 74 20 70 72 69 6f 72 69 74 69 65  .  set prioritie
1b80: 73 20 5b 6c 69 73 74 5d 3b 20 20 23 20 44 69 63  s [list];  # Dic
1b90: 74 69 6f 6e 61 72 79 20 6f 66 20 77 6f 72 6b 6c  tionary of workl
1ba0: 6f 61 64 20 74 68 72 65 61 64 20 70 72 69 6f 72  oad thread prior
1bb0: 69 74 69 65 73 2e 0d 0a 20 20 73 65 74 20 65 78  ities...  set ex
1bc0: 69 74 4f 6e 46 61 69 6c 20 74 72 75 65 3b 20 20  itOnFail true;  
1bd0: 20 20 23 20 48 61 6c 74 20 74 65 73 74 69 6e 67    # Halt testing
1be0: 20 61 6e 64 20 65 78 69 74 20 70 72 6f 63 65 73   and exit proces
1bf0: 73 20 6f 6e 20 74 65 73 74 20 66 61 69 6c 75 72  s on test failur
1c00: 65 3f 0d 0a 20 20 73 65 74 20 63 6f 54 61 73 6b  e?..  set coTask
1c10: 4d 65 6d 20 74 72 75 65 3b 20 20 20 20 20 23 20  Mem true;     # 
1c20: 55 73 65 20 41 6c 6c 6f 63 43 6f 54 61 73 6b 4d  Use AllocCoTaskM
1c30: 65 6d 2f 46 72 65 65 43 6f 54 61 73 6b 4d 65 6d  em/FreeCoTaskMem
1c40: 20 66 6f 72 20 6d 65 6d 6f 72 79 3f 0d 0a 20 20   for memory?..  
1c50: 73 65 74 20 6e 6f 54 72 61 63 65 20 66 61 6c 73  set noTrace fals
1c60: 65 3b 20 20 20 20 20 20 23 20 44 69 73 61 62 6c  e;      # Disabl
1c70: 65 20 53 51 4c 69 74 65 20 74 72 61 63 65 20 6c  e SQLite trace l
1c80: 6f 67 67 69 6e 67 20 74 6f 20 61 20 66 69 6c 65  ogging to a file
1c90: 3f 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  ?....  #########
1ca0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ce0: 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23  ####....  #..  #
1cf0: 20 4e 4f 54 45 3a 20 49 66 20 63 6f 6d 6d 61 6e   NOTE: If comman
1d00: 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73  d line arguments
1d10: 20 74 6f 20 74 68 65 20 74 65 73 74 20 73 75 69   to the test sui
1d20: 74 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  te are available
1d30: 2c 20 70 72 6f 63 65 73 73 0d 0a 20 20 23 20 20  , process..  #  
1d40: 20 20 20 20 20 74 68 65 6d 20 66 6f 72 20 61 6e       them for an
1d50: 79 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 61  y options that a
1d60: 72 65 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f  re applicable to
1d70: 20 74 68 69 73 20 74 65 73 74 20 28 69 2e 65 2e   this test (i.e.
1d80: 20 61 6e 79 20 6f 66 0d 0a 20 20 23 20 20 20 20   any of..  #    
1d90: 20 20 20 74 68 65 20 74 75 6e 61 62 6c 65 20 77     the tunable w
1da0: 6f 72 6b 6c 6f 61 64 20 70 61 72 61 6d 65 74 65  orkload paramete
1db0: 72 73 20 6c 69 73 74 65 64 20 61 62 6f 76 65 29  rs listed above)
1dc0: 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 5b 69  ...  #..  if {[i
1dd0: 6e 66 6f 20 65 78 69 73 74 73 20 61 72 67 76 5d  nfo exists argv]
1de0: 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24 61 72   && [llength $ar
1df0: 67 76 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  gv] > 0} then {.
1e00: 0a 20 20 20 20 70 61 72 73 65 20 6f 70 74 69 6f  .    parse optio
1e10: 6e 73 20 2d 66 6c 61 67 73 20 5c 0d 0a 20 20 20  ns -flags \..   
1e20: 20 20 20 20 20 7b 2d 53 74 6f 70 4f 6e 55 6e 6b       {-StopOnUnk
1e30: 6e 6f 77 6e 4f 70 74 69 6f 6e 20 2b 49 67 6e 6f  nownOption +Igno
1e40: 72 65 4f 6e 55 6e 6b 6e 6f 77 6e 4f 70 74 69 6f  reOnUnknownOptio
1e50: 6e 20 53 6b 69 70 4f 6e 55 6e 6b 6e 6f 77 6e 4f  n SkipOnUnknownO
1e60: 70 74 69 6f 6e 7d 20 2d 2d 20 5c 0d 0a 20 20 20  ption} -- \..   
1e70: 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 73 74       [list [list
1e80: 20 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 49 6e   null MustHaveIn
1e90: 74 65 67 65 72 56 61 6c 75 65 20 2d 31 20 2d 31  tegerValue -1 -1
1ea0: 20 2d 63 6f 75 6e 74 30 20 24 63 6f 75 6e 74 28   -count0 $count(
1eb0: 30 29 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b  0)] \..        [
1ec0: 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48 61  list null MustHa
1ed0: 76 65 49 6e 74 65 67 65 72 56 61 6c 75 65 20 2d  veIntegerValue -
1ee0: 31 20 2d 31 20 2d 63 6f 75 6e 74 31 20 24 63 6f  1 -1 -count1 $co
1ef0: 75 6e 74 28 31 29 5d 20 5c 0d 0a 20 20 20 20 20  unt(1)] \..     
1f00: 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75     [list null Mu
1f10: 73 74 48 61 76 65 49 6e 74 65 67 65 72 56 61 6c  stHaveIntegerVal
1f20: 75 65 20 2d 31 20 2d 31 20 2d 63 6f 75 6e 74 32  ue -1 -1 -count2
1f30: 20 24 63 6f 75 6e 74 28 32 29 5d 20 5c 0d 0a 20   $count(2)] \.. 
1f40: 20 20 20 20 20 20 20 5b 6c 69 73 74 20 6e 75 6c         [list nul
1f50: 6c 20 4d 75 73 74 48 61 76 65 49 6e 74 65 67 65  l MustHaveIntege
1f60: 72 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 63 6f  rValue -1 -1 -co
1f70: 75 6e 74 33 20 24 63 6f 75 6e 74 28 33 29 5d 20  unt3 $count(3)] 
1f80: 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73 74  \..        [list
1f90: 20 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 49 6e   null MustHaveIn
1fa0: 74 65 67 65 72 56 61 6c 75 65 20 2d 31 20 2d 31  tegerValue -1 -1
1fb0: 20 2d 63 6f 75 6e 74 34 20 24 63 6f 75 6e 74 28   -count4 $count(
1fc0: 34 29 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b  4)] \..        [
1fd0: 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74 48 61  list null MustHa
1fe0: 76 65 49 6e 74 65 67 65 72 56 61 6c 75 65 20 2d  veIntegerValue -
1ff0: 31 20 2d 31 20 2d 63 6f 75 6e 74 35 20 24 63 6f  1 -1 -count5 $co
2000: 75 6e 74 28 35 29 5d 20 5c 0d 0a 20 20 20 20 20  unt(5)] \..     
2010: 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75     [list null Mu
2020: 73 74 48 61 76 65 4c 69 73 74 56 61 6c 75 65 20  stHaveListValue 
2030: 2d 31 20 2d 31 20 2d 6e 6f 57 6f 72 6b 6c 6f 61  -1 -1 -noWorkloa
2040: 64 20 24 6e 6f 57 6f 72 6b 6c 6f 61 64 5d 20 5c  d $noWorkload] \
2050: 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20  ..        [list 
2060: 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 4c 69 73  null MustHaveLis
2070: 74 56 61 6c 75 65 20 2d 31 20 2d 31 20 2d 70 72  tValue -1 -1 -pr
2080: 69 6f 72 69 74 69 65 73 20 24 70 72 69 6f 72 69  iorities $priori
2090: 74 69 65 73 5d 20 5c 0d 0a 20 20 20 20 20 20 20  ties] \..       
20a0: 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75 73 74   [list null Must
20b0: 48 61 76 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65  HaveBooleanValue
20c0: 20 2d 31 20 2d 31 20 2d 65 78 69 74 4f 6e 46 61   -1 -1 -exitOnFa
20d0: 69 6c 20 24 65 78 69 74 4f 6e 46 61 69 6c 5d 20  il $exitOnFail] 
20e0: 5c 0d 0a 20 20 20 20 20 20 20 20 5b 6c 69 73 74  \..        [list
20f0: 20 6e 75 6c 6c 20 4d 75 73 74 48 61 76 65 42 6f   null MustHaveBo
2100: 6f 6c 65 61 6e 56 61 6c 75 65 20 2d 31 20 2d 31  oleanValue -1 -1
2110: 20 2d 63 6f 54 61 73 6b 4d 65 6d 20 24 63 6f 54   -coTaskMem $coT
2120: 61 73 6b 4d 65 6d 5d 20 5c 0d 0a 20 20 20 20 20  askMem] \..     
2130: 20 20 20 5b 6c 69 73 74 20 6e 75 6c 6c 20 4d 75     [list null Mu
2140: 73 74 48 61 76 65 42 6f 6f 6c 65 61 6e 56 61 6c  stHaveBooleanVal
2150: 75 65 20 2d 31 20 2d 31 20 2d 6e 6f 54 72 61 63  ue -1 -1 -noTrac
2160: 65 20 24 6e 6f 54 72 61 63 65 5d 5d 20 24 61 72  e $noTrace]] $ar
2170: 67 76 0d 0a 0d 0a 20 20 20 20 73 65 74 20 63 6f  gv....    set co
2180: 75 6e 74 28 30 29 20 24 6f 70 74 69 6f 6e 73 28  unt(0) $options(
2190: 2d 63 6f 75 6e 74 30 2c 76 61 6c 75 65 29 0d 0a  -count0,value)..
21a0: 20 20 20 20 73 65 74 20 63 6f 75 6e 74 28 31 29      set count(1)
21b0: 20 24 6f 70 74 69 6f 6e 73 28 2d 63 6f 75 6e 74   $options(-count
21c0: 31 2c 76 61 6c 75 65 29 0d 0a 20 20 20 20 73 65  1,value)..    se
21d0: 74 20 63 6f 75 6e 74 28 32 29 20 24 6f 70 74 69  t count(2) $opti
21e0: 6f 6e 73 28 2d 63 6f 75 6e 74 32 2c 76 61 6c 75  ons(-count2,valu
21f0: 65 29 0d 0a 20 20 20 20 73 65 74 20 63 6f 75 6e  e)..    set coun
2200: 74 28 33 29 20 24 6f 70 74 69 6f 6e 73 28 2d 63  t(3) $options(-c
2210: 6f 75 6e 74 33 2c 76 61 6c 75 65 29 0d 0a 20 20  ount3,value)..  
2220: 20 20 73 65 74 20 63 6f 75 6e 74 28 34 29 20 24    set count(4) $
2230: 6f 70 74 69 6f 6e 73 28 2d 63 6f 75 6e 74 34 2c  options(-count4,
2240: 76 61 6c 75 65 29 0d 0a 20 20 20 20 73 65 74 20  value)..    set 
2250: 63 6f 75 6e 74 28 35 29 20 24 6f 70 74 69 6f 6e  count(5) $option
2260: 73 28 2d 63 6f 75 6e 74 35 2c 76 61 6c 75 65 29  s(-count5,value)
2270: 0d 0a 20 20 20 20 73 65 74 20 6e 6f 57 6f 72 6b  ..    set noWork
2280: 6c 6f 61 64 20 24 6f 70 74 69 6f 6e 73 28 2d 6e  load $options(-n
2290: 6f 57 6f 72 6b 6c 6f 61 64 2c 76 61 6c 75 65 29  oWorkload,value)
22a0: 0d 0a 20 20 20 20 73 65 74 20 70 72 69 6f 72 69  ..    set priori
22b0: 74 69 65 73 20 24 6f 70 74 69 6f 6e 73 28 2d 70  ties $options(-p
22c0: 72 69 6f 72 69 74 69 65 73 2c 76 61 6c 75 65 29  riorities,value)
22d0: 0d 0a 20 20 20 20 73 65 74 20 65 78 69 74 4f 6e  ..    set exitOn
22e0: 46 61 69 6c 20 24 6f 70 74 69 6f 6e 73 28 2d 65  Fail $options(-e
22f0: 78 69 74 4f 6e 46 61 69 6c 2c 76 61 6c 75 65 29  xitOnFail,value)
2300: 0d 0a 20 20 20 20 73 65 74 20 63 6f 54 61 73 6b  ..    set coTask
2310: 4d 65 6d 20 24 6f 70 74 69 6f 6e 73 28 2d 63 6f  Mem $options(-co
2320: 54 61 73 6b 4d 65 6d 2c 76 61 6c 75 65 29 0d 0a  TaskMem,value)..
2330: 20 20 20 20 73 65 74 20 6e 6f 54 72 61 63 65 20      set noTrace 
2340: 24 6f 70 74 69 6f 6e 73 28 2d 6e 6f 54 72 61 63  $options(-noTrac
2350: 65 2c 76 61 6c 75 65 29 0d 0a 20 20 7d 0d 0a 0d  e,value)..  }...
2360: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
2370: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23b0: 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
23c0: 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70  E: Load custom p
23d0: 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
23e0: 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
23f0: 74 69 6e 67 73 2e 20 20 43 75 72 72 65 6e 74 6c  tings.  Currentl
2400: 79 2c 20 74 68 69 73 0d 0a 20 20 23 20 20 20 20  y, this..  #    
2410: 20 20 20 69 73 20 64 6f 6e 65 20 61 66 74 65 72     is done after
2420: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20   processing the 
2430: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
2440: 69 6f 6e 73 2e 20 20 54 68 65 20 73 65 74 74 69  ions.  The setti
2450: 6e 67 73 20 66 69 6c 65 0d 0a 20 20 23 20 20 20  ngs file..  #   
2460: 20 20 20 20 73 68 6f 75 6c 64 20 74 61 6b 65 20      should take 
2470: 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 74 68 65  into account the
2480: 20 65 78 69 73 74 69 6e 67 20 77 6f 72 6b 6c 6f   existing worklo
2490: 61 64 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e  ad parameters an
24a0: 64 20 61 76 6f 69 64 0d 0a 20 20 23 20 20 20 20  d avoid..  #    
24b0: 20 20 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 20     changing any 
24c0: 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 61 6c  that may have al
24d0: 72 65 61 64 79 20 62 65 65 6e 20 6f 76 65 72 72  ready been overr
24e0: 69 64 64 65 6e 2e 0d 0a 20 20 23 0d 0a 20 20 6c  idden...  #..  l
24f0: 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
2500: 74 69 6e 67 73 20 24 74 65 73 74 5f 63 68 61 6e  tings $test_chan
2510: 6e 65 6c 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23  nel....  #######
2520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2560: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20  ######....  #.. 
2570: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 74 72 61   # NOTE: The tra
2580: 63 65 20 6c 69 73 74 65 6e 65 72 20 75 73 65 64  ce listener used
2590: 20 77 69 74 68 20 74 68 65 20 53 51 4c 69 74 65   with the SQLite
25a0: 4c 6f 67 20 63 6c 61 73 73 20 74 6f 20 63 61 70  Log class to cap
25b0: 74 75 72 65 20 6f 75 74 70 75 74 0d 0a 20 20 23  ture output..  #
25c0: 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20         from the 
25d0: 63 6f 72 65 20 53 51 4c 69 74 65 20 6c 69 62 72  core SQLite libr
25e0: 61 72 79 20 72 65 71 75 69 72 65 73 20 69 74 73  ary requires its
25f0: 20 6f 77 6e 20 6c 6f 67 20 66 69 6c 65 20 62 65   own log file be
2600: 63 61 75 73 65 20 74 68 65 0d 0a 20 20 23 20 20  cause the..  #  
2610: 20 20 20 20 20 54 65 78 74 57 72 69 74 65 72 54       TextWriterT
2620: 72 61 63 65 4c 69 73 74 65 6e 65 72 20 63 6c 61  raceListener cla
2630: 73 73 20 6f 70 65 6e 73 20 61 6e 64 20 6c 6f 63  ss opens and loc
2640: 6b 73 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  ks the log file 
2650: 69 74 20 75 73 65 73 0d 0a 20 20 23 20 20 20 20  it uses..  #    
2660: 20 20 20 61 73 20 74 68 65 20 62 61 73 69 73 20     as the basis 
2670: 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 74  of the output st
2680: 72 65 61 6d 2e 20 20 42 65 66 6f 72 65 20 74 68  ream.  Before th
2690: 69 73 20 74 65 73 74 20 69 73 20 63 6f 6d 70 6c  is test is compl
26a0: 65 74 65 2c 0d 0a 20 20 23 20 20 20 20 20 20 20  ete,..  #       
26b0: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
26c0: 6e 74 73 20 6f 66 20 74 68 69 73 20 74 72 61 63  nts of this trac
26d0: 65 20 6c 6f 67 20 66 69 6c 65 20 77 69 6c 6c 20  e log file will 
26e0: 62 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  be copied into t
26f0: 68 65 0d 0a 20 20 23 20 20 20 20 20 20 20 6d 61  he..  #       ma
2700: 69 6e 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65  in test log file
2710: 20 61 6e 64 20 74 68 65 6e 20 64 65 6c 65 74 65   and then delete
2720: 64 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21  d...  #..  if {!
2730: 24 6e 6f 54 72 61 63 65 7d 20 74 68 65 6e 20 7b  $noTrace} then {
2740: 0d 0a 20 20 20 20 73 65 74 20 6c 6f 67 46 69 6c  ..    set logFil
2750: 65 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67  eName [appendArg
2760: 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65  s [file rootname
2770: 20 24 74 65 73 74 5f 6c 6f 67 5d 20 2e 74 72 61   $test_log] .tra
2780: 63 65 2e 6c 6f 67 5d 0d 0a 20 20 20 20 73 65 74  ce.log]..    set
2790: 75 70 4c 6f 67 67 69 6e 67 20 24 6c 6f 67 46 69  upLogging $logFi
27a0: 6c 65 4e 61 6d 65 0d 0a 20 20 7d 0d 0a 0d 0a 20  leName..  }.... 
27b0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
27c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
2800: 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f  ..  tputs $test_
2810: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2820: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d  rgs \..      "--
2830: 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20 77 69 6c  -- workloads wil
2840: 6c 20 72 65 70 65 61 74 20 22 20 24 63 6f 75 6e  l repeat " $coun
2850: 74 28 30 29 20 22 20 74 69 6d 65 28 73 29 5c 6e  t(0) " time(s)\n
2860: 22 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74  "]....  tputs $t
2870: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
2880: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
2890: 20 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73   "---- workloads
28a0: 20 77 69 6c 6c 20 68 61 76 65 20 22 20 24 63 6f   will have " $co
28b0: 75 6e 74 28 31 29 20 22 20 69 74 65 72 61 74 69  unt(1) " iterati
28c0: 6f 6e 28 73 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 74  on(s)\n"]....  t
28d0: 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e  puts $test_chann
28e0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
28f0: 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77 6f  ..      "---- wo
2900: 72 6b 6c 6f 61 64 73 20 77 69 6c 6c 20 77 61 69  rkloads will wai
2910: 74 20 61 74 20 6c 65 61 73 74 20 22 20 24 63 6f  t at least " $co
2920: 75 6e 74 28 32 29 20 5c 0d 0a 20 20 20 20 20 20  unt(2) \..      
2930: 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 28 73 29  " millisecond(s)
2940: 20 61 66 74 65 72 20 65 61 63 68 20 69 74 65 72   after each iter
2950: 61 74 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 74  ation\n"]....  t
2960: 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e  puts $test_chann
2970: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
2980: 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6d  ..      "---- sm
2990: 61 6c 6c 20 63 68 75 6e 6b 20 73 69 7a 65 20 69  all chunk size i
29a0: 73 20 22 20 24 63 6f 75 6e 74 28 33 29 20 22 20  s " $count(3) " 
29b0: 62 79 74 65 28 73 29 5c 6e 22 5d 0d 0a 0d 0a 20  byte(s)\n"].... 
29c0: 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61   tputs $test_cha
29d0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
29e0: 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20   \..      "---- 
29f0: 62 69 67 20 63 68 75 6e 6b 20 73 69 7a 65 20 69  big chunk size i
2a00: 73 20 22 20 24 63 6f 75 6e 74 28 34 29 20 22 20  s " $count(4) " 
2a10: 62 79 74 65 28 73 29 5c 6e 22 5d 0d 0a 0d 0a 20  byte(s)\n"].... 
2a20: 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61   tputs $test_cha
2a30: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
2a40: 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20   \..      "---- 
2a50: 6d 61 78 69 6d 75 6d 20 65 78 63 6c 75 64 65 64  maximum excluded
2a60: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 69 73 20   heap memory is 
2a70: 22 20 24 63 6f 75 6e 74 28 35 29 20 22 20 62 79  " $count(5) " by
2a80: 74 65 28 73 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 74  te(s)\n"]....  t
2a90: 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e  puts $test_chann
2aa0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
2ab0: 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77 6f  ..      "---- wo
2ac0: 72 6b 6c 6f 61 64 73 20 74 6f 20 62 65 20 73 6b  rkloads to be sk
2ad0: 69 70 70 65 64 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ipped... " \..  
2ae0: 20 20 20 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e      [expr {[llen
2af0: 67 74 68 20 24 6e 6f 57 6f 72 6b 6c 6f 61 64 5d  gth $noWorkload]
2b00: 20 3e 20 30 20 3f 20 24 6e 6f 57 6f 72 6b 6c 6f   > 0 ? $noWorklo
2b10: 61 64 20 3a 20 22 6e 6f 6e 65 22 7d 5d 20 5c 6e  ad : "none"}] \n
2b20: 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65  ]....  tputs $te
2b30: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2b40: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
2b50: 22 2d 2d 2d 2d 20 77 6f 72 6b 6c 6f 61 64 73 20  "---- workloads 
2b60: 70 72 69 6f 72 69 74 79 20 6f 76 65 72 72 69 64  priority overrid
2b70: 65 73 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  es... " \..     
2b80: 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68   [expr {[llength
2b90: 20 24 70 72 69 6f 72 69 74 69 65 73 5d 20 3e 20   $priorities] > 
2ba0: 30 20 3f 20 24 70 72 69 6f 72 69 74 69 65 73 20  0 ? $priorities 
2bb0: 3a 20 22 6e 6f 6e 65 22 7d 5d 20 5c 6e 5d 0d 0a  : "none"}] \n]..
2bc0: 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f  ..  tputs $test_
2bd0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2be0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d  rgs \..      "--
2bf0: 2d 2d 20 75 6e 65 78 70 65 63 74 65 64 20 65 72  -- unexpected er
2c00: 72 6f 72 73 20 22 20 5c 0d 0a 20 20 20 20 20 20  rors " \..      
2c10: 5b 65 78 70 72 20 7b 24 65 78 69 74 4f 6e 46 61  [expr {$exitOnFa
2c20: 69 6c 20 3f 20 22 77 69 6c 6c 22 20 3a 20 22 77  il ? "will" : "w
2c30: 69 6c 6c 20 6e 6f 74 22 7d 5d 20 5c 0d 0a 20 20  ill not"}] \..  
2c40: 20 20 20 20 22 20 68 61 6c 74 20 74 65 73 74 69      " halt testi
2c50: 6e 67 20 61 6e 64 20 65 78 69 74 20 74 68 65 20  ng and exit the 
2c60: 70 72 6f 63 65 73 73 5c 6e 22 5d 0d 0a 0d 0a 20  process\n"].... 
2c70: 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61   tputs $test_cha
2c80: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
2c90: 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20   \..      "---- 
2ca0: 74 68 65 20 22 20 5b 65 78 70 72 20 7b 24 63 6f  the " [expr {$co
2cb0: 54 61 73 6b 4d 65 6d 20 3f 20 22 43 6f 54 61 73  TaskMem ? "CoTas
2cc0: 6b 4d 65 6d 22 20 3a 20 22 53 51 4c 69 74 65 22  kMem" : "SQLite"
2cd0: 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 22 20 61 6c  }] \..      " al
2ce0: 6c 6f 63 61 74 6f 72 20 77 69 6c 6c 20 62 65 20  locator will be 
2cf0: 75 73 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20  used to exclude 
2d00: 68 65 61 70 20 6d 65 6d 6f 72 79 5c 6e 22 5d 0d  heap memory\n"].
2d10: 0a 0d 0a 20 20 74 70 75 74 73 20 24 74 65 73 74  ...  tputs $test
2d20: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
2d30: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d  Args \..      "-
2d40: 2d 2d 2d 20 74 72 61 63 65 20 6c 6f 67 67 69 6e  --- trace loggin
2d50: 67 20 74 6f 20 61 20 66 69 6c 65 20 69 73 20 22  g to a file is "
2d60: 20 5c 0d 0a 20 20 20 20 20 20 5b 65 78 70 72 20   \..      [expr 
2d70: 7b 24 6e 6f 54 72 61 63 65 20 3f 20 22 64 69 73  {$noTrace ? "dis
2d80: 61 62 6c 65 64 22 20 3a 20 22 65 6e 61 62 6c 65  abled" : "enable
2d90: 64 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 23 23  d"}] \n]....  ##
2da0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2db0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2dc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2de0: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
2df0: 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 43 72   #..  # NOTE: Cr
2e00: 65 61 74 65 20 74 68 65 20 77 6f 72 6b 6c 6f 61  eate the workloa
2e10: 64 20 70 72 69 6f 72 69 74 79 20 61 72 72 61 79  d priority array
2e20: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70 72   based on the pr
2e30: 69 6f 72 69 74 79 20 6c 69 73 74 20 73 65 65 6e  iority list seen
2e40: 0d 0a 20 20 23 20 20 20 20 20 20 20 6f 6e 20 74  ..  #       on t
2e50: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
2e60: 20 69 66 20 61 6e 79 2e 0d 0a 20 20 23 0d 0a 20   if any...  #.. 
2e70: 20 61 72 72 61 79 20 73 65 74 20 70 72 69 6f 72   array set prior
2e80: 69 74 79 20 24 70 72 69 6f 72 69 74 69 65 73 0d  ity $priorities.
2e90: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
2ea0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2eb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ec0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ed0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2ee0: 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e  ##....  #..  # N
2ef0: 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 73 20 23  OTE: Workloads #
2f00: 31 32 20 61 6e 64 20 23 31 33 20 63 6f 6e 74 61  12 and #13 conta
2f10: 69 6e 20 43 23 20 63 6f 64 65 20 74 68 61 74 20  in C# code that 
2f20: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 69 6c  should be compil
2f30: 65 64 2c 20 62 75 74 0d 0a 20 20 23 20 20 20 20  ed, but..  #    
2f40: 20 20 20 6f 6e 6c 79 20 6f 6e 63 65 2e 20 20 54     only once.  T
2f50: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 6b  hese variables k
2f60: 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 61  eep track of tha
2f70: 74 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  t state informat
2f80: 69 6f 6e 2e 0d 0a 20 20 23 20 20 20 20 20 20 20  ion...  #       
2f90: 41 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  An integer value
2fa0: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   in one of these
2fb0: 20 76 61 72 69 61 62 6c 65 73 20 6d 65 61 6e 73   variables means
2fc0: 20 74 68 65 20 63 6f 6d 70 69 6c 61 74 69 6f 6e   the compilation
2fd0: 20 77 61 73 0d 0a 20 20 23 20 20 20 20 20 20 20   was..  #       
2fe0: 63 6f 6d 70 6c 65 74 65 64 20 61 6e 64 20 74 68  completed and th
2ff0: 65 20 72 65 73 75 6c 74 69 6e 67 20 63 6f 6d 70  e resulting comp
3000: 69 6c 65 64 20 6d 65 74 68 6f 64 20 6d 61 79 20  iled method may 
3010: 62 65 20 69 6e 76 6f 6b 65 64 20 75 73 69 6e 67  be invoked using
3020: 20 74 68 65 0d 0a 20 20 23 20 20 20 20 20 20 20   the..  #       
3030: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e  following comman
3040: 64 20 28 77 68 65 72 65 20 24 7b 69 64 7d 20 69  d (where ${id} i
3050: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
3060: 68 65 20 76 61 72 69 61 62 6c 65 29 3a 0d 0a 20  he variable):.. 
3070: 20 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20   #..  #         
3080: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
3090: 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54 65  _Dynamic${id}.Te
30a0: 73 74 24 7b 69 64 7d 20 42 61 63 6b 75 70 41 6e  st${id} BackupAn
30b0: 64 47 65 74 44 61 74 61 0d 0a 20 20 23 0d 0a 20  dGetData..  #.. 
30c0: 20 73 65 74 20 63 6f 6d 70 69 6c 65 64 28 31 32   set compiled(12
30d0: 29 20 22 22 0d 0a 20 20 73 65 74 20 63 6f 6d 70  ) ""..  set comp
30e0: 69 6c 65 64 28 31 33 29 20 22 22 0d 0a 0d 0a 20  iled(13) "".... 
30f0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
3100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3110: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3120: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3130: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
3140: 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
3150: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   This is an in-m
3160: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 77  emory database w
3170: 69 74 68 20 73 68 61 72 65 64 20 63 61 63 68 65  ith shared cache
3180: 20 65 6e 61 62 6c 65 64 2e 0d 0a 20 20 23 0d 0a   enabled...  #..
3190: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 31    set fileName(1
31a0: 29 20 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 3f  ) file::memory:?
31b0: 63 61 63 68 65 3d 73 68 61 72 65 64 0d 0a 0d 0a  cache=shared....
31c0: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
31d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3200: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
3210: 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
3220: 3a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 72 6d  : This is a norm
3230: 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61 62  al on-disk datab
3240: 61 73 65 2e 0d 0a 20 20 23 0d 0a 20 20 73 65 74  ase...  #..  set
3250: 20 66 69 6c 65 4e 61 6d 65 28 32 29 20 5b 66 69   fileName(2) [fi
3260: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61  le join [getData
3270: 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b  baseDirectory] [
3280: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
3290: 20 20 20 20 73 74 72 65 73 73 2d 20 5b 70 69 64      stress- [pid
32a0: 5d 20 2d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  ] - [string trim
32b0: 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
32c0: 20 2d 5d 20 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 23   -] .db]]....  #
32d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3310: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
3320: 20 20 73 65 74 75 70 44 62 20 24 66 69 6c 65 4e    setupDb $fileN
3330: 61 6d 65 28 31 29 20 22 22 20 22 22 20 22 22 20  ame(1) "" "" "" 
3340: 22 22 20 22 22 20 66 61 6c 73 65 20 66 61 6c 73  "" "" false fals
3350: 65 20 74 72 75 65 20 74 72 75 65 20 73 72 63 44  e true true srcD
3360: 62 0d 0a 20 20 73 65 74 75 70 44 62 20 24 66 69  b..  setupDb $fi
3370: 6c 65 4e 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 23  leName(2)....  #
3380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
33a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
33b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
33c0: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
33d0: 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54    #..  # NOTE: T
33e0: 68 69 73 20 73 65 72 76 65 73 20 74 77 6f 20 70  his serves two p
33f0: 75 72 70 6f 73 65 73 2e 20 20 46 69 72 73 74 2c  urposes.  First,
3400: 20 69 74 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f   it allows us to
3410: 20 76 65 72 69 66 79 20 74 68 65 20 74 72 61 63   verify the trac
3420: 65 0d 0a 20 20 23 20 20 20 20 20 20 20 6c 6f 67  e..  #       log
3430: 67 69 6e 67 20 73 75 62 73 79 73 74 65 6d 20 69  ging subsystem i
3440: 73 20 77 6f 72 6b 69 6e 67 20 70 72 6f 70 65 72  s working proper
3450: 6c 79 2e 20 20 53 65 63 6f 6e 64 2c 20 69 74 20  ly.  Second, it 
3460: 70 6c 61 63 65 73 20 74 68 65 20 66 69 6c 65 0d  places the file.
3470: 0a 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20  .  #       name 
3480: 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69 61 74  for the associat
3490: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
34a0: 20 69 6e 74 6f 20 74 68 65 20 74 72 61 63 65 20   into the trace 
34b0: 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a  log file...  #..
34c0: 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    set connection
34d0: 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f   [getDbConnectio
34e0: 6e 5d 0d 0a 0d 0a 20 20 24 63 6f 6e 6e 65 63 74  n]....  $connect
34f0: 69 6f 6e 20 4c 6f 67 4d 65 73 73 61 67 65 20 30  ion LogMessage 0
3500: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
3510: 20 20 20 20 20 20 22 73 74 61 72 74 69 6e 67 20        "starting 
3520: 73 74 72 65 73 73 20 74 65 73 74 20 75 73 69 6e  stress test usin
3530: 67 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24  g database \"" $
3540: 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c 22 2e 2e  fileName(2) \"..
3550: 2e 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23  .]....  ########
3560: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3570: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3580: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
35a0: 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20  #####..  #      
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44          WORKLOAD
35d0: 20 23 31 20 28 41 29 20 20 20 20 20 20 20 20 20   #1 (A)         
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23       #..  ######
3600: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3610: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3620: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3630: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3640: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
3650: 20 77 6f 72 6b 6c 6f 61 64 28 31 29 20 5b 6c 69   workload(1) [li
3660: 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73  st \..      [lis
3670: 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73  t srcFileName ds
3680: 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20  tFileName table 
3690: 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f  count1 count2 co
36a0: 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a  unt3] {..    #..
36b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b      # NOTE: Work
36c0: 6c 6f 61 64 20 23 31 2c 20 43 52 45 41 54 45 20  load #1, CREATE 
36d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73  TABLE statements
36e0: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 6c 61  ...    #..    la
36f0: 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 29  ppend ::times(1)
3700: 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b   [lindex [time {
3710: 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20  ..      setupDb 
3720: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 22 22 20  $dstFileName "" 
3730: 22 22 20 22 22 20 22 22 20 22 22 20 74 72 75 65  "" "" "" "" true
3740: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 66 6f   false..      fo
3750: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 32 7d 20  r {set index 2} 
3760: 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e  {$index <= $coun
3770: 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  t1} {incr index}
3780: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
3790: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
37a0: 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
37b0: 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20  $db [appendArgs 
37c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
37d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
37e0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 22 20  F NOT EXISTS t" 
37f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
3800: 20 24 69 6e 64 65 78 20 22 28 78 20 50 52 49 4d   $index "(x PRIM
3810: 41 52 59 20 4b 45 59 2c 20 79 2c 20 7a 29 3b 22  ARY KEY, y, z);"
3820: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f  ]..          sho
3830: 77 54 65 73 74 20 41 0d 0a 20 20 20 20 20 20 20  wTest A..       
3840: 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
3850: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
3860: 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72 6f  {[isExpectedErro
3870: 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  r $error]} then 
3880: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
3890: 68 6f 77 54 65 73 74 20 61 0d 0a 20 20 20 20 20  howTest a..     
38a0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
38b0: 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 54             failT
38c0: 65 73 74 20 61 20 24 65 72 72 6f 72 0d 0a 20 20  est a $error..  
38d0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
38e0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
38f0: 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24       cleanupDb $
3900: 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66  dstFileName db f
3910: 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d  alse true false.
3920: 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20  .      doneTest 
3930: 41 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20  A..    }] 0]..  
3940: 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23  }]....  ########
3950: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3960: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3970: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3980: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3990: 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20  #####..  #      
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44          WORKLOAD
39c0: 20 23 32 20 28 42 29 20 20 20 20 20 20 20 20 20   #2 (B)         
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39e0: 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23       #..  ######
39f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3a00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3a10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3a20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3a30: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
3a40: 20 77 6f 72 6b 6c 6f 61 64 28 32 29 20 5b 6c 69   workload(2) [li
3a50: 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73  st \..      [lis
3a60: 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73  t srcFileName ds
3a70: 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20  tFileName table 
3a80: 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f  count1 count2 co
3a90: 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a  unt3] {..    #..
3aa0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b      # NOTE: Work
3ab0: 6c 6f 61 64 20 23 32 2c 20 44 52 4f 50 20 54 41  load #2, DROP TA
3ac0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d  BLE statements..
3ad0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 6c 61 70 70  .    #..    lapp
3ae0: 65 6e 64 20 3a 3a 74 69 6d 65 73 28 32 29 20 5b  end ::times(2) [
3af0: 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a  lindex [time {..
3b00: 20 20 20 20 20 20 73 65 74 75 70 44 62 20 24 64        setupDb $d
3b10: 73 74 46 69 6c 65 4e 61 6d 65 20 22 22 20 22 22  stFileName "" ""
3b20: 20 22 22 20 22 22 20 22 22 20 74 72 75 65 20 66   "" "" "" true f
3b30: 61 6c 73 65 0d 0a 20 20 20 20 20 20 66 6f 72 20  alse..      for 
3b40: 7b 73 65 74 20 69 6e 64 65 78 20 32 7d 20 7b 24  {set index 2} {$
3b50: 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31  index <= $count1
3b60: 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
3b70: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
3b80: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
3b90: 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64    sql execute $d
3ba0: 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  b [appendArgs \.
3bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
3bc0: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
3bd0: 49 53 54 53 20 74 22 20 24 69 6e 64 65 78 20 5c  ISTS t" $index \
3be0: 3b 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68  ;]..          sh
3bf0: 6f 77 54 65 73 74 20 42 0d 0a 20 20 20 20 20 20  owTest B..      
3c00: 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
3c10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
3c20: 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72   {[isExpectedErr
3c30: 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e  or $error]} then
3c40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
3c50: 73 68 6f 77 54 65 73 74 20 62 0d 0a 20 20 20 20  showTest b..    
3c60: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
3c80: 54 65 73 74 20 62 20 24 65 72 72 6f 72 0d 0a 20  Test b $error.. 
3c90: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
3ca0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
3cb0: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
3cc0: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20  $dstFileName db 
3cd0: 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65  false true false
3ce0: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
3cf0: 20 42 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   B..    }] 0].. 
3d00: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
3d10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d50: 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20  ######..  #     
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41           WORKLOA
3d80: 44 20 23 33 20 28 43 29 20 20 20 20 20 20 20 20  D #3 (C)        
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 20 20 20 20 20 23 0d 0a 20 20 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 23 23 23 23 23 23 23  ################
3dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3de0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3df0: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
3e00: 74 20 77 6f 72 6b 6c 6f 61 64 28 33 29 20 5b 6c  t workload(3) [l
3e10: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69  ist \..      [li
3e20: 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64  st srcFileName d
3e30: 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65  stFileName table
3e40: 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63   count1 count2 c
3e50: 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d  ount3] {..    #.
3e60: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72  .    # NOTE: Wor
3e70: 6b 6c 6f 61 64 20 23 33 2c 20 22 73 6d 61 6c 6c  kload #3, "small
3e80: 22 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  " SELECT stateme
3e90: 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  nts...    #..   
3ea0: 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73   lappend ::times
3eb0: 28 33 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d  (3) [lindex [tim
3ec0: 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 75 70  e {..      setup
3ed0: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
3ee0: 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20 74  "" "" "" "" "" t
3ef0: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
3f00: 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
3f10: 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63  1} {$index <= $c
3f20: 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64  ount1} {incr ind
3f30: 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ex} {..        i
3f40: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
3f50: 20 20 20 20 20 20 20 73 65 74 20 72 65 61 64 65         set reade
3f60: 72 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d  r [sql execute -
3f70: 65 78 65 63 75 74 65 20 72 65 61 64 65 72 20 5c  execute reader \
3f80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3f90: 2d 66 6f 72 6d 61 74 20 64 61 74 61 52 65 61 64  -format dataRead
3fa0: 65 72 20 2d 61 6c 69 61 73 20 24 64 62 20 5b 61  er -alias $db [a
3fb0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
3fc0: 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
3fd0: 43 54 20 78 2c 20 79 20 46 52 4f 4d 20 22 20 24  CT x, y FROM " $
3fe0: 74 61 62 6c 65 20 22 20 57 48 45 52 45 20 7a 20  table " WHERE z 
3ff0: 3d 20 27 73 6d 61 6c 6c 27 3b 22 5d 5d 0d 0a 20  = 'small';"]].. 
4000: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 7b           while {
4010: 5b 24 72 65 61 64 65 72 20 52 65 61 64 5d 7d 20  [$reader Read]} 
4020: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
4030: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
4040: 4e 4f 54 45 3a 20 44 6f 20 6e 6f 74 68 69 6e 67  NOTE: Do nothing
4050: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
4060: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
4070: 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d           unset -
4080: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72 65 61 64 65  nocomplain reade
4090: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f  r..          sho
40a0: 77 54 65 73 74 20 43 0d 0a 20 20 20 20 20 20 20  wTest C..       
40b0: 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
40c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
40d0: 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72 72 6f  {[isExpectedErro
40e0: 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  r $error]} then 
40f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
4100: 68 6f 77 54 65 73 74 20 63 0d 0a 20 20 20 20 20  howTest c..     
4110: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
4120: 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 54             failT
4130: 65 73 74 20 63 20 24 65 72 72 6f 72 0d 0a 20 20  est c $error..  
4140: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
4150: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
4160: 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24       cleanupDb $
4170: 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66  dstFileName db f
4180: 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d  alse true false.
4190: 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20  .      doneTest 
41a0: 43 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20  C..    }] 0]..  
41b0: 7d 5d 0d 0a 0d 0a 20 20 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 23 23 0d 0a 20 20 23 20 20 20 20 20 20  #####..  #      
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4220: 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44          WORKLOAD
4230: 20 23 34 20 28 44 29 20 20 20 20 20 20 20 20 20   #4 (D)         
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4250: 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23       #..  ######
4260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4280: 23 23 23 23 23 23 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 23 23 0d 0a 0d 0a 20 20 73 65 74  #######....  set
42b0: 20 77 6f 72 6b 6c 6f 61 64 28 34 29 20 5b 6c 69   workload(4) [li
42c0: 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73  st \..      [lis
42d0: 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73  t srcFileName ds
42e0: 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20  tFileName table 
42f0: 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f  count1 count2 co
4300: 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a  unt3] {..    #..
4310: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b      # NOTE: Work
4320: 6c 6f 61 64 20 23 34 2c 20 22 62 69 67 22 20 53  load #4, "big" S
4330: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
4340: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 6c 61  ...    #..    la
4350: 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 34 29  ppend ::times(4)
4360: 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b   [lindex [time {
4370: 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20  ..      setupDb 
4380: 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 22 22 20  $dstFileName "" 
4390: 22 22 20 22 22 20 22 22 20 22 22 20 74 72 75 65  "" "" "" "" true
43a0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 66 6f   false..      fo
43b0: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
43c0: 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e  {$index <= $coun
43d0: 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  t1} {incr index}
43e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
43f0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
4400: 20 20 20 20 73 65 74 20 72 65 61 64 65 72 20 5b      set reader [
4410: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
4420: 63 75 74 65 20 72 65 61 64 65 72 20 5c 0d 0a 20  cute reader \.. 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 66 6f               -fo
4440: 72 6d 61 74 20 64 61 74 61 52 65 61 64 65 72 20  rmat dataReader 
4450: 2d 61 6c 69 61 73 20 24 64 62 20 5b 61 70 70 65  -alias $db [appe
4460: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
4470: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
4480: 78 2c 20 79 20 46 52 4f 4d 20 22 20 24 74 61 62  x, y FROM " $tab
4490: 6c 65 20 22 20 57 48 45 52 45 20 7a 20 3d 20 27  le " WHERE z = '
44a0: 62 69 67 27 3b 22 5d 5d 0d 0a 20 20 20 20 20 20  big';"]]..      
44b0: 20 20 20 20 77 68 69 6c 65 20 7b 5b 24 72 65 61      while {[$rea
44c0: 64 65 72 20 52 65 61 64 5d 7d 20 7b 0d 0a 20 20  der Read]} {..  
44d0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
44e0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
44f0: 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20   Do nothing...  
4500: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
4510: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4520: 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d      unset -nocom
4530: 70 6c 61 69 6e 20 72 65 61 64 65 72 0d 0a 20 20  plain reader..  
4540: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
4550: 20 44 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72   D..        } er
4560: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
4570: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45          if {[isE
4580: 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72  xpectedError $er
4590: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
45a0: 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65            showTe
45b0: 73 74 20 64 0d 0a 20 20 20 20 20 20 20 20 20 20  st d..          
45c0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
45d0: 20 20 20 20 20 20 66 61 69 6c 54 65 73 74 20 64        failTest d
45e0: 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20   $error..       
45f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
4600: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
4610: 63 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46 69  cleanupDb $dstFi
4620: 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20  leName db false 
4630: 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20  true false..    
4640: 20 20 64 6f 6e 65 54 65 73 74 20 44 0d 0a 20 20    doneTest D..  
4650: 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d    }] 0]..  }]...
4660: 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4690: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
46a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
46b0: 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20 20 20  ..  #           
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 35 20 28     WORKLOAD #5 (
46e0: 45 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E)              
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 23 0d 0a 20 20 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 23 23 23 23 23 23 23 23 23 23 23  ################
4730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4750: 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b  ##....  set work
4760: 6c 6f 61 64 28 35 29 20 5b 6c 69 73 74 20 5c 0d  load(5) [list \.
4770: 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63  .      [list src
4780: 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65  FileName dstFile
4790: 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74  Name table count
47a0: 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d  1 count2 count3]
47b0: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
47c0: 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20   NOTE: Workload 
47d0: 23 35 2c 20 22 73 6d 61 6c 6c 22 20 49 4e 53 45  #5, "small" INSE
47e0: 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a  RT statements...
47f0: 20 20 20 20 23 0d 0a 20 20 20 20 6c 61 70 70 65      #..    lappe
4800: 6e 64 20 3a 3a 74 69 6d 65 73 28 35 29 20 5b 6c  nd ::times(5) [l
4810: 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20  index [time {.. 
4820: 20 20 20 20 20 73 65 74 75 70 44 62 20 24 64 73       setupDb $ds
4830: 74 46 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20  tFileName "" "" 
4840: 22 22 20 22 22 20 22 22 20 74 72 75 65 20 66 61  "" "" "" true fa
4850: 6c 73 65 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b  lse..      for {
4860: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
4870: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
4880: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
4890: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
48a0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
48b0: 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
48c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 49 4e   [appendArgs "IN
48d0: 53 45 52 54 20 49 4e 54 4f 20 22 20 24 74 61 62  SERT INTO " $tab
48e0: 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
48f0: 20 20 20 20 22 28 78 2c 20 79 2c 20 7a 29 20 56      "(x, y, z) V
4900: 41 4c 55 45 53 28 27 22 20 5b 66 6f 72 6d 61 74  ALUES('" [format
4910: 20 25 6c 58 20 5b 65 78 70 72 20 7b 72 61 6e 64   %lX [expr {rand
4920: 6f 6d 28 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20  om()}]] \..     
4930: 20 20 20 20 20 20 20 20 20 22 27 2c 20 27 22 20           "', '" 
4940: 5b 62 61 73 65 36 34 20 65 6e 63 6f 64 65 20 2d  [base64 encode -
4950: 2d 20 5b 65 78 70 72 20 7b 72 61 6e 64 73 74 72  - [expr {randstr
4960: 28 24 63 6f 75 6e 74 32 29 7d 5d 5d 20 5c 0d 0a  ($count2)}]] \..
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27                "'
4980: 2c 20 27 73 6d 61 6c 6c 27 29 3b 22 5d 0d 0a 20  , 'small');"].. 
4990: 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73           showTes
49a0: 74 20 45 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  t E..        } e
49b0: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
49c0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
49d0: 45 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65  ExpectedError $e
49e0: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
49f0: 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54             showT
4a00: 65 73 74 20 65 0d 0a 20 20 20 20 20 20 20 20 20  est e..         
4a10: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
4a20: 20 20 20 20 20 20 20 66 61 69 6c 54 65 73 74 20         failTest 
4a30: 65 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  e $error..      
4a40: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
4a50: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
4a60: 20 63 6c 65 61 6e 75 70 44 62 20 24 64 73 74 46   cleanupDb $dstF
4a70: 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
4a80: 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20   true false..   
4a90: 20 20 20 64 6f 6e 65 54 65 73 74 20 45 0d 0a 20     doneTest E.. 
4aa0: 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a     }] 0]..  }]..
4ab0: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
4ac0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ad0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ae0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4af0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b00: 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20 20  #..  #          
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 36 20      WORKLOAD #6 
4b30: 28 46 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (F)             
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23   #..  ##########
4b60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ba0: 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72  ###....  set wor
4bb0: 6b 6c 6f 61 64 28 36 29 20 5b 6c 69 73 74 20 5c  kload(6) [list \
4bc0: 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72  ..      [list sr
4bd0: 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c  cFileName dstFil
4be0: 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e  eName table coun
4bf0: 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33  t1 count2 count3
4c00: 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ] {..    #..    
4c10: 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64  # NOTE: Workload
4c20: 20 23 36 2c 20 22 62 69 67 22 20 49 4e 53 45 52   #6, "big" INSER
4c30: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20  T statements... 
4c40: 20 20 20 23 0d 0a 20 20 20 20 6c 61 70 70 65 6e     #..    lappen
4c50: 64 20 3a 3a 74 69 6d 65 73 28 36 29 20 5b 6c 69  d ::times(6) [li
4c60: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
4c70: 20 20 20 20 73 65 74 75 70 44 62 20 24 64 73 74      setupDb $dst
4c80: 46 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22  FileName "" "" "
4c90: 22 20 22 22 20 22 22 20 74 72 75 65 20 66 61 6c  " "" "" true fal
4ca0: 73 65 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73  se..      for {s
4cb0: 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e  et index 1} {$in
4cc0: 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20  dex <= $count1} 
4cd0: 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
4ce0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
4cf0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
4d00: 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
4d10: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 49 4e 53  [appendArgs "INS
4d20: 45 52 54 20 49 4e 54 4f 20 22 20 24 74 61 62 6c  ERT INTO " $tabl
4d30: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
4d40: 20 20 20 22 28 78 2c 20 79 2c 20 7a 29 20 56 41     "(x, y, z) VA
4d50: 4c 55 45 53 28 27 22 20 5b 66 6f 72 6d 61 74 20  LUES('" [format 
4d60: 25 6c 58 20 5b 65 78 70 72 20 7b 72 61 6e 64 6f  %lX [expr {rando
4d70: 6d 28 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20  m()}]] \..      
4d80: 20 20 20 20 20 20 20 20 22 27 2c 20 52 41 4e 44          "', RAND
4d90: 4f 4d 42 4c 4f 42 28 22 20 24 63 6f 75 6e 74 33  OMBLOB(" $count3
4da0: 20 22 29 2c 20 27 62 69 67 27 29 3b 22 5d 0d 0a   "), 'big');"]..
4db0: 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54 65            showTe
4dc0: 73 74 20 46 0d 0a 20 20 20 20 20 20 20 20 7d 20  st F..        } 
4dd0: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
4de0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69            if {[i
4df0: 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20 24  sExpectedError $
4e00: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77              show
4e20: 54 65 73 74 20 66 0d 0a 20 20 20 20 20 20 20 20  Test f..        
4e30: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
4e40: 20 20 20 20 20 20 20 20 66 61 69 6c 54 65 73 74          failTest
4e50: 20 66 20 24 65 72 72 6f 72 0d 0a 20 20 20 20 20   f $error..     
4e60: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4e70: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
4e80: 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64 73 74    cleanupDb $dst
4e90: 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73  FileName db fals
4ea0: 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20  e true false..  
4eb0: 20 20 20 20 64 6f 6e 65 54 65 73 74 20 46 0d 0a      doneTest F..
4ec0: 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d      }] 0]..  }].
4ed0: 0a 0d 0a 20 20 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 23 23  ################
4f00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4f10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4f20: 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20  ##..  #         
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f40: 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 37       WORKLOAD #7
4f50: 20 28 47 29 20 20 20 20 20 20 20 20 20 20 20 20   (G)            
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23    #..  #########
4f80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4f90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4fa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4fb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4fc0: 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f  ####....  set wo
4fd0: 72 6b 6c 6f 61 64 28 37 29 20 5b 6c 69 73 74 20  rkload(7) [list 
4fe0: 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73  \..      [list s
4ff0: 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69  rcFileName dstFi
5000: 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75  leName table cou
5010: 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74  nt1 count2 count
5020: 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20  3] {..    #..   
5030: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
5040: 64 20 23 37 2c 20 22 73 6d 61 6c 6c 22 20 55 50  d #7, "small" UP
5050: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e  DATE statements.
5060: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 6c 61 70  ..    #..    lap
5070: 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 37 29 20  pend ::times(7) 
5080: 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d  [lindex [time {.
5090: 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20 24  .      setupDb $
50a0: 64 73 74 46 69 6c 65 4e 61 6d 65 20 22 22 20 22  dstFileName "" "
50b0: 22 20 22 22 20 22 22 20 22 22 20 74 72 75 65 20  " "" "" "" true 
50c0: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 66 6f 72  false..      for
50d0: 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b   {set index 1} {
50e0: 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74  $index <= $count
50f0: 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  1} {incr index} 
5100: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
5110: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
5120: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
5130: 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  db [appendArgs "
5140: 55 50 44 41 54 45 20 22 20 24 74 61 62 6c 65 20  UPDATE " $table 
5150: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
5160: 20 22 20 53 45 54 20 79 20 3d 20 27 22 20 5b 62   " SET y = '" [b
5170: 61 73 65 36 34 20 65 6e 63 6f 64 65 20 2d 2d 20  ase64 encode -- 
5180: 5b 65 78 70 72 20 7b 72 61 6e 64 73 74 72 28 24  [expr {randstr($
5190: 63 6f 75 6e 74 32 29 7d 5d 5d 20 5c 0d 0a 20 20  count2)}]] \..  
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 27 20 57              "' W
51b0: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 22 20 5b  HERE x LIKE '" [
51c0: 66 6f 72 6d 61 74 20 25 58 20 24 69 6e 64 65 78  format %X $index
51d0: 5d 20 22 25 27 20 41 4e 44 20 7a 20 3d 20 27 73  ] "%' AND z = 's
51e0: 6d 61 6c 6c 27 3b 22 5d 0d 0a 20 20 20 20 20 20  mall';"]..      
51f0: 20 20 20 20 73 68 6f 77 54 65 73 74 20 47 0d 0a      showTest G..
5200: 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
5210: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5220: 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63      if {[isExpec
5230: 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d  tedError $error]
5240: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5250: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 67        showTest g
5260: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
5270: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
5280: 20 20 66 61 69 6c 54 65 73 74 20 67 20 24 65 72    failTest g $er
5290: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ror..          }
52a0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
52b0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61     }..      clea
52c0: 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61  nupDb $dstFileNa
52d0: 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72 75 65  me db false true
52e0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f   false..      do
52f0: 6e 65 54 65 73 74 20 47 0d 0a 20 20 20 20 7d 5d  neTest G..    }]
5300: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23   0]..  }]....  #
5310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5350: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
5360: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
5380: 4f 52 4b 4c 4f 41 44 20 23 38 20 28 48 29 20 20  ORKLOAD #8 (H)  
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
53b0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
53c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
53d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
53e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
53f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
5400: 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64  ..  set workload
5410: 28 38 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  (8) [list \..   
5420: 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65     [list srcFile
5430: 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65  Name dstFileName
5440: 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f   table count1 co
5450: 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a  unt2 count3] {..
5460: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
5470: 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 38 2c 20  E: Workload #8, 
5480: 22 62 69 67 22 20 55 50 44 41 54 45 20 73 74 61  "big" UPDATE sta
5490: 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d  tements...    #.
54a0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74  .    lappend ::t
54b0: 69 6d 65 73 28 38 29 20 5b 6c 69 6e 64 65 78 20  imes(8) [lindex 
54c0: 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 73  [time {..      s
54d0: 65 74 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e  etupDb $dstFileN
54e0: 61 6d 65 20 22 22 20 22 22 20 22 22 20 22 22 20  ame "" "" "" "" 
54f0: 22 22 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20  "" true false.. 
5500: 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e       for {set in
5510: 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c  dex 1} {$index <
5520: 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72  = $count1} {incr
5530: 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20   index} {..     
5540: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
5550: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65  .          sql e
5560: 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65  xecute $db [appe
5570: 6e 64 41 72 67 73 20 22 55 50 44 41 54 45 20 22  ndArgs "UPDATE "
5580: 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20   $table \..     
5590: 20 20 20 20 20 20 20 20 20 22 20 53 45 54 20 79           " SET y
55a0: 20 3d 20 52 41 4e 44 4f 4d 42 4c 4f 42 28 22 20   = RANDOMBLOB(" 
55b0: 24 63 6f 75 6e 74 33 20 22 29 20 57 48 45 52 45  $count3 ") WHERE
55c0: 20 78 20 4c 49 4b 45 20 27 22 20 5c 0d 0a 20 20   x LIKE '" \..  
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72              [for
55e0: 6d 61 74 20 25 58 20 24 69 6e 64 65 78 5d 20 22  mat %X $index] "
55f0: 25 27 20 41 4e 44 20 7a 20 3d 20 27 62 69 67 27  %' AND z = 'big'
5600: 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ;"]..          s
5610: 68 6f 77 54 65 73 74 20 48 0d 0a 20 20 20 20 20  howTest H..     
5620: 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
5630: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
5640: 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72  f {[isExpectedEr
5650: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
5660: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
5670: 20 73 68 6f 77 54 65 73 74 20 68 0d 0a 20 20 20   showTest h..   
5680: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
5690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69  .            fai
56a0: 6c 54 65 73 74 20 68 20 24 65 72 72 6f 72 0d 0a  lTest h $error..
56b0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
56c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
56d0: 0a 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62  .      cleanupDb
56e0: 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20 64 62   $dstFileName db
56f0: 20 66 61 6c 73 65 20 74 72 75 65 20 66 61 6c 73   false true fals
5700: 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73  e..      doneTes
5710: 74 20 48 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a  t H..    }] 0]..
5720: 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23    }]....  ######
5730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5750: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5770: 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20  #######..  #    
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f            WORKLO
57a0: 41 44 20 23 39 20 28 49 29 20 20 20 20 20 20 20  AD #9 (I)       
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23         #..  ####
57d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
57e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
57f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5800: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5810: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73  #########....  s
5820: 65 74 20 77 6f 72 6b 6c 6f 61 64 28 39 29 20 5b  et workload(9) [
5830: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c  list \..      [l
5840: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
5850: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
5860: 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20  e count1 count2 
5870: 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23  count3] {..    #
5880: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f  ..    # NOTE: Wo
5890: 72 6b 6c 6f 61 64 20 23 39 2c 20 22 73 6d 61 6c  rkload #9, "smal
58a0: 6c 22 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  l" DELETE statem
58b0: 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  ents...    #..  
58c0: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65    lappend ::time
58d0: 73 28 39 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69  s(9) [lindex [ti
58e0: 6d 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 75  me {..      setu
58f0: 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65  pDb $dstFileName
5900: 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20   "" "" "" "" "" 
5910: 74 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20  true false..    
5920: 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
5930: 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24   1} {$index <= $
5940: 63 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e  count1} {incr in
5950: 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  dex} {..        
5960: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
5970: 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
5980: 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41  ute $db [appendA
5990: 72 67 73 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  rgs "DELETE FROM
59a0: 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a 20 20 20   " $table \..   
59b0: 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
59c0: 52 45 20 78 20 4c 49 4b 45 20 27 22 20 5b 66 6f  RE x LIKE '" [fo
59d0: 72 6d 61 74 20 25 58 20 24 69 6e 64 65 78 5d 20  rmat %X $index] 
59e0: 22 25 27 20 41 4e 44 20 7a 20 3d 20 27 73 6d 61  "%' AND z = 'sma
59f0: 6c 6c 27 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20  ll';"]..        
5a00: 20 20 73 68 6f 77 54 65 73 74 20 49 0d 0a 20 20    showTest I..  
5a10: 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20        } error]} 
5a20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5a30: 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65    if {[isExpecte
5a40: 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20  dError $error]} 
5a50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5a60: 20 20 20 20 73 68 6f 77 54 65 73 74 20 69 0d 0a      showTest i..
5a70: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
5a80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5a90: 66 61 69 6c 54 65 73 74 20 69 20 24 65 72 72 6f  failTest i $erro
5aa0: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  r..          }..
5ab0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
5ac0: 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61 6e 75   }..      cleanu
5ad0: 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65  pDb $dstFileName
5ae0: 20 64 62 20 66 61 6c 73 65 20 74 72 75 65 20 66   db false true f
5af0: 61 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f 6e 65  alse..      done
5b00: 54 65 73 74 20 49 0d 0a 20 20 20 20 7d 5d 20 30  Test I..    }] 0
5b10: 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23  ]..  }]....  ###
5b20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5b30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5b40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5b50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5b60: 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20  ##########..  # 
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 52               WOR
5b90: 4b 4c 4f 41 44 20 23 31 30 20 28 4a 29 20 20 20  KLOAD #10 (J)   
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bb0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23            #..  #
5bc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5bd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5be0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5bf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5c00: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
5c10: 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 31    set workload(1
5c20: 30 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  0) [list \..    
5c30: 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e    [list srcFileN
5c40: 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20  ame dstFileName 
5c50: 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75  table count1 cou
5c60: 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20  nt2 count3] {.. 
5c70: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
5c80: 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 30 2c 20  : Workload #10, 
5c90: 22 62 69 67 22 20 44 45 4c 45 54 45 20 73 74 61  "big" DELETE sta
5ca0: 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 23 0d  tements...    #.
5cb0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74  .    lappend ::t
5cc0: 69 6d 65 73 28 31 30 29 20 5b 6c 69 6e 64 65 78  imes(10) [lindex
5cd0: 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20   [time {..      
5ce0: 73 65 74 75 70 44 62 20 24 64 73 74 46 69 6c 65  setupDb $dstFile
5cf0: 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20 22 22  Name "" "" "" ""
5d00: 20 22 22 20 74 72 75 65 20 66 61 6c 73 65 0d 0a   "" true false..
5d10: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
5d20: 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
5d30: 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63  <= $count1} {inc
5d40: 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
5d50: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
5d60: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20  ..          sql 
5d70: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
5d80: 65 6e 64 41 72 67 73 20 22 44 45 4c 45 54 45 20  endArgs "DELETE 
5d90: 46 52 4f 4d 20 22 20 24 74 61 62 6c 65 20 5c 0d  FROM " $table \.
5da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
5db0: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 22   WHERE x LIKE '"
5dc0: 20 5b 66 6f 72 6d 61 74 20 25 58 20 24 69 6e 64   [format %X $ind
5dd0: 65 78 5d 20 22 25 27 20 41 4e 44 20 7a 20 3d 20  ex] "%' AND z = 
5de0: 27 62 69 67 27 3b 22 5d 0d 0a 20 20 20 20 20 20  'big';"]..      
5df0: 20 20 20 20 73 68 6f 77 54 65 73 74 20 4a 0d 0a      showTest J..
5e00: 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
5e10: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5e20: 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65 63      if {[isExpec
5e30: 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72 5d  tedError $error]
5e40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5e50: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 6a        showTest j
5e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
5e70: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
5e80: 20 20 66 61 69 6c 54 65 73 74 20 6a 20 24 65 72    failTest j $er
5e90: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ror..          }
5ea0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
5eb0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65 61     }..      clea
5ec0: 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e 61  nupDb $dstFileNa
5ed0: 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72 75 65  me db false true
5ee0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 64 6f   false..      do
5ef0: 6e 65 54 65 73 74 20 4a 0d 0a 20 20 20 20 7d 5d  neTest J..    }]
5f00: 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 23   0]..  }]....  #
5f10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5f20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5f30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5f40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5f50: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
5f60: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
5f80: 4f 52 4b 4c 4f 41 44 20 23 31 31 20 28 4b 29 20  ORKLOAD #11 (K) 
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
5fb0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
5fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
6000: 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61 64  ..  set workload
6010: 28 31 31 29 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  (11) [list \..  
6020: 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69 6c      [list srcFil
6030: 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61 6d  eName dstFileNam
6040: 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20 63  e table count1 c
6050: 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b 0d  ount2 count3] {.
6060: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
6070: 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 31  TE: Workload #11
6080: 2c 20 56 41 43 55 55 4d 20 73 74 61 74 65 6d 65  , VACUUM stateme
6090: 6e 74 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  nt...    #..    
60a0: 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28  lappend ::times(
60b0: 31 31 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d  11) [lindex [tim
60c0: 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 75 70  e {..      setup
60d0: 44 62 20 24 64 73 74 46 69 6c 65 4e 61 6d 65 20  Db $dstFileName 
60e0: 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20 74  "" "" "" "" "" t
60f0: 72 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  rue false..     
6100: 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
6110: 31 7d 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63  1} {$index <= $c
6120: 6f 75 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64  ount1} {incr ind
6130: 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ex} {..        i
6140: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
6150: 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
6160: 74 65 20 24 64 62 20 22 56 41 43 55 55 4d 3b 22  te $db "VACUUM;"
6170: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77  ..          show
6180: 54 65 73 74 20 4b 0d 0a 20 20 20 20 20 20 20 20  Test K..        
6190: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
61a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
61b0: 5b 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72  [isExpectedError
61c0: 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b   $error]} then {
61d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68  ..            sh
61e0: 6f 77 54 65 73 74 20 6b 0d 0a 20 20 20 20 20 20  owTest k..      
61f0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
6200: 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65            failTe
6210: 73 74 20 6b 20 24 65 72 72 6f 72 0d 0a 20 20 20  st k $error..   
6220: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
6230: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
6240: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 64      cleanupDb $d
6250: 73 74 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61  stFileName db fa
6260: 6c 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a  lse true false..
6270: 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20 4b        doneTest K
6280: 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d  ..    }] 0]..  }
6290: 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23  ]....  #########
62a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
62b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
62c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
62d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
62e0: 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20  ####..  #       
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6300: 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20         WORKLOAD 
6310: 23 31 32 20 28 4c 29 20 20 20 20 20 20 20 20 20  #12 (L)         
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6330: 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23 23 23      #..  #######
6340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6360: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6370: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6380: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20  ######....  set 
6390: 77 6f 72 6b 6c 6f 61 64 28 31 32 29 20 5b 6c 69  workload(12) [li
63a0: 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73  st \..      [lis
63b0: 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73  t srcFileName ds
63c0: 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20  tFileName table 
63d0: 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f  count1 count2 co
63e0: 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a  unt3] {..    #..
63f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b      # NOTE: Work
6400: 6c 6f 61 64 20 23 31 32 2c 20 62 61 63 6b 75 70  load #12, backup
6410: 20 74 6f 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   to in-memory da
6420: 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 23 0d 0a  tabase...    #..
6430: 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69      lappend ::ti
6440: 6d 65 73 28 31 32 29 20 5b 6c 69 6e 64 65 78 20  mes(12) [lindex 
6450: 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20 66  [time {..      f
6460: 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d  or {set index 1}
6470: 20 7b 24 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75   {$index <= $cou
6480: 6e 74 31 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  nt1} {incr index
6490: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  } {..        if 
64a0: 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65  {[string is inte
64b0: 67 65 72 20 2d 73 74 72 69 63 74 20 24 3a 3a 63  ger -strict $::c
64c0: 6f 6d 70 69 6c 65 64 28 31 32 29 5d 7d 20 74 68  ompiled(12)]} th
64d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
64e0: 73 65 74 20 69 64 20 24 3a 3a 63 6f 6d 70 69 6c  set id $::compil
64f0: 65 64 28 31 32 29 3b 20 23 20 4e 4f 54 45 3a 20  ed(12); # NOTE: 
6500: 41 6c 72 65 61 64 79 20 63 6f 6d 70 69 6c 65 64  Already compiled
6510: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
6520: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
6530: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
6540: 76 6f 6b 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69  voke _Dynamic${i
6550: 64 7d 2e 54 65 73 74 24 7b 69 64 7d 20 42 61 63  d}.Test${id} Bac
6560: 6b 75 70 41 6e 64 47 65 74 44 61 74 61 0d 0a 20  kupAndGetData.. 
6570: 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54             showT
6580: 65 73 74 20 4c 0d 0a 20 20 20 20 20 20 20 20 20  est L..         
6590: 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
65a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
65b0: 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45 72  f {[isExpectedEr
65c0: 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68 65  ror $error]} the
65d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
65e0: 20 20 20 73 68 6f 77 54 65 73 74 20 6c 0d 0a 20     showTest l.. 
65f0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
6600: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
6610: 20 20 20 66 61 69 6c 54 65 73 74 20 6c 20 24 65     failTest l $e
6620: 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  rror..          
6630: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
6640: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
6650: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
6660: 74 20 69 64 20 5b 6f 62 6a 65 63 74 20 69 6e 76  t id [object inv
6670: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
6680: 47 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64  GetActive NextId
6690: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ]..          set
66a0: 20 63 6f 64 65 20 5b 63 6f 6d 70 69 6c 65 43 53   code [compileCS
66b0: 68 61 72 70 57 69 74 68 20 5b 73 75 62 73 74 20  harpWith [subst 
66c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  {..            u
66d0: 73 69 6e 67 20 53 79 73 74 65 6d 3b 0d 0a 20 20  sing System;..  
66e0: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
66f0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
6700: 74 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  te;..           
6710: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 54 65   using System.Te
6720: 78 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  xt;....         
6730: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 5f 44 79     namespace _Dy
6740: 6e 61 6d 69 63 24 7b 69 64 7d 0d 0a 20 20 20 20  namic${id}..    
6750: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
6760: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
6770: 73 74 61 74 69 63 20 63 6c 61 73 73 20 54 65 73  static class Tes
6780: 74 24 7b 69 64 7d 0d 0a 20 20 20 20 20 20 20 20  t${id}..        
6790: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
67a0: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
67b0: 73 74 61 74 69 63 20 76 6f 69 64 20 42 61 63 6b  static void Back
67c0: 75 70 41 6e 64 47 65 74 44 61 74 61 28 29 0d 0a  upAndGetData()..
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
67f0: 20 20 20 20 20 75 73 69 6e 67 20 28 53 51 4c 69       using (SQLi
6800: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f 75  teConnection sou
6810: 72 63 65 20 3d 20 6e 65 77 20 53 51 4c 69 74 65  rce = new SQLite
6820: 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d 0a 20 20 20  Connection(..   
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 20 22 46 75 6c 6c 55 72 69 3d 24 7b 64 73     "FullUri=${ds
6850: 74 46 69 6c 65 4e 61 6d 65 7d 3b 22 29 29 0d 0a  tFileName};"))..
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
6880: 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65 2e           source.
6890: 4f 70 65 6e 28 29 3b 0d 0a 20 20 20 20 20 20 20  Open();..       
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69               usi
68b0: 6e 67 20 28 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ng (SQLiteConnec
68c0: 74 69 6f 6e 20 64 65 73 74 69 6e 61 74 69 6f 6e  tion destination
68d0: 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 43 6f 6e   = new SQLiteCon
68e0: 6e 65 63 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20  nection(..      
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6900: 20 20 22 46 75 6c 6c 55 72 69 3d 24 7b 73 72 63    "FullUri=${src
6910: 46 69 6c 65 4e 61 6d 65 7d 3b 22 29 29 0d 0a 20  FileName};")).. 
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
6940: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74              dest
6950: 69 6e 61 74 69 6f 6e 2e 4f 70 65 6e 28 29 3b 0d  ination.Open();.
6960: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
6970: 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65 2e           source.
6980: 42 61 63 6b 75 70 44 61 74 61 62 61 73 65 28 0d  BackupDatabase(.
6990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
69a0: 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74 69             desti
69b0: 6e 61 74 69 6f 6e 2c 20 22 6d 61 69 6e 22 2c 20  nation, "main", 
69c0: 22 6d 61 69 6e 22 2c 20 2d 31 2c 20 6e 75 6c 6c  "main", -1, null
69d0: 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  , 0);..         
69e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
6a10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
6a20: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
6a30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a60: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
6a70: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
6a80: 63 20 73 74 61 74 69 63 20 76 6f 69 64 20 4d 61  c static void Ma
6a90: 69 6e 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20  in()..          
6aa0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
6ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f             // do
6ac0: 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20   nothing...     
6ad0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
6af0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
6b00: 20 20 20 20 20 20 20 20 7d 5d 20 74 72 75 65 20          }] true 
6b10: 74 72 75 65 20 74 72 75 65 20 72 65 73 75 6c 74  true true result
6b20: 73 20 65 72 72 6f 72 73 20 53 79 73 74 65 6d 2e  s errors System.
6b30: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
6b40: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
6b50: 24 63 6f 64 65 20 65 71 20 22 4f 6b 22 7d 20 74  $code eq "Ok"} t
6b60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
6b70: 20 20 20 73 65 74 20 3a 3a 63 6f 6d 70 69 6c 65     set ::compile
6b80: 64 28 31 32 29 20 24 69 64 3b 20 23 20 4e 4f 54  d(12) $id; # NOT
6b90: 45 3a 20 43 6f 6d 70 69 6c 65 64 20 4f 4b 2e 0d  E: Compiled OK..
6ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
6bb0: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
6bc0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
6bd0: 69 6e 76 6f 6b 65 20 5f 44 79 6e 61 6d 69 63 24  invoke _Dynamic$
6be0: 7b 69 64 7d 2e 54 65 73 74 24 7b 69 64 7d 20 42  {id}.Test${id} B
6bf0: 61 63 6b 75 70 41 6e 64 47 65 74 44 61 74 61 0d  ackupAndGetData.
6c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
6c10: 68 6f 77 54 65 73 74 20 4c 0d 0a 20 20 20 20 20  howTest L..     
6c20: 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d         } error]}
6c30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6c40: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78         if {[isEx
6c50: 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72  pectedError $err
6c60: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f               sho
6c80: 77 54 65 73 74 20 6c 0d 0a 20 20 20 20 20 20 20  wTest l..       
6c90: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
6ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6cb0: 20 66 61 69 6c 54 65 73 74 20 6c 20 24 65 72 72   failTest l $err
6cc0: 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  or..            
6cd0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
6ce0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   }..          } 
6cf0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
6d00: 20 20 20 20 65 72 72 6f 72 20 24 65 72 72 6f 72      error $error
6d10: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  s..          }..
6d20: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
6d30: 20 7d 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65   }..      doneTe
6d40: 73 74 20 4c 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d  st L..    }] 0].
6d50: 0a 20 20 7d 5d 0d 0a 0d 0a 20 20 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 23 23  ################
6da0: 23 23 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20  ########..  #   
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 20 20 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c             WORKL
6dd0: 4f 41 44 20 23 31 33 20 28 4d 29 20 20 20 20 20  OAD #13 (M)     
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23          #..  ###
6e00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6e10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6e30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
6e40: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
6e50: 73 65 74 20 77 6f 72 6b 6c 6f 61 64 28 31 33 29  set workload(13)
6e60: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
6e70: 5b 6c 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d  [list srcFileNam
6e80: 65 20 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61  e dstFileName ta
6e90: 62 6c 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74  ble count1 count
6ea0: 32 20 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20  2 count3] {..   
6eb0: 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
6ec0: 57 6f 72 6b 6c 6f 61 64 20 23 31 33 2c 20 62 61  Workload #13, ba
6ed0: 63 6b 75 70 20 66 72 6f 6d 20 61 6e 20 69 6e 2d  ckup from an in-
6ee0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
6ef0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 6c 61 70  ..    #..    lap
6f00: 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 33 29  pend ::times(13)
6f10: 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20 7b   [lindex [time {
6f20: 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74  ..      for {set
6f30: 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65   index 1} {$inde
6f40: 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69  x <= $count1} {i
6f50: 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
6f60: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
6f70: 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74  g is integer -st
6f80: 72 69 63 74 20 24 3a 3a 63 6f 6d 70 69 6c 65 64  rict $::compiled
6f90: 28 31 33 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  (13)]} then {.. 
6fa0: 20 20 20 20 20 20 20 20 20 73 65 74 20 69 64 20           set id 
6fb0: 24 3a 3a 63 6f 6d 70 69 6c 65 64 28 31 33 29 3b  $::compiled(13);
6fc0: 20 23 20 4e 4f 54 45 3a 20 41 6c 72 65 61 64 79   # NOTE: Already
6fd0: 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20   compiled...    
6fe0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
6ff0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7000: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5f 44  object invoke _D
7010: 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54 65 73 74  ynamic${id}.Test
7020: 24 7b 69 64 7d 20 42 61 63 6b 75 70 41 6e 64 47  ${id} BackupAndG
7030: 65 74 44 61 74 61 0d 0a 20 20 20 20 20 20 20 20  etData..        
7040: 20 20 20 20 73 68 6f 77 54 65 73 74 20 4d 0d 0a      showTest M..
7050: 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
7060: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
7070: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45          if {[isE
7080: 78 70 65 63 74 65 64 45 72 72 6f 72 20 24 65 72  xpectedError $er
7090: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77              show
70b0: 54 65 73 74 20 6d 0d 0a 20 20 20 20 20 20 20 20  Test m..        
70c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
70e0: 54 65 73 74 20 6d 20 24 65 72 72 6f 72 0d 0a 20  Test m $error.. 
70f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
7100: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7110: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7120: 20 20 20 20 20 20 20 73 65 74 20 69 64 20 5b 6f         set id [o
7130: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74  bject invoke Int
7140: 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
7150: 76 65 20 4e 65 78 74 49 64 5d 0d 0a 20 20 20 20  ve NextId]..    
7160: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b        set code [
7170: 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74  compileCSharpWit
7180: 68 20 5b 73 75 62 73 74 20 7b 0d 0a 20 20 20 20  h [subst {..    
7190: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 53 79          using Sy
71a0: 73 74 65 6d 3b 0d 0a 20 20 20 20 20 20 20 20 20  stem;..         
71b0: 20 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e     using System.
71c0: 44 61 74 61 2e 53 51 4c 69 74 65 3b 0d 0a 20 20  Data.SQLite;..  
71d0: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
71e0: 53 79 73 74 65 6d 2e 54 65 78 74 3b 0d 0a 0d 0a  System.Text;....
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
7200: 73 70 61 63 65 20 5f 44 79 6e 61 6d 69 63 24 7b  space _Dynamic${
7210: 69 64 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  id}..           
7220: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7230: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
7240: 63 6c 61 73 73 20 54 65 73 74 24 7b 69 64 7d 0d  class Test${id}.
7250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
7260: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7270: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
7280: 76 6f 69 64 20 42 61 63 6b 75 70 41 6e 64 47 65  void BackupAndGe
7290: 74 44 61 74 61 28 29 0d 0a 20 20 20 20 20 20 20  tData()..       
72a0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73                us
72c0: 69 6e 67 20 28 53 51 4c 69 74 65 43 6f 6e 6e 65  ing (SQLiteConne
72d0: 63 74 69 6f 6e 20 73 6f 75 72 63 65 20 3d 20 6e  ction source = n
72e0: 65 77 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  ew SQLiteConnect
72f0: 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ion(..          
7300: 20 20 20 20 20 20 20 20 20 20 20 20 22 46 75 6c              "Ful
7310: 6c 55 72 69 3d 24 7b 73 72 63 46 69 6c 65 4e 61  lUri=${srcFileNa
7320: 6d 65 7d 3b 22 29 29 0d 0a 20 20 20 20 20 20 20  me};"))..       
7330: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7350: 20 20 73 6f 75 72 63 65 2e 4f 70 65 6e 28 29 3b    source.Open();
7360: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7370: 20 20 20 20 20 20 75 73 69 6e 67 20 28 53 51 4c        using (SQL
7380: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 64 65  iteConnection de
7390: 73 74 69 6e 61 74 69 6f 6e 20 3d 20 6e 65 77 20  stination = new 
73a0: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
73b0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
73c0: 20 20 20 20 20 20 20 20 20 20 20 22 46 75 6c 6c             "Full
73d0: 55 72 69 3d 24 7b 64 73 74 46 69 6c 65 4e 61 6d  Uri=${dstFileNam
73e0: 65 7d 3b 22 29 29 0d 0a 20 20 20 20 20 20 20 20  e};"))..        
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 20 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e       destination
7420: 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20  .Open();....    
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 73 6f 75 72 63 65 2e 42 61 63 6b 75 70 44    source.BackupD
7450: 61 74 61 62 61 73 65 28 0d 0a 20 20 20 20 20 20  atabase(..      
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7470: 20 20 20 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c      destination,
7480: 20 22 6d 61 69 6e 22 2c 20 22 6d 61 69 6e 22 2c   "main", "main",
7490: 20 2d 31 2c 20 6e 75 6c 6c 2c 20 30 29 3b 0d 0a   -1, null, 0);..
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
74c0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
74e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
74f0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
7500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7520: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7530: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
7540: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
7550: 63 20 76 6f 69 64 20 4d 61 69 6e 28 29 0d 0a 20  c void Main().. 
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
7570: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7580: 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e      // do nothin
7590: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
75a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
75b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
75c0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
75d0: 20 7d 5d 20 74 72 75 65 20 74 72 75 65 20 74 72   }] true true tr
75e0: 75 65 20 72 65 73 75 6c 74 73 20 65 72 72 6f 72  ue results error
75f0: 73 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  s System.Data.SQ
7600: 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20  Lite.dll]..     
7610: 20 20 20 20 20 69 66 20 7b 24 63 6f 64 65 20 65       if {$code e
7620: 71 20 22 4f 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a  q "Ok"} then {..
7630: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
7640: 3a 3a 63 6f 6d 70 69 6c 65 64 28 31 33 29 20 24  ::compiled(13) $
7650: 69 64 3b 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 70  id; # NOTE: Comp
7660: 69 6c 65 64 20 4f 4b 2e 0d 0a 20 20 20 20 20 20  iled OK...      
7670: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
7680: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7690: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
76a0: 5f 44 79 6e 61 6d 69 63 24 7b 69 64 7d 2e 54 65  _Dynamic${id}.Te
76b0: 73 74 24 7b 69 64 7d 20 42 61 63 6b 75 70 41 6e  st${id} BackupAn
76c0: 64 47 65 74 44 61 74 61 0d 0a 20 20 20 20 20 20  dGetData..      
76d0: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
76e0: 20 4d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   M..            
76f0: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
7700: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7710: 69 66 20 7b 5b 69 73 45 78 70 65 63 74 65 64 45  if {[isExpectedE
7720: 72 72 6f 72 20 24 65 72 72 6f 72 5d 7d 20 74 68  rror $error]} th
7730: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
7740: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 6d        showTest m
7750: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7760: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
7770: 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65            failTe
7780: 73 74 20 6d 20 24 65 72 72 6f 72 0d 0a 20 20 20  st m $error..   
7790: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
77a0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
77b0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
77c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
77d0: 6f 72 20 24 65 72 72 6f 72 73 0d 0a 20 20 20 20  or $errors..    
77e0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
77f0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
7800: 20 20 20 64 6f 6e 65 54 65 73 74 20 4d 0d 0a 20     doneTest M.. 
7810: 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a     }] 0]..  }]..
7820: 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23  ..  ############
7830: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7840: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7860: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7870: 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20 20  #..  #          
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7890: 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31 34      WORKLOAD #14
78a0: 20 28 4e 29 20 20 20 20 20 20 20 20 20 20 20 20   (N)            
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23   #..  ##########
78d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
78e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
78f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7900: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7910: 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72  ###....  set wor
7920: 6b 6c 6f 61 64 28 31 34 29 20 5b 6c 69 73 74 20  kload(14) [list 
7930: 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20 73  \..      [list s
7940: 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46 69  rcFileName dstFi
7950: 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f 75  leName table cou
7960: 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74  nt1 count2 count
7970: 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20  3] {..    #..   
7980: 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61   # NOTE: Workloa
7990: 64 20 23 31 34 2c 20 50 52 41 47 4d 41 20 69 6e  d #14, PRAGMA in
79a0: 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 73 74  tegrity check st
79b0: 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 23 0d  atement...    #.
79c0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 74  .    lappend ::t
79d0: 69 6d 65 73 28 31 34 29 20 5b 6c 69 6e 64 65 78  imes(14) [lindex
79e0: 20 5b 74 69 6d 65 20 7b 0d 0a 20 20 20 20 20 20   [time {..      
79f0: 73 65 74 75 70 44 62 20 24 64 73 74 46 69 6c 65  setupDb $dstFile
7a00: 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20 22 22  Name "" "" "" ""
7a10: 20 22 22 20 74 72 75 65 20 66 61 6c 73 65 0d 0a   "" true false..
7a20: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
7a30: 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
7a40: 3c 3d 20 24 63 6f 75 6e 74 31 7d 20 7b 69 6e 63  <= $count1} {inc
7a50: 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
7a60: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
7a70: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
7a80: 72 65 73 75 6c 74 20 5b 73 71 6c 20 65 78 65 63  result [sql exec
7a90: 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61  ute -execute sca
7aa0: 6c 61 72 20 24 64 62 20 5c 0d 0a 20 20 20 20 20  lar $db \..     
7ab0: 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41           "PRAGMA
7ac0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
7ad0: 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ;"]..          i
7ae0: 66 20 7b 24 72 65 73 75 6c 74 20 6e 65 20 22 6f  f {$result ne "o
7af0: 6b 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  k"} then {..    
7b00: 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61          error [a
7b10: 70 70 65 6e 64 41 72 67 73 20 22 69 6e 74 65 67  ppendArgs "integ
7b20: 72 69 74 79 20 63 68 65 63 6b 20 66 61 69 6c 65  rity check faile
7b30: 64 3a 20 22 20 24 72 65 73 75 6c 74 5d 0d 0a 20  d: " $result].. 
7b40: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
7b50: 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 4e        showTest N
7b60: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f  ..        } erro
7b70: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
7b80: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70        if {[isExp
7b90: 65 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f  ectedError $erro
7ba0: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
7bb0: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
7bc0: 20 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   n..          } 
7bd0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
7be0: 20 20 20 20 66 61 69 6c 54 65 73 74 20 6e 20 24      failTest n $
7bf0: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
7c00: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
7c10: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c       }..      cl
7c20: 65 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65  eanupDb $dstFile
7c30: 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72  Name db false tr
7c40: 75 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ue false..      
7c50: 64 6f 6e 65 54 65 73 74 20 4e 0d 0a 20 20 20 20  doneTest N..    
7c60: 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20  }] 0]..  }].... 
7c70: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
7c80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7c90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7ca0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7cb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
7cc0: 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20    #             
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 57 4f 52 4b 4c 4f 41 44 20 23 31 35 20 28 4f   WORKLOAD #15 (O
7cf0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
7d10: 0a 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23  .  #############
7d20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7d30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7d40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7d50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7d60: 0d 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f  ....  set worklo
7d70: 61 64 28 31 35 29 20 5b 6c 69 73 74 20 5c 0d 0a  ad(15) [list \..
7d80: 20 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46        [list srcF
7d90: 69 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e  ileName dstFileN
7da0: 61 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31  ame table count1
7db0: 20 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20   count2 count3] 
7dc0: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
7dd0: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
7de0: 31 35 2c 20 66 6f 72 63 65 20 6d 61 6e 61 67 65  15, force manage
7df0: 64 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63  d garbage collec
7e00: 74 69 6f 6e 0d 0a 20 20 20 20 23 0d 0a 20 20 20  tion..    #..   
7e10: 20 6c 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73   lappend ::times
7e20: 28 31 35 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69  (15) [lindex [ti
7e30: 6d 65 20 7b 0d 0a 20 20 20 20 20 20 66 6f 72 20  me {..      for 
7e40: 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24  {set index 1} {$
7e50: 69 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31  index <= $count1
7e60: 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
7e70: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
7e80: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
7e90: 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65    collectGarbage
7ea0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
7eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77  ..          show
7ec0: 54 65 73 74 20 4f 0d 0a 20 20 20 20 20 20 20 20  Test O..        
7ed0: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
7ee0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
7ef0: 5b 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72  [isExpectedError
7f00: 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b   $error]} then {
7f10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68  ..            sh
7f20: 6f 77 54 65 73 74 20 6f 0d 0a 20 20 20 20 20 20  owTest o..      
7f30: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
7f40: 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65            failTe
7f50: 73 74 20 6f 20 24 65 72 72 6f 72 0d 0a 20 20 20  st o $error..   
7f60: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7f70: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
7f80: 20 20 20 20 64 6f 6e 65 54 65 73 74 20 4f 0d 0a      doneTest O..
7f90: 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d 0d      }] 0]..  }].
7fa0: 0a 0d 0a 20 20 23 23 23 23 23 23 23 23 23 23 23  ...  ###########
7fb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7ff0: 23 23 0d 0a 20 20 23 20 20 20 20 20 20 20 20 20  ##..  #         
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8010: 20 20 20 20 20 57 4f 52 4b 4c 4f 41 44 20 23 31       WORKLOAD #1
8020: 36 20 28 50 29 20 20 20 20 20 20 20 20 20 20 20  6 (P)           
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 23 0d 0a 20 20 23 23 23 23 23 23 23 23 23    #..  #########
8050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8070: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8080: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8090: 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20 77 6f  ####....  set wo
80a0: 72 6b 6c 6f 61 64 28 31 36 29 20 5b 6c 69 73 74  rkload(16) [list
80b0: 20 5c 0d 0a 20 20 20 20 20 20 5b 6c 69 73 74 20   \..      [list 
80c0: 73 72 63 46 69 6c 65 4e 61 6d 65 20 64 73 74 46  srcFileName dstF
80d0: 69 6c 65 4e 61 6d 65 20 74 61 62 6c 65 20 63 6f  ileName table co
80e0: 75 6e 74 31 20 63 6f 75 6e 74 32 20 63 6f 75 6e  unt1 count2 coun
80f0: 74 33 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20  t3] {..    #..  
8100: 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f    # NOTE: Worklo
8110: 61 64 20 23 31 36 2c 20 61 6c 6c 6f 63 61 74 65  ad #16, allocate
8120: 20 28 65 78 63 6c 75 64 65 29 20 73 6f 6d 65 20   (exclude) some 
8130: 6e 61 74 69 76 65 20 68 65 61 70 20 6d 65 6d 6f  native heap memo
8140: 72 79 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 6c  ry..    #..    l
8150: 61 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31  append ::times(1
8160: 36 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65  6) [lindex [time
8170: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 6d 61   {..      set ma
8180: 78 53 69 7a 65 20 24 3a 3a 63 6f 75 6e 74 28 35  xSize $::count(5
8190: 29 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  )..      object 
81a0: 69 6e 76 6f 6b 65 20 47 43 20 41 64 64 4d 65 6d  invoke GC AddMem
81b0: 6f 72 79 50 72 65 73 73 75 72 65 20 24 6d 61 78  oryPressure $max
81c0: 53 69 7a 65 0d 0a 20 20 20 20 20 20 74 72 79 20  Size..      try 
81d0: 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b  {..        for {
81e0: 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
81f0: 6e 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d  ndex <= $count1}
8200: 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
8210: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
8220: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
8230: 20 20 20 20 20 73 65 74 20 73 69 7a 65 20 5b 65       set size [e
8240: 78 70 72 20 7b 69 6e 74 28 6d 69 6e 28 24 6d 61  xpr {int(min($ma
8250: 78 53 69 7a 65 2c 20 61 62 73 28 24 63 6f 75 6e  xSize, abs($coun
8260: 74 33 20 2a 20 24 69 6e 64 65 78 20 2a 20 35 2e  t3 * $index * 5.
8270: 30 29 29 29 7d 5d 0d 0a 20 20 20 20 20 20 20 20  0)))}]..        
8280: 20 20 20 20 73 65 74 20 70 74 72 20 5b 61 6c 6c      set ptr [all
8290: 6f 63 4d 65 6d 20 24 73 69 7a 65 5d 3b 20 23 20  ocMem $size]; # 
82a0: 74 68 72 6f 77 0d 0a 20 20 20 20 20 20 20 20 20  throw..         
82b0: 20 20 20 75 73 65 4d 65 6d 20 24 70 74 72 20 24     useMem $ptr $
82c0: 73 69 7a 65 3b 20 77 61 69 74 46 6f 72 54 65 73  size; waitForTes
82d0: 74 20 24 63 6f 75 6e 74 32 0d 0a 20 20 20 20 20  t $count2..     
82e0: 20 20 20 20 20 20 20 66 72 65 65 4d 65 6d 20 24         freeMem $
82f0: 70 74 72 3b 20 75 6e 73 65 74 20 2d 6e 6f 63 6f  ptr; unset -noco
8300: 6d 70 6c 61 69 6e 20 70 74 72 0d 0a 20 20 20 20  mplain ptr..    
8310: 20 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74          showTest
8320: 20 50 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   P..          } 
8330: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
8340: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
8350: 5b 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72  [isExpectedError
8360: 20 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b   $error]} then {
8370: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8380: 73 68 6f 77 54 65 73 74 20 70 0d 0a 20 20 20 20  showTest p..    
8390: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
83a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
83b0: 66 61 69 6c 54 65 73 74 20 70 20 24 65 72 72 6f  failTest p $erro
83c0: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  r..            }
83d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
83e0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
83f0: 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20  } finally {..   
8400: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
8410: 78 69 73 74 73 20 70 74 72 5d 7d 20 74 68 65 6e  xists ptr]} then
8420: 20 7b 66 72 65 65 4d 65 6d 20 24 70 74 72 7d 0d   {freeMem $ptr}.
8430: 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
8440: 69 6e 76 6f 6b 65 20 47 43 20 52 65 6d 6f 76 65  invoke GC Remove
8450: 4d 65 6d 6f 72 79 50 72 65 73 73 75 72 65 20 24  MemoryPressure $
8460: 6d 61 78 53 69 7a 65 0d 0a 20 20 20 20 20 20 7d  maxSize..      }
8470: 0d 0a 20 20 20 20 20 20 64 6f 6e 65 54 65 73 74  ..      doneTest
8480: 20 50 0d 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20   P..    }] 0].. 
8490: 20 7d 5d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23   }]....  #######
84a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
84b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
84c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
84d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
84e0: 23 23 23 23 23 23 0d 0a 20 20 23 20 20 20 20 20  ######..  #     
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 20 20 20 20 20 20 20 20 57 4f 52 4b 4c 4f 41           WORKLOA
8510: 44 20 23 31 37 20 28 51 29 20 20 20 20 20 20 20  D #17 (Q)       
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 20 20 20 20 20 20 23 0d 0a 20 20 23 23 23 23 23        #..  #####
8540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8560: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8570: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8580: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65  ########....  se
8590: 74 20 77 6f 72 6b 6c 6f 61 64 28 31 37 29 20 5b  t workload(17) [
85a0: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 5b 6c  list \..      [l
85b0: 69 73 74 20 73 72 63 46 69 6c 65 4e 61 6d 65 20  ist srcFileName 
85c0: 64 73 74 46 69 6c 65 4e 61 6d 65 20 74 61 62 6c  dstFileName tabl
85d0: 65 20 63 6f 75 6e 74 31 20 63 6f 75 6e 74 32 20  e count1 count2 
85e0: 63 6f 75 6e 74 33 5d 20 7b 0d 0a 20 20 20 20 23  count3] {..    #
85f0: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f  ..    # NOTE: Wo
8600: 72 6b 6c 6f 61 64 20 23 31 37 2c 20 63 68 61 6e  rkload #17, chan
8610: 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ge the database 
8620: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 0d 0a 20 20  journal mode..  
8630: 20 20 23 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64    #..    lappend
8640: 20 3a 3a 74 69 6d 65 73 28 31 37 29 20 5b 6c 69   ::times(17) [li
8650: 6e 64 65 78 20 5b 74 69 6d 65 20 7b 0d 0a 20 20  ndex [time {..  
8660: 20 20 20 20 73 65 74 75 70 44 62 20 24 64 73 74      setupDb $dst
8670: 46 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22  FileName "" "" "
8680: 22 20 22 22 20 22 22 20 74 72 75 65 20 66 61 6c  " "" "" true fal
8690: 73 65 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73  se..      for {s
86a0: 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e  et index 1} {$in
86b0: 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20  dex <= $count1} 
86c0: 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
86d0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
86e0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
86f0: 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
8700: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41  [appendArgs "PRA
8710: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8720: 20 3d 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20   = \"" \..      
8730: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
8740: 69 6e 64 65 78 20 25 20 32 20 3d 3d 20 30 20 3f  index % 2 == 0 ?
8750: 20 22 64 65 6c 65 74 65 22 20 3a 20 22 77 61 6c   "delete" : "wal
8760: 22 7d 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20  "}] \"\;]..     
8770: 20 20 20 20 20 73 68 6f 77 54 65 73 74 20 51 0d       showTest Q.
8780: 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72  .        } error
8790: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
87a0: 20 20 20 20 20 69 66 20 7b 5b 69 73 45 78 70 65       if {[isExpe
87b0: 63 74 65 64 45 72 72 6f 72 20 24 65 72 72 6f 72  ctedError $error
87c0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
87d0: 20 20 20 20 20 20 20 73 68 6f 77 54 65 73 74 20         showTest 
87e0: 71 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  q..          } e
87f0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
8800: 20 20 20 66 61 69 6c 54 65 73 74 20 71 20 24 65     failTest q $e
8810: 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  rror..          
8820: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
8830: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6c 65      }..      cle
8840: 61 6e 75 70 44 62 20 24 64 73 74 46 69 6c 65 4e  anupDb $dstFileN
8850: 61 6d 65 20 64 62 20 66 61 6c 73 65 20 74 72 75  ame db false tru
8860: 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 64  e false..      d
8870: 6f 6e 65 54 65 73 74 20 51 0d 0a 20 20 20 20 7d  oneTest Q..    }
8880: 5d 20 30 5d 0d 0a 20 20 7d 5d 0d 0a 0d 0a 20 20  ] 0]..  }]....  
8890: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
88a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
88b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
88c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
88d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
88e0: 20 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20   #              
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8900: 57 4f 52 4b 4c 4f 41 44 20 23 31 38 20 28 52 29  WORKLOAD #18 (R)
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
8930: 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
8940: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8950: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8960: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8970: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
8980: 0a 0d 0a 20 20 73 65 74 20 77 6f 72 6b 6c 6f 61  ...  set workloa
8990: 64 28 31 38 29 20 5b 6c 69 73 74 20 5c 0d 0a 20  d(18) [list \.. 
89a0: 20 20 20 20 20 5b 6c 69 73 74 20 73 72 63 46 69       [list srcFi
89b0: 6c 65 4e 61 6d 65 20 64 73 74 46 69 6c 65 4e 61  leName dstFileNa
89c0: 6d 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 31 20  me table count1 
89d0: 63 6f 75 6e 74 32 20 63 6f 75 6e 74 33 5d 20 7b  count2 count3] {
89e0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
89f0: 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31  OTE: Workload #1
8a00: 38 2c 20 65 78 65 63 75 74 65 20 71 75 65 72 69  8, execute queri
8a10: 65 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 69  es against the i
8a20: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8a30: 65 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 6c 61  e..    #..    la
8a40: 70 70 65 6e 64 20 3a 3a 74 69 6d 65 73 28 31 38  ppend ::times(18
8a50: 29 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d 65 20  ) [lindex [time 
8a60: 7b 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62  {..      setupDb
8a70: 20 24 73 72 63 46 69 6c 65 4e 61 6d 65 20 22 22   $srcFileName ""
8a80: 20 22 22 20 22 22 20 22 22 20 22 22 20 66 61 6c   "" "" "" "" fal
8a90: 73 65 20 66 61 6c 73 65 20 74 72 75 65 20 74 72  se false true tr
8aa0: 75 65 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73  ue..      for {s
8ab0: 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e  et index 1} {$in
8ac0: 64 65 78 20 3c 3d 20 24 63 6f 75 6e 74 31 7d 20  dex <= $count1} 
8ad0: 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
8ae0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
8af0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
8b00: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
8b10: 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31  OTE: Workload #1
8b20: 38 2e 33 2c 20 22 73 6d 61 6c 6c 22 20 53 45 4c  8.3, "small" SEL
8b30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d  ECT statements..
8b40: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
8b50: 20 20 20 20 20 20 20 20 73 65 74 20 72 65 61 64          set read
8b60: 65 72 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20  er [sql execute 
8b70: 2d 65 78 65 63 75 74 65 20 72 65 61 64 65 72 20  -execute reader 
8b80: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
8b90: 20 2d 66 6f 72 6d 61 74 20 64 61 74 61 52 65 61   -format dataRea
8ba0: 64 65 72 20 2d 61 6c 69 61 73 20 24 64 62 20 5b  der -alias $db [
8bb0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
8bd0: 45 43 54 20 78 2c 20 79 20 46 52 4f 4d 20 22 20  ECT x, y FROM " 
8be0: 24 74 61 62 6c 65 20 22 20 57 48 45 52 45 20 7a  $table " WHERE z
8bf0: 20 3d 20 27 73 6d 61 6c 6c 27 3b 22 5d 5d 0d 0a   = 'small';"]]..
8c00: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20            while 
8c10: 7b 5b 24 72 65 61 64 65 72 20 52 65 61 64 5d 7d  {[$reader Read]}
8c20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8c30: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
8c40: 20 4e 4f 54 45 3a 20 44 6f 20 6e 6f 74 68 69 6e   NOTE: Do nothin
8c50: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
8c60: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  #..          }..
8c70: 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
8c80: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72 65 61 64  -nocomplain read
8c90: 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  er..          #.
8ca0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
8cb0: 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e  E: Workload #18.
8cc0: 34 2c 20 22 62 69 67 22 20 53 45 4c 45 43 54 20  4, "big" SELECT 
8cd0: 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20  statements...   
8ce0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8cf0: 20 20 20 20 73 65 74 20 72 65 61 64 65 72 20 5b      set reader [
8d00: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
8d10: 63 75 74 65 20 72 65 61 64 65 72 20 5c 0d 0a 20  cute reader \.. 
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 66 6f               -fo
8d30: 72 6d 61 74 20 64 61 74 61 52 65 61 64 65 72 20  rmat dataReader 
8d40: 2d 61 6c 69 61 73 20 24 64 62 20 5b 61 70 70 65  -alias $db [appe
8d50: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
8d60: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
8d70: 78 2c 20 79 20 46 52 4f 4d 20 22 20 24 74 61 62  x, y FROM " $tab
8d80: 6c 65 20 22 20 57 48 45 52 45 20 7a 20 3d 20 27  le " WHERE z = '
8d90: 62 69 67 27 3b 22 5d 5d 0d 0a 20 20 20 20 20 20  big';"]]..      
8da0: 20 20 20 20 77 68 69 6c 65 20 7b 5b 24 72 65 61      while {[$rea
8db0: 64 65 72 20 52 65 61 64 5d 7d 20 7b 0d 0a 20 20  der Read]} {..  
8dc0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
8dd0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
8de0: 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20   Do nothing...  
8df0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
8e00: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8e10: 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d      unset -nocom
8e20: 70 6c 61 69 6e 20 72 65 61 64 65 72 0d 0a 20 20  plain reader..  
8e30: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8e40: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72       # NOTE: Wor
8e50: 6b 6c 6f 61 64 20 23 31 38 2e 35 2c 20 22 73 6d  kload #18.5, "sm
8e60: 61 6c 6c 22 20 49 4e 53 45 52 54 20 73 74 61 74  all" INSERT stat
8e70: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  ements...       
8e80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
8e90: 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
8ea0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 49 4e 53  [appendArgs "INS
8eb0: 45 52 54 20 49 4e 54 4f 20 22 20 24 74 61 62 6c  ERT INTO " $tabl
8ec0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
8ed0: 20 20 20 22 28 78 2c 20 79 2c 20 7a 29 20 56 41     "(x, y, z) VA
8ee0: 4c 55 45 53 28 27 22 20 5b 66 6f 72 6d 61 74 20  LUES('" [format 
8ef0: 25 6c 58 20 5b 65 78 70 72 20 7b 72 61 6e 64 6f  %lX [expr {rando
8f00: 6d 28 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20  m()}]] \..      
8f10: 20 20 20 20 20 20 20 20 22 27 2c 20 27 22 20 5b          "', '" [
8f20: 62 61 73 65 36 34 20 65 6e 63 6f 64 65 20 2d 2d  base64 encode --
8f30: 20 5b 65 78 70 72 20 7b 72 61 6e 64 73 74 72 28   [expr {randstr(
8f40: 24 63 6f 75 6e 74 32 29 7d 5d 5d 20 5c 0d 0a 20  $count2)}]] \.. 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27 2c               "',
8f60: 20 27 73 6d 61 6c 6c 27 29 3b 22 5d 0d 0a 20 20   'small');"]..  
8f70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8f80: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72       # NOTE: Wor
8f90: 6b 6c 6f 61 64 20 23 31 38 2e 36 2c 20 22 62 69  kload #18.6, "bi
8fa0: 67 22 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  g" INSERT statem
8fb0: 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  ents...         
8fc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71   #..          sq
8fd0: 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61  l execute $db [a
8fe0: 70 70 65 6e 64 41 72 67 73 20 22 49 4e 53 45 52  ppendArgs "INSER
8ff0: 54 20 49 4e 54 4f 20 22 20 24 74 61 62 6c 65 20  T INTO " $table 
9000: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9010: 20 22 28 78 2c 20 79 2c 20 7a 29 20 56 41 4c 55   "(x, y, z) VALU
9020: 45 53 28 27 22 20 5b 66 6f 72 6d 61 74 20 25 6c  ES('" [format %l
9030: 58 20 5b 65 78 70 72 20 7b 72 61 6e 64 6f 6d 28  X [expr {random(
9040: 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  )}]] \..        
9050: 20 20 20 20 20 20 22 27 2c 20 52 41 4e 44 4f 4d        "', RANDOM
9060: 42 4c 4f 42 28 22 20 24 63 6f 75 6e 74 33 20 22  BLOB(" $count3 "
9070: 29 2c 20 27 62 69 67 27 29 3b 22 5d 0d 0a 20 20  ), 'big');"]..  
9080: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9090: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 6f 72       # NOTE: Wor
90a0: 6b 6c 6f 61 64 20 23 31 38 2e 37 2c 20 22 73 6d  kload #18.7, "sm
90b0: 61 6c 6c 22 20 55 50 44 41 54 45 20 73 74 61 74  all" UPDATE stat
90c0: 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  ements...       
90d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
90e0: 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
90f0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 55 50 44  [appendArgs "UPD
9100: 41 54 45 20 22 20 24 74 61 62 6c 65 20 5c 0d 0a  ATE " $table \..
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
9120: 53 45 54 20 79 20 3d 20 27 22 20 5b 62 61 73 65  SET y = '" [base
9130: 36 34 20 65 6e 63 6f 64 65 20 2d 2d 20 5b 65 78  64 encode -- [ex
9140: 70 72 20 7b 72 61 6e 64 73 74 72 28 24 63 6f 75  pr {randstr($cou
9150: 6e 74 32 29 7d 5d 5d 20 5c 0d 0a 20 20 20 20 20  nt2)}]] \..     
9160: 20 20 20 20 20 20 20 20 20 22 27 20 57 48 45 52           "' WHER
9170: 45 20 78 20 4c 49 4b 45 20 27 22 20 5b 66 6f 72  E x LIKE '" [for
9180: 6d 61 74 20 25 58 20 24 69 6e 64 65 78 5d 20 22  mat %X $index] "
9190: 25 27 20 41 4e 44 20 7a 20 3d 20 27 73 6d 61 6c  %' AND z = 'smal
91a0: 6c 27 3b 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  l';"]..         
91b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
91c0: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
91d0: 31 38 2e 38 2c 20 22 62 69 67 22 20 55 50 44 41  18.8, "big" UPDA
91e0: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a  TE statements...
91f0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
9200: 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
9210: 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  te $db [appendAr
9220: 67 73 20 22 55 50 44 41 54 45 20 22 20 24 74 61  gs "UPDATE " $ta
9230: 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ble \..         
9240: 20 20 20 20 20 22 20 53 45 54 20 79 20 3d 20 52       " SET y = R
9250: 41 4e 44 4f 4d 42 4c 4f 42 28 22 20 24 63 6f 75  ANDOMBLOB(" $cou
9260: 6e 74 33 20 22 29 20 57 48 45 52 45 20 78 20 4c  nt3 ") WHERE x L
9270: 49 4b 45 20 27 22 20 5c 0d 0a 20 20 20 20 20 20  IKE '" \..      
9280: 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 20          [format 
9290: 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20 41  %X $index] "%' A
92a0: 4e 44 20 7a 20 3d 20 27 62 69 67 27 3b 22 5d 0d  ND z = 'big';"].
92b0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
92c0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
92d0: 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 39 2c 20  Workload #18.9, 
92e0: 22 73 6d 61 6c 6c 22 20 44 45 4c 45 54 45 20 73  "small" DELETE s
92f0: 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20 20  tatements...    
9300: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9310: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
9320: 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  db [appendArgs "
9330: 44 45 4c 45 54 45 20 46 52 4f 4d 20 22 20 24 74  DELETE FROM " $t
9340: 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  able \..        
9350: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 78 20        " WHERE x 
9360: 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74 20  LIKE '" [format 
9370: 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20 41  %X $index] "%' A
9380: 4e 44 20 7a 20 3d 20 27 73 6d 61 6c 6c 27 3b 22  ND z = 'small';"
9390: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ]..          #..
93a0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
93b0: 3a 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 31  : Workload #18.1
93c0: 30 2c 20 22 62 69 67 22 20 44 45 4c 45 54 45 20  0, "big" DELETE 
93d0: 73 74 61 74 65 6d 65 6e 74 73 2e 0d 0a 20 20 20  statements...   
93e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
93f0: 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
9400: 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20  $db [appendArgs 
9410: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 22 20 24  "DELETE FROM " $
9420: 74 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  table \..       
9430: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 78         " WHERE x
9440: 20 4c 49 4b 45 20 27 22 20 5b 66 6f 72 6d 61 74   LIKE '" [format
9450: 20 25 58 20 24 69 6e 64 65 78 5d 20 22 25 27 20   %X $index] "%' 
9460: 41 4e 44 20 7a 20 3d 20 27 62 69 67 27 3b 22 5d  AND z = 'big';"]
9470: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
9480: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9490: 20 57 6f 72 6b 6c 6f 61 64 20 23 31 38 2e 31 31   Workload #18.11
94a0: 2c 20 56 41 43 55 55 4d 20 73 74 61 74 65 6d 65  , VACUUM stateme
94b0: 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nt...          #
94c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 20  ..          sql 
94d0: 65 78 65 63 75 74 65 20 24 64 62 20 22 56 41 43  execute $db "VAC
94e0: 55 55 4d 3b 22 0d 0a 20 20 20 20 20 20 20 20 20  UUM;"..         
94f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
9500: 4e 4f 54 45 3a 20 57 6f 72 6b 6c 6f 61 64 20 23  NOTE: Workload #
9510: 31 38 2e 31 34 2c 20 50 52 41 47 4d 41 20 69 6e  18.14, PRAGMA in
9520: 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 73 74  tegrity check st
9530: 61 74 65 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20  atement...      
9540: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
9550: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 73 71 6c   set result [sql
9560: 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74   execute -execut
9570: 65 20 73 63 61 6c 61 72 20 24 64 62 20 5c 0d 0a  e scalar $db \..
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50                "P
9590: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
95a0: 63 68 65 63 6b 3b 22 5d 0d 0a 20 20 20 20 20 20  check;"]..      
95b0: 20 20 20 20 69 66 20 7b 24 72 65 73 75 6c 74 20      if {$result 
95c0: 6e 65 20 22 6f 6b 22 7d 20 74 68 65 6e 20 7b 0d  ne "ok"} then {.
95d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
95e0: 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  or [appendArgs "
95f0: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  integrity check 
9600: 66 61 69 6c 65 64 3a 20 22 20 24 72 65 73 75 6c  failed: " $resul
9610: 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t]..          }.
9620: 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 54  .          showT
9630: 65 73 74 20 52 0d 0a 20 20 20 20 20 20 20 20 7d  est R..        }
9640: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
9650: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
9660: 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72 20  isExpectedError 
9670: 24 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d  $error]} then {.
9680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f  .            sho
9690: 77 54 65 73 74 20 72 0d 0a 20 20 20 20 20 20 20  wTest r..       
96a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
96b0: 20 20 20 20 20 20 20 20 20 66 61 69 6c 54 65 73           failTes
96c0: 74 20 72 20 24 65 72 72 6f 72 0d 0a 20 20 20 20  t r $error..    
96d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
96e0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
96f0: 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 73 72     cleanupDb $sr
9700: 63 46 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c  cFileName db fal
9710: 73 65 20 74 72 75 65 20 66 61 6c 73 65 0d 0a 20  se true false.. 
9720: 20 20 20 20 20 64 6f 6e 65 54 65 73 74 20 52 0d       doneTest R.
9730: 0a 20 20 20 20 7d 5d 20 30 5d 0d 0a 20 20 7d 5d  .    }] 0]..  }]
9740: 0d 0a 7d 20 2d 62 6f 64 79 20 7b 0d 0a 20 20 66  ..} -body {..  f
9750: 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 28 30 29  or {set index(0)
9760: 20 30 7d 20 7b 24 69 6e 64 65 78 28 30 29 20 3c   0} {$index(0) <
9770: 20 24 63 6f 75 6e 74 28 30 29 7d 20 7b 69 6e 63   $count(0)} {inc
9780: 72 20 69 6e 64 65 78 28 30 29 7d 20 7b 0d 0a 20  r index(0)} {.. 
9790: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
97a0: 73 72 63 44 62 20 22 43 52 45 41 54 45 20 54 41  srcDb "CREATE TA
97b0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
97c0: 53 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b  S t1(x PRIMARY K
97d0: 45 59 2c 20 79 2c 20 7a 29 3b 22 0d 0a 20 20 20  EY, y, z);"..   
97e0: 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
97f0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
9800: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 31 28  F NOT EXISTS t1(
9810: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
9820: 2c 20 7a 29 3b 22 0d 0a 0d 0a 20 20 20 20 75 6e  , z);"....    un
9830: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
9840: 74 68 72 65 61 64 0d 0a 0d 0a 20 20 20 20 66 6f  thread....    fo
9850: 72 65 61 63 68 20 69 6e 64 65 78 28 31 29 20 5b  reach index(1) [
9860: 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 5b  lsort -integer [
9870: 61 72 72 61 79 20 6e 61 6d 65 73 20 77 6f 72 6b  array names work
9880: 6c 6f 61 64 5d 5d 20 7b 0d 0a 20 20 20 20 20 20  load]] {..      
9890: 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78  if {[lsearch -ex
98a0: 61 63 74 20 24 6e 6f 57 6f 72 6b 6c 6f 61 64 20  act $noWorkload 
98b0: 24 69 6e 64 65 78 28 31 29 5d 20 3d 3d 20 2d 31  $index(1)] == -1
98c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
98d0: 20 20 73 65 74 20 74 68 72 65 61 64 28 24 69 6e    set thread($in
98e0: 64 65 78 28 31 29 29 20 5b 6f 62 6a 65 63 74 20  dex(1)) [object 
98f0: 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 53 79  create -alias Sy
9900: 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54  stem.Threading.T
9910: 68 72 65 61 64 20 5c 0d 0a 20 20 20 20 20 20 20  hread \..       
9920: 20 20 20 20 20 5b 6c 69 73 74 20 61 70 70 6c 79       [list apply
9930: 20 24 77 6f 72 6b 6c 6f 61 64 28 24 69 6e 64 65   $workload($inde
9940: 78 28 31 29 29 20 24 66 69 6c 65 4e 61 6d 65 28  x(1)) $fileName(
9950: 31 29 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20  1) $fileName(2) 
9960: 74 31 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  t1 \..          
9970: 20 20 24 63 6f 75 6e 74 28 31 29 20 24 63 6f 75    $count(1) $cou
9980: 6e 74 28 33 29 20 24 63 6f 75 6e 74 28 34 29 5d  nt(3) $count(4)]
9990: 20 31 30 34 38 35 37 36 5d 0d 0a 0d 0a 20 20 20   1048576]....   
99a0: 20 20 20 20 20 24 74 68 72 65 61 64 28 24 69 6e       $thread($in
99b0: 64 65 78 28 31 29 29 20 4e 61 6d 65 20 5b 61 70  dex(1)) Name [ap
99c0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
99d0: 20 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74        [file root
99e0: 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  name [file tail 
99f0: 24 66 69 6c 65 4e 61 6d 65 28 32 29 5d 5d 20 22  $fileName(2)]] "
9a00: 20 23 22 20 24 69 6e 64 65 78 28 31 29 5d 0d 0a   #" $index(1)]..
9a10: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
9a20: 6e 66 6f 20 65 78 69 73 74 73 20 70 72 69 6f 72  nfo exists prior
9a30: 69 74 79 28 24 69 6e 64 65 78 28 31 29 29 5d 7d  ity($index(1))]}
9a40: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9a50: 20 20 20 24 74 68 72 65 61 64 28 24 69 6e 64 65     $thread($inde
9a60: 78 28 31 29 29 20 50 72 69 6f 72 69 74 79 20 24  x(1)) Priority $
9a70: 70 72 69 6f 72 69 74 79 28 24 69 6e 64 65 78 28  priority($index(
9a80: 31 29 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  1))..        }..
9a90: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
9aa0: 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 69 6e  ..    foreach in
9ab0: 64 65 78 28 31 29 20 5b 6c 69 73 74 20 53 74 61  dex(1) [list Sta
9ac0: 72 74 20 4a 6f 69 6e 5d 20 7b 0d 0a 20 20 20 20  rt Join] {..    
9ad0: 20 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78 28    foreach index(
9ae0: 32 29 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20  2) [array names 
9af0: 74 68 72 65 61 64 5d 20 7b 0d 0a 20 20 20 20 20  thread] {..     
9b00: 20 20 20 24 74 68 72 65 61 64 28 24 69 6e 64 65     $thread($inde
9b10: 78 28 32 29 29 20 24 69 6e 64 65 78 28 31 29 0d  x(2)) $index(1).
9b20: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
9b30: 0a 0d 0a 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f  ...    unset -no
9b40: 63 6f 6d 70 6c 61 69 6e 20 74 68 72 65 61 64 0d  complain thread.
9b50: 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23  .  }....  ######
9b60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9b80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9b90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ba0: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 66 6f 72  #######....  for
9bb0: 65 61 63 68 20 69 6e 64 65 78 28 30 29 20 5b 73  each index(0) [s
9bc0: 70 6c 69 74 20 24 69 6e 64 69 63 61 74 6f 72 73  plit $indicators
9bd0: 20 22 22 5d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20   ""] {..    #.. 
9be0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
9bf0: 66 20 74 68 69 73 20 77 6f 72 6b 6c 6f 61 64 20  f this workload 
9c00: 69 74 65 72 61 74 69 6f 6e 20 72 61 69 73 65 64  iteration raised
9c10: 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 66 20 73   an error.  If s
9c20: 6f 2c 20 74 68 65 0d 0a 20 20 20 20 23 20 20 20  o, the..    #   
9c30: 20 20 20 20 69 6e 64 69 63 61 74 6f 72 20 6c 65      indicator le
9c40: 74 74 65 72 20 77 69 6c 6c 20 62 65 20 69 6e 20  tter will be in 
9c50: 6c 6f 77 65 72 20 63 61 73 65 3b 20 6f 74 68 65  lower case; othe
9c60: 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 0d 0a  rwise, it will..
9c70: 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20 69      #       be i
9c80: 6e 20 75 70 70 65 72 20 63 61 73 65 2e 0d 0a 20  n upper case... 
9c90: 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20 69 6e     #..    set in
9ca0: 64 65 78 28 31 29 20 5b 73 74 72 69 6e 67 20 69  dex(1) [string i
9cb0: 73 20 75 70 70 65 72 20 2d 73 74 72 69 63 74 20  s upper -strict 
9cc0: 24 69 6e 64 65 78 28 30 29 5d 0d 0a 0d 0a 20 20  $index(0)]....  
9cd0: 20 20 73 65 74 20 69 6e 64 65 78 28 32 29 20 5b    set index(2) [
9ce0: 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6f 72  expr {[string or
9cf0: 64 69 6e 61 6c 20 24 69 6e 64 65 78 28 30 29 20  dinal $index(0) 
9d00: 30 5d 20 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20  0] - \..        
9d10: 5b 73 74 72 69 6e 67 20 6f 72 64 69 6e 61 6c 20  [string ordinal 
9d20: 5b 65 78 70 72 20 7b 24 69 6e 64 65 78 28 31 29  [expr {$index(1)
9d30: 20 3f 20 22 41 22 20 3a 20 22 61 22 7d 5d 20 30   ? "A" : "a"}] 0
9d40: 5d 20 2b 20 31 7d 5d 0d 0a 0d 0a 20 20 20 20 73  ] + 1}]....    s
9d50: 65 74 20 69 6e 64 65 78 28 33 29 20 5b 65 78 70  et index(3) [exp
9d60: 72 20 7b 24 69 6e 64 65 78 28 31 29 20 3f 20 22  r {$index(1) ? "
9d70: 6f 6b 22 20 3a 20 22 65 72 72 6f 72 22 7d 5d 0d  ok" : "error"}].
9d80: 0a 0d 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  ...    if {![inf
9d90: 6f 20 65 78 69 73 74 73 20 69 74 65 72 61 74 69  o exists iterati
9da0: 6f 6e 73 28 24 69 6e 64 65 78 28 32 29 2c 24 69  ons($index(2),$i
9db0: 6e 64 65 78 28 33 29 29 5d 7d 20 74 68 65 6e 20  ndex(3))]} then 
9dc0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 69 74 65  {..      set ite
9dd0: 72 61 74 69 6f 6e 73 28 24 69 6e 64 65 78 28 32  rations($index(2
9de0: 29 2c 24 69 6e 64 65 78 28 33 29 29 20 30 0d 0a  ),$index(3)) 0..
9df0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 63      }....    inc
9e00: 72 20 69 74 65 72 61 74 69 6f 6e 73 28 24 69 6e  r iterations($in
9e10: 64 65 78 28 32 29 2c 24 69 6e 64 65 78 28 33 29  dex(2),$index(3)
9e20: 29 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23  )..  }....  ####
9e30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e70: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 23  #########....  #
9e80: 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 41 64 76 61  ..  # NOTE: Adva
9e90: 6e 63 65 20 6f 75 74 70 75 74 20 74 6f 20 74 68  nce output to th
9ea0: 65 20 6e 65 78 74 20 6c 69 6e 65 20 64 75 65 20  e next line due 
9eb0: 74 6f 20 74 68 65 20 77 6f 72 6b 6c 6f 61 64 20  to the workload 
9ec0: 69 74 65 72 61 74 69 6f 6e 0d 0a 20 20 23 20 20  iteration..  #  
9ed0: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 69 6e       progress in
9ee0: 64 69 63 61 74 6f 72 73 2e 0d 0a 20 20 23 0d 0a  dicators...  #..
9ef0: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
9f00: 61 6e 6e 65 6c 20 5c 6e 0d 0a 0d 0a 20 20 23 23  annel \n....  ##
9f10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9f20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9f30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9f40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9f50: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
9f60: 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78 28 30   foreach index(0
9f70: 29 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65  ) [lsort -intege
9f80: 72 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 74  r [array names t
9f90: 69 6d 65 73 5d 5d 20 7b 0d 0a 20 20 20 20 73 65  imes]] {..    se
9fa0: 74 20 74 69 6d 65 73 28 6c 65 6e 67 74 68 29 20  t times(length) 
9fb0: 5b 6c 6c 65 6e 67 74 68 20 24 74 69 6d 65 73 28  [llength $times(
9fc0: 24 69 6e 64 65 78 28 30 29 29 5d 0d 0a 0d 0a 20  $index(0))].... 
9fd0: 20 20 20 69 66 20 7b 24 74 69 6d 65 73 28 6c 65     if {$times(le
9fe0: 6e 67 74 68 29 20 3e 20 30 7d 20 74 68 65 6e 20  ngth) > 0} then 
9ff0: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
a000: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
a010: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
a020: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 76 65 72        "---- aver
a030: 61 67 65 20 74 69 6d 65 20 66 6f 72 20 77 6f 72  age time for wor
a040: 6b 6c 6f 61 64 20 28 22 20 24 69 6e 64 65 78 28  kload (" $index(
a050: 30 29 20 22 29 20 69 73 20 61 62 6f 75 74 20 22  0) ") is about "
a060: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 65   \..          [e
a070: 78 70 72 20 69 6e 74 28 28 5b 6a 6f 69 6e 20 24  xpr int(([join $
a080: 74 69 6d 65 73 28 24 69 6e 64 65 78 28 30 29 29  times($index(0))
a090: 20 2b 5d 29 2f 24 74 69 6d 65 73 28 6c 65 6e 67   +])/$times(leng
a0a0: 74 68 29 2f 31 30 30 30 2e 30 29 5d 20 5c 0d 0a  th)/1000.0)] \..
a0b0: 20 20 20 20 20 20 20 20 20 20 22 20 6d 69 6c 6c            " mill
a0c0: 69 73 65 63 6f 6e 64 73 5c 6e 22 5d 0d 0a 20 20  iseconds\n"]..  
a0d0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
a0e0: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
a0f0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
a100: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
a110: 2d 2d 2d 2d 20 6e 6f 20 74 69 6d 65 73 20 66 6f  ---- no times fo
a120: 72 20 77 6f 72 6b 6c 6f 61 64 20 28 22 20 24 69  r workload (" $i
a130: 6e 64 65 78 28 30 29 20 22 29 5c 6e 22 5d 0d 0a  ndex(0) ")\n"]..
a140: 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
a150: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a160: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a190: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
a1a0: 0a 20 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78  .  foreach index
a1b0: 28 30 29 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65  (0) [lsort -inte
a1c0: 67 65 72 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  ger [array names
a1d0: 20 77 6f 72 6b 6c 6f 61 64 5d 5d 20 7b 0d 0a 20   workload]] {.. 
a1e0: 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20     if {[lsearch 
a1f0: 2d 65 78 61 63 74 20 24 6e 6f 57 6f 72 6b 6c 6f  -exact $noWorklo
a200: 61 64 20 24 69 6e 64 65 78 28 30 29 5d 20 3d 3d  ad $index(0)] ==
a210: 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
a220: 20 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63     tputs $test_c
a230: 68 61 6e 6e 65 6c 20 5b 66 6f 72 6d 61 74 57 6f  hannel [formatWo
a240: 72 6b 6c 6f 61 64 52 65 73 75 6c 74 20 24 69 6e  rkloadResult $in
a250: 64 65 78 28 30 29 5d 0d 0a 20 20 20 20 7d 0d 0a  dex(0)]..    }..
a260: 20 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23    }....  #######
a270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a2a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a2b0: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 73 65 74 20  ######....  set 
a2c0: 72 65 73 75 6c 74 20 5b 73 71 6c 20 65 78 65 63  result [sql exec
a2d0: 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61  ute -execute sca
a2e0: 6c 61 72 20 24 73 72 63 44 62 20 22 50 52 41 47  lar $srcDb "PRAG
a2f0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
a300: 63 6b 3b 22 5d 0d 0a 0d 0a 20 20 69 66 20 7b 24  ck;"]....  if {$
a310: 72 65 73 75 6c 74 20 65 71 20 22 6f 6b 22 7d 20  result eq "ok"} 
a320: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 74 70 75 74  then {..    tput
a330: 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  s $test_channel 
a340: 22 2d 2d 2d 2d 20 69 6e 74 65 67 72 69 74 79 20  "---- integrity 
a350: 63 68 65 63 6b 20 6f 6b 20 28 73 72 63 44 62 29  check ok (srcDb)
a360: 5c 6e 22 0d 0a 20 20 7d 20 65 6c 73 65 20 7b 0d  \n"..  } else {.
a370: 0a 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65  .    error [appe
a380: 6e 64 41 72 67 73 20 22 69 6e 74 65 67 72 69 74  ndArgs "integrit
a390: 79 20 63 68 65 63 6b 20 66 61 69 6c 65 64 20 28  y check failed (
a3a0: 73 72 63 44 62 29 3a 20 22 20 24 72 65 73 75 6c  srcDb): " $resul
a3b0: 74 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 23 23  t]..  }....  ###
a3c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a3d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a3e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a3f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a400: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
a410: 73 65 74 20 72 65 73 75 6c 74 20 5b 73 71 6c 20  set result [sql 
a420: 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
a430: 20 73 63 61 6c 61 72 20 24 64 62 20 22 50 52 41   scalar $db "PRA
a440: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
a450: 65 63 6b 3b 22 5d 0d 0a 0d 0a 20 20 69 66 20 7b  eck;"]....  if {
a460: 24 72 65 73 75 6c 74 20 65 71 20 22 6f 6b 22 7d  $result eq "ok"}
a470: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 74 70 75   then {..    tpu
a480: 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  ts $test_channel
a490: 20 22 2d 2d 2d 2d 20 69 6e 74 65 67 72 69 74 79   "---- integrity
a4a0: 20 63 68 65 63 6b 20 6f 6b 20 28 64 62 29 5c 6e   check ok (db)\n
a4b0: 22 0d 0a 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  "..  } else {.. 
a4c0: 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64     error [append
a4d0: 41 72 67 73 20 22 69 6e 74 65 67 72 69 74 79 20  Args "integrity 
a4e0: 63 68 65 63 6b 20 66 61 69 6c 65 64 20 28 64 62  check failed (db
a4f0: 29 3a 20 22 20 24 72 65 73 75 6c 74 5d 0d 0a 20  ): " $result].. 
a500: 20 7d 0d 0a 0d 0a 20 20 23 23 23 23 23 23 23 23   }....  ########
a510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a550: 23 23 23 23 23 0d 0a 0d 0a 20 20 23 0d 0a 20 20  #####....  #..  
a560: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6f 76 65 72  # NOTE: The over
a570: 61 6c 6c 20 74 65 73 74 20 72 65 73 75 6c 74 20  all test result 
a580: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
a590: 62 65 72 20 6f 66 20 66 61 69 6c 75 72 65 73 20  ber of failures 
a5a0: 28 69 2e 65 2e 0d 0a 20 20 23 20 20 20 20 20 20  (i.e...  #      
a5b0: 20 22 75 6e 65 78 70 65 63 74 65 64 20 65 72 72   "unexpected err
a5c0: 6f 72 73 22 29 20 65 6e 63 6f 75 6e 74 65 72 65  ors") encountere
a5d0: 64 20 64 75 72 69 6e 67 20 61 20 77 6f 72 6b 6c  d during a workl
a5e0: 6f 61 64 20 69 74 65 72 61 74 69 6f 6e 2e 0d 0a  oad iteration...
a5f0: 20 20 23 0d 0a 20 20 65 78 70 72 20 7b 5b 61 72    #..  expr {[ar
a600: 72 61 79 20 73 69 7a 65 20 66 61 69 6c 75 72 65  ray size failure
a610: 73 5d 20 3e 20 30 20 3f 20 5c 0d 0a 20 20 20 20  s] > 0 ? \..    
a620: 20 20 5b 65 78 70 72 20 5b 6a 6f 69 6e 20 5b 61    [expr [join [a
a630: 72 72 61 79 20 76 61 6c 75 65 73 20 66 61 69 6c  rray values fail
a640: 75 72 65 73 5d 20 2b 5d 5d 20 3a 20 30 7d 0d 0a  ures] +]] : 0}..
a650: 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0d 0a 20 20  } -cleanup {..  
a660: 72 65 6e 61 6d 65 20 66 72 65 65 4d 65 6d 20 22  rename freeMem "
a670: 22 0d 0a 20 20 72 65 6e 61 6d 65 20 75 73 65 4d  "..  rename useM
a680: 65 6d 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20  em ""..  rename 
a690: 61 6c 6c 6f 63 4d 65 6d 20 22 22 0d 0a 20 20 72  allocMem ""..  r
a6a0: 65 6e 61 6d 65 20 66 61 69 6c 54 65 73 74 20 22  ename failTest "
a6b0: 22 0d 0a 20 20 72 65 6e 61 6d 65 20 64 6f 6e 65  "..  rename done
a6c0: 54 65 73 74 20 22 22 0d 0a 20 20 72 65 6e 61 6d  Test ""..  renam
a6d0: 65 20 73 68 6f 77 54 65 73 74 20 22 22 0d 0a 20  e showTest "".. 
a6e0: 20 72 65 6e 61 6d 65 20 77 61 69 74 46 6f 72 54   rename waitForT
a6f0: 65 73 74 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65  est ""..  rename
a700: 20 69 73 45 78 70 65 63 74 65 64 45 72 72 6f 72   isExpectedError
a710: 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20 66 6f   ""..  rename fo
a720: 72 6d 61 74 57 6f 72 6b 6c 6f 61 64 52 65 73 75  rmatWorkloadResu
a730: 6c 74 20 22 22 0d 0a 0d 0a 20 20 63 6c 65 61 6e  lt ""....  clean
a740: 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 28 32  upDb $fileName(2
a750: 29 0d 0a 20 20 63 6c 65 61 6e 75 70 44 62 20 24  )..  cleanupDb $
a760: 66 69 6c 65 4e 61 6d 65 28 31 29 20 73 72 63 44  fileName(1) srcD
a770: 62 0d 0a 0d 0a 20 20 66 6f 72 65 61 63 68 20 69  b....  foreach i
a780: 6e 64 65 78 28 30 29 20 5b 61 72 72 61 79 20 6e  ndex(0) [array n
a790: 61 6d 65 73 20 77 6f 72 6b 6c 6f 61 64 5d 20 7b  ames workload] {
a7a0: 0d 0a 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20  ..    catch {.. 
a7b0: 20 20 20 20 20 6f 62 6a 65 63 74 20 72 65 6d 6f       object remo
a7c0: 76 65 63 61 6c 6c 62 61 63 6b 20 5b 6c 69 73 74  vecallback [list
a7d0: 20 61 70 70 6c 79 20 24 77 6f 72 6b 6c 6f 61 64   apply $workload
a7e0: 28 24 69 6e 64 65 78 28 30 29 29 20 24 66 69 6c  ($index(0)) $fil
a7f0: 65 4e 61 6d 65 28 31 29 20 5c 0d 0a 20 20 20 20  eName(1) \..    
a800: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28        $fileName(
a810: 32 29 20 74 31 20 24 63 6f 75 6e 74 28 31 29 20  2) t1 $count(1) 
a820: 24 63 6f 75 6e 74 28 33 29 20 24 63 6f 75 6e 74  $count(3) $count
a830: 28 34 29 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  (4)]..    }..  }
a840: 0d 0a 0d 0a 20 20 66 72 65 65 44 62 43 6f 6e 6e  ....  freeDbConn
a850: 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 69 66 20 7b  ection....  if {
a860: 21 24 6e 6f 54 72 61 63 65 7d 20 74 68 65 6e 20  !$noTrace} then 
a870: 7b 0d 0a 20 20 20 20 63 6c 65 61 6e 75 70 4c 6f  {..    cleanupLo
a880: 67 67 69 6e 67 20 24 6c 6f 67 46 69 6c 65 4e 61  gging $logFileNa
a890: 6d 65 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 72 65 6e  me..  }....  ren
a8a0: 61 6d 65 20 63 6c 65 61 6e 75 70 4c 6f 67 67 69  ame cleanupLoggi
a8b0: 6e 67 20 22 22 0d 0a 20 20 72 65 6e 61 6d 65 20  ng ""..  rename 
a8c0: 73 65 74 75 70 4c 6f 67 67 69 6e 67 20 22 22 0d  setupLogging "".
a8d0: 0a 0d 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f  ...  unset -noco
a8e0: 6d 70 6c 61 69 6e 20 72 65 73 75 6c 74 20 74 68  mplain result th
a8f0: 72 65 61 64 20 69 6e 64 65 78 20 77 6f 72 6b 6c  read index workl
a900: 6f 61 64 20 70 72 69 6f 72 69 74 79 20 6e 6f 57  oad priority noW
a910: 6f 72 6b 6c 6f 61 64 20 5c 0d 0a 20 20 20 20 20  orkload \..     
a920: 20 70 72 69 6f 72 69 74 69 65 73 20 73 72 63 44   priorities srcD
a930: 62 20 64 62 20 66 69 6c 65 4e 61 6d 65 20 63 6f  b db fileName co
a940: 6d 70 69 6c 65 64 20 6f 70 74 69 6f 6e 73 20 63  mpiled options c
a950: 6f 75 6e 74 20 74 69 6d 65 73 20 6c 6f 67 46 69  ount times logFi
a960: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
a970: 6c 6f 67 4c 69 73 74 65 6e 65 72 20 63 6f 6e 6e  logListener conn
a980: 65 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 6f 72  ection indicator
a990: 73 20 69 74 65 72 61 74 69 6f 6e 73 20 65 78 69  s iterations exi
a9a0: 74 4f 6e 46 61 69 6c 20 63 6f 54 61 73 6b 4d 65  tOnFail coTaskMe
a9b0: 6d 20 5c 0d 0a 20 20 20 20 20 20 6e 6f 54 72 61  m \..      noTra
a9c0: 63 65 20 66 61 69 6c 75 72 65 73 20 73 74 61 74  ce failures stat
a9d0: 75 73 0d 0a 7d 20 2d 63 6f 6e 73 74 72 61 69 6e  us..} -constrain
a9e0: 74 73 20 5c 0d 0a 7b 65 61 67 6c 65 20 6d 6f 6e  ts \..{eagle mon
a9f0: 6f 42 75 67 32 38 20 63 6f 6d 6d 61 6e 64 2e 73  oBug28 command.s
aa00: 71 6c 20 63 6f 6d 70 69 6c 65 2e 44 41 54 41 20  ql compile.DATA 
aa10: 53 51 4c 69 74 65 20 53 79 73 74 65 6d 2e 44 61  SQLite System.Da
aa20: 74 61 2e 53 51 4c 69 74 65 7d 20 5c 0d 0a 2d 72  ta.SQLite} \..-r
aa30: 65 73 75 6c 74 20 7b 30 7d 7d 0d 0a 0d 0a 23 23  esult {0}}....##
aa40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
aa50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
aa60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
aa70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
aa80: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
aa90: 0a 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70  .runSQLiteTestEp
aaa0: 69 6c 6f 67 75 65 0d 0a 72 75 6e 54 65 73 74 45  ilogue..runTestE
aab0: 70 69 6c 6f 67 75 65 0d 0a                       pilogue..