/ Hex Artifact Content
Login

Artifact c2633dc73f4206deffd8e8c34fe5a2dc0ab97800:


0000: 23 20 32 30 30 37 20 4f 63 74 6f 62 65 72 20 32  # 2007 October 2
0010: 33 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  3.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an you give..#.#
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63  rary.  The.# foc
01b0: 75 73 20 6f 66 20 74 68 69 73 20 73 63 72 69 70  us of this scrip
01c0: 74 20 69 73 20 6d 65 61 73 75 72 69 6e 67 20 65  t is measuring e
01d0: 78 65 63 75 74 69 6e 67 20 73 70 65 65 64 2e 20  xecuting speed. 
01e0: 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
01f0: 79 2c 0a 23 20 74 68 65 20 66 6f 63 75 73 20 69  y,.# the focus i
0200: 73 20 6f 6e 20 74 68 65 20 73 70 65 65 64 20 6f  s on the speed o
0210: 66 3a 0a 23 0a 23 20 20 20 2a 20 6a 6f 69 6e 73  f:.#.#   * joins
0220: 0a 23 20 20 20 2a 20 76 69 65 77 73 0a 23 20 20  .#   * views.#  
0230: 20 2a 20 73 75 62 2d 73 65 6c 65 63 74 73 0a 23   * sub-selects.#
0240: 20 20 20 2a 20 74 72 69 67 67 65 72 73 0a 23 0a     * triggers.#.
0250: 23 20 24 49 64 3a 20 73 70 65 65 64 34 70 2e 74  # $Id: speed4p.t
0260: 65 73 74 2c 76 20 31 2e 31 20 32 30 30 38 2f 30  est,v 1.1 2008/0
0270: 33 2f 32 37 20 31 35 3a 30 37 3a 30 35 20 64 72  3/27 15:07:05 dr
0280: 68 20 45 78 70 20 24 0a 23 0a 0a 73 65 74 20 74  h Exp $.#..set t
0290: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
02a0: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
02b0: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
02c0: 74 65 72 2e 74 63 6c 0a 73 70 65 65 64 5f 74 72  ter.tcl.speed_tr
02d0: 69 61 6c 5f 69 6e 69 74 20 73 70 65 65 64 31 0a  ial_init speed1.
02e0: 0a 23 20 53 65 74 20 61 20 75 6e 69 66 6f 72 6d  .# Set a uniform
02f0: 20 72 61 6e 64 6f 6d 20 73 65 65 64 0a 65 78 70   random seed.exp
0300: 72 20 73 72 61 6e 64 28 30 29 0a 0a 73 65 74 20  r srand(0)..set 
0310: 73 71 6c 6f 75 74 20 5b 6f 70 65 6e 20 73 70 65  sqlout [open spe
0320: 65 64 31 2e 74 78 74 20 77 5d 0a 70 72 6f 63 20  ed1.txt w].proc 
0330: 74 72 61 63 65 73 71 6c 20 7b 73 71 6c 7d 20 7b  tracesql {sql} {
0340: 0a 20 20 70 75 74 73 20 24 3a 3a 73 71 6c 6f 75  .  puts $::sqlou
0350: 74 20 24 73 71 6c 5c 3b 0a 7d 0a 23 64 62 20 74  t $sql\;.}.#db t
0360: 72 61 63 65 20 74 72 61 63 65 73 71 6c 0a 0a 23  race tracesql..#
0370: 20 54 68 65 20 6e 75 6d 62 65 72 5f 6e 61 6d 65   The number_name
0380: 20 70 72 6f 63 65 64 75 72 65 20 62 65 6c 6f 77   procedure below
0390: 20 63 6f 6e 76 65 72 74 73 20 69 74 73 20 61 72   converts its ar
03a0: 67 6d 65 6e 74 20 28 61 6e 20 69 6e 74 65 67 65  gment (an intege
03b0: 72 29 0a 23 20 69 6e 74 6f 20 61 20 73 74 72 69  r).# into a stri
03c0: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ng which is the 
03d0: 45 6e 67 6c 69 73 68 2d 6c 61 6e 67 75 61 67 65  English-language
03e0: 20 6e 61 6d 65 20 66 6f 72 20 74 68 61 74 20 6e   name for that n
03f0: 75 6d 62 65 72 2e 0a 23 0a 23 20 45 78 61 6d 70  umber..#.# Examp
0400: 6c 65 3a 0a 23 0a 23 20 20 20 20 20 70 75 74 73  le:.#.#     puts
0410: 20 5b 6e 75 6d 62 65 72 5f 6e 61 6d 65 20 31 32   [number_name 12
0420: 33 5d 20 20 20 2d 3e 20 20 22 6f 6e 65 20 68 75  3]   ->  "one hu
0430: 6e 64 72 65 64 20 74 77 65 6e 74 79 20 74 68 72  ndred twenty thr
0440: 65 65 22 0a 23 0a 73 65 74 20 6f 6e 65 73 20 7b  ee".#.set ones {
0450: 7a 65 72 6f 20 6f 6e 65 20 74 77 6f 20 74 68 72  zero one two thr
0460: 65 65 20 66 6f 75 72 20 66 69 76 65 20 73 69 78  ee four five six
0470: 20 73 65 76 65 6e 20 65 69 67 68 74 20 6e 69 6e   seven eight nin
0480: 65 0a 20 20 20 20 20 20 20 20 20 20 74 65 6e 20  e.          ten 
0490: 65 6c 65 76 65 6e 20 74 77 65 6c 76 65 20 74 68  eleven twelve th
04a0: 69 72 74 65 65 6e 20 66 6f 75 72 74 65 65 6e 20  irteen fourteen 
04b0: 66 69 66 74 65 65 6e 20 73 69 78 74 65 65 6e 20  fifteen sixteen 
04c0: 73 65 76 65 6e 74 65 65 6e 0a 20 20 20 20 20 20  seventeen.      
04d0: 20 20 20 20 65 69 67 68 74 65 65 6e 20 6e 69 6e      eighteen nin
04e0: 65 74 65 65 6e 7d 0a 73 65 74 20 74 65 6e 73 20  eteen}.set tens 
04f0: 7b 7b 7d 20 74 65 6e 20 74 77 65 6e 74 79 20 74  {{} ten twenty t
0500: 68 69 72 74 79 20 66 6f 72 74 79 20 66 69 66 74  hirty forty fift
0510: 79 20 73 69 78 74 79 20 73 65 76 65 6e 74 79 20  y sixty seventy 
0520: 65 69 67 68 74 79 20 6e 69 6e 65 74 79 7d 0a 70  eighty ninety}.p
0530: 72 6f 63 20 6e 75 6d 62 65 72 5f 6e 61 6d 65 20  roc number_name 
0540: 7b 6e 7d 20 7b 0a 20 20 69 66 20 7b 24 6e 3e 3d  {n} {.  if {$n>=
0550: 31 30 30 30 7d 20 7b 0a 20 20 20 20 73 65 74 20  1000} {.    set 
0560: 74 78 74 20 22 5b 6e 75 6d 62 65 72 5f 6e 61 6d  txt "[number_nam
0570: 65 20 5b 65 78 70 72 20 7b 24 6e 2f 31 30 30 30  e [expr {$n/1000
0580: 7d 5d 5d 20 74 68 6f 75 73 61 6e 64 22 0a 20 20  }]] thousand".  
0590: 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24    set n [expr {$
05a0: 6e 25 31 30 30 30 7d 5d 0a 20 20 7d 20 65 6c 73  n%1000}].  } els
05b0: 65 20 7b 0a 20 20 20 20 73 65 74 20 74 78 74 20  e {.    set txt 
05c0: 7b 7d 0a 20 20 7d 0a 20 20 69 66 20 7b 24 6e 3e  {}.  }.  if {$n>
05d0: 3d 31 30 30 7d 20 7b 0a 20 20 20 20 61 70 70 65  =100} {.    appe
05e0: 6e 64 20 74 78 74 20 22 20 5b 6c 69 6e 64 65 78  nd txt " [lindex
05f0: 20 24 3a 3a 6f 6e 65 73 20 5b 65 78 70 72 20 7b   $::ones [expr {
0600: 24 6e 2f 31 30 30 7d 5d 5d 20 68 75 6e 64 72 65  $n/100}]] hundre
0610: 64 22 0a 20 20 20 20 73 65 74 20 6e 20 5b 65 78  d".    set n [ex
0620: 70 72 20 7b 24 6e 25 31 30 30 7d 5d 0a 20 20 7d  pr {$n%100}].  }
0630: 0a 20 20 69 66 20 7b 24 6e 3e 3d 32 30 7d 20 7b  .  if {$n>=20} {
0640: 0a 20 20 20 20 61 70 70 65 6e 64 20 74 78 74 20  .    append txt 
0650: 22 20 5b 6c 69 6e 64 65 78 20 24 3a 3a 74 65 6e  " [lindex $::ten
0660: 73 20 5b 65 78 70 72 20 7b 24 6e 2f 31 30 7d 5d  s [expr {$n/10}]
0670: 5d 22 0a 20 20 20 20 73 65 74 20 6e 20 5b 65 78  ]".    set n [ex
0680: 70 72 20 7b 24 6e 25 31 30 7d 5d 0a 20 20 7d 0a  pr {$n%10}].  }.
0690: 20 20 69 66 20 7b 24 6e 3e 30 7d 20 7b 0a 20 20    if {$n>0} {.  
06a0: 20 20 61 70 70 65 6e 64 20 74 78 74 20 22 20 5b    append txt " [
06b0: 6c 69 6e 64 65 78 20 24 3a 3a 6f 6e 65 73 20 24  lindex $::ones $
06c0: 6e 5d 22 0a 20 20 7d 0a 20 20 73 65 74 20 74 78  n]".  }.  set tx
06d0: 74 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  t [string trim $
06e0: 74 78 74 5d 0a 20 20 69 66 20 7b 24 74 78 74 3d  txt].  if {$txt=
06f0: 3d 22 22 7d 20 7b 73 65 74 20 74 78 74 20 7a 65  =""} {set txt ze
0700: 72 6f 7d 0a 20 20 72 65 74 75 72 6e 20 24 74 78  ro}.  return $tx
0710: 74 0a 7d 0a 0a 23 20 53 75 6d 6d 61 72 79 20 6f  t.}..# Summary o
0720: 66 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 20 73  f tests:.#.#   s
0730: 70 65 65 64 34 70 2d 6a 6f 69 6e 31 3a 20 4a 6f  peed4p-join1: Jo
0740: 69 6e 20 74 68 72 65 65 20 74 61 62 6c 65 73 20  in three tables 
0750: 75 73 69 6e 67 20 49 50 4b 20 69 6e 64 65 78 2e  using IPK index.
0760: 0a 23 20 20 20 73 70 65 65 64 34 70 2d 6a 6f 69  .#   speed4p-joi
0770: 6e 32 3a 20 4a 6f 69 6e 20 74 68 72 65 65 20 74  n2: Join three t
0780: 61 62 6c 65 73 20 75 73 69 6e 67 20 61 6e 20 69  ables using an i
0790: 6e 64 65 78 2e 0a 23 20 20 20 73 70 65 65 64 34  ndex..#   speed4
07a0: 70 2d 6a 6f 69 6e 33 3a 20 4a 6f 69 6e 20 74 77  p-join3: Join tw
07b0: 6f 20 74 61 62 6c 65 73 20 77 69 74 68 6f 75 74  o tables without
07c0: 20 61 6e 20 69 6e 64 65 78 2e 0a 23 0a 23 20 20   an index..#.#  
07d0: 20 73 70 65 65 64 34 70 2d 76 69 65 77 31 3a 20   speed4p-view1: 
07e0: 20 51 75 65 72 79 69 6e 67 20 61 20 76 69 65 77   Querying a view
07f0: 2e 0a 23 20 20 20 73 70 65 65 64 34 70 2d 74 61  ..#   speed4p-ta
0800: 62 6c 65 31 3a 20 53 61 6d 65 20 71 75 65 72 69  ble1: Same queri
0810: 65 73 20 61 73 20 69 6e 20 73 70 65 65 64 34 70  es as in speed4p
0820: 2d 76 69 65 77 31 2c 20 62 75 74 20 72 75 6e 20  -view1, but run 
0830: 64 69 72 65 63 74 6c 79 20 61 67 61 69 6e 73 74  directly against
0840: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
0850: 20 20 20 20 74 68 65 20 74 61 62 6c 65 73 20 66      the tables f
0860: 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 75  or comparison pu
0870: 72 70 6f 73 65 73 2e 0a 23 0a 23 20 20 20 73 70  rposes..#.#   sp
0880: 65 65 64 34 70 2d 73 75 62 73 65 6c 65 63 74 31  eed4p-subselect1
0890: 3a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  : A SELECT state
08a0: 6d 65 6e 74 20 74 68 61 74 20 75 73 65 73 20 6d  ment that uses m
08b0: 61 6e 79 20 73 75 62 2d 71 75 65 72 69 65 73 2e  any sub-queries.
08c0: 2e 0a 23 0a 23 20 20 20 73 70 65 65 64 34 70 2d  ..#.#   speed4p-
08d0: 74 72 69 67 67 65 72 31 3a 20 41 6e 20 49 4e 53  trigger1: An INS
08e0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ERT statement th
08f0: 61 74 20 66 69 72 65 73 20 61 20 74 72 69 67 67  at fires a trigg
0900: 65 72 2e 0a 23 20 20 20 73 70 65 65 64 34 70 2d  er..#   speed4p-
0910: 74 72 69 67 67 65 72 32 3a 20 41 6e 20 55 50 44  trigger2: An UPD
0920: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ATE statement th
0930: 61 74 20 66 69 72 65 73 20 61 20 74 72 69 67 67  at fires a trigg
0940: 65 72 2e 0a 23 20 20 20 73 70 65 65 64 34 70 2d  er..#   speed4p-
0950: 74 72 69 67 67 65 72 33 3a 20 41 20 44 45 4c 45  trigger3: A DELE
0960: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
0970: 74 20 66 69 72 65 73 20 61 20 74 72 69 67 67 65  t fires a trigge
0980: 72 2e 0a 23 20 20 20 73 70 65 65 64 34 70 2d 6e  r..#   speed4p-n
0990: 6f 74 72 69 67 67 65 72 31 3a 20 53 61 6d 65 20  otrigger1: Same 
09a0: 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 74 72 69  operation as tri
09b0: 67 67 65 72 31 2c 20 62 75 74 20 77 69 74 68 6f  gger1, but witho
09c0: 75 74 20 74 68 65 20 74 72 69 67 67 65 72 2e 0a  ut the trigger..
09d0: 23 20 20 20 73 70 65 65 64 34 70 2d 6e 6f 74 72  #   speed4p-notr
09e0: 69 67 67 65 72 32 3a 20 20 20 20 20 20 20 20 22  igger2:        "
09f0: 20 20 20 20 20 20 20 20 20 20 74 72 69 67 67 65            trigge
0a00: 72 32 20 20 20 20 20 20 20 20 20 20 20 22 0a 23  r2           ".#
0a10: 20 20 20 73 70 65 65 64 34 70 2d 6e 6f 74 72 69     speed4p-notri
0a20: 67 67 65 72 33 3a 20 20 20 20 20 20 20 20 22 20  gger3:        " 
0a30: 20 20 20 20 20 20 20 20 20 74 72 69 67 67 65 72           trigger
0a40: 33 20 20 20 20 20 20 20 20 20 20 20 22 0a 23 0a  3           ".#.
0a50: 0a 23 20 53 65 74 20 75 70 20 74 68 65 20 73 63  .# Set up the sc
0a60: 68 65 6d 61 2e 20 45 61 63 68 20 6f 66 20 74 68  hema. Each of th
0a70: 65 20 74 61 62 6c 65 73 20 74 31 2c 20 74 32 20  e tables t1, t2 
0a80: 61 6e 64 20 74 33 20 63 6f 6e 74 61 69 6e 20 35  and t3 contain 5
0a90: 30 2c 30 30 30 20 72 6f 77 73 2e 0a 23 20 54 68  0,000 rows..# Th
0aa0: 69 73 20 63 72 65 61 74 65 73 20 61 20 64 61 74  is creates a dat
0ab0: 61 62 61 73 65 20 6f 66 20 61 72 6f 75 6e 64 20  abase of around 
0ac0: 31 36 4d 42 2e 0a 65 78 65 63 73 71 6c 20 7b 0a  16MB..execsql {.
0ad0: 20 20 42 45 47 49 4e 3b 0a 20 20 43 52 45 41 54    BEGIN;.  CREAT
0ae0: 45 20 54 41 42 4c 45 20 74 31 28 72 6f 77 69 64  E TABLE t1(rowid
0af0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0b00: 20 4b 45 59 2c 20 69 20 49 4e 54 45 47 45 52 2c   KEY, i INTEGER,
0b10: 20 74 20 54 45 58 54 29 3b 0a 20 20 43 52 45 41   t TEXT);.  CREA
0b20: 54 45 20 54 41 42 4c 45 20 74 32 28 72 6f 77 69  TE TABLE t2(rowi
0b30: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
0b40: 59 20 4b 45 59 2c 20 69 20 49 4e 54 45 47 45 52  Y KEY, i INTEGER
0b50: 2c 20 74 20 54 45 58 54 29 3b 0a 20 20 43 52 45  , t TEXT);.  CRE
0b60: 41 54 45 20 54 41 42 4c 45 20 74 33 28 72 6f 77  ATE TABLE t3(row
0b70: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
0b80: 52 59 20 4b 45 59 2c 20 69 20 49 4e 54 45 47 45  RY KEY, i INTEGE
0b90: 52 2c 20 74 20 54 45 58 54 29 3b 0a 0a 20 20 43  R, t TEXT);..  C
0ba0: 52 45 41 54 45 20 56 49 45 57 20 76 31 20 41 53  REATE VIEW v1 AS
0bb0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 69   SELECT rowid, i
0bc0: 2c 20 74 20 46 52 4f 4d 20 74 31 3b 0a 20 20 43  , t FROM t1;.  C
0bd0: 52 45 41 54 45 20 56 49 45 57 20 76 32 20 41 53  REATE VIEW v2 AS
0be0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 69   SELECT rowid, i
0bf0: 2c 20 74 20 46 52 4f 4d 20 74 32 3b 0a 20 20 43  , t FROM t2;.  C
0c00: 52 45 41 54 45 20 56 49 45 57 20 76 33 20 41 53  REATE VIEW v3 AS
0c10: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 69   SELECT rowid, i
0c20: 2c 20 74 20 46 52 4f 4d 20 74 33 3b 0a 7d 0a 66  , t FROM t3;.}.f
0c30: 6f 72 20 7b 73 65 74 20 6a 6a 20 31 7d 20 7b 24  or {set jj 1} {$
0c40: 6a 6a 20 3c 3d 20 33 7d 20 7b 69 6e 63 72 20 6a  jj <= 3} {incr j
0c50: 6a 7d 20 7b 0a 20 20 73 65 74 20 73 74 6d 74 20  j} {.  set stmt 
0c60: 5b 73 74 72 69 6e 67 20 6d 61 70 20 22 25 54 25  [string map "%T%
0c70: 20 74 24 6a 6a 22 20 7b 49 4e 53 45 52 54 20 49   t$jj" {INSERT I
0c80: 4e 54 4f 20 25 54 25 20 56 41 4c 55 45 53 28 4e  NTO %T% VALUES(N
0c90: 55 4c 4c 2c 20 24 69 2c 20 24 74 29 7d 5d 0a 20  ULL, $i, $t)}]. 
0ca0: 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20   for {set ii 0} 
0cb0: 7b 24 69 69 20 3c 20 35 30 30 30 30 7d 20 7b 69  {$ii < 50000} {i
0cc0: 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20 20 73 65  ncr ii} {.    se
0cd0: 74 20 69 20 5b 65 78 70 72 20 7b 69 6e 74 28 72  t i [expr {int(r
0ce0: 61 6e 64 28 29 2a 35 30 30 30 30 29 7d 5d 0a 20  and()*50000)}]. 
0cf0: 20 20 20 73 65 74 20 74 20 5b 6e 75 6d 62 65 72     set t [number
0d00: 5f 6e 61 6d 65 20 24 69 5d 0a 20 20 20 20 65 78  _name $i].    ex
0d10: 65 63 73 71 6c 20 24 73 74 6d 74 0a 20 20 7d 0a  ecsql $stmt.  }.
0d20: 7d 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 43 52  }.execsql {.  CR
0d30: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
0d40: 20 74 31 28 74 29 3b 0a 20 20 43 52 45 41 54 45   t1(t);.  CREATE
0d50: 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 32 28   INDEX i2 ON t2(
0d60: 74 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  t);.  CREATE IND
0d70: 45 58 20 69 33 20 4f 4e 20 74 33 28 74 29 3b 0a  EX i3 ON t3(t);.
0d80: 20 20 43 4f 4d 4d 49 54 3b 0a 7d 0a 0a 23 20 42    COMMIT;.}..# B
0d90: 65 66 6f 72 65 20 72 75 6e 6e 69 6e 67 20 74 68  efore running th
0da0: 65 73 65 20 74 65 73 74 73 2c 20 64 69 73 61 62  ese tests, disab
0db0: 6c 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20  le the compiled 
0dc0: 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20  statement cache 
0dd0: 62 75 69 6c 74 20 69 6e 74 6f 0a 23 20 74 68 65  built into.# the
0de0: 20 54 63 6c 20 69 6e 74 65 72 66 61 63 65 2e 20   Tcl interface. 
0df0: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
0e00: 77 65 20 77 61 6e 74 20 74 6f 20 74 65 73 74 20  we want to test 
0e10: 74 68 65 20 73 70 65 65 64 20 6f 66 20 53 51 4c  the speed of SQL
0e20: 0a 23 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61  .# compilation a
0e30: 73 20 77 65 6c 6c 20 61 73 20 65 78 65 63 75 74  s well as execut
0e40: 69 6f 6e 2e 0a 23 0a 64 62 20 63 61 63 68 65 20  ion..#.db cache 
0e50: 73 69 7a 65 20 30 0a 0a 23 20 4a 6f 69 6e 20 74  size 0..# Join t
0e60: 31 2c 20 74 32 2c 20 74 33 20 6f 6e 20 49 50 4b  1, t2, t3 on IPK
0e70: 2e 0a 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43  ..set sql "SELEC
0e80: 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
0e90: 20 74 33 20 57 48 45 52 45 20 74 31 2e 6f 69 64   t3 WHERE t1.oid
0ea0: 20 3d 20 74 32 2e 6f 69 64 20 41 4e 44 20 74 32   = t2.oid AND t2
0eb0: 2e 6f 69 64 20 3d 20 74 33 2e 6f 69 64 22 0a 73  .oid = t3.oid".s
0ec0: 70 65 65 64 5f 74 72 69 61 6c 20 73 70 65 65 64  peed_trial speed
0ed0: 34 70 2d 6a 6f 69 6e 31 20 35 30 30 30 30 20 72  4p-join1 50000 r
0ee0: 6f 77 20 24 73 71 6c 0a 0a 23 20 4a 6f 69 6e 20  ow $sql..# Join 
0ef0: 74 31 2c 20 74 32 2c 20 74 33 20 6f 6e 20 74 68  t1, t2, t3 on th
0f00: 65 20 6e 6f 6e 2d 49 50 4b 20 69 6e 64 65 78 2e  e non-IPK index.
0f10: 0a 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43 54  .set sql "SELECT
0f20: 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
0f30: 74 33 20 57 48 45 52 45 20 74 31 2e 74 20 3d 20  t3 WHERE t1.t = 
0f40: 74 32 2e 74 20 41 4e 44 20 74 32 2e 74 20 3d 20  t2.t AND t2.t = 
0f50: 74 33 2e 74 22 0a 73 70 65 65 64 5f 74 72 69 61  t3.t".speed_tria
0f60: 6c 20 73 70 65 65 64 34 70 2d 6a 6f 69 6e 32 20  l speed4p-join2 
0f70: 35 30 30 30 30 20 72 6f 77 20 24 73 71 6c 0a 0a  50000 row $sql..
0f80: 23 20 52 75 6e 20 31 30 30 30 30 20 73 69 6d 70  # Run 10000 simp
0f90: 6c 65 20 71 75 65 72 69 65 73 20 61 67 61 69 6e  le queries again
0fa0: 73 74 20 74 68 65 20 76 69 65 77 73 2e 0a 73 65  st the views..se
0fb0: 74 20 73 63 72 69 70 74 20 7b 0a 20 20 66 6f 72  t script {.  for
0fc0: 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69 69   {set ii 1} {$ii
0fd0: 20 3c 20 31 30 30 30 30 7d 20 7b 69 6e 63 72 20   < 10000} {incr 
0fe0: 69 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 76 20  ii} {.    set v 
0ff0: 5b 65 78 70 72 20 7b 24 69 69 2a 33 7d 5d 0a 20  [expr {$ii*3}]. 
1000: 20 20 20 73 65 74 20 74 20 5b 65 78 70 72 20 7b     set t [expr {
1010: 24 69 69 25 33 2b 31 7d 5d 0a 20 20 20 20 64 62  $ii%3+1}].    db
1020: 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 2a 20   eval "SELECT * 
1030: 46 52 4f 4d 20 76 24 74 20 57 48 45 52 45 20 72  FROM v$t WHERE r
1040: 6f 77 69 64 20 3d 20 5c 24 76 22 0a 20 20 7d 0a  owid = \$v".  }.
1050: 7d 0a 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63  }.speed_trial_tc
1060: 6c 20 73 70 65 65 64 34 70 2d 76 69 65 77 31 20  l speed4p-view1 
1070: 31 30 30 30 30 20 73 74 6d 74 20 24 73 63 72 69  10000 stmt $scri
1080: 70 74 0a 0a 23 20 52 75 6e 20 74 68 65 20 73 61  pt..# Run the sa
1090: 6d 65 20 31 30 30 30 30 20 73 69 6d 70 6c 65 20  me 10000 simple 
10a0: 71 75 65 72 69 65 73 20 61 73 20 69 6e 20 74 68  queries as in th
10b0: 65 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 20  e previous test 
10c0: 63 61 73 65 20 61 67 61 69 6e 73 74 0a 23 20 74  case against.# t
10d0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 74 61  he underlying ta
10e0: 62 6c 65 73 2e 20 54 68 65 20 63 6f 6d 70 69 6c  bles. The compil
10f0: 65 64 20 76 64 62 65 20 70 72 6f 67 72 61 6d 73  ed vdbe programs
1100: 20 73 68 6f 75 6c 64 20 62 65 20 69 64 65 6e 74   should be ident
1110: 69 63 61 6c 2c 20 73 6f 0a 23 20 74 68 65 20 6f  ical, so.# the o
1120: 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20 69  nly difference i
1130: 6e 20 72 75 6e 6e 69 6e 67 20 74 69 6d 65 20 69  n running time i
1140: 73 20 74 68 65 20 65 78 74 72 61 20 74 69 6d 65  s the extra time
1150: 20 74 61 6b 65 6e 20 74 6f 20 63 6f 6d 70 69 6c   taken to compil
1160: 65 0a 23 20 74 68 65 20 76 69 65 77 20 64 65 66  e.# the view def
1170: 69 6e 69 74 69 6f 6e 73 2e 0a 23 0a 73 65 74 20  initions..#.set 
1180: 73 63 72 69 70 74 20 7b 0a 20 20 66 6f 72 20 7b  script {.  for {
1190: 73 65 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c  set ii 1} {$ii <
11a0: 20 31 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 69   10000} {incr ii
11b0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 76 20 5b 65  } {.    set v [e
11c0: 78 70 72 20 7b 24 69 69 2a 33 7d 5d 0a 20 20 20  xpr {$ii*3}].   
11d0: 20 73 65 74 20 74 20 5b 65 78 70 72 20 7b 24 69   set t [expr {$i
11e0: 69 25 33 2b 31 7d 5d 0a 20 20 20 20 64 62 20 65  i%3+1}].    db e
11f0: 76 61 6c 20 22 53 45 4c 45 43 54 20 74 20 46 52  val "SELECT t FR
1200: 4f 4d 20 74 24 74 20 57 48 45 52 45 20 72 6f 77  OM t$t WHERE row
1210: 69 64 20 3d 20 5c 24 76 22 0a 20 20 7d 0a 7d 0a  id = \$v".  }.}.
1220: 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20  speed_trial_tcl 
1230: 73 70 65 65 64 34 70 2d 74 61 62 6c 65 31 20 31  speed4p-table1 1
1240: 30 30 30 30 20 73 74 6d 74 20 24 73 63 72 69 70  0000 stmt $scrip
1250: 74 0a 0a 23 20 52 75 6e 20 61 20 53 45 4c 45 43  t..# Run a SELEC
1260: 54 20 74 68 61 74 20 75 73 65 73 20 73 75 62 2d  T that uses sub-
1270: 71 75 65 72 69 65 73 20 31 30 30 30 30 20 74 69  queries 10000 ti
1280: 6d 65 73 2e 20 41 20 74 6f 74 61 6c 20 6f 66 20  mes. A total of 
1290: 33 30 30 30 30 20 73 75 62 2d 73 65 6c 65 63 74  30000 sub-select
12a0: 73 2e 0a 23 0a 73 65 74 20 73 63 72 69 70 74 20  s..#.set script 
12b0: 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20  {.  for {set ii 
12c0: 31 7d 20 7b 24 69 69 20 3c 20 31 30 30 30 30 7d  1} {$ii < 10000}
12d0: 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20   {incr ii} {.   
12e0: 20 73 65 74 20 76 20 5b 65 78 70 72 20 7b 24 69   set v [expr {$i
12f0: 69 2a 33 7d 5d 0a 20 20 20 20 64 62 20 65 76 61  i*3}].    db eva
1300: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
1310: 20 28 53 45 4c 45 43 54 20 74 20 46 52 4f 4d 20   (SELECT t FROM 
1320: 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  t1 WHERE rowid =
1330: 20 24 76 29 2c 20 0a 20 20 20 20 20 20 20 20 20   $v), .         
1340: 20 20 20 20 28 53 45 4c 45 43 54 20 74 20 46 52      (SELECT t FR
1350: 4f 4d 20 74 32 20 57 48 45 52 45 20 72 6f 77 69  OM t2 WHERE rowi
1360: 64 20 3d 20 24 76 29 2c 20 0a 20 20 20 20 20 20  d = $v), .      
1370: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 74         (SELECT t
1380: 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 72   FROM t3 WHERE r
1390: 6f 77 69 64 20 3d 20 24 76 29 0a 20 20 20 20 7d  owid = $v).    }
13a0: 0a 20 20 7d 0a 7d 0a 73 70 65 65 64 5f 74 72 69  .  }.}.speed_tri
13b0: 61 6c 5f 74 63 6c 20 73 70 65 65 64 34 70 2d 73  al_tcl speed4p-s
13c0: 75 62 73 65 6c 65 63 74 31 20 31 30 30 30 30 20  ubselect1 10000 
13d0: 73 74 6d 74 20 24 73 63 72 69 70 74 0a 0a 23 20  stmt $script..# 
13e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
13f0: 6f 63 6b 20 74 65 73 74 73 20 74 68 65 20 73 70  ock tests the sp
1400: 65 65 64 20 6f 66 20 73 6f 6d 65 20 44 4d 4c 20  eed of some DML 
1410: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
1420: 63 61 75 73 65 0a 23 20 74 72 69 67 67 65 72 73  cause.# triggers
1430: 20 74 6f 20 66 69 72 65 2e 0a 23 0a 65 78 65 63   to fire..#.exec
1440: 73 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20 54  sql {.  CREATE T
1450: 41 42 4c 45 20 6c 6f 67 28 6f 70 20 54 45 58 54  ABLE log(op TEXT
1460: 2c 20 72 20 49 4e 54 45 47 45 52 2c 20 69 20 49  , r INTEGER, i I
1470: 4e 54 45 47 45 52 2c 20 74 20 54 45 58 54 29 3b  NTEGER, t TEXT);
1480: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1490: 74 34 28 72 6f 77 69 64 20 49 4e 54 45 47 45 52  t4(rowid INTEGER
14a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 69 20   PRIMARY KEY, i 
14b0: 49 4e 54 45 47 45 52 2c 20 74 20 54 45 58 54 29  INTEGER, t TEXT)
14c0: 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47  ;.  CREATE TRIGG
14d0: 45 52 20 74 34 5f 74 72 69 67 67 65 72 31 20 41  ER t4_trigger1 A
14e0: 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74  FTER INSERT ON t
14f0: 34 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53 45  4 BEGIN.    INSE
1500: 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55  RT INTO log VALU
1510: 45 53 28 27 49 4e 53 45 52 54 20 49 4e 54 4f 20  ES('INSERT INTO 
1520: 74 34 27 2c 20 6e 65 77 2e 72 6f 77 69 64 2c 20  t4', new.rowid, 
1530: 6e 65 77 2e 69 2c 20 6e 65 77 2e 74 29 3b 0a 20  new.i, new.t);. 
1540: 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54   END;.  CREATE T
1550: 52 49 47 47 45 52 20 74 34 5f 74 72 69 67 67 65  RIGGER t4_trigge
1560: 72 32 20 41 46 54 45 52 20 55 50 44 41 54 45 20  r2 AFTER UPDATE 
1570: 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20  ON t4 BEGIN.    
1580: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20  INSERT INTO log 
1590: 56 41 4c 55 45 53 28 27 55 50 44 41 54 45 20 4f  VALUES('UPDATE O
15a0: 46 20 74 34 27 2c 20 6e 65 77 2e 72 6f 77 69 64  F t4', new.rowid
15b0: 2c 20 6e 65 77 2e 69 2c 20 6e 65 77 2e 74 29 3b  , new.i, new.t);
15c0: 0a 20 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45  .  END;.  CREATE
15d0: 20 54 52 49 47 47 45 52 20 74 34 5f 74 72 69 67   TRIGGER t4_trig
15e0: 67 65 72 33 20 41 46 54 45 52 20 44 45 4c 45 54  ger3 AFTER DELET
15f0: 45 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20  E ON t4 BEGIN.  
1600: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f    INSERT INTO lo
1610: 67 20 56 41 4c 55 45 53 28 27 44 45 4c 45 54 45  g VALUES('DELETE
1620: 20 4f 46 20 74 34 27 2c 20 6f 6c 64 2e 72 6f 77   OF t4', old.row
1630: 69 64 2c 20 6f 6c 64 2e 69 2c 20 6f 6c 64 2e 74  id, old.i, old.t
1640: 29 3b 0a 20 20 45 4e 44 3b 0a 20 20 42 45 47 49  );.  END;.  BEGI
1650: 4e 3b 0a 7d 0a 73 65 74 20 6c 69 73 74 20 7b 7d  N;.}.set list {}
1660: 0a 66 6f 72 20 7b 73 65 74 20 69 69 20 31 7d 20  .for {set ii 1} 
1670: 7b 24 69 69 20 3c 20 31 30 30 30 30 7d 20 7b 69  {$ii < 10000} {i
1680: 6e 63 72 20 69 69 7d 20 7b 0a 20 20 6c 61 70 70  ncr ii} {.  lapp
1690: 65 6e 64 20 6c 69 73 74 20 24 69 69 20 5b 6e 75  end list $ii [nu
16a0: 6d 62 65 72 5f 6e 61 6d 65 20 24 69 69 5d 0a 7d  mber_name $ii].}
16b0: 0a 73 65 74 20 73 63 72 69 70 74 20 7b 0a 20 20  .set script {.  
16c0: 66 6f 72 65 61 63 68 20 7b 69 69 20 6e 61 6d 65  foreach {ii name
16d0: 7d 20 24 3a 3a 6c 69 73 74 20 7b 0a 20 20 20 20  } $::list {.    
16e0: 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20  db eval {INSERT 
16f0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 4e  INTO t4 VALUES(N
1700: 55 4c 4c 2c 20 24 69 69 2c 20 24 6e 61 6d 65 29  ULL, $ii, $name)
1710: 7d 0a 20 20 7d 0a 7d 0a 73 70 65 65 64 5f 74 72  }.  }.}.speed_tr
1720: 69 61 6c 5f 74 63 6c 20 73 70 65 65 64 34 70 2d  ial_tcl speed4p-
1730: 74 72 69 67 67 65 72 31 20 31 30 30 30 30 20 73  trigger1 10000 s
1740: 74 6d 74 20 24 73 63 72 69 70 74 0a 0a 73 65 74  tmt $script..set
1750: 20 6c 69 73 74 20 7b 7d 0a 66 6f 72 20 7b 73 65   list {}.for {se
1760: 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c 20 32  t ii 1} {$ii < 2
1770: 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 69 20 32  0000} {incr ii 2
1780: 7d 20 7b 0a 20 20 73 65 74 20 69 69 32 20 5b 65  } {.  set ii2 [e
1790: 78 70 72 20 7b 24 69 69 2a 32 7d 5d 0a 20 20 6c  xpr {$ii*2}].  l
17a0: 61 70 70 65 6e 64 20 6c 69 73 74 20 24 69 69 20  append list $ii 
17b0: 24 69 69 32 20 5b 6e 75 6d 62 65 72 5f 6e 61 6d  $ii2 [number_nam
17c0: 65 20 24 69 69 32 5d 0a 7d 0a 73 65 74 20 73 63  e $ii2].}.set sc
17d0: 72 69 70 74 20 7b 0a 20 20 66 6f 72 65 61 63 68  ript {.  foreach
17e0: 20 7b 69 69 20 69 69 32 20 6e 61 6d 65 7d 20 24   {ii ii2 name} $
17f0: 3a 3a 6c 69 73 74 20 7b 0a 20 20 20 20 64 62 20  ::list {.    db 
1800: 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 55 50 44  eval {.      UPD
1810: 41 54 45 20 74 34 20 53 45 54 20 69 20 3d 20 24  ATE t4 SET i = $
1820: 69 69 32 2c 20 74 20 3d 20 24 6e 61 6d 65 20 57  ii2, t = $name W
1830: 48 45 52 45 20 72 6f 77 69 64 20 3d 20 24 69 69  HERE rowid = $ii
1840: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 70  ;.    }.  }.}.sp
1850: 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20 73 70  eed_trial_tcl sp
1860: 65 65 64 34 70 2d 74 72 69 67 67 65 72 32 20 31  eed4p-trigger2 1
1870: 30 30 30 30 20 73 74 6d 74 20 24 73 63 72 69 70  0000 stmt $scrip
1880: 74 0a 0a 73 65 74 20 73 63 72 69 70 74 20 7b 0a  t..set script {.
1890: 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 31 7d    for {set ii 1}
18a0: 20 7b 24 69 69 20 3c 20 32 30 30 30 30 7d 20 7b   {$ii < 20000} {
18b0: 69 6e 63 72 20 69 69 20 32 7d 20 7b 0a 20 20 20  incr ii 2} {.   
18c0: 20 64 62 20 65 76 61 6c 20 7b 44 45 4c 45 54 45   db eval {DELETE
18d0: 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 72   FROM t4 WHERE r
18e0: 6f 77 69 64 20 3d 20 24 69 69 7d 0a 20 20 7d 0a  owid = $ii}.  }.
18f0: 7d 0a 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63  }.speed_trial_tc
1900: 6c 20 73 70 65 65 64 34 70 2d 74 72 69 67 67 65  l speed4p-trigge
1910: 72 33 20 31 30 30 30 30 20 73 74 6d 74 20 24 73  r3 10000 stmt $s
1920: 63 72 69 70 74 0a 65 78 65 63 73 71 6c 20 7b 43  cript.execsql {C
1930: 4f 4d 4d 49 54 7d 0a 0a 23 20 54 68 65 20 66 6f  OMMIT}..# The fo
1940: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f  llowing block co
1950: 6e 74 61 69 6e 73 20 74 68 65 20 73 61 6d 65 20  ntains the same 
1960: 74 65 73 74 73 20 61 73 20 74 68 65 20 61 62 6f  tests as the abo
1970: 76 65 20 62 6c 6f 63 6b 20 74 68 61 74 0a 23 20  ve block that.# 
1980: 74 65 73 74 73 20 74 72 69 67 67 65 72 73 2c 20  tests triggers, 
1990: 77 69 74 68 20 6f 6e 65 20 63 72 75 63 69 61 6c  with one crucial
19a0: 20 64 69 66 66 65 72 65 6e 63 65 3a 20 6e 6f 20   difference: no 
19b0: 74 72 69 67 67 65 72 73 20 61 72 65 20 64 65 66  triggers are def
19c0: 69 6e 65 64 2e 0a 23 20 53 6f 20 74 68 65 20 64  ined..# So the d
19d0: 69 66 66 65 72 65 6e 63 65 20 69 6e 20 73 70 65  ifference in spe
19e0: 65 64 20 62 65 74 77 65 65 6e 20 74 68 65 73 65  ed between these
19f0: 20 74 65 73 74 73 20 61 6e 64 20 74 68 65 20 70   tests and the p
1a00: 72 65 63 65 64 69 6e 67 20 6f 6e 65 73 0a 23 20  receding ones.# 
1a10: 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
1a20: 20 74 69 6d 65 20 74 61 6b 65 6e 20 74 6f 20 63   time taken to c
1a30: 6f 6d 70 69 6c 65 20 61 6e 64 20 65 78 65 63 75  ompile and execu
1a40: 74 65 20 74 68 65 20 74 72 69 67 67 65 72 20 70  te the trigger p
1a50: 72 6f 67 72 61 6d 73 2e 0a 23 0a 65 78 65 63 73  rograms..#.execs
1a60: 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c  ql {.  DROP TABL
1a70: 45 20 74 34 3b 0a 20 20 44 52 4f 50 20 54 41 42  E t4;.  DROP TAB
1a80: 4c 45 20 6c 6f 67 3b 0a 20 20 56 41 43 55 55 4d  LE log;.  VACUUM
1a90: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
1aa0: 20 74 34 28 72 6f 77 69 64 20 49 4e 54 45 47 45   t4(rowid INTEGE
1ab0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 69  R PRIMARY KEY, i
1ac0: 20 49 4e 54 45 47 45 52 2c 20 74 20 54 45 58 54   INTEGER, t TEXT
1ad0: 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 7d 0a 73 65  );.  BEGIN;.}.se
1ae0: 74 20 6c 69 73 74 20 7b 7d 0a 66 6f 72 20 7b 73  t list {}.for {s
1af0: 65 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c 20  et ii 1} {$ii < 
1b00: 31 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 69 7d  10000} {incr ii}
1b10: 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20 6c 69 73   {.  lappend lis
1b20: 74 20 24 69 69 20 5b 6e 75 6d 62 65 72 5f 6e 61  t $ii [number_na
1b30: 6d 65 20 24 69 69 5d 0a 7d 0a 73 65 74 20 73 63  me $ii].}.set sc
1b40: 72 69 70 74 20 7b 0a 20 20 66 6f 72 65 61 63 68  ript {.  foreach
1b50: 20 7b 69 69 20 6e 61 6d 65 7d 20 24 3a 3a 6c 69   {ii name} $::li
1b60: 73 74 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c  st {.    db eval
1b70: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34   {INSERT INTO t4
1b80: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 24 69   VALUES(NULL, $i
1b90: 69 2c 20 24 6e 61 6d 65 29 3b 7d 0a 20 20 7d 0a  i, $name);}.  }.
1ba0: 7d 0a 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63  }.speed_trial_tc
1bb0: 6c 20 73 70 65 65 64 34 70 2d 6e 6f 74 72 69 67  l speed4p-notrig
1bc0: 67 65 72 31 20 31 30 30 30 30 20 73 74 6d 74 20  ger1 10000 stmt 
1bd0: 24 73 63 72 69 70 74 0a 0a 73 65 74 20 6c 69 73  $script..set lis
1be0: 74 20 7b 7d 0a 66 6f 72 20 7b 73 65 74 20 69 69  t {}.for {set ii
1bf0: 20 31 7d 20 7b 24 69 69 20 3c 20 32 30 30 30 30   1} {$ii < 20000
1c00: 7d 20 7b 69 6e 63 72 20 69 69 20 32 7d 20 7b 0a  } {incr ii 2} {.
1c10: 20 20 73 65 74 20 69 69 32 20 5b 65 78 70 72 20    set ii2 [expr 
1c20: 7b 24 69 69 2a 32 7d 5d 0a 20 20 6c 61 70 70 65  {$ii*2}].  lappe
1c30: 6e 64 20 6c 69 73 74 20 24 69 69 20 24 69 69 32  nd list $ii $ii2
1c40: 20 5b 6e 75 6d 62 65 72 5f 6e 61 6d 65 20 24 69   [number_name $i
1c50: 69 32 5d 0a 7d 0a 73 65 74 20 73 63 72 69 70 74  i2].}.set script
1c60: 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 7b 69 69   {.  foreach {ii
1c70: 20 69 69 32 20 6e 61 6d 65 7d 20 24 3a 3a 6c 69   ii2 name} $::li
1c80: 73 74 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c  st {.    db eval
1c90: 20 7b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20   {.      UPDATE 
1ca0: 74 34 20 53 45 54 20 69 20 3d 20 24 69 69 32 2c  t4 SET i = $ii2,
1cb0: 20 74 20 3d 20 24 6e 61 6d 65 20 57 48 45 52 45   t = $name WHERE
1cc0: 20 72 6f 77 69 64 20 3d 20 24 69 69 3b 0a 20 20   rowid = $ii;.  
1cd0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 70 65 65 64 5f    }.  }.}.speed_
1ce0: 74 72 69 61 6c 5f 74 63 6c 20 73 70 65 65 64 34  trial_tcl speed4
1cf0: 70 2d 6e 6f 74 72 69 67 67 65 72 32 20 31 30 30  p-notrigger2 100
1d00: 30 30 20 73 74 6d 74 20 24 73 63 72 69 70 74 0a  00 stmt $script.
1d10: 0a 73 65 74 20 73 63 72 69 70 74 20 7b 0a 20 20  .set script {.  
1d20: 66 6f 72 20 7b 73 65 74 20 69 69 20 31 7d 20 7b  for {set ii 1} {
1d30: 24 69 69 20 3c 20 32 30 30 30 30 7d 20 7b 69 6e  $ii < 20000} {in
1d40: 63 72 20 69 69 20 32 7d 20 7b 0a 20 20 20 20 64  cr ii 2} {.    d
1d50: 62 20 65 76 61 6c 20 7b 44 45 4c 45 54 45 20 46  b eval {DELETE F
1d60: 52 4f 4d 20 74 34 20 57 48 45 52 45 20 72 6f 77  ROM t4 WHERE row
1d70: 69 64 20 3d 20 24 69 69 7d 0a 20 20 7d 0a 7d 0a  id = $ii}.  }.}.
1d80: 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20  speed_trial_tcl 
1d90: 73 70 65 65 64 34 70 2d 6e 6f 74 72 69 67 67 65  speed4p-notrigge
1da0: 72 33 20 31 30 30 30 30 20 73 74 6d 74 20 24 73  r3 10000 stmt $s
1db0: 63 72 69 70 74 0a 65 78 65 63 73 71 6c 20 7b 43  cript.execsql {C
1dc0: 4f 4d 4d 49 54 7d 0a 0a 73 70 65 65 64 5f 74 72  OMMIT}..speed_tr
1dd0: 69 61 6c 5f 73 75 6d 6d 61 72 79 20 73 70 65 65  ial_summary spee
1de0: 64 34 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     d4.finish_test.