/ Hex Artifact Content
Login

Artifact 6b5f104ebeb34a038b2f714150f51d01143e59aa:


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 65  # $Id: speed4p.e
0260: 78 70 6c 61 69 6e 2c 76 20 31 2e 31 20 32 30 30  xplain,v 1.1 200
0270: 38 2f 30 34 2f 31 36 20 31 32 3a 35 37 3a 34 38  8/04/16 12:57:48
0280: 20 64 72 68 20 45 78 70 20 24 0a 23 0a 0a 73 65   drh Exp $.#..se
0290: 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20  t testdir [file 
02a0: 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a  dirname $argv0].
02b0: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
02c0: 74 65 73 74 65 72 2e 74 63 6c 0a 73 70 65 65 64  tester.tcl.speed
02d0: 5f 74 72 69 61 6c 5f 69 6e 69 74 20 73 70 65 65  _trial_init spee
02e0: 64 31 0a 0a 23 20 53 65 74 20 61 20 75 6e 69 66  d1..# Set a unif
02f0: 6f 72 6d 20 72 61 6e 64 6f 6d 20 73 65 65 64 0a  orm random seed.
0300: 65 78 70 72 20 73 72 61 6e 64 28 30 29 0a 0a 73  expr srand(0)..s
0310: 65 74 20 73 71 6c 6f 75 74 20 5b 6f 70 65 6e 20  et sqlout [open 
0320: 73 70 65 65 64 31 2e 74 78 74 20 77 5d 0a 70 72  speed1.txt w].pr
0330: 6f 63 20 74 72 61 63 65 73 71 6c 20 7b 73 71 6c  oc tracesql {sql
0340: 7d 20 7b 0a 20 20 70 75 74 73 20 24 3a 3a 73 71  } {.  puts $::sq
0350: 6c 6f 75 74 20 24 73 71 6c 5c 3b 0a 7d 0a 23 64  lout $sql\;.}.#d
0360: 62 20 74 72 61 63 65 20 74 72 61 63 65 73 71 6c  b trace tracesql
0370: 0a 0a 23 20 54 68 65 20 6e 75 6d 62 65 72 5f 6e  ..# The number_n
0380: 61 6d 65 20 70 72 6f 63 65 64 75 72 65 20 62 65  ame procedure be
0390: 6c 6f 77 20 63 6f 6e 76 65 72 74 73 20 69 74 73  low converts its
03a0: 20 61 72 67 6d 65 6e 74 20 28 61 6e 20 69 6e 74   argment (an int
03b0: 65 67 65 72 29 0a 23 20 69 6e 74 6f 20 61 20 73  eger).# into a s
03c0: 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74  tring which is t
03d0: 68 65 20 45 6e 67 6c 69 73 68 2d 6c 61 6e 67 75  he English-langu
03e0: 61 67 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 61  age name for tha
03f0: 74 20 6e 75 6d 62 65 72 2e 0a 23 0a 23 20 45 78  t number..#.# Ex
0400: 61 6d 70 6c 65 3a 0a 23 0a 23 20 20 20 20 20 70  ample:.#.#     p
0410: 75 74 73 20 5b 6e 75 6d 62 65 72 5f 6e 61 6d 65  uts [number_name
0420: 20 31 32 33 5d 20 20 20 2d 3e 20 20 22 6f 6e 65   123]   ->  "one
0430: 20 68 75 6e 64 72 65 64 20 74 77 65 6e 74 79 20   hundred twenty 
0440: 74 68 72 65 65 22 0a 23 0a 73 65 74 20 6f 6e 65  three".#.set one
0450: 73 20 7b 7a 65 72 6f 20 6f 6e 65 20 74 77 6f 20  s {zero one two 
0460: 74 68 72 65 65 20 66 6f 75 72 20 66 69 76 65 20  three four five 
0470: 73 69 78 20 73 65 76 65 6e 20 65 69 67 68 74 20  six seven eight 
0480: 6e 69 6e 65 0a 20 20 20 20 20 20 20 20 20 20 74  nine.          t
0490: 65 6e 20 65 6c 65 76 65 6e 20 74 77 65 6c 76 65  en eleven twelve
04a0: 20 74 68 69 72 74 65 65 6e 20 66 6f 75 72 74 65   thirteen fourte
04b0: 65 6e 20 66 69 66 74 65 65 6e 20 73 69 78 74 65  en fifteen sixte
04c0: 65 6e 20 73 65 76 65 6e 74 65 65 6e 0a 20 20 20  en seventeen.   
04d0: 20 20 20 20 20 20 20 65 69 67 68 74 65 65 6e 20         eighteen 
04e0: 6e 69 6e 65 74 65 65 6e 7d 0a 73 65 74 20 74 65  nineteen}.set te
04f0: 6e 73 20 7b 7b 7d 20 74 65 6e 20 74 77 65 6e 74  ns {{} ten twent
0500: 79 20 74 68 69 72 74 79 20 66 6f 72 74 79 20 66  y thirty forty f
0510: 69 66 74 79 20 73 69 78 74 79 20 73 65 76 65 6e  ifty sixty seven
0520: 74 79 20 65 69 67 68 74 79 20 6e 69 6e 65 74 79  ty eighty ninety
0530: 7d 0a 70 72 6f 63 20 6e 75 6d 62 65 72 5f 6e 61  }.proc number_na
0540: 6d 65 20 7b 6e 7d 20 7b 0a 20 20 69 66 20 7b 24  me {n} {.  if {$
0550: 6e 3e 3d 31 30 30 30 7d 20 7b 0a 20 20 20 20 73  n>=1000} {.    s
0560: 65 74 20 74 78 74 20 22 5b 6e 75 6d 62 65 72 5f  et txt "[number_
0570: 6e 61 6d 65 20 5b 65 78 70 72 20 7b 24 6e 2f 31  name [expr {$n/1
0580: 30 30 30 7d 5d 5d 20 74 68 6f 75 73 61 6e 64 22  000}]] thousand"
0590: 0a 20 20 20 20 73 65 74 20 6e 20 5b 65 78 70 72  .    set n [expr
05a0: 20 7b 24 6e 25 31 30 30 30 7d 5d 0a 20 20 7d 20   {$n%1000}].  } 
05b0: 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 74  else {.    set t
05c0: 78 74 20 7b 7d 0a 20 20 7d 0a 20 20 69 66 20 7b  xt {}.  }.  if {
05d0: 24 6e 3e 3d 31 30 30 7d 20 7b 0a 20 20 20 20 61  $n>=100} {.    a
05e0: 70 70 65 6e 64 20 74 78 74 20 22 20 5b 6c 69 6e  ppend txt " [lin
05f0: 64 65 78 20 24 3a 3a 6f 6e 65 73 20 5b 65 78 70  dex $::ones [exp
0600: 72 20 7b 24 6e 2f 31 30 30 7d 5d 5d 20 68 75 6e  r {$n/100}]] hun
0610: 64 72 65 64 22 0a 20 20 20 20 73 65 74 20 6e 20  dred".    set n 
0620: 5b 65 78 70 72 20 7b 24 6e 25 31 30 30 7d 5d 0a  [expr {$n%100}].
0630: 20 20 7d 0a 20 20 69 66 20 7b 24 6e 3e 3d 32 30    }.  if {$n>=20
0640: 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 74  } {.    append t
0650: 78 74 20 22 20 5b 6c 69 6e 64 65 78 20 24 3a 3a  xt " [lindex $::
0660: 74 65 6e 73 20 5b 65 78 70 72 20 7b 24 6e 2f 31  tens [expr {$n/1
0670: 30 7d 5d 5d 22 0a 20 20 20 20 73 65 74 20 6e 20  0}]]".    set n 
0680: 5b 65 78 70 72 20 7b 24 6e 25 31 30 7d 5d 0a 20  [expr {$n%10}]. 
0690: 20 7d 0a 20 20 69 66 20 7b 24 6e 3e 30 7d 20 7b   }.  if {$n>0} {
06a0: 0a 20 20 20 20 61 70 70 65 6e 64 20 74 78 74 20  .    append txt 
06b0: 22 20 5b 6c 69 6e 64 65 78 20 24 3a 3a 6f 6e 65  " [lindex $::one
06c0: 73 20 24 6e 5d 22 0a 20 20 7d 0a 20 20 73 65 74  s $n]".  }.  set
06d0: 20 74 78 74 20 5b 73 74 72 69 6e 67 20 74 72 69   txt [string tri
06e0: 6d 20 24 74 78 74 5d 0a 20 20 69 66 20 7b 24 74  m $txt].  if {$t
06f0: 78 74 3d 3d 22 22 7d 20 7b 73 65 74 20 74 78 74  xt==""} {set txt
0700: 20 7a 65 72 6f 7d 0a 20 20 72 65 74 75 72 6e 20   zero}.  return 
0710: 24 74 78 74 0a 7d 0a 0a 23 20 53 75 6d 6d 61 72  $txt.}..# Summar
0720: 79 20 6f 66 20 74 65 73 74 73 3a 0a 23 0a 23 20  y of tests:.#.# 
0730: 20 20 73 70 65 65 64 34 70 2d 6a 6f 69 6e 31 3a    speed4p-join1:
0740: 20 4a 6f 69 6e 20 74 68 72 65 65 20 74 61 62 6c   Join three tabl
0750: 65 73 20 75 73 69 6e 67 20 49 50 4b 20 69 6e 64  es using IPK ind
0760: 65 78 2e 0a 23 20 20 20 73 70 65 65 64 34 70 2d  ex..#   speed4p-
0770: 6a 6f 69 6e 32 3a 20 4a 6f 69 6e 20 74 68 72 65  join2: Join thre
0780: 65 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20 61  e tables using a
0790: 6e 20 69 6e 64 65 78 2e 0a 23 20 20 20 73 70 65  n index..#   spe
07a0: 65 64 34 70 2d 6a 6f 69 6e 33 3a 20 4a 6f 69 6e  ed4p-join3: Join
07b0: 20 74 77 6f 20 74 61 62 6c 65 73 20 77 69 74 68   two tables with
07c0: 6f 75 74 20 61 6e 20 69 6e 64 65 78 2e 0a 23 0a  out an index..#.
07d0: 23 20 20 20 73 70 65 65 64 34 70 2d 76 69 65 77  #   speed4p-view
07e0: 31 3a 20 20 51 75 65 72 79 69 6e 67 20 61 20 76  1:  Querying a v
07f0: 69 65 77 2e 0a 23 20 20 20 73 70 65 65 64 34 70  iew..#   speed4p
0800: 2d 74 61 62 6c 65 31 3a 20 53 61 6d 65 20 71 75  -table1: Same qu
0810: 65 72 69 65 73 20 61 73 20 69 6e 20 73 70 65 65  eries as in spee
0820: 64 34 70 2d 76 69 65 77 31 2c 20 62 75 74 20 72  d4p-view1, but r
0830: 75 6e 20 64 69 72 65 63 74 6c 79 20 61 67 61 69  un directly agai
0840: 6e 73 74 0a 23 20 20 20 20 20 20 20 20 20 20 20  nst.#           
0850: 20 20 20 20 20 20 20 74 68 65 20 74 61 62 6c 65         the table
0860: 73 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  s for comparison
0870: 20 70 75 72 70 6f 73 65 73 2e 0a 23 0a 23 20 20   purposes..#.#  
0880: 20 73 70 65 65 64 34 70 2d 73 75 62 73 65 6c 65   speed4p-subsele
0890: 63 74 31 3a 20 41 20 53 45 4c 45 43 54 20 73 74  ct1: A SELECT st
08a0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 75 73 65  atement that use
08b0: 73 20 6d 61 6e 79 20 73 75 62 2d 71 75 65 72 69  s many sub-queri
08c0: 65 73 2e 2e 0a 23 0a 23 20 20 20 73 70 65 65 64  es...#.#   speed
08d0: 34 70 2d 74 72 69 67 67 65 72 31 3a 20 41 6e 20  4p-trigger1: An 
08e0: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
08f0: 20 74 68 61 74 20 66 69 72 65 73 20 61 20 74 72   that fires a tr
0900: 69 67 67 65 72 2e 0a 23 20 20 20 73 70 65 65 64  igger..#   speed
0910: 34 70 2d 74 72 69 67 67 65 72 32 3a 20 41 6e 20  4p-trigger2: An 
0920: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
0930: 20 74 68 61 74 20 66 69 72 65 73 20 61 20 74 72   that fires a tr
0940: 69 67 67 65 72 2e 0a 23 20 20 20 73 70 65 65 64  igger..#   speed
0950: 34 70 2d 74 72 69 67 67 65 72 33 3a 20 41 20 44  4p-trigger3: A D
0960: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
0970: 74 68 61 74 20 66 69 72 65 73 20 61 20 74 72 69  that fires a tri
0980: 67 67 65 72 2e 0a 23 20 20 20 73 70 65 65 64 34  gger..#   speed4
0990: 70 2d 6e 6f 74 72 69 67 67 65 72 31 3a 20 53 61  p-notrigger1: Sa
09a0: 6d 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20  me operation as 
09b0: 74 72 69 67 67 65 72 31 2c 20 62 75 74 20 77 69  trigger1, but wi
09c0: 74 68 6f 75 74 20 74 68 65 20 74 72 69 67 67 65  thout the trigge
09d0: 72 2e 0a 23 20 20 20 73 70 65 65 64 34 70 2d 6e  r..#   speed4p-n
09e0: 6f 74 72 69 67 67 65 72 32 3a 20 20 20 20 20 20  otrigger2:      
09f0: 20 20 22 20 20 20 20 20 20 20 20 20 20 74 72 69    "          tri
0a00: 67 67 65 72 32 20 20 20 20 20 20 20 20 20 20 20  gger2           
0a10: 22 0a 23 20 20 20 73 70 65 65 64 34 70 2d 6e 6f  ".#   speed4p-no
0a20: 74 72 69 67 67 65 72 33 3a 20 20 20 20 20 20 20  trigger3:       
0a30: 20 22 20 20 20 20 20 20 20 20 20 20 74 72 69 67   "          trig
0a40: 67 65 72 33 20 20 20 20 20 20 20 20 20 20 20 22  ger3           "
0a50: 0a 23 0a 0a 23 20 53 65 74 20 75 70 20 74 68 65  .#..# Set up the
0a60: 20 73 63 68 65 6d 61 2e 20 45 61 63 68 20 6f 66   schema. Each of
0a70: 20 74 68 65 20 74 61 62 6c 65 73 20 74 31 2c 20   the tables t1, 
0a80: 74 32 20 61 6e 64 20 74 33 20 63 6f 6e 74 61 69  t2 and t3 contai
0a90: 6e 20 35 30 2c 30 30 30 20 72 6f 77 73 2e 0a 23  n 50,000 rows..#
0aa0: 20 54 68 69 73 20 63 72 65 61 74 65 73 20 61 20   This creates a 
0ab0: 64 61 74 61 62 61 73 65 20 6f 66 20 61 72 6f 75  database of arou
0ac0: 6e 64 20 31 36 4d 42 2e 0a 65 78 65 63 73 71 6c  nd 16MB..execsql
0ad0: 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65   {.  PRAGMA page
0ae0: 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20 50 52  _size=1024;.  PR
0af0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3d  AGMA cache_size=
0b00: 38 31 39 32 3b 0a 20 20 50 52 41 47 4d 41 20 6c  8192;.  PRAGMA l
0b10: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
0b20: 55 53 49 56 45 3b 0a 20 20 42 45 47 49 4e 3b 0a  USIVE;.  BEGIN;.
0b30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0b40: 31 28 72 6f 77 69 64 20 49 4e 54 45 47 45 52 20  1(rowid INTEGER 
0b50: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 69 20 49  PRIMARY KEY, i I
0b60: 4e 54 45 47 45 52 2c 20 74 20 54 45 58 54 29 3b  NTEGER, t TEXT);
0b70: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0b80: 74 32 28 72 6f 77 69 64 20 49 4e 54 45 47 45 52  t2(rowid INTEGER
0b90: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 69 20   PRIMARY KEY, i 
0ba0: 49 4e 54 45 47 45 52 2c 20 74 20 54 45 58 54 29  INTEGER, t TEXT)
0bb0: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
0bc0: 20 74 33 28 72 6f 77 69 64 20 49 4e 54 45 47 45   t3(rowid INTEGE
0bd0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 69  R PRIMARY KEY, i
0be0: 20 49 4e 54 45 47 45 52 2c 20 74 20 54 45 58 54   INTEGER, t TEXT
0bf0: 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 56 49 45  );..  CREATE VIE
0c00: 57 20 76 31 20 41 53 20 53 45 4c 45 43 54 20 72  W v1 AS SELECT r
0c10: 6f 77 69 64 2c 20 69 2c 20 74 20 46 52 4f 4d 20  owid, i, t FROM 
0c20: 74 31 3b 0a 20 20 43 52 45 41 54 45 20 56 49 45  t1;.  CREATE VIE
0c30: 57 20 76 32 20 41 53 20 53 45 4c 45 43 54 20 72  W v2 AS SELECT r
0c40: 6f 77 69 64 2c 20 69 2c 20 74 20 46 52 4f 4d 20  owid, i, t FROM 
0c50: 74 32 3b 0a 20 20 43 52 45 41 54 45 20 56 49 45  t2;.  CREATE VIE
0c60: 57 20 76 33 20 41 53 20 53 45 4c 45 43 54 20 72  W v3 AS SELECT r
0c70: 6f 77 69 64 2c 20 69 2c 20 74 20 46 52 4f 4d 20  owid, i, t FROM 
0c80: 74 33 3b 0a 7d 0a 66 6f 72 20 7b 73 65 74 20 6a  t3;.}.for {set j
0c90: 6a 20 31 7d 20 7b 24 6a 6a 20 3c 3d 20 33 7d 20  j 1} {$jj <= 3} 
0ca0: 7b 69 6e 63 72 20 6a 6a 7d 20 7b 0a 20 20 73 65  {incr jj} {.  se
0cb0: 74 20 73 74 6d 74 20 5b 73 74 72 69 6e 67 20 6d  t stmt [string m
0cc0: 61 70 20 22 25 54 25 20 74 24 6a 6a 22 20 7b 49  ap "%T% t$jj" {I
0cd0: 4e 53 45 52 54 20 49 4e 54 4f 20 25 54 25 20 56  NSERT INTO %T% V
0ce0: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 24 69 2c 20  ALUES(NULL, $i, 
0cf0: 24 74 29 7d 5d 0a 20 20 66 6f 72 20 7b 73 65 74  $t)}].  for {set
0d00: 20 69 69 20 30 7d 20 7b 24 69 69 20 3c 20 35 30   ii 0} {$ii < 50
0d10: 30 30 30 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b  000} {incr ii} {
0d20: 0a 20 20 20 20 73 65 74 20 69 20 5b 65 78 70 72  .    set i [expr
0d30: 20 7b 69 6e 74 28 72 61 6e 64 28 29 2a 35 30 30   {int(rand()*500
0d40: 30 30 29 7d 5d 0a 20 20 20 20 73 65 74 20 74 20  00)}].    set t 
0d50: 5b 6e 75 6d 62 65 72 5f 6e 61 6d 65 20 24 69 5d  [number_name $i]
0d60: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 73 74  .    execsql $st
0d70: 6d 74 0a 20 20 7d 0a 7d 0a 65 78 65 63 73 71 6c  mt.  }.}.execsql
0d80: 20 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45   {.  CREATE INDE
0d90: 58 20 69 31 20 4f 4e 20 74 31 28 74 29 3b 0a 20  X i1 ON t1(t);. 
0da0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
0db0: 20 4f 4e 20 74 32 28 74 29 3b 0a 20 20 43 52 45   ON t2(t);.  CRE
0dc0: 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20  ATE INDEX i3 ON 
0dd0: 74 33 28 74 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b  t3(t);.  COMMIT;
0de0: 0a 7d 0a 0a 23 20 42 65 66 6f 72 65 20 72 75 6e  .}..# Before run
0df0: 6e 69 6e 67 20 74 68 65 73 65 20 74 65 73 74 73  ning these tests
0e00: 2c 20 64 69 73 61 62 6c 65 20 74 68 65 20 63 6f  , disable the co
0e10: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
0e20: 20 63 61 63 68 65 20 62 75 69 6c 74 20 69 6e 74   cache built int
0e30: 6f 0a 23 20 74 68 65 20 54 63 6c 20 69 6e 74 65  o.# the Tcl inte
0e40: 72 66 61 63 65 2e 20 54 68 69 73 20 69 73 20 62  rface. This is b
0e50: 65 63 61 75 73 65 20 77 65 20 77 61 6e 74 20 74  ecause we want t
0e60: 6f 20 74 65 73 74 20 74 68 65 20 73 70 65 65 64  o test the speed
0e70: 20 6f 66 20 53 51 4c 0a 23 20 63 6f 6d 70 69 6c   of SQL.# compil
0e80: 61 74 69 6f 6e 20 61 73 20 77 65 6c 6c 20 61 73  ation as well as
0e90: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 23 0a 64 62   execution..#.db
0ea0: 20 63 61 63 68 65 20 73 69 7a 65 20 30 0a 0a 23   cache size 0..#
0eb0: 20 4a 6f 69 6e 20 74 31 2c 20 74 32 2c 20 74 33   Join t1, t2, t3
0ec0: 20 6f 6e 20 49 50 4b 2e 0a 73 65 74 20 73 71 6c   on IPK..set sql
0ed0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
0ee0: 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
0ef0: 20 74 31 2e 6f 69 64 20 3d 20 74 32 2e 6f 69 64   t1.oid = t2.oid
0f00: 20 41 4e 44 20 74 32 2e 6f 69 64 20 3d 20 74 33   AND t2.oid = t3
0f10: 2e 6f 69 64 22 0a 65 78 70 6c 61 69 6e 20 24 73  .oid".explain $s
0f20: 71 6c 0a 73 70 65 65 64 5f 74 72 69 61 6c 20 73  ql.speed_trial s
0f30: 70 65 65 64 34 70 2d 6a 6f 69 6e 31 20 35 30 30  peed4p-join1 500
0f40: 30 30 20 72 6f 77 20 24 73 71 6c 0a 0a 23 20 4a  00 row $sql..# J
0f50: 6f 69 6e 20 74 31 2c 20 74 32 2c 20 74 33 20 6f  oin t1, t2, t3 o
0f60: 6e 20 74 68 65 20 6e 6f 6e 2d 49 50 4b 20 69 6e  n the non-IPK in
0f70: 64 65 78 2e 0a 73 65 74 20 73 71 6c 20 22 53 45  dex..set sql "SE
0f80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
0f90: 74 32 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e  t2, t3 WHERE t1.
0fa0: 74 20 3d 20 74 32 2e 74 20 41 4e 44 20 74 32 2e  t = t2.t AND t2.
0fb0: 74 20 3d 20 74 33 2e 74 22 0a 65 78 70 6c 61 69  t = t3.t".explai
0fc0: 6e 20 24 73 71 6c 0a 73 70 65 65 64 5f 74 72 69  n $sql.speed_tri
0fd0: 61 6c 20 73 70 65 65 64 34 70 2d 6a 6f 69 6e 32  al speed4p-join2
0fe0: 20 35 30 30 30 30 20 72 6f 77 20 24 73 71 6c 0a   50000 row $sql.
0ff0: 0a 23 20 52 75 6e 20 31 30 30 30 30 20 73 69 6d  .# Run 10000 sim
1000: 70 6c 65 20 71 75 65 72 69 65 73 20 61 67 61 69  ple queries agai
1010: 6e 73 74 20 74 68 65 20 76 69 65 77 73 2e 0a 73  nst the views..s
1020: 65 74 20 73 63 72 69 70 74 20 7b 0a 20 20 66 6f  et script {.  fo
1030: 72 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69  r {set ii 1} {$i
1040: 69 20 3c 20 31 30 30 30 30 7d 20 7b 69 6e 63 72  i < 10000} {incr
1050: 20 69 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 76   ii} {.    set v
1060: 20 5b 65 78 70 72 20 7b 24 69 69 2a 33 7d 5d 0a   [expr {$ii*3}].
1070: 20 20 20 20 73 65 74 20 74 20 5b 65 78 70 72 20      set t [expr 
1080: 7b 24 69 69 25 33 2b 31 7d 5d 0a 20 20 20 20 64  {$ii%3+1}].    d
1090: 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 2a  b eval "SELECT *
10a0: 20 46 52 4f 4d 20 76 24 74 20 57 48 45 52 45 20   FROM v$t WHERE 
10b0: 72 6f 77 69 64 20 3d 20 5c 24 76 22 0a 20 20 7d  rowid = \$v".  }
10c0: 0a 7d 0a 65 78 70 6c 61 69 6e 20 7b 53 45 4c 45  .}.explain {SELE
10d0: 43 54 20 2a 20 46 52 4f 6d 20 76 31 20 57 48 45  CT * FROm v1 WHE
10e0: 52 45 20 72 6f 77 69 64 3d 24 76 7d 0a 73 70 65  RE rowid=$v}.spe
10f0: 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20 73 70 65  ed_trial_tcl spe
1100: 65 64 34 70 2d 76 69 65 77 31 20 31 30 30 30 30  ed4p-view1 10000
1110: 20 73 74 6d 74 20 24 73 63 72 69 70 74 0a 0a 23   stmt $script..#
1120: 20 52 75 6e 20 74 68 65 20 73 61 6d 65 20 31 30   Run the same 10
1130: 30 30 30 20 73 69 6d 70 6c 65 20 71 75 65 72 69  000 simple queri
1140: 65 73 20 61 73 20 69 6e 20 74 68 65 20 70 72 65  es as in the pre
1150: 76 69 6f 75 73 20 74 65 73 74 20 63 61 73 65 20  vious test case 
1160: 61 67 61 69 6e 73 74 0a 23 20 74 68 65 20 75 6e  against.# the un
1170: 64 65 72 6c 79 69 6e 67 20 74 61 62 6c 65 73 2e  derlying tables.
1180: 20 54 68 65 20 63 6f 6d 70 69 6c 65 64 20 76 64   The compiled vd
1190: 62 65 20 70 72 6f 67 72 61 6d 73 20 73 68 6f 75  be programs shou
11a0: 6c 64 20 62 65 20 69 64 65 6e 74 69 63 61 6c 2c  ld be identical,
11b0: 20 73 6f 0a 23 20 74 68 65 20 6f 6e 6c 79 20 64   so.# the only d
11c0: 69 66 66 65 72 65 6e 63 65 20 69 6e 20 72 75 6e  ifference in run
11d0: 6e 69 6e 67 20 74 69 6d 65 20 69 73 20 74 68 65  ning time is the
11e0: 20 65 78 74 72 61 20 74 69 6d 65 20 74 61 6b 65   extra time take
11f0: 6e 20 74 6f 20 63 6f 6d 70 69 6c 65 0a 23 20 74  n to compile.# t
1200: 68 65 20 76 69 65 77 20 64 65 66 69 6e 69 74 69  he view definiti
1210: 6f 6e 73 2e 0a 23 0a 73 65 74 20 73 63 72 69 70  ons..#.set scrip
1220: 74 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  t {.  for {set i
1230: 69 20 31 7d 20 7b 24 69 69 20 3c 20 31 30 30 30  i 1} {$ii < 1000
1240: 30 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20  0} {incr ii} {. 
1250: 20 20 20 73 65 74 20 76 20 5b 65 78 70 72 20 7b     set v [expr {
1260: 24 69 69 2a 33 7d 5d 0a 20 20 20 20 73 65 74 20  $ii*3}].    set 
1270: 74 20 5b 65 78 70 72 20 7b 24 69 69 25 33 2b 31  t [expr {$ii%3+1
1280: 7d 5d 0a 20 20 20 20 64 62 20 65 76 61 6c 20 22  }].    db eval "
1290: 53 45 4c 45 43 54 20 74 20 46 52 4f 4d 20 74 24  SELECT t FROM t$
12a0: 74 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  t WHERE rowid = 
12b0: 5c 24 76 22 0a 20 20 7d 0a 7d 0a 65 78 70 6c 61  \$v".  }.}.expla
12c0: 69 6e 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  in {SELECT * FRO
12d0: 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64  M t1 WHERE rowid
12e0: 3d 24 76 7d 0a 73 70 65 65 64 5f 74 72 69 61 6c  =$v}.speed_trial
12f0: 5f 74 63 6c 20 73 70 65 65 64 34 70 2d 74 61 62  _tcl speed4p-tab
1300: 6c 65 31 20 31 30 30 30 30 20 73 74 6d 74 20 24  le1 10000 stmt $
1310: 73 63 72 69 70 74 0a 0a 23 20 52 75 6e 20 61 20  script..# Run a 
1320: 53 45 4c 45 43 54 20 74 68 61 74 20 75 73 65 73  SELECT that uses
1330: 20 73 75 62 2d 71 75 65 72 69 65 73 20 31 30 30   sub-queries 100
1340: 30 30 20 74 69 6d 65 73 2e 20 41 20 74 6f 74 61  00 times. A tota
1350: 6c 20 6f 66 20 33 30 30 30 30 20 73 75 62 2d 73  l of 30000 sub-s
1360: 65 6c 65 63 74 73 2e 0a 23 0a 73 65 74 20 73 63  elects..#.set sc
1370: 72 69 70 74 20 7b 0a 20 20 66 6f 72 20 7b 73 65  ript {.  for {se
1380: 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c 20 31  t ii 1} {$ii < 1
1390: 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 69 7d 20  0000} {incr ii} 
13a0: 7b 0a 20 20 20 20 73 65 74 20 76 20 5b 65 78 70  {.    set v [exp
13b0: 72 20 7b 24 69 69 2a 33 7d 5d 0a 20 20 20 20 64  r {$ii*3}].    d
13c0: 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 53  b eval {.      S
13d0: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 20  ELECT (SELECT t 
13e0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f  FROM t1 WHERE ro
13f0: 77 69 64 20 3d 20 24 76 29 2c 20 0a 20 20 20 20  wid = $v), .    
1400: 20 20 20 20 20 20 20 20 20 28 53 45 4c 45 43 54           (SELECT
1410: 20 74 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   t FROM t2 WHERE
1420: 20 72 6f 77 69 64 20 3d 20 24 76 29 2c 20 0a 20   rowid = $v), . 
1430: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 45 4c              (SEL
1440: 45 43 54 20 74 20 46 52 4f 4d 20 74 33 20 57 48  ECT t FROM t3 WH
1450: 45 52 45 20 72 6f 77 69 64 20 3d 20 24 76 29 0a  ERE rowid = $v).
1460: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 65 78 70 6c      }.  }.}.expl
1470: 61 69 6e 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  ain {.      SELE
1480: 43 54 20 28 53 45 4c 45 43 54 20 74 20 46 52 4f  CT (SELECT t FRO
1490: 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64  M t1 WHERE rowid
14a0: 20 3d 20 24 76 29 2c 20 0a 20 20 20 20 20 20 20   = $v), .       
14b0: 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 74 20        (SELECT t 
14c0: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 72 6f  FROM t2 WHERE ro
14d0: 77 69 64 20 3d 20 24 76 29 2c 20 0a 20 20 20 20  wid = $v), .    
14e0: 20 20 20 20 20 20 20 20 20 28 53 45 4c 45 43 54           (SELECT
14f0: 20 74 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45   t FROM t3 WHERE
1500: 20 72 6f 77 69 64 20 3d 20 24 76 29 0a 7d 0a 73   rowid = $v).}.s
1510: 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20 73  peed_trial_tcl s
1520: 70 65 65 64 34 70 2d 73 75 62 73 65 6c 65 63 74  peed4p-subselect
1530: 31 20 31 30 30 30 30 20 73 74 6d 74 20 24 73 63  1 10000 stmt $sc
1540: 72 69 70 74 0a 0a 23 20 54 68 65 20 66 6f 6c 6c  ript..# The foll
1550: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 74 65 73 74  owing block test
1560: 73 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 73  s the speed of s
1570: 6f 6d 65 20 44 4d 4c 20 73 74 61 74 65 6d 65 6e  ome DML statemen
1580: 74 73 20 74 68 61 74 20 63 61 75 73 65 0a 23 20  ts that cause.# 
1590: 74 72 69 67 67 65 72 73 20 74 6f 20 66 69 72 65  triggers to fire
15a0: 2e 0a 23 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..#.execsql {.  
15b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f 67  CREATE TABLE log
15c0: 28 6f 70 20 54 45 58 54 2c 20 72 20 49 4e 54 45  (op TEXT, r INTE
15d0: 47 45 52 2c 20 69 20 49 4e 54 45 47 45 52 2c 20  GER, i INTEGER, 
15e0: 74 20 54 45 58 54 29 3b 0a 20 20 43 52 45 41 54  t TEXT);.  CREAT
15f0: 45 20 54 41 42 4c 45 20 74 34 28 72 6f 77 69 64  E TABLE t4(rowid
1600: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1610: 20 4b 45 59 2c 20 69 20 49 4e 54 45 47 45 52 2c   KEY, i INTEGER,
1620: 20 74 20 54 45 58 54 29 3b 0a 20 20 43 52 45 41   t TEXT);.  CREA
1630: 54 45 20 54 52 49 47 47 45 52 20 74 34 5f 74 72  TE TRIGGER t4_tr
1640: 69 67 67 65 72 31 20 41 46 54 45 52 20 49 4e 53  igger1 AFTER INS
1650: 45 52 54 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a  ERT ON t4 BEGIN.
1660: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1670: 6c 6f 67 20 56 41 4c 55 45 53 28 27 49 4e 53 45  log VALUES('INSE
1680: 52 54 20 49 4e 54 4f 20 74 34 27 2c 20 6e 65 77  RT INTO t4', new
1690: 2e 72 6f 77 69 64 2c 20 6e 65 77 2e 69 2c 20 6e  .rowid, new.i, n
16a0: 65 77 2e 74 29 3b 0a 20 20 45 4e 44 3b 0a 20 20  ew.t);.  END;.  
16b0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
16c0: 34 5f 74 72 69 67 67 65 72 32 20 41 46 54 45 52  4_trigger2 AFTER
16d0: 20 55 50 44 41 54 45 20 4f 4e 20 74 34 20 42 45   UPDATE ON t4 BE
16e0: 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20 49  GIN.    INSERT I
16f0: 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 27  NTO log VALUES('
1700: 55 50 44 41 54 45 20 4f 46 20 74 34 27 2c 20 6e  UPDATE OF t4', n
1710: 65 77 2e 72 6f 77 69 64 2c 20 6e 65 77 2e 69 2c  ew.rowid, new.i,
1720: 20 6e 65 77 2e 74 29 3b 0a 20 20 45 4e 44 3b 0a   new.t);.  END;.
1730: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
1740: 20 74 34 5f 74 72 69 67 67 65 72 33 20 41 46 54   t4_trigger3 AFT
1750: 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74 34 20  ER DELETE ON t4 
1760: 42 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54  BEGIN.    INSERT
1770: 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53   INTO log VALUES
1780: 28 27 44 45 4c 45 54 45 20 4f 46 20 74 34 27 2c  ('DELETE OF t4',
1790: 20 6f 6c 64 2e 72 6f 77 69 64 2c 20 6f 6c 64 2e   old.rowid, old.
17a0: 69 2c 20 6f 6c 64 2e 74 29 3b 0a 20 20 45 4e 44  i, old.t);.  END
17b0: 3b 0a 20 20 42 45 47 49 4e 3b 0a 7d 0a 73 65 74  ;.  BEGIN;.}.set
17c0: 20 6c 69 73 74 20 7b 7d 0a 66 6f 72 20 7b 73 65   list {}.for {se
17d0: 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c 20 31  t ii 1} {$ii < 1
17e0: 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 69 7d 20  0000} {incr ii} 
17f0: 7b 0a 20 20 6c 61 70 70 65 6e 64 20 6c 69 73 74  {.  lappend list
1800: 20 24 69 69 20 5b 6e 75 6d 62 65 72 5f 6e 61 6d   $ii [number_nam
1810: 65 20 24 69 69 5d 0a 7d 0a 73 65 74 20 73 63 72  e $ii].}.set scr
1820: 69 70 74 20 7b 0a 20 20 66 6f 72 65 61 63 68 20  ipt {.  foreach 
1830: 7b 69 69 20 6e 61 6d 65 7d 20 24 3a 3a 6c 69 73  {ii name} $::lis
1840: 74 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20  t {.    db eval 
1850: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20  {INSERT INTO t4 
1860: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 24 69 69  VALUES(NULL, $ii
1870: 2c 20 24 6e 61 6d 65 29 7d 0a 20 20 7d 0a 7d 0a  , $name)}.  }.}.
1880: 65 78 70 6c 61 69 6e 20 7b 49 4e 53 45 52 54 20  explain {INSERT 
1890: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 4e  INTO t4 VALUES(N
18a0: 55 4c 4c 2c 20 24 69 69 2c 20 24 6e 61 6d 65 29  ULL, $ii, $name)
18b0: 7d 0a 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63  }.speed_trial_tc
18c0: 6c 20 73 70 65 65 64 34 70 2d 74 72 69 67 67 65  l speed4p-trigge
18d0: 72 31 20 31 30 30 30 30 20 73 74 6d 74 20 24 73  r1 10000 stmt $s
18e0: 63 72 69 70 74 0a 0a 73 65 74 20 6c 69 73 74 20  cript..set list 
18f0: 7b 7d 0a 66 6f 72 20 7b 73 65 74 20 69 69 20 31  {}.for {set ii 1
1900: 7d 20 7b 24 69 69 20 3c 20 32 30 30 30 30 7d 20  } {$ii < 20000} 
1910: 7b 69 6e 63 72 20 69 69 20 32 7d 20 7b 0a 20 20  {incr ii 2} {.  
1920: 73 65 74 20 69 69 32 20 5b 65 78 70 72 20 7b 24  set ii2 [expr {$
1930: 69 69 2a 32 7d 5d 0a 20 20 6c 61 70 70 65 6e 64  ii*2}].  lappend
1940: 20 6c 69 73 74 20 24 69 69 20 24 69 69 32 20 5b   list $ii $ii2 [
1950: 6e 75 6d 62 65 72 5f 6e 61 6d 65 20 24 69 69 32  number_name $ii2
1960: 5d 0a 7d 0a 73 65 74 20 73 63 72 69 70 74 20 7b  ].}.set script {
1970: 0a 20 20 66 6f 72 65 61 63 68 20 7b 69 69 20 69  .  foreach {ii i
1980: 69 32 20 6e 61 6d 65 7d 20 24 3a 3a 6c 69 73 74  i2 name} $::list
1990: 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b   {.    db eval {
19a0: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 34  .      UPDATE t4
19b0: 20 53 45 54 20 69 20 3d 20 24 69 69 32 2c 20 74   SET i = $ii2, t
19c0: 20 3d 20 24 6e 61 6d 65 20 57 48 45 52 45 20 72   = $name WHERE r
19d0: 6f 77 69 64 20 3d 20 24 69 69 3b 0a 20 20 20 20  owid = $ii;.    
19e0: 7d 0a 20 20 7d 0a 7d 0a 65 78 70 6c 61 69 6e 20  }.  }.}.explain 
19f0: 7b 55 50 44 41 54 45 20 74 34 20 53 45 54 20 69  {UPDATE t4 SET i
1a00: 20 3d 20 24 69 69 32 2c 20 74 20 3d 20 24 6e 61   = $ii2, t = $na
1a10: 6d 65 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  me WHERE rowid =
1a20: 20 24 69 69 7d 0a 73 70 65 65 64 5f 74 72 69 61   $ii}.speed_tria
1a30: 6c 5f 74 63 6c 20 73 70 65 65 64 34 70 2d 74 72  l_tcl speed4p-tr
1a40: 69 67 67 65 72 32 20 31 30 30 30 30 20 73 74 6d  igger2 10000 stm
1a50: 74 20 24 73 63 72 69 70 74 0a 0a 73 65 74 20 73  t $script..set s
1a60: 63 72 69 70 74 20 7b 0a 20 20 66 6f 72 20 7b 73  cript {.  for {s
1a70: 65 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c 20  et ii 1} {$ii < 
1a80: 32 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 69 20  20000} {incr ii 
1a90: 32 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c  2} {.    db eval
1aa0: 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 34   {DELETE FROM t4
1ab0: 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 24   WHERE rowid = $
1ac0: 69 69 7d 0a 20 20 7d 0a 7d 0a 65 78 70 6c 61 69  ii}.  }.}.explai
1ad0: 6e 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  n {DELETE FROM t
1ae0: 34 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  4 WHERE rowid = 
1af0: 24 69 69 7d 0a 73 70 65 65 64 5f 74 72 69 61 6c  $ii}.speed_trial
1b00: 5f 74 63 6c 20 73 70 65 65 64 34 70 2d 74 72 69  _tcl speed4p-tri
1b10: 67 67 65 72 33 20 31 30 30 30 30 20 73 74 6d 74  gger3 10000 stmt
1b20: 20 24 73 63 72 69 70 74 0a 65 78 65 63 73 71 6c   $script.execsql
1b30: 20 7b 43 4f 4d 4d 49 54 7d 0a 0a 23 20 54 68 65   {COMMIT}..# The
1b40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
1b50: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 61   contains the sa
1b60: 6d 65 20 74 65 73 74 73 20 61 73 20 74 68 65 20  me tests as the 
1b70: 61 62 6f 76 65 20 62 6c 6f 63 6b 20 74 68 61 74  above block that
1b80: 0a 23 20 74 65 73 74 73 20 74 72 69 67 67 65 72  .# tests trigger
1b90: 73 2c 20 77 69 74 68 20 6f 6e 65 20 63 72 75 63  s, with one cruc
1ba0: 69 61 6c 20 64 69 66 66 65 72 65 6e 63 65 3a 20  ial difference: 
1bb0: 6e 6f 20 74 72 69 67 67 65 72 73 20 61 72 65 20  no triggers are 
1bc0: 64 65 66 69 6e 65 64 2e 0a 23 20 53 6f 20 74 68  defined..# So th
1bd0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  e difference in 
1be0: 73 70 65 65 64 20 62 65 74 77 65 65 6e 20 74 68  speed between th
1bf0: 65 73 65 20 74 65 73 74 73 20 61 6e 64 20 74 68  ese tests and th
1c00: 65 20 70 72 65 63 65 64 69 6e 67 20 6f 6e 65 73  e preceding ones
1c10: 0a 23 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  .# is the amount
1c20: 20 6f 66 20 74 69 6d 65 20 74 61 6b 65 6e 20 74   of time taken t
1c30: 6f 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 65 78  o compile and ex
1c40: 65 63 75 74 65 20 74 68 65 20 74 72 69 67 67 65  ecute the trigge
1c50: 72 20 70 72 6f 67 72 61 6d 73 2e 0a 23 0a 65 78  r programs..#.ex
1c60: 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54  ecsql {.  DROP T
1c70: 41 42 4c 45 20 74 34 3b 0a 20 20 44 52 4f 50 20  ABLE t4;.  DROP 
1c80: 54 41 42 4c 45 20 6c 6f 67 3b 0a 20 20 56 41 43  TABLE log;.  VAC
1c90: 55 55 4d 3b 0a 20 20 43 52 45 41 54 45 20 54 41  UUM;.  CREATE TA
1ca0: 42 4c 45 20 74 34 28 72 6f 77 69 64 20 49 4e 54  BLE t4(rowid INT
1cb0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1cc0: 2c 20 69 20 49 4e 54 45 47 45 52 2c 20 74 20 54  , i INTEGER, t T
1cd0: 45 58 54 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 7d  EXT);.  BEGIN;.}
1ce0: 0a 73 65 74 20 6c 69 73 74 20 7b 7d 0a 66 6f 72  .set list {}.for
1cf0: 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69 69   {set ii 1} {$ii
1d00: 20 3c 20 31 30 30 30 30 7d 20 7b 69 6e 63 72 20   < 10000} {incr 
1d10: 69 69 7d 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20  ii} {.  lappend 
1d20: 6c 69 73 74 20 24 69 69 20 5b 6e 75 6d 62 65 72  list $ii [number
1d30: 5f 6e 61 6d 65 20 24 69 69 5d 0a 7d 0a 73 65 74  _name $ii].}.set
1d40: 20 73 63 72 69 70 74 20 7b 0a 20 20 66 6f 72 65   script {.  fore
1d50: 61 63 68 20 7b 69 69 20 6e 61 6d 65 7d 20 24 3a  ach {ii name} $:
1d60: 3a 6c 69 73 74 20 7b 0a 20 20 20 20 64 62 20 65  :list {.    db e
1d70: 76 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  val {INSERT INTO
1d80: 20 74 34 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c   t4 VALUES(NULL,
1d90: 20 24 69 69 2c 20 24 6e 61 6d 65 29 3b 7d 0a 20   $ii, $name);}. 
1da0: 20 7d 0a 7d 0a 65 78 70 6c 61 69 6e 20 7b 49 4e   }.}.explain {IN
1db0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
1dc0: 55 45 53 28 4e 55 4c 4c 2c 20 24 69 69 2c 20 24  UES(NULL, $ii, $
1dd0: 6e 61 6d 65 29 7d 0a 73 70 65 65 64 5f 74 72 69  name)}.speed_tri
1de0: 61 6c 5f 74 63 6c 20 73 70 65 65 64 34 70 2d 6e  al_tcl speed4p-n
1df0: 6f 74 72 69 67 67 65 72 31 20 31 30 30 30 30 20  otrigger1 10000 
1e00: 73 74 6d 74 20 24 73 63 72 69 70 74 0a 0a 73 65  stmt $script..se
1e10: 74 20 6c 69 73 74 20 7b 7d 0a 66 6f 72 20 7b 73  t list {}.for {s
1e20: 65 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c 20  et ii 1} {$ii < 
1e30: 32 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 69 20  20000} {incr ii 
1e40: 32 7d 20 7b 0a 20 20 73 65 74 20 69 69 32 20 5b  2} {.  set ii2 [
1e50: 65 78 70 72 20 7b 24 69 69 2a 32 7d 5d 0a 20 20  expr {$ii*2}].  
1e60: 6c 61 70 70 65 6e 64 20 6c 69 73 74 20 24 69 69  lappend list $ii
1e70: 20 24 69 69 32 20 5b 6e 75 6d 62 65 72 5f 6e 61   $ii2 [number_na
1e80: 6d 65 20 24 69 69 32 5d 0a 7d 0a 73 65 74 20 73  me $ii2].}.set s
1e90: 63 72 69 70 74 20 7b 0a 20 20 66 6f 72 65 61 63  cript {.  foreac
1ea0: 68 20 7b 69 69 20 69 69 32 20 6e 61 6d 65 7d 20  h {ii ii2 name} 
1eb0: 24 3a 3a 6c 69 73 74 20 7b 0a 20 20 20 20 64 62  $::list {.    db
1ec0: 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 55 50   eval {.      UP
1ed0: 44 41 54 45 20 74 34 20 53 45 54 20 69 20 3d 20  DATE t4 SET i = 
1ee0: 24 69 69 32 2c 20 74 20 3d 20 24 6e 61 6d 65 20  $ii2, t = $name 
1ef0: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 24 69  WHERE rowid = $i
1f00: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 65  i;.    }.  }.}.e
1f10: 78 70 6c 61 69 6e 20 7b 55 50 44 41 54 45 20 74  xplain {UPDATE t
1f20: 34 20 53 45 54 20 69 20 3d 20 24 69 69 32 2c 20  4 SET i = $ii2, 
1f30: 74 20 3d 20 24 6e 61 6d 65 20 57 48 45 52 45 20  t = $name WHERE 
1f40: 72 6f 77 69 64 20 3d 20 24 69 69 7d 0a 73 70 65  rowid = $ii}.spe
1f50: 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20 73 70 65  ed_trial_tcl spe
1f60: 65 64 34 70 2d 6e 6f 74 72 69 67 67 65 72 32 20  ed4p-notrigger2 
1f70: 31 30 30 30 30 20 73 74 6d 74 20 24 73 63 72 69  10000 stmt $scri
1f80: 70 74 0a 0a 73 65 74 20 73 63 72 69 70 74 20 7b  pt..set script {
1f90: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 31  .  for {set ii 1
1fa0: 7d 20 7b 24 69 69 20 3c 20 32 30 30 30 30 7d 20  } {$ii < 20000} 
1fb0: 7b 69 6e 63 72 20 69 69 20 32 7d 20 7b 0a 20 20  {incr ii 2} {.  
1fc0: 20 20 64 62 20 65 76 61 6c 20 7b 44 45 4c 45 54    db eval {DELET
1fd0: 45 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  E FROM t4 WHERE 
1fe0: 72 6f 77 69 64 20 3d 20 24 69 69 7d 0a 20 20 7d  rowid = $ii}.  }
1ff0: 0a 7d 0a 65 78 70 6c 61 69 6e 20 7b 44 45 4c 45  .}.explain {DELE
2000: 54 45 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45  TE FROM t4 WHERE
2010: 20 72 6f 77 69 64 20 3d 20 24 69 69 7d 0a 73 70   rowid = $ii}.sp
2020: 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20 73 70  eed_trial_tcl sp
2030: 65 65 64 34 70 2d 6e 6f 74 72 69 67 67 65 72 33  eed4p-notrigger3
2040: 20 31 30 30 30 30 20 73 74 6d 74 20 24 73 63 72   10000 stmt $scr
2050: 69 70 74 0a 65 78 65 63 73 71 6c 20 7b 43 4f 4d  ipt.execsql {COM
2060: 4d 49 54 7d 0a 0a 73 70 65 65 64 5f 74 72 69 61  MIT}..speed_tria
2070: 6c 5f 73 75 6d 6d 61 72 79 20 73 70 65 65 64 34  l_summary speed4
2080: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.