/ Hex Artifact Content
Login

Artifact 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c:


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 34 20 32 30 30 38 2f 30  est,v 1.4 2008/0
0270: 34 2f 31 30 20 31 33 3a 33 32 3a 33 37 20 64 72  4/10 13:32:37 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 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
0ae0: 7a 65 3d 31 30 32 34 3b 0a 20 20 50 52 41 47 4d  ze=1024;.  PRAGM
0af0: 41 20 63 61 63 68 65 5f 73 69 7a 65 3d 38 31 39  A cache_size=819
0b00: 32 3b 0a 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  2;.  PRAGMA lock
0b10: 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
0b20: 56 45 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 43  VE;.  BEGIN;.  C
0b30: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 72  REATE TABLE t1(r
0b40: 6f 77 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  owid INTEGER PRI
0b50: 4d 41 52 59 20 4b 45 59 2c 20 69 20 49 4e 54 45  MARY KEY, i INTE
0b60: 47 45 52 2c 20 74 20 54 45 58 54 29 3b 0a 20 20  GER, t TEXT);.  
0b70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
0b80: 72 6f 77 69 64 20 49 4e 54 45 47 45 52 20 50 52  rowid INTEGER PR
0b90: 49 4d 41 52 59 20 4b 45 59 2c 20 69 20 49 4e 54  IMARY KEY, i INT
0ba0: 45 47 45 52 2c 20 74 20 54 45 58 54 29 3b 0a 20  EGER, t TEXT);. 
0bb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
0bc0: 28 72 6f 77 69 64 20 49 4e 54 45 47 45 52 20 50  (rowid INTEGER P
0bd0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 69 20 49 4e  RIMARY KEY, i IN
0be0: 54 45 47 45 52 2c 20 74 20 54 45 58 54 29 3b 0a  TEGER, t TEXT);.
0bf0: 0a 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76  .  CREATE VIEW v
0c00: 31 20 41 53 20 53 45 4c 45 43 54 20 72 6f 77 69  1 AS SELECT rowi
0c10: 64 2c 20 69 2c 20 74 20 46 52 4f 4d 20 74 31 3b  d, i, t FROM t1;
0c20: 0a 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76  .  CREATE VIEW v
0c30: 32 20 41 53 20 53 45 4c 45 43 54 20 72 6f 77 69  2 AS SELECT rowi
0c40: 64 2c 20 69 2c 20 74 20 46 52 4f 4d 20 74 32 3b  d, i, t FROM t2;
0c50: 0a 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76  .  CREATE VIEW v
0c60: 33 20 41 53 20 53 45 4c 45 43 54 20 72 6f 77 69  3 AS SELECT rowi
0c70: 64 2c 20 69 2c 20 74 20 46 52 4f 4d 20 74 33 3b  d, i, t FROM t3;
0c80: 0a 7d 0a 66 6f 72 20 7b 73 65 74 20 6a 6a 20 31  .}.for {set jj 1
0c90: 7d 20 7b 24 6a 6a 20 3c 3d 20 33 7d 20 7b 69 6e  } {$jj <= 3} {in
0ca0: 63 72 20 6a 6a 7d 20 7b 0a 20 20 73 65 74 20 73  cr jj} {.  set s
0cb0: 74 6d 74 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  tmt [string map 
0cc0: 22 25 54 25 20 74 24 6a 6a 22 20 7b 49 4e 53 45  "%T% t$jj" {INSE
0cd0: 52 54 20 49 4e 54 4f 20 25 54 25 20 56 41 4c 55  RT INTO %T% VALU
0ce0: 45 53 28 4e 55 4c 4c 2c 20 24 69 2c 20 24 74 29  ES(NULL, $i, $t)
0cf0: 7d 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 69  }].  for {set ii
0d00: 20 30 7d 20 7b 24 69 69 20 3c 20 35 30 30 30 30   0} {$ii < 50000
0d10: 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20  } {incr ii} {.  
0d20: 20 20 73 65 74 20 69 20 5b 65 78 70 72 20 7b 69    set i [expr {i
0d30: 6e 74 28 72 61 6e 64 28 29 2a 35 30 30 30 30 29  nt(rand()*50000)
0d40: 7d 5d 0a 20 20 20 20 73 65 74 20 74 20 5b 6e 75  }].    set t [nu
0d50: 6d 62 65 72 5f 6e 61 6d 65 20 24 69 5d 0a 20 20  mber_name $i].  
0d60: 20 20 65 78 65 63 73 71 6c 20 24 73 74 6d 74 0a    execsql $stmt.
0d70: 20 20 7d 0a 7d 0a 65 78 65 63 73 71 6c 20 7b 0a    }.}.execsql {.
0d80: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
0d90: 31 20 4f 4e 20 74 31 28 74 29 3b 0a 20 20 43 52  1 ON t1(t);.  CR
0da0: 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
0db0: 20 74 32 28 74 29 3b 0a 20 20 43 52 45 41 54 45   t2(t);.  CREATE
0dc0: 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 33 28   INDEX i3 ON t3(
0dd0: 74 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 0a  t);.  COMMIT;.}.
0de0: 0a 23 20 4a 6f 69 6e 20 74 31 2c 20 74 32 2c 20  .# Join t1, t2, 
0df0: 74 33 20 6f 6e 20 49 50 4b 2e 0a 73 65 74 20 73  t3 on IPK..set s
0e00: 71 6c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql "SELECT * FRO
0e10: 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
0e20: 52 45 20 74 31 2e 6f 69 64 20 3d 20 74 32 2e 6f  RE t1.oid = t2.o
0e30: 69 64 20 41 4e 44 20 74 32 2e 6f 69 64 20 3d 20  id AND t2.oid = 
0e40: 74 33 2e 6f 69 64 22 0a 73 70 65 65 64 5f 74 72  t3.oid".speed_tr
0e50: 69 61 6c 20 73 70 65 65 64 34 70 2d 6a 6f 69 6e  ial speed4p-join
0e60: 31 20 35 30 30 30 30 20 72 6f 77 20 24 73 71 6c  1 50000 row $sql
0e70: 0a 0a 23 20 4a 6f 69 6e 20 74 31 2c 20 74 32 2c  ..# Join t1, t2,
0e80: 20 74 33 20 6f 6e 20 74 68 65 20 6e 6f 6e 2d 49   t3 on the non-I
0e90: 50 4b 20 69 6e 64 65 78 2e 0a 73 65 74 20 73 71  PK index..set sq
0ea0: 6c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l "SELECT * FROM
0eb0: 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
0ec0: 45 20 74 31 2e 74 20 3d 20 74 32 2e 74 20 41 4e  E t1.t = t2.t AN
0ed0: 44 20 74 32 2e 74 20 3d 20 74 33 2e 74 22 0a 73  D t2.t = t3.t".s
0ee0: 70 65 65 64 5f 74 72 69 61 6c 20 73 70 65 65 64  peed_trial speed
0ef0: 34 70 2d 6a 6f 69 6e 32 20 35 30 30 30 30 20 72  4p-join2 50000 r
0f00: 6f 77 20 24 73 71 6c 0a 0a 23 20 52 75 6e 20 31  ow $sql..# Run 1
0f10: 30 30 30 30 20 73 69 6d 70 6c 65 20 71 75 65 72  0000 simple quer
0f20: 69 65 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ies against the 
0f30: 76 69 65 77 73 2e 0a 73 65 74 20 73 63 72 69 70  views..set scrip
0f40: 74 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  t {.  for {set i
0f50: 69 20 31 7d 20 7b 24 69 69 20 3c 20 31 30 30 30  i 1} {$ii < 1000
0f60: 30 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20  0} {incr ii} {. 
0f70: 20 20 20 73 65 74 20 76 20 5b 65 78 70 72 20 7b     set v [expr {
0f80: 24 69 69 2a 33 7d 5d 0a 20 20 20 20 73 65 74 20  $ii*3}].    set 
0f90: 74 20 5b 65 78 70 72 20 7b 24 69 69 25 33 2b 31  t [expr {$ii%3+1
0fa0: 7d 5d 0a 20 20 20 20 64 62 20 65 76 61 6c 20 22  }].    db eval "
0fb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 24  SELECT * FROM v$
0fc0: 74 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  t WHERE rowid = 
0fd0: 5c 24 76 22 0a 20 20 7d 0a 7d 0a 73 70 65 65 64  \$v".  }.}.speed
0fe0: 5f 74 72 69 61 6c 5f 74 63 6c 20 73 70 65 65 64  _trial_tcl speed
0ff0: 34 70 2d 76 69 65 77 31 20 31 30 30 30 30 20 73  4p-view1 10000 s
1000: 74 6d 74 20 24 73 63 72 69 70 74 0a 0a 23 20 52  tmt $script..# R
1010: 75 6e 20 74 68 65 20 73 61 6d 65 20 31 30 30 30  un the same 1000
1020: 30 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73  0 simple queries
1030: 20 61 73 20 69 6e 20 74 68 65 20 70 72 65 76 69   as in the previ
1040: 6f 75 73 20 74 65 73 74 20 63 61 73 65 20 61 67  ous test case ag
1050: 61 69 6e 73 74 0a 23 20 74 68 65 20 75 6e 64 65  ainst.# the unde
1060: 72 6c 79 69 6e 67 20 74 61 62 6c 65 73 2e 20 54  rlying tables. T
1070: 68 65 20 63 6f 6d 70 69 6c 65 64 20 76 64 62 65  he compiled vdbe
1080: 20 70 72 6f 67 72 61 6d 73 20 73 68 6f 75 6c 64   programs should
1090: 20 62 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 73   be identical, s
10a0: 6f 0a 23 20 74 68 65 20 6f 6e 6c 79 20 64 69 66  o.# the only dif
10b0: 66 65 72 65 6e 63 65 20 69 6e 20 72 75 6e 6e 69  ference in runni
10c0: 6e 67 20 74 69 6d 65 20 69 73 20 74 68 65 20 65  ng time is the e
10d0: 78 74 72 61 20 74 69 6d 65 20 74 61 6b 65 6e 20  xtra time taken 
10e0: 74 6f 20 63 6f 6d 70 69 6c 65 0a 23 20 74 68 65  to compile.# the
10f0: 20 76 69 65 77 20 64 65 66 69 6e 69 74 69 6f 6e   view definition
1100: 73 2e 0a 23 0a 73 65 74 20 73 63 72 69 70 74 20  s..#.set script 
1110: 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20  {.  for {set ii 
1120: 31 7d 20 7b 24 69 69 20 3c 20 31 30 30 30 30 7d  1} {$ii < 10000}
1130: 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20   {incr ii} {.   
1140: 20 73 65 74 20 76 20 5b 65 78 70 72 20 7b 24 69   set v [expr {$i
1150: 69 2a 33 7d 5d 0a 20 20 20 20 73 65 74 20 74 20  i*3}].    set t 
1160: 5b 65 78 70 72 20 7b 24 69 69 25 33 2b 31 7d 5d  [expr {$ii%3+1}]
1170: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 22 53 45  .    db eval "SE
1180: 4c 45 43 54 20 74 20 46 52 4f 4d 20 74 24 74 20  LECT t FROM t$t 
1190: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 5c 24  WHERE rowid = \$
11a0: 76 22 0a 20 20 7d 0a 7d 0a 73 70 65 65 64 5f 74  v".  }.}.speed_t
11b0: 72 69 61 6c 5f 74 63 6c 20 73 70 65 65 64 34 70  rial_tcl speed4p
11c0: 2d 74 61 62 6c 65 31 20 31 30 30 30 30 20 73 74  -table1 10000 st
11d0: 6d 74 20 24 73 63 72 69 70 74 0a 0a 23 20 52 75  mt $script..# Ru
11e0: 6e 20 61 20 53 45 4c 45 43 54 20 74 68 61 74 20  n a SELECT that 
11f0: 75 73 65 73 20 73 75 62 2d 71 75 65 72 69 65 73  uses sub-queries
1200: 20 31 30 30 30 30 20 74 69 6d 65 73 2e 20 41 20   10000 times. A 
1210: 74 6f 74 61 6c 20 6f 66 20 33 30 30 30 30 20 73  total of 30000 s
1220: 75 62 2d 73 65 6c 65 63 74 73 2e 0a 23 0a 73 65  ub-selects..#.se
1230: 74 20 73 63 72 69 70 74 20 7b 0a 20 20 66 6f 72  t script {.  for
1240: 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69 69   {set ii 1} {$ii
1250: 20 3c 20 31 30 30 30 30 7d 20 7b 69 6e 63 72 20   < 10000} {incr 
1260: 69 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 76 20  ii} {.    set v 
1270: 5b 65 78 70 72 20 7b 24 69 69 2a 33 7d 5d 0a 20  [expr {$ii*3}]. 
1280: 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20     db eval {.   
1290: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
12a0: 54 20 74 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T t FROM t1 WHER
12b0: 45 20 72 6f 77 69 64 20 3d 20 24 76 29 2c 20 0a  E rowid = $v), .
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 45               (SE
12d0: 4c 45 43 54 20 74 20 46 52 4f 4d 20 74 32 20 57  LECT t FROM t2 W
12e0: 48 45 52 45 20 72 6f 77 69 64 20 3d 20 24 76 29  HERE rowid = $v)
12f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1300: 28 53 45 4c 45 43 54 20 74 20 46 52 4f 4d 20 74  (SELECT t FROM t
1310: 33 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  3 WHERE rowid = 
1320: 24 76 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  $v).    }.  }.}.
1330: 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20  speed_trial_tcl 
1340: 73 70 65 65 64 34 70 2d 73 75 62 73 65 6c 65 63  speed4p-subselec
1350: 74 31 20 31 30 30 30 30 20 73 74 6d 74 20 24 73  t1 10000 stmt $s
1360: 63 72 69 70 74 0a 0a 23 20 53 69 6e 67 6c 65 2d  cript..# Single-
1370: 72 6f 77 20 75 70 64 61 74 65 73 20 70 65 72 66  row updates perf
1380: 6f 72 6d 61 6e 63 65 2e 0a 23 0a 73 65 74 20 73  ormance..#.set s
1390: 63 72 69 70 74 20 7b 0a 20 20 64 62 20 65 76 61  cript {.  db eva
13a0: 6c 20 42 45 47 49 4e 0a 20 20 66 6f 72 20 7b 73  l BEGIN.  for {s
13b0: 65 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c 20  et ii 1} {$ii < 
13c0: 31 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 69 7d  10000} {incr ii}
13d0: 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b   {.    db eval {
13e0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 69 3d  UPDATE t1 SET i=
13f0: 69 2b 31 20 57 48 45 52 45 20 72 6f 77 69 64 3d  i+1 WHERE rowid=
1400: 24 69 69 7d 0a 20 20 7d 0a 20 20 64 62 20 65 76  $ii}.  }.  db ev
1410: 61 6c 20 43 4f 4d 4d 49 54 0a 7d 0a 73 70 65 65  al COMMIT.}.spee
1420: 64 5f 74 72 69 61 6c 5f 74 63 6c 20 73 70 65 65  d_trial_tcl spee
1430: 64 34 70 2d 72 6f 77 69 64 2d 75 70 64 61 74 65  d4p-rowid-update
1440: 20 31 30 30 30 30 20 73 74 6d 74 20 24 73 63 72   10000 stmt $scr
1450: 69 70 74 0a 0a 0a 64 62 20 65 76 61 6c 20 7b 0a  ipt...db eval {.
1460: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1470: 74 35 28 74 20 54 45 58 54 20 50 52 49 4d 41 52  t5(t TEXT PRIMAR
1480: 59 20 4b 45 59 2c 20 69 20 49 4e 54 45 47 45 52  Y KEY, i INTEGER
1490: 29 3b 0a 7d 0a 73 70 65 65 64 5f 74 72 69 61 6c  );.}.speed_trial
14a0: 20 73 70 65 65 64 34 70 2d 69 6e 73 65 72 74 2d   speed4p-insert-
14b0: 69 67 6e 6f 72 65 20 35 30 30 30 30 20 72 6f 77  ignore 50000 row
14c0: 20 7b 0a 20 20 49 4e 53 45 52 54 20 4f 52 20 49   {.  INSERT OR I
14d0: 47 4e 4f 52 45 20 49 4e 54 4f 20 74 35 20 53 45  GNORE INTO t5 SE
14e0: 4c 45 43 54 20 74 2c 20 69 20 46 52 4f 4d 20 74  LECT t, i FROM t
14f0: 31 3b 0a 7d 0a 0a 73 65 74 20 6c 69 73 74 20 5b  1;.}..set list [
1500: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
1510: 74 20 46 52 4f 4d 20 74 35 7d 5d 0a 73 65 74 20  t FROM t5}].set 
1520: 73 63 72 69 70 74 20 7b 0a 20 20 64 62 20 65 76  script {.  db ev
1530: 61 6c 20 42 45 47 49 4e 0a 20 20 66 6f 72 65 61  al BEGIN.  forea
1540: 63 68 20 74 20 24 3a 3a 6c 69 73 74 20 7b 0a 20  ch t $::list {. 
1550: 20 20 20 64 62 20 65 76 61 6c 20 7b 55 50 44 41     db eval {UPDA
1560: 54 45 20 74 35 20 53 45 54 20 69 3d 69 2b 31 20  TE t5 SET i=i+1 
1570: 57 48 45 52 45 20 74 3d 24 74 7d 0a 20 20 7d 0a  WHERE t=$t}.  }.
1580: 20 20 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54    db eval COMMIT
1590: 0a 7d 0a 73 70 65 65 64 5f 74 72 69 61 6c 5f 74  .}.speed_trial_t
15a0: 63 6c 20 73 70 65 65 64 34 70 2d 75 6e 69 71 75  cl speed4p-uniqu
15b0: 65 2d 75 70 64 61 74 65 20 5b 6c 6c 65 6e 67 74  e-update [llengt
15c0: 68 20 24 6c 69 73 74 5d 20 73 74 6d 74 20 24 73  h $list] stmt $s
15d0: 63 72 69 70 74 0a 0a 23 20 54 68 65 20 66 6f 6c  cript..# The fol
15e0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 74 65 73  lowing block tes
15f0: 74 73 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  ts the speed of 
1600: 73 6f 6d 65 20 44 4d 4c 20 73 74 61 74 65 6d 65  some DML stateme
1610: 6e 74 73 20 74 68 61 74 20 63 61 75 73 65 0a 23  nts that cause.#
1620: 20 74 72 69 67 67 65 72 73 20 74 6f 20 66 69 72   triggers to fir
1630: 65 2e 0a 23 0a 65 78 65 63 73 71 6c 20 7b 0a 20  e..#.execsql {. 
1640: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f   CREATE TABLE lo
1650: 67 28 6f 70 20 54 45 58 54 2c 20 72 20 49 4e 54  g(op TEXT, r INT
1660: 45 47 45 52 2c 20 69 20 49 4e 54 45 47 45 52 2c  EGER, i INTEGER,
1670: 20 74 20 54 45 58 54 29 3b 0a 20 20 43 52 45 41   t TEXT);.  CREA
1680: 54 45 20 54 41 42 4c 45 20 74 34 28 72 6f 77 69  TE TABLE t4(rowi
1690: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
16a0: 59 20 4b 45 59 2c 20 69 20 49 4e 54 45 47 45 52  Y KEY, i INTEGER
16b0: 2c 20 74 20 54 45 58 54 29 3b 0a 20 20 43 52 45  , t TEXT);.  CRE
16c0: 41 54 45 20 54 52 49 47 47 45 52 20 74 34 5f 74  ATE TRIGGER t4_t
16d0: 72 69 67 67 65 72 31 20 41 46 54 45 52 20 49 4e  rigger1 AFTER IN
16e0: 53 45 52 54 20 4f 4e 20 74 34 20 42 45 47 49 4e  SERT ON t4 BEGIN
16f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1700: 20 6c 6f 67 20 56 41 4c 55 45 53 28 27 49 4e 53   log VALUES('INS
1710: 45 52 54 20 49 4e 54 4f 20 74 34 27 2c 20 6e 65  ERT INTO t4', ne
1720: 77 2e 72 6f 77 69 64 2c 20 6e 65 77 2e 69 2c 20  w.rowid, new.i, 
1730: 6e 65 77 2e 74 29 3b 0a 20 20 45 4e 44 3b 0a 20  new.t);.  END;. 
1740: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
1750: 74 34 5f 74 72 69 67 67 65 72 32 20 41 46 54 45  t4_trigger2 AFTE
1760: 52 20 55 50 44 41 54 45 20 4f 4e 20 74 34 20 42  R UPDATE ON t4 B
1770: 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20  EGIN.    INSERT 
1780: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
1790: 27 55 50 44 41 54 45 20 4f 46 20 74 34 27 2c 20  'UPDATE OF t4', 
17a0: 6e 65 77 2e 72 6f 77 69 64 2c 20 6e 65 77 2e 69  new.rowid, new.i
17b0: 2c 20 6e 65 77 2e 74 29 3b 0a 20 20 45 4e 44 3b  , new.t);.  END;
17c0: 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45  .  CREATE TRIGGE
17d0: 52 20 74 34 5f 74 72 69 67 67 65 72 33 20 41 46  R t4_trigger3 AF
17e0: 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74 34  TER DELETE ON t4
17f0: 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52   BEGIN.    INSER
1800: 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45  T INTO log VALUE
1810: 53 28 27 44 45 4c 45 54 45 20 4f 46 20 74 34 27  S('DELETE OF t4'
1820: 2c 20 6f 6c 64 2e 72 6f 77 69 64 2c 20 6f 6c 64  , old.rowid, old
1830: 2e 69 2c 20 6f 6c 64 2e 74 29 3b 0a 20 20 45 4e  .i, old.t);.  EN
1840: 44 3b 0a 20 20 42 45 47 49 4e 3b 0a 7d 0a 73 65  D;.  BEGIN;.}.se
1850: 74 20 6c 69 73 74 20 7b 7d 0a 66 6f 72 20 7b 73  t list {}.for {s
1860: 65 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c 20  et ii 1} {$ii < 
1870: 31 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 69 7d  10000} {incr ii}
1880: 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20 6c 69 73   {.  lappend lis
1890: 74 20 24 69 69 20 5b 6e 75 6d 62 65 72 5f 6e 61  t $ii [number_na
18a0: 6d 65 20 24 69 69 5d 0a 7d 0a 73 65 74 20 73 63  me $ii].}.set sc
18b0: 72 69 70 74 20 7b 0a 20 20 66 6f 72 65 61 63 68  ript {.  foreach
18c0: 20 7b 69 69 20 6e 61 6d 65 7d 20 24 3a 3a 6c 69   {ii name} $::li
18d0: 73 74 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c  st {.    db eval
18e0: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34   {INSERT INTO t4
18f0: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 24 69   VALUES(NULL, $i
1900: 69 2c 20 24 6e 61 6d 65 29 7d 0a 20 20 7d 0a 7d  i, $name)}.  }.}
1910: 0a 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c  .speed_trial_tcl
1920: 20 73 70 65 65 64 34 70 2d 74 72 69 67 67 65 72   speed4p-trigger
1930: 31 20 31 30 30 30 30 20 73 74 6d 74 20 24 73 63  1 10000 stmt $sc
1940: 72 69 70 74 0a 0a 73 65 74 20 6c 69 73 74 20 7b  ript..set list {
1950: 7d 0a 66 6f 72 20 7b 73 65 74 20 69 69 20 31 7d  }.for {set ii 1}
1960: 20 7b 24 69 69 20 3c 20 32 30 30 30 30 7d 20 7b   {$ii < 20000} {
1970: 69 6e 63 72 20 69 69 20 32 7d 20 7b 0a 20 20 73  incr ii 2} {.  s
1980: 65 74 20 69 69 32 20 5b 65 78 70 72 20 7b 24 69  et ii2 [expr {$i
1990: 69 2a 32 7d 5d 0a 20 20 6c 61 70 70 65 6e 64 20  i*2}].  lappend 
19a0: 6c 69 73 74 20 24 69 69 20 24 69 69 32 20 5b 6e  list $ii $ii2 [n
19b0: 75 6d 62 65 72 5f 6e 61 6d 65 20 24 69 69 32 5d  umber_name $ii2]
19c0: 0a 7d 0a 73 65 74 20 73 63 72 69 70 74 20 7b 0a  .}.set script {.
19d0: 20 20 66 6f 72 65 61 63 68 20 7b 69 69 20 69 69    foreach {ii ii
19e0: 32 20 6e 61 6d 65 7d 20 24 3a 3a 6c 69 73 74 20  2 name} $::list 
19f0: 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a  {.    db eval {.
1a00: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 34 20        UPDATE t4 
1a10: 53 45 54 20 69 20 3d 20 24 69 69 32 2c 20 74 20  SET i = $ii2, t 
1a20: 3d 20 24 6e 61 6d 65 20 57 48 45 52 45 20 72 6f  = $name WHERE ro
1a30: 77 69 64 20 3d 20 24 69 69 3b 0a 20 20 20 20 7d  wid = $ii;.    }
1a40: 0a 20 20 7d 0a 7d 0a 73 70 65 65 64 5f 74 72 69  .  }.}.speed_tri
1a50: 61 6c 5f 74 63 6c 20 73 70 65 65 64 34 70 2d 74  al_tcl speed4p-t
1a60: 72 69 67 67 65 72 32 20 31 30 30 30 30 20 73 74  rigger2 10000 st
1a70: 6d 74 20 24 73 63 72 69 70 74 0a 0a 73 65 74 20  mt $script..set 
1a80: 73 63 72 69 70 74 20 7b 0a 20 20 66 6f 72 20 7b  script {.  for {
1a90: 73 65 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c  set ii 1} {$ii <
1aa0: 20 32 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 69   20000} {incr ii
1ab0: 20 32 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61   2} {.    db eva
1ac0: 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  l {DELETE FROM t
1ad0: 34 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  4 WHERE rowid = 
1ae0: 24 69 69 7d 0a 20 20 7d 0a 7d 0a 73 70 65 65 64  $ii}.  }.}.speed
1af0: 5f 74 72 69 61 6c 5f 74 63 6c 20 73 70 65 65 64  _trial_tcl speed
1b00: 34 70 2d 74 72 69 67 67 65 72 33 20 31 30 30 30  4p-trigger3 1000
1b10: 30 20 73 74 6d 74 20 24 73 63 72 69 70 74 0a 65  0 stmt $script.e
1b20: 78 65 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 0a  xecsql {COMMIT}.
1b30: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
1b40: 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20   block contains 
1b50: 74 68 65 20 73 61 6d 65 20 74 65 73 74 73 20 61  the same tests a
1b60: 73 20 74 68 65 20 61 62 6f 76 65 20 62 6c 6f 63  s the above bloc
1b70: 6b 20 74 68 61 74 0a 23 20 74 65 73 74 73 20 74  k that.# tests t
1b80: 72 69 67 67 65 72 73 2c 20 77 69 74 68 20 6f 6e  riggers, with on
1b90: 65 20 63 72 75 63 69 61 6c 20 64 69 66 66 65 72  e crucial differ
1ba0: 65 6e 63 65 3a 20 6e 6f 20 74 72 69 67 67 65 72  ence: no trigger
1bb0: 73 20 61 72 65 20 64 65 66 69 6e 65 64 2e 0a 23  s are defined..#
1bc0: 20 53 6f 20 74 68 65 20 64 69 66 66 65 72 65 6e   So the differen
1bd0: 63 65 20 69 6e 20 73 70 65 65 64 20 62 65 74 77  ce in speed betw
1be0: 65 65 6e 20 74 68 65 73 65 20 74 65 73 74 73 20  een these tests 
1bf0: 61 6e 64 20 74 68 65 20 70 72 65 63 65 64 69 6e  and the precedin
1c00: 67 20 6f 6e 65 73 0a 23 20 69 73 20 74 68 65 20  g ones.# is the 
1c10: 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 74  amount of time t
1c20: 61 6b 65 6e 20 74 6f 20 63 6f 6d 70 69 6c 65 20  aken to compile 
1c30: 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20  and execute the 
1c40: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
1c50: 2e 0a 23 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..#.execsql {.  
1c60: 44 52 4f 50 20 54 41 42 4c 45 20 74 34 3b 0a 20  DROP TABLE t4;. 
1c70: 20 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f 67 3b   DROP TABLE log;
1c80: 0a 20 20 56 41 43 55 55 4d 3b 0a 20 20 43 52 45  .  VACUUM;.  CRE
1c90: 41 54 45 20 54 41 42 4c 45 20 74 34 28 72 6f 77  ATE TABLE t4(row
1ca0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
1cb0: 52 59 20 4b 45 59 2c 20 69 20 49 4e 54 45 47 45  RY KEY, i INTEGE
1cc0: 52 2c 20 74 20 54 45 58 54 29 3b 0a 20 20 42 45  R, t TEXT);.  BE
1cd0: 47 49 4e 3b 0a 7d 0a 73 65 74 20 6c 69 73 74 20  GIN;.}.set list 
1ce0: 7b 7d 0a 66 6f 72 20 7b 73 65 74 20 69 69 20 31  {}.for {set ii 1
1cf0: 7d 20 7b 24 69 69 20 3c 20 31 30 30 30 30 7d 20  } {$ii < 10000} 
1d00: 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 6c 61  {incr ii} {.  la
1d10: 70 70 65 6e 64 20 6c 69 73 74 20 24 69 69 20 5b  ppend list $ii [
1d20: 6e 75 6d 62 65 72 5f 6e 61 6d 65 20 24 69 69 5d  number_name $ii]
1d30: 0a 7d 0a 73 65 74 20 73 63 72 69 70 74 20 7b 0a  .}.set script {.
1d40: 20 20 66 6f 72 65 61 63 68 20 7b 69 69 20 6e 61    foreach {ii na
1d50: 6d 65 7d 20 24 3a 3a 6c 69 73 74 20 7b 0a 20 20  me} $::list {.  
1d60: 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52    db eval {INSER
1d70: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
1d80: 28 4e 55 4c 4c 2c 20 24 69 69 2c 20 24 6e 61 6d  (NULL, $ii, $nam
1d90: 65 29 3b 7d 0a 20 20 7d 0a 7d 0a 73 70 65 65 64  e);}.  }.}.speed
1da0: 5f 74 72 69 61 6c 5f 74 63 6c 20 73 70 65 65 64  _trial_tcl speed
1db0: 34 70 2d 6e 6f 74 72 69 67 67 65 72 31 20 31 30  4p-notrigger1 10
1dc0: 30 30 30 20 73 74 6d 74 20 24 73 63 72 69 70 74  000 stmt $script
1dd0: 0a 0a 73 65 74 20 6c 69 73 74 20 7b 7d 0a 66 6f  ..set list {}.fo
1de0: 72 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69  r {set ii 1} {$i
1df0: 69 20 3c 20 32 30 30 30 30 7d 20 7b 69 6e 63 72  i < 20000} {incr
1e00: 20 69 69 20 32 7d 20 7b 0a 20 20 73 65 74 20 69   ii 2} {.  set i
1e10: 69 32 20 5b 65 78 70 72 20 7b 24 69 69 2a 32 7d  i2 [expr {$ii*2}
1e20: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 6c 69 73 74  ].  lappend list
1e30: 20 24 69 69 20 24 69 69 32 20 5b 6e 75 6d 62 65   $ii $ii2 [numbe
1e40: 72 5f 6e 61 6d 65 20 24 69 69 32 5d 0a 7d 0a 73  r_name $ii2].}.s
1e50: 65 74 20 73 63 72 69 70 74 20 7b 0a 20 20 66 6f  et script {.  fo
1e60: 72 65 61 63 68 20 7b 69 69 20 69 69 32 20 6e 61  reach {ii ii2 na
1e70: 6d 65 7d 20 24 3a 3a 6c 69 73 74 20 7b 0a 20 20  me} $::list {.  
1e80: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
1e90: 20 20 55 50 44 41 54 45 20 74 34 20 53 45 54 20    UPDATE t4 SET 
1ea0: 69 20 3d 20 24 69 69 32 2c 20 74 20 3d 20 24 6e  i = $ii2, t = $n
1eb0: 61 6d 65 20 57 48 45 52 45 20 72 6f 77 69 64 20  ame WHERE rowid 
1ec0: 3d 20 24 69 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  = $ii;.    }.  }
1ed0: 0a 7d 0a 73 70 65 65 64 5f 74 72 69 61 6c 5f 74  .}.speed_trial_t
1ee0: 63 6c 20 73 70 65 65 64 34 70 2d 6e 6f 74 72 69  cl speed4p-notri
1ef0: 67 67 65 72 32 20 31 30 30 30 30 20 73 74 6d 74  gger2 10000 stmt
1f00: 20 24 73 63 72 69 70 74 0a 0a 73 65 74 20 73 63   $script..set sc
1f10: 72 69 70 74 20 7b 0a 20 20 66 6f 72 20 7b 73 65  ript {.  for {se
1f20: 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c 20 32  t ii 1} {$ii < 2
1f30: 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 69 20 32  0000} {incr ii 2
1f40: 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20  } {.    db eval 
1f50: 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 34 20  {DELETE FROM t4 
1f60: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 24 69  WHERE rowid = $i
1f70: 69 7d 0a 20 20 7d 0a 7d 0a 73 70 65 65 64 5f 74  i}.  }.}.speed_t
1f80: 72 69 61 6c 5f 74 63 6c 20 73 70 65 65 64 34 70  rial_tcl speed4p
1f90: 2d 6e 6f 74 72 69 67 67 65 72 33 20 31 30 30 30  -notrigger3 1000
1fa0: 30 20 73 74 6d 74 20 24 73 63 72 69 70 74 0a 65  0 stmt $script.e
1fb0: 78 65 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 0a  xecsql {COMMIT}.
1fc0: 0a 73 70 65 65 64 5f 74 72 69 61 6c 5f 73 75 6d  .speed_trial_sum
1fd0: 6d 61 72 79 20 73 70 65 65 64 34 0a 66 69 6e 69  mary speed4.fini
1fe0: 73 68 5f 74 65 73 74 0a                          sh_test.