/ Hex Artifact Content
Login

Artifact e8c421fd2c70c503b25cedb3f9617a1f387ac7ea:


0000: 23 0a 23 20 52 75 6e 20 74 68 69 73 20 54 63 6c  #.# Run this Tcl
0010: 20 73 63 72 69 70 74 20 74 6f 20 67 65 6e 65 72   script to gener
0020: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 2e 68  ate the sqlite.h
0030: 74 6d 6c 20 66 69 6c 65 2e 0a 23 0a 73 65 74 20  tml file..#.set 
0040: 72 63 73 69 64 20 7b 24 49 64 3a 20 6f 70 63 6f  rcsid {$Id: opco
0050: 64 65 2e 74 63 6c 2c 76 20 31 2e 31 33 20 32 30  de.tcl,v 1.13 20
0060: 30 34 2f 30 35 2f 33 31 20 31 35 3a 30 36 3a 33  04/05/31 15:06:3
0070: 30 20 64 72 68 20 45 78 70 20 24 7d 0a 73 6f 75  0 drh Exp $}.sou
0080: 72 63 65 20 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 68  rce common.tcl.h
0090: 65 61 64 65 72 20 7b 53 51 4c 69 74 65 20 56 69  eader {SQLite Vi
00a0: 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20 4f 70  rtual Machine Op
00b0: 63 6f 64 65 73 7d 0a 70 75 74 73 20 7b 0a 3c 68  codes}.puts {.<h
00c0: 32 3e 53 51 4c 69 74 65 20 56 69 72 74 75 61 6c  2>SQLite Virtual
00d0: 20 4d 61 63 68 69 6e 65 20 4f 70 63 6f 64 65 73   Machine Opcodes
00e0: 3c 2f 68 32 3e 0a 7d 0a 0a 73 65 74 20 66 64 20  </h2>.}..set fd 
00f0: 5b 6f 70 65 6e 20 5b 6c 69 6e 64 65 78 20 24 61  [open [lindex $a
0100: 72 67 76 20 30 5d 20 72 5d 0a 73 65 74 20 66 69  rgv 0] r].set fi
0110: 6c 65 20 5b 72 65 61 64 20 24 66 64 20 5b 66 69  le [read $fd [fi
0120: 6c 65 20 73 69 7a 65 20 5b 6c 69 6e 64 65 78 20  le size [lindex 
0130: 24 61 72 67 76 20 30 5d 5d 5d 0a 63 6c 6f 73 65  $argv 0]]].close
0140: 20 24 66 64 0a 73 65 74 20 63 75 72 72 65 6e 74   $fd.set current
0150: 5f 6f 70 20 7b 7d 0a 66 6f 72 65 61 63 68 20 6c  _op {}.foreach l
0160: 69 6e 65 20 5b 73 70 6c 69 74 20 24 66 69 6c 65  ine [split $file
0170: 20 5c 6e 5d 20 7b 0a 20 20 73 65 74 20 6c 69 6e   \n] {.  set lin
0180: 65 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  e [string trim $
0190: 6c 69 6e 65 5d 0a 20 20 69 66 20 7b 5b 73 74 72  line].  if {[str
01a0: 69 6e 67 20 69 6e 64 65 78 20 24 6c 69 6e 65 20  ing index $line 
01b0: 31 5d 21 3d 22 2a 22 7d 20 7b 0a 20 20 20 20 73  1]!="*"} {.    s
01c0: 65 74 20 63 75 72 72 65 6e 74 5f 6f 70 20 7b 7d  et current_op {}
01d0: 0a 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20  .    continue.  
01e0: 7d 0a 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20  }.  if {[regexp 
01f0: 7b 5e 2f 5c 2a 20 4f 70 63 6f 64 65 3a 20 7d 20  {^/\* Opcode: } 
0200: 24 6c 69 6e 65 5d 7d 20 7b 0a 20 20 20 20 73 65  $line]} {.    se
0210: 74 20 63 75 72 72 65 6e 74 5f 6f 70 20 5b 6c 69  t current_op [li
0220: 6e 64 65 78 20 24 6c 69 6e 65 20 32 5d 0a 20 20  ndex $line 2].  
0230: 20 20 73 65 74 20 4f 70 63 6f 64 65 28 24 63 75    set Opcode($cu
0240: 72 72 65 6e 74 5f 6f 70 3a 61 72 67 73 29 20 5b  rrent_op:args) [
0250: 6c 72 61 6e 67 65 20 24 6c 69 6e 65 20 33 20 65  lrange $line 3 e
0260: 6e 64 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  nd].    lappend 
0270: 4f 70 63 6f 64 65 4c 69 73 74 20 24 63 75 72 72  OpcodeList $curr
0280: 65 6e 74 5f 6f 70 0a 20 20 20 20 63 6f 6e 74 69  ent_op.    conti
0290: 6e 75 65 0a 20 20 7d 0a 20 20 69 66 20 7b 24 63  nue.  }.  if {$c
02a0: 75 72 72 65 6e 74 5f 6f 70 3d 3d 22 22 7d 20 63  urrent_op==""} c
02b0: 6f 6e 74 69 6e 75 65 0a 20 20 69 66 20 7b 5b 72  ontinue.  if {[r
02c0: 65 67 65 78 70 20 7b 5e 5c 2a 2f 7d 20 24 6c 69  egexp {^\*/} $li
02d0: 6e 65 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 63  ne]} {.    set c
02e0: 75 72 72 65 6e 74 5f 6f 70 20 7b 7d 0a 20 20 20  urrent_op {}.   
02f0: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 7d 0a 20 20   continue.  }.  
0300: 73 65 74 20 6c 69 6e 65 20 5b 73 74 72 69 6e 67  set line [string
0310: 20 74 72 69 6d 20 5b 73 74 72 69 6e 67 20 72 61   trim [string ra
0320: 6e 67 65 20 24 6c 69 6e 65 20 33 20 65 6e 64 5d  nge $line 3 end]
0330: 5d 0a 20 20 69 66 20 7b 24 6c 69 6e 65 3d 3d 22  ].  if {$line=="
0340: 22 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20  "} {.    append 
0350: 4f 70 63 6f 64 65 28 24 63 75 72 72 65 6e 74 5f  Opcode($current_
0360: 6f 70 3a 74 65 78 74 29 20 5c 6e 3c 70 3e 0a 20  op:text) \n<p>. 
0370: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 61 70   } else {.    ap
0380: 70 65 6e 64 20 4f 70 63 6f 64 65 28 24 63 75 72  pend Opcode($cur
0390: 72 65 6e 74 5f 6f 70 3a 74 65 78 74 29 20 5c 6e  rent_op:text) \n
03a0: 24 6c 69 6e 65 0a 20 20 7d 0a 7d 0a 75 6e 73 65  $line.  }.}.unse
03b0: 74 20 66 69 6c 65 0a 0a 70 75 74 73 20 7b 0a 3c  t file..puts {.<
03c0: 68 33 3e 49 6e 74 72 6f 64 75 63 74 69 6f 6e 3c  h3>Introduction<
03d0: 2f 68 33 3e 0a 0a 3c 70 3e 49 6e 20 6f 72 64 65  /h3>..<p>In orde
03e0: 72 20 74 6f 20 65 78 65 63 75 74 65 20 61 6e 20  r to execute an 
03f0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  SQL statement, t
0400: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
0410: 79 20 66 69 72 73 74 20 70 61 72 73 65 73 0a 74  y first parses.t
0420: 68 65 20 53 51 4c 2c 20 61 6e 61 6c 79 7a 65 73  he SQL, analyzes
0430: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
0440: 74 68 65 6e 20 67 65 6e 65 72 61 74 65 73 20 61  then generates a
0450: 20 73 68 6f 72 74 20 70 72 6f 67 72 61 6d 20 74   short program t
0460: 6f 20 65 78 65 63 75 74 65 0a 74 68 65 20 73 74  o execute.the st
0470: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 72  atement.  The pr
0480: 6f 67 72 61 6d 20 69 73 20 67 65 6e 65 72 61 74  ogram is generat
0490: 65 64 20 66 6f 72 20 61 20 22 76 69 72 74 75 61  ed for a "virtua
04a0: 6c 20 6d 61 63 68 69 6e 65 22 20 69 6d 70 6c 65  l machine" imple
04b0: 6d 65 6e 74 65 64 0a 62 79 20 74 68 65 20 53 51  mented.by the SQ
04c0: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54  Lite library.  T
04d0: 68 69 73 20 64 6f 63 75 6d 65 6e 74 20 64 65 73  his document des
04e0: 63 72 69 62 65 73 20 74 68 65 20 6f 70 65 72 61  cribes the opera
04f0: 74 69 6f 6e 20 6f 66 20 74 68 61 74 0a 76 69 72  tion of that.vir
0500: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 3c 2f 70  tual machine.</p
0510: 3e 0a 0a 3c 70 3e 54 68 69 73 20 64 6f 63 75 6d  >..<p>This docum
0520: 65 6e 74 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ent is intended 
0530: 61 73 20 61 20 72 65 66 65 72 65 6e 63 65 2c 20  as a reference, 
0540: 6e 6f 74 20 61 20 74 75 74 6f 72 69 61 6c 2e 0a  not a tutorial..
0550: 41 20 73 65 70 61 72 61 74 65 20 3c 61 20 68 72  A separate <a hr
0560: 65 66 3d 22 76 64 62 65 2e 68 74 6d 6c 22 3e 56  ef="vdbe.html">V
0570: 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20 54  irtual Machine T
0580: 75 74 6f 72 69 61 6c 3c 2f 61 3e 20 69 73 20 0a  utorial</a> is .
0590: 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79  available.  If y
05a0: 6f 75 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  ou are looking f
05b0: 6f 72 20 61 20 6e 61 72 72 61 74 69 76 65 20 64  or a narrative d
05c0: 65 73 63 72 69 70 74 69 6f 6e 0a 6f 66 20 68 6f  escription.of ho
05d0: 77 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  w the virtual ma
05e0: 63 68 69 6e 65 20 77 6f 72 6b 73 2c 20 79 6f 75  chine works, you
05f0: 20 73 68 6f 75 6c 64 20 72 65 61 64 20 74 68 65   should read the
0600: 20 74 75 74 6f 72 69 61 6c 0a 61 6e 64 20 6e 6f   tutorial.and no
0610: 74 20 74 68 69 73 20 64 6f 63 75 6d 65 6e 74 2e  t this document.
0620: 20 20 4f 6e 63 65 20 79 6f 75 20 68 61 76 65 20    Once you have 
0630: 61 20 62 61 73 69 63 20 69 64 65 61 20 6f 66 20  a basic idea of 
0640: 77 68 61 74 20 74 68 65 0a 76 69 72 74 75 61 6c  what the.virtual
0650: 20 6d 61 63 68 69 6e 65 20 64 6f 65 73 2c 20 79   machine does, y
0660: 6f 75 20 63 61 6e 20 72 65 66 65 72 20 62 61 63  ou can refer bac
0670: 6b 20 74 6f 20 74 68 69 73 20 64 6f 63 75 6d 65  k to this docume
0680: 6e 74 20 66 6f 72 0a 74 68 65 20 64 65 74 61 69  nt for.the detai
0690: 6c 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ls on a particul
06a0: 61 72 20 6f 70 63 6f 64 65 2e 0a 55 6e 66 6f 72  ar opcode..Unfor
06b0: 74 75 6e 61 74 65 6c 79 2c 20 74 68 65 20 76 69  tunately, the vi
06c0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 74 75  rtual machine tu
06d0: 74 6f 72 69 61 6c 20 77 61 73 20 77 72 69 74 74  torial was writt
06e0: 65 6e 20 66 6f 72 0a 53 51 4c 69 74 65 20 76 65  en for.SQLite ve
06f0: 72 73 69 6f 6e 20 31 2e 30 2e 20 20 54 68 65 72  rsion 1.0.  Ther
0700: 65 20 61 72 65 20 73 75 62 73 74 61 6e 74 69 61  e are substantia
0710: 6c 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  l changes in the
0720: 20 76 69 72 74 75 61 6c 0a 6d 61 63 68 69 6e 65   virtual.machine
0730: 20 66 6f 72 20 76 65 72 73 69 6f 6e 20 32 2e 30   for version 2.0
0740: 20 61 6e 64 20 74 68 65 20 64 6f 63 75 6d 65 6e   and the documen
0750: 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 75  t has not been u
0760: 70 64 61 74 65 64 2e 0a 3c 2f 70 3e 0a 0a 3c 70  pdated..</p>..<p
0770: 3e 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65  >The source code
0780: 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
0790: 6d 61 63 68 69 6e 65 20 69 73 20 69 6e 20 74 68  machine is in th
07a0: 65 20 3c 62 3e 76 64 62 65 2e 63 3c 2f 62 3e 20  e <b>vdbe.c</b> 
07b0: 73 6f 75 72 63 65 0a 66 69 6c 65 2e 20 20 41 6c  source.file.  Al
07c0: 6c 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  l of the opcode 
07d0: 64 65 66 69 6e 69 74 69 6f 6e 73 20 66 75 72 74  definitions furt
07e0: 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 69 73  her down in this
07f0: 20 64 6f 63 75 6d 65 6e 74 20 61 72 65 0a 63 6f   document are.co
0800: 6e 74 61 69 6e 65 64 20 69 6e 20 63 6f 6d 6d 65  ntained in comme
0810: 6e 74 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  nts in the sourc
0820: 65 20 66 69 6c 65 2e 20 20 49 6e 20 66 61 63 74  e file.  In fact
0830: 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 74 61 62  , the opcode tab
0840: 6c 65 0a 69 6e 20 74 68 69 73 20 64 6f 63 75 6d  le.in this docum
0850: 65 6e 74 0a 77 61 73 20 67 65 6e 65 72 61 74 65  ent.was generate
0860: 64 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68  d by scanning th
0870: 65 20 3c 62 3e 76 64 62 65 2e 63 3c 2f 62 3e 20  e <b>vdbe.c</b> 
0880: 73 6f 75 72 63 65 20 66 69 6c 65 20 0a 61 6e 64  source file .and
0890: 20 65 78 74 72 61 63 74 69 6e 67 20 74 68 65 20   extracting the 
08a0: 6e 65 63 65 73 73 61 72 79 20 69 6e 66 6f 72 6d  necessary inform
08b0: 61 74 69 6f 6e 20 66 72 6f 6d 20 63 6f 6d 6d 65  ation from comme
08c0: 6e 74 73 2e 20 20 53 6f 20 74 68 65 20 0a 73 6f  nts.  So the .so
08d0: 75 72 63 65 20 63 6f 64 65 20 63 6f 6d 6d 65 6e  urce code commen
08e0: 74 73 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68  ts are really th
08f0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 73 6f 75 72  e canonical sour
0900: 63 65 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f  ce of informatio
0910: 6e 0a 61 62 6f 75 74 20 74 68 65 20 76 69 72 74  n.about the virt
0920: 75 61 6c 20 6d 61 63 63 68 69 6e 65 2e 20 20 57  ual macchine.  W
0930: 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
0940: 66 65 72 20 74 6f 20 74 68 65 20 73 6f 75 72 63  fer to the sourc
0950: 65 20 63 6f 64 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e  e code.</p>..<p>
0960: 45 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  Each instruction
0970: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
0980: 6d 61 63 68 69 6e 65 20 63 6f 6e 73 69 73 74 73  machine consists
0990: 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 61 6e   of an opcode an
09a0: 64 0a 75 70 20 74 6f 20 74 68 72 65 65 20 6f 70  d.up to three op
09b0: 65 72 61 6e 64 73 20 6e 61 6d 65 64 20 50 31 2c  erands named P1,
09c0: 20 50 32 20 61 6e 64 20 50 33 2e 20 20 50 31 20   P2 and P3.  P1 
09d0: 6d 61 79 20 62 65 20 61 6e 20 61 72 62 69 74 72  may be an arbitr
09e0: 61 72 79 0a 69 6e 74 65 67 65 72 2e 20 20 50 32  ary.integer.  P2
09f0: 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e   must be a non-n
0a00: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e  egative integer.
0a10: 20 20 50 32 20 69 73 20 61 6c 77 61 79 73 20 74    P2 is always t
0a20: 68 65 0a 6a 75 6d 70 20 64 65 73 74 69 6e 61 74  he.jump destinat
0a30: 69 6f 6e 20 69 6e 20 61 6e 79 20 6f 70 65 72 61  ion in any opera
0a40: 74 69 6f 6e 20 74 68 61 74 20 6d 69 67 68 74 20  tion that might 
0a50: 63 61 75 73 65 20 61 20 6a 75 6d 70 2e 0a 50 33  cause a jump..P3
0a60: 20 69 73 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69   is a null-termi
0a70: 6e 61 74 65 64 0a 73 74 72 69 6e 67 20 6f 72 20  nated.string or 
0a80: 4e 55 4c 4c 2e 20 20 53 6f 6d 65 20 6f 70 65 72  NULL.  Some oper
0a90: 61 74 6f 72 73 20 75 73 65 20 61 6c 6c 20 74 68  ators use all th
0aa0: 72 65 65 20 6f 70 65 72 61 6e 64 73 2e 20 20 53  ree operands.  S
0ab0: 6f 6d 65 20 75 73 65 0a 6f 6e 65 20 6f 72 20 74  ome use.one or t
0ac0: 77 6f 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74  wo.  Some operat
0ad0: 6f 72 73 20 75 73 65 20 6e 6f 6e 65 20 6f 66 20  ors use none of 
0ae0: 74 68 65 20 6f 70 65 72 61 6e 64 73 2e 3c 70 3e  the operands.<p>
0af0: 0a 0a 3c 70 3e 54 68 65 20 76 69 72 74 75 61 6c  ..<p>The virtual
0b00: 20 6d 61 63 68 69 6e 65 20 62 65 67 69 6e 73 20   machine begins 
0b10: 65 78 65 63 75 74 69 6f 6e 20 6f 6e 20 69 6e 73  execution on ins
0b20: 74 72 75 63 74 69 6f 6e 20 6e 75 6d 62 65 72 20  truction number 
0b30: 30 2e 0a 45 78 65 63 75 74 69 6f 6e 20 63 6f 6e  0..Execution con
0b40: 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 28 31 29  tinues until (1)
0b50: 20 61 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74   a Halt instruct
0b60: 69 6f 6e 20 69 73 20 73 65 65 6e 2c 20 6f 72 20  ion is seen, or 
0b70: 0a 28 32 29 20 74 68 65 20 70 72 6f 67 72 61 6d  .(2) the program
0b80: 20 63 6f 75 6e 74 65 72 20 62 65 63 6f 6d 65 73   counter becomes
0b90: 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
0ba0: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
0bb0: 0a 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f  .last instructio
0bc0: 6e 2c 20 6f 72 20 28 33 29 20 74 68 65 72 65 20  n, or (3) there 
0bd0: 69 73 20 61 6e 20 65 78 65 63 75 74 69 6f 6e 20  is an execution 
0be0: 65 72 72 6f 72 2e 0a 57 68 65 6e 20 74 68 65 20  error..When the 
0bf0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
0c00: 68 61 6c 74 73 2c 20 61 6c 6c 20 6d 65 6d 6f 72  halts, all memor
0c10: 79 0a 74 68 61 74 20 69 74 20 61 6c 6c 6f 63 61  y.that it alloca
0c20: 74 65 64 20 69 73 20 72 65 6c 65 61 73 65 64 20  ted is released 
0c30: 61 6e 64 20 61 6c 6c 20 64 61 74 61 62 61 73 65  and all database
0c40: 20 63 75 72 73 6f 72 73 20 69 74 20 6d 61 79 0a   cursors it may.
0c50: 68 61 76 65 20 68 61 64 20 6f 70 65 6e 20 61 72  have had open ar
0c60: 65 20 63 6c 6f 73 65 64 2e 20 20 49 66 20 74 68  e closed.  If th
0c70: 65 20 65 78 65 63 75 74 69 6f 6e 20 73 74 6f 70  e execution stop
0c80: 70 65 64 20 64 75 65 20 74 6f 20 61 6e 0a 65 72  ped due to an.er
0c90: 72 6f 72 2c 20 61 6e 79 20 70 65 6e 64 69 6e 67  ror, any pending
0ca0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
0cb0: 65 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  e terminated and
0cc0: 20 63 68 61 6e 67 65 73 20 6d 61 64 65 0a 74 6f   changes made.to
0cd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72   the database ar
0ce0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 3c 2f  e rolled back.</
0cf0: 70 3e 0a 0a 3c 70 3e 54 68 65 20 76 69 72 74 75  p>..<p>The virtu
0d00: 61 6c 20 6d 61 63 68 69 6e 65 20 61 6c 73 6f 20  al machine also 
0d10: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 6f 70 65 72  contains an oper
0d20: 61 6e 64 20 73 74 61 63 6b 20 6f 66 20 75 6e 6c  and stack of unl
0d30: 69 6d 69 74 65 64 0a 64 65 70 74 68 2e 20 20 4d  imited.depth.  M
0d40: 61 6e 79 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  any of the opcod
0d50: 65 73 20 75 73 65 20 6f 70 65 72 61 6e 64 73 20  es use operands 
0d60: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
0d70: 20 53 65 65 20 74 68 65 0a 69 6e 64 69 76 69 64   See the.individ
0d80: 75 61 6c 20 6f 70 63 6f 64 65 20 64 65 73 63 72  ual opcode descr
0d90: 69 70 74 69 6f 6e 73 20 66 6f 72 20 64 65 74 61  iptions for deta
0da0: 69 6c 73 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65  ils.</p>..<p>The
0db0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
0dc0: 20 63 61 6e 20 68 61 76 65 20 7a 65 72 6f 20 6f   can have zero o
0dd0: 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 2e 20  r more cursors. 
0de0: 20 45 61 63 68 20 63 75 72 73 6f 72 0a 69 73 20   Each cursor.is 
0df0: 61 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 61  a pointer into a
0e00: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 72   single table or
0e10: 20 69 6e 64 65 78 20 77 69 74 68 69 6e 20 74 68   index within th
0e20: 65 20 64 61 74 61 62 61 73 65 2e 0a 54 68 65 72  e database..Ther
0e30: 65 20 63 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c  e can be multipl
0e40: 65 20 63 75 72 73 6f 72 73 20 70 6f 69 6e 74 69  e cursors pointi
0e50: 6e 67 20 61 74 20 74 68 65 20 73 61 6d 65 20 69  ng at the same i
0e60: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 2e 0a 41  ndex or table..A
0e70: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 72 61  ll cursors opera
0e80: 74 65 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  te independently
0e90: 2c 20 65 76 65 6e 20 63 75 72 73 6f 72 73 20 70  , even cursors p
0ea0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 73  ointing to the s
0eb0: 61 6d 65 0a 69 6e 64 69 63 65 73 20 6f 72 20 74  ame.indices or t
0ec0: 61 62 6c 65 73 2e 0a 54 68 65 20 6f 6e 6c 79 20  ables..The only 
0ed0: 77 61 79 20 66 6f 72 20 74 68 65 20 76 69 72 74  way for the virt
0ee0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 74 6f 20 69  ual machine to i
0ef0: 6e 74 65 72 61 63 74 20 77 69 74 68 20 61 20 64  nteract with a d
0f00: 61 74 61 62 61 73 65 0a 66 69 6c 65 20 69 73 20  atabase.file is 
0f10: 74 68 72 6f 75 67 68 20 61 20 63 75 72 73 6f 72  through a cursor
0f20: 2e 0a 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  ..Instructions i
0f30: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 0a 6d 61  n the virtual.ma
0f40: 63 68 69 6e 65 20 63 61 6e 20 63 72 65 61 74 65  chine can create
0f50: 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 28 4f   a new cursor (O
0f60: 70 65 6e 29 2c 20 72 65 61 64 20 64 61 74 61 20  pen), read data 
0f70: 66 72 6f 6d 20 61 20 63 75 72 73 6f 72 0a 28 43  from a cursor.(C
0f80: 6f 6c 75 6d 6e 29 2c 20 61 64 76 61 6e 63 65 20  olumn), advance 
0f90: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
0fa0: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
0fb0: 74 68 65 20 74 61 62 6c 65 0a 28 4e 65 78 74 29  the table.(Next)
0fc0: 20 6f 72 20 69 6e 64 65 78 20 28 4e 65 78 74 49   or index (NextI
0fd0: 64 78 29 2c 20 61 6e 64 20 6d 61 6e 79 20 6f 74  dx), and many ot
0fe0: 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  her operations..
0ff0: 41 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  All cursors are 
1000: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 63 6c  automatically.cl
1010: 6f 73 65 64 20 77 68 65 6e 20 74 68 65 20 76 69  osed when the vi
1020: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 74 65  rtual machine te
1030: 72 6d 69 6e 61 74 65 73 2e 3c 2f 70 3e 0a 0a 3c  rminates.</p>..<
1040: 70 3e 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  p>The virtual ma
1050: 63 68 69 6e 65 20 63 6f 6e 74 61 69 6e 73 20 61  chine contains a
1060: 6e 20 61 72 62 69 74 72 61 72 79 20 6e 75 6d 62  n arbitrary numb
1070: 65 72 20 6f 66 20 66 69 78 65 64 20 6d 65 6d 6f  er of fixed memo
1080: 72 79 0a 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74  ry.locations wit
1090: 68 20 61 64 64 72 65 73 73 65 73 20 62 65 67 69  h addresses begi
10a0: 6e 6e 69 6e 67 20 61 74 20 7a 65 72 6f 20 61 6e  nning at zero an
10b0: 64 20 67 72 6f 77 69 6e 67 20 75 70 77 61 72 64  d growing upward
10c0: 2e 0a 45 61 63 68 20 6d 65 6d 6f 72 79 20 6c 6f  ..Each memory lo
10d0: 63 61 74 69 6f 6e 20 63 61 6e 20 68 6f 6c 64 20  cation can hold 
10e0: 61 6e 20 61 72 62 69 74 72 61 72 79 20 73 74 72  an arbitrary str
10f0: 69 6e 67 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ing.  The memory
1100: 0a 63 65 6c 6c 73 20 61 72 65 20 74 79 70 69 63  .cells are typic
1110: 61 6c 6c 79 20 75 73 65 64 20 74 6f 20 68 6f 6c  ally used to hol
1120: 64 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  d the result of 
1130: 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 0a  a scalar SELECT.
1140: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
1150: 61 20 6c 61 72 67 65 72 20 65 78 70 72 65 73 73  a larger express
1160: 69 6f 6e 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65  ion.</p>..<p>The
1170: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
1180: 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
1190: 6c 65 20 73 6f 72 74 65 72 2e 0a 54 68 65 20 73  le sorter..The s
11a0: 6f 72 74 65 72 20 69 73 20 61 62 6c 65 20 74 6f  orter is able to
11b0: 20 61 63 63 75 6d 75 6c 61 74 65 20 72 65 63 6f   accumulate reco
11c0: 72 64 73 2c 20 73 6f 72 74 20 74 68 6f 73 65 20  rds, sort those 
11d0: 72 65 63 6f 72 64 73 2c 0a 74 68 65 6e 20 70 6c  records,.then pl
11e0: 61 79 20 74 68 65 20 72 65 63 6f 72 64 73 20 62  ay the records b
11f0: 61 63 6b 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  ack in sorted or
1200: 64 65 72 2e 20 20 54 68 65 20 73 6f 72 74 65 72  der.  The sorter
1210: 20 69 73 20 75 73 65 64 0a 74 6f 20 69 6d 70 6c   is used.to impl
1220: 65 6d 65 6e 74 20 74 68 65 20 4f 52 44 45 52 20  ement the ORDER 
1230: 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  BY clause of a S
1240: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1250: 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65 20 76 69 72  </p>..<p>The vir
1260: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 63 6f 6e  tual machine con
1270: 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 22  tains a single "
1280: 4c 69 73 74 22 2e 0a 54 68 65 20 6c 69 73 74 20  List"..The list 
1290: 73 74 6f 72 65 73 20 61 20 6c 69 73 74 20 6f 66  stores a list of
12a0: 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68 65 20   integers.  The 
12b0: 6c 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20  list is used to 
12c0: 68 6f 6c 64 20 74 68 65 0a 72 6f 77 69 64 73 20  hold the.rowids 
12d0: 66 6f 72 20 72 65 63 6f 72 64 73 20 6f 66 20 61  for records of a
12e0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
12f0: 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
1300: 20 6d 6f 64 69 66 69 65 64 2e 0a 54 68 65 20 57   modified..The W
1310: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 61  HERE clause of a
1320: 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
1330: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 73 63 61  TE statement sca
1340: 6e 73 20 74 68 72 6f 75 67 68 0a 74 68 65 20 74  ns through.the t
1350: 61 62 6c 65 20 61 6e 64 20 77 72 69 74 65 73 20  able and writes 
1360: 74 68 65 20 72 6f 77 69 64 20 6f 66 20 65 76 65  the rowid of eve
1370: 72 79 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20  ry record to be 
1380: 6d 6f 64 69 66 69 65 64 0a 69 6e 74 6f 20 74 68  modified.into th
1390: 65 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74 68  e list.  Then th
13a0: 65 20 6c 69 73 74 20 69 73 20 70 6c 61 79 65 64  e list is played
13b0: 20 62 61 63 6b 20 61 6e 64 20 74 68 65 20 74 61   back and the ta
13c0: 62 6c 65 20 69 73 20 6d 6f 64 69 66 69 65 64 0a  ble is modified.
13d0: 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 73 74  in a separate st
13e0: 65 70 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65 20  ep.</p>..<p>The 
13f0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
1400: 63 61 6e 20 63 6f 6e 74 61 69 6e 20 61 6e 20 61  can contain an a
1410: 72 62 69 74 72 61 72 79 20 6e 75 6d 62 65 72 20  rbitrary number 
1420: 6f 66 20 22 53 65 74 73 22 2e 0a 45 61 63 68 20  of "Sets"..Each 
1430: 73 65 74 20 68 6f 6c 64 73 20 61 6e 20 61 72 62  set holds an arb
1440: 69 74 72 61 72 79 20 6e 75 6d 62 65 72 20 6f 66  itrary number of
1450: 20 73 74 72 69 6e 67 73 2e 20 20 53 65 74 73 20   strings.  Sets 
1460: 61 72 65 20 75 73 65 64 20 74 6f 0a 69 6d 70 6c  are used to.impl
1470: 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65  ement the IN ope
1480: 72 61 74 6f 72 20 77 69 74 68 20 61 20 63 6f 6e  rator with a con
1490: 73 74 61 6e 74 20 72 69 67 68 74 2d 68 61 6e 64  stant right-hand
14a0: 20 73 69 64 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54   side.</p>..<p>T
14b0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
14c0: 6e 65 20 63 61 6e 20 6f 70 65 6e 20 61 20 73 69  ne can open a si
14d0: 6e 67 6c 65 20 65 78 74 65 72 6e 61 6c 20 66 69  ngle external fi
14e0: 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
14f0: 54 68 69 73 20 65 78 74 65 72 6e 61 6c 20 72 65  This external re
1500: 61 64 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  ad file is used 
1510: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
1520: 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 2e 3c 2f   COPY command.</
1530: 70 3e 0a 0a 3c 70 3e 46 69 6e 61 6c 6c 79 2c 20  p>..<p>Finally, 
1540: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
1550: 69 6e 65 20 63 61 6e 20 68 61 76 65 20 61 20 73  ine can have a s
1560: 69 6e 67 6c 65 20 73 65 74 20 6f 66 20 61 67 67  ingle set of agg
1570: 72 65 67 61 74 6f 72 73 2e 0a 41 6e 20 61 67 67  regators..An agg
1580: 72 65 67 61 74 6f 72 20 69 73 20 61 20 64 65 76  regator is a dev
1590: 69 63 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ice used to impl
15a0: 65 6d 65 6e 74 20 74 68 65 20 47 52 4f 55 50 20  ement the GROUP 
15b0: 42 59 20 63 6c 61 75 73 65 0a 6f 66 20 61 20 53  BY clause.of a S
15c0: 45 4c 45 43 54 2e 20 20 41 6e 20 61 67 67 72 65  ELECT.  An aggre
15d0: 67 61 74 6f 72 20 68 61 73 20 6f 6e 65 20 6f 72  gator has one or
15e0: 20 6d 6f 72 65 20 73 6c 6f 74 73 20 74 68 61 74   more slots that
15f0: 20 63 61 6e 20 68 6f 6c 64 0a 76 61 6c 75 65 73   can hold.values
1600: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
1610: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 2e 20   by the select. 
1620: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   The number of s
1630: 6c 6f 74 73 20 69 73 20 74 68 65 0a 73 61 6d 65  lots is the.same
1640: 20 66 6f 72 20 61 6c 6c 20 61 67 67 72 65 67 61   for all aggrega
1650: 74 6f 72 73 20 61 6e 64 20 69 73 20 64 65 66 69  tors and is defi
1660: 6e 65 64 20 62 79 20 74 68 65 20 41 67 67 52 65  ned by the AggRe
1670: 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 41  set operation..A
1680: 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74  t any point in t
1690: 69 6d 65 20 61 20 73 69 6e 67 6c 65 20 61 67 67  ime a single agg
16a0: 72 65 67 61 74 6f 72 20 69 73 20 63 75 72 72 65  regator is curre
16b0: 6e 74 20 6f 72 20 22 68 61 73 20 66 6f 63 75 73  nt or "has focus
16c0: 22 2e 0a 54 68 65 72 65 20 61 72 65 20 6f 70 65  "..There are ope
16d0: 72 61 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20  rations to read 
16e0: 6f 72 20 77 72 69 74 65 20 74 6f 20 6d 65 6d 6f  or write to memo
16f0: 72 79 20 73 6c 6f 74 73 20 6f 66 20 74 68 65 20  ry slots of the 
1700: 61 67 67 72 65 67 61 74 6f 72 0a 69 6e 20 66 6f  aggregator.in fo
1710: 63 75 73 2e 20 20 54 68 65 72 65 20 61 72 65 20  cus.  There are 
1720: 61 6c 73 6f 20 6f 70 65 72 61 74 69 6f 6e 73 20  also operations 
1730: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 66 6f  to change the fo
1740: 63 75 73 20 61 67 67 72 65 67 61 74 6f 72 0a 61  cus aggregator.a
1750: 6e 64 20 74 6f 20 73 63 61 6e 20 74 68 72 6f 75  nd to scan throu
1760: 67 68 20 61 6c 6c 20 61 67 67 72 65 67 61 74 6f  gh all aggregato
1770: 72 73 2e 3c 2f 70 3e 0a 0a 3c 68 33 3e 56 69 65  rs.</p>..<h3>Vie
1780: 77 69 6e 67 20 50 72 6f 67 72 61 6d 73 20 47 65  wing Programs Ge
1790: 6e 65 72 61 74 65 64 20 42 79 20 53 51 4c 69 74  nerated By SQLit
17a0: 65 3c 2f 68 33 3e 0a 0a 3c 70 3e 45 76 65 72 79  e</h3>..<p>Every
17b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
17c0: 68 61 74 20 53 51 4c 69 74 65 20 69 6e 74 65 72  hat SQLite inter
17d0: 70 72 65 74 73 20 72 65 73 75 6c 74 73 20 69 6e  prets results in
17e0: 20 61 20 70 72 6f 67 72 61 6d 0a 66 6f 72 20 74   a program.for t
17f0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
1800: 6e 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  ne.  But if you 
1810: 70 72 65 63 65 64 65 20 74 68 65 20 53 51 4c 20  precede the SQL 
1820: 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 0a 74  statement with.t
1830: 68 65 20 6b 65 79 77 6f 72 64 20 22 45 58 50 4c  he keyword "EXPL
1840: 41 49 4e 22 20 74 68 65 20 76 69 72 74 75 61 6c  AIN" the virtual
1850: 20 6d 61 63 68 69 6e 65 20 77 69 6c 6c 20 6e 6f   machine will no
1860: 74 20 65 78 65 63 75 74 65 20 74 68 65 0a 70 72  t execute the.pr
1870: 6f 67 72 61 6d 2e 20 20 49 6e 73 74 65 61 64 2c  ogram.  Instead,
1880: 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1890: 73 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  s of the program
18a0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
18b0: 64 0a 6c 69 6b 65 20 61 20 71 75 65 72 79 20 72  d.like a query r
18c0: 65 73 75 6c 74 2e 20 20 54 68 69 73 20 66 65 61  esult.  This fea
18d0: 74 75 72 65 20 69 73 20 75 73 65 66 75 6c 20 66  ture is useful f
18e0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 6e 64  or debugging and
18f0: 0a 66 6f 72 20 6c 65 61 72 6e 69 6e 67 20 68 6f  .for learning ho
1900: 77 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  w the virtual ma
1910: 63 68 69 6e 65 20 6f 70 65 72 61 74 65 73 2e 3c  chine operates.<
1920: 2f 70 3e 0a 0a 3c 70 3e 59 6f 75 20 63 61 6e 20  /p>..<p>You can 
1930: 75 73 65 20 74 68 65 20 3c 62 3e 73 71 6c 69 74  use the <b>sqlit
1940: 65 3c 2f 62 3e 20 63 6f 6d 6d 61 6e 64 2d 6c 69  e</b> command-li
1950: 6e 65 20 74 6f 6f 6c 20 74 6f 20 73 65 65 20 74  ne tool to see t
1960: 68 65 0a 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  he.instructions 
1970: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
1980: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
1990: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
19a0: 0a 61 6e 20 65 78 61 6d 70 6c 65 3a 3c 2f 70 3e  .an example:</p>
19b0: 7d 0a 0a 70 72 6f 63 20 43 6f 64 65 20 7b 62 6f  }..proc Code {bo
19c0: 64 79 7d 20 7b 0a 20 20 70 75 74 73 20 7b 3c 62  dy} {.  puts {<b
19d0: 6c 6f 63 6b 71 75 6f 74 65 3e 3c 74 74 3e 7d 0a  lockquote><tt>}.
19e0: 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 26    regsub -all {&
19f0: 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  } [string trim $
1a00: 62 6f 64 79 5d 20 7b 5c 26 61 6d 70 3b 7d 20 62  body] {\&amp;} b
1a10: 6f 64 79 0a 20 20 72 65 67 73 75 62 20 2d 61 6c  ody.  regsub -al
1a20: 6c 20 7b 3e 7d 20 24 62 6f 64 79 20 7b 5c 26 67  l {>} $body {\&g
1a30: 74 3b 7d 20 62 6f 64 79 0a 20 20 72 65 67 73 75  t;} body.  regsu
1a40: 62 20 2d 61 6c 6c 20 7b 3c 7d 20 24 62 6f 64 79  b -all {<} $body
1a50: 20 7b 5c 26 6c 74 3b 7d 20 62 6f 64 79 0a 20 20   {\&lt;} body.  
1a60: 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5c 28 5c  regsub -all {\(\
1a70: 28 5c 28 7d 20 24 62 6f 64 79 20 7b 3c 62 3e 7d  (\(} $body {<b>}
1a80: 20 62 6f 64 79 0a 20 20 72 65 67 73 75 62 20 2d   body.  regsub -
1a90: 61 6c 6c 20 7b 5c 29 5c 29 5c 29 7d 20 24 62 6f  all {\)\)\)} $bo
1aa0: 64 79 20 7b 3c 2f 62 3e 7d 20 62 6f 64 79 0a 20  dy {</b>} body. 
1ab0: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 20 7d   regsub -all { }
1ac0: 20 24 62 6f 64 79 20 7b 5c 26 6e 62 73 70 3b 7d   $body {\&nbsp;}
1ad0: 20 62 6f 64 79 0a 20 20 72 65 67 73 75 62 20 2d   body.  regsub -
1ae0: 61 6c 6c 20 5c 6e 20 24 62 6f 64 79 20 3c 62 72  all \n $body <br
1af0: 3e 5c 6e 20 62 6f 64 79 0a 20 20 70 75 74 73 20  >\n body.  puts 
1b00: 24 62 6f 64 79 0a 20 20 70 75 74 73 20 7b 3c 2f  $body.  puts {</
1b10: 74 74 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e  tt></blockquote>
1b20: 7d 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 24 20 28 28  }.}..Code {.$ ((
1b30: 28 73 71 6c 69 74 65 20 65 78 31 29 29 29 0a 73  (sqlite ex1))).s
1b40: 71 6c 69 74 65 3e 20 28 28 28 2e 65 78 70 6c 61  qlite> (((.expla
1b50: 69 6e 29 29 29 0a 73 71 6c 69 74 65 3e 20 28 28  in))).sqlite> ((
1b60: 28 65 78 70 6c 61 69 6e 20 64 65 6c 65 74 65 20  (explain delete 
1b70: 66 72 6f 6d 20 74 62 6c 31 20 77 68 65 72 65 20  from tbl1 where 
1b80: 74 77 6f 3c 32 30 3b 29 29 29 0a 61 64 64 72 20  two<20;))).addr 
1b90: 20 6f 70 63 6f 64 65 20 20 20 20 20 20 20 20 70   opcode        p
1ba0: 31 20 20 20 20 20 70 32 20 20 20 20 20 70 33 20  1     p2     p3 
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d       .----  ----
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20  --------  ----- 
1bf0: 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d   -----  --------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c20: 0a 30 20 20 20 20 20 54 72 61 6e 73 61 63 74 69  .0     Transacti
1c30: 6f 6e 20 20 20 30 20 20 20 20 20 20 30 20 20 20  on   0      0   
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 20 20 20 20 20 20 20 20 0a 31 20 20 20             .1   
1c70: 20 20 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 20    VerifyCookie  
1c80: 32 31 39 20 20 20 20 30 20 20 20 20 20 20 20 20  219    0        
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 20 20 20 0a 32 20 20 20 20 20 4c 69 73        .2     Lis
1cc0: 74 4f 70 65 6e 20 20 20 20 20 20 30 20 20 20 20  tOpen      0    
1cd0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 0a 33 20 20 20 20 20 4f 70 65 6e 20 20 20 20   .3     Open    
1d10: 20 20 20 20 20 20 30 20 20 20 20 20 20 33 20 20        0      3  
1d20: 20 20 20 20 74 62 6c 31 20 20 20 20 20 20 20 20      tbl1        
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 0a 34 20 20              .4  
1d50: 20 20 20 52 65 77 69 6e 64 20 20 20 20 20 20 20     Rewind       
1d60: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 0a 35 20 20 20 20 20 4e 65         .5     Ne
1da0: 78 74 20 20 20 20 20 20 20 20 20 20 30 20 20 20  xt          0   
1db0: 20 20 20 31 32 20 20 20 20 20 20 20 20 20 20 20     12           
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 0a 36 20 20 20 20 20 43 6f 6c 75 6d 6e 20    .6     Column 
1df0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31 20         0      1 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 37 20               .7 
1e30: 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20      Integer     
1e40: 20 20 32 30 20 20 20 20 20 30 20 20 20 20 20 20    20     0      
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 20 20 0a 38 20 20 20 20 20 47          .8     G
1e80: 65 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20  e            0  
1e90: 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 0a 39 20 20 20 20 20 52 65 63 6e 6f 20     .9     Recno 
1ed0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30          0      0
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
1f10: 30 20 20 20 20 4c 69 73 74 57 72 69 74 65 20 20  0    ListWrite  
1f20: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 20 20 20 20 20 20 20 20 0a 31 31 20 20 20 20           .11    
1f60: 47 6f 74 6f 20 20 20 20 20 20 20 20 20 20 30 20  Goto          0 
1f70: 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 20 20 20 0a 31 32 20 20 20 20 43 6c 6f 73 65      .12    Close
1fb0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
1fc0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
1ff0: 31 33 20 20 20 20 4c 69 73 74 52 65 77 69 6e 64  13    ListRewind
2000: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 20 20 20 20 20 20 20 0a 31 34 20 20 20            .14   
2040: 20 4f 70 65 6e 57 72 69 74 65 20 20 20 20 20 30   OpenWrite     0
2050: 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 20 0a 31 35 20 20 20 20 4c 69 73 74       .15    List
2090: 52 65 61 64 20 20 20 20 20 20 30 20 20 20 20 20  Read      0     
20a0: 20 31 39 20 20 20 20 20 20 20 20 20 20 20 20 20   19             
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 0a 31 36 20 20 20 20 4d 6f 76 65 54 6f 20 20 20  .16    MoveTo   
20e0: 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20       0      0   
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 20 20 20 20 20 20 20 0a 31 37 20 20             .17  
2120: 20 20 44 65 6c 65 74 65 20 20 20 20 20 20 20 20    Delete        
2130: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 0a 31 38 20 20 20 20 47 6f 74        .18    Got
2170: 6f 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20  o          0    
2180: 20 20 31 35 20 20 20 20 20 20 20 20 20 20 20 20    15            
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 0a 31 39 20 20 20 20 4c 69 73 74 43 6c 6f 73   .19    ListClos
21c0: 65 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20  e     0      0  
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 30 20              .20 
2200: 20 20 20 43 6f 6d 6d 69 74 20 20 20 20 20 20 20     Commit       
2210: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 20 20 0a 7d 0a 0a 70 75 74 73 20         .}..puts 
2250: 7b 0a 3c 70 3e 41 6c 6c 20 79 6f 75 20 68 61 76  {.<p>All you hav
2260: 65 20 74 6f 20 64 6f 20 69 73 20 61 64 64 20 74  e to do is add t
2270: 68 65 20 22 45 58 50 4c 41 49 4e 22 20 6b 65 79  he "EXPLAIN" key
2280: 77 6f 72 64 20 74 6f 20 74 68 65 20 66 72 6f 6e  word to the fron
2290: 74 20 6f 66 20 74 68 65 0a 53 51 4c 20 73 74 61  t of the.SQL sta
22a0: 74 65 6d 65 6e 74 2e 20 20 42 75 74 20 69 66 20  tement.  But if 
22b0: 79 6f 75 20 75 73 65 20 74 68 65 20 22 2e 65 78  you use the ".ex
22c0: 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64 20 74  plain" command t
22d0: 6f 20 3c 62 3e 73 71 6c 69 74 65 3c 2f 62 3e 0a  o <b>sqlite</b>.
22e0: 66 69 72 73 74 2c 20 69 74 20 77 69 6c 6c 20 73  first, it will s
22f0: 65 74 20 75 70 20 74 68 65 20 6f 75 74 70 75 74  et up the output
2300: 20 6d 6f 64 65 20 74 6f 20 6d 61 6b 65 20 74 68   mode to make th
2310: 65 20 70 72 6f 67 72 61 6d 20 6d 6f 72 65 20 65  e program more e
2320: 61 73 69 6c 79 0a 76 69 65 77 61 62 6c 65 2e 3c  asily.viewable.<
2330: 2f 70 3e 0a 0a 3c 70 3e 49 66 20 3c 62 3e 73 71  /p>..<p>If <b>sq
2340: 6c 69 74 65 3c 2f 62 3e 20 68 61 73 20 62 65 65  lite</b> has bee
2350: 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 6f  n compiled witho
2360: 75 74 20 74 68 65 20 22 2d 44 4e 44 45 42 55 47  ut the "-DNDEBUG
2370: 3d 31 22 20 6f 70 74 69 6f 6e 0a 28 74 68 61 74  =1" option.(that
2380: 20 69 73 2c 20 77 69 74 68 20 74 68 65 20 4e 44   is, with the ND
2390: 45 42 55 47 20 70 72 65 70 72 6f 63 65 73 73 6f  EBUG preprocesso
23a0: 72 20 6d 61 63 72 6f 20 6e 6f 74 20 64 65 66 69  r macro not defi
23b0: 6e 65 64 29 20 74 68 65 6e 20 79 6f 75 0a 63 61  ned) then you.ca
23c0: 6e 20 70 75 74 20 74 68 65 20 53 51 4c 69 74 65  n put the SQLite
23d0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
23e0: 20 69 6e 20 61 20 6d 6f 64 65 20 77 68 65 72 65   in a mode where
23f0: 20 69 74 20 77 69 6c 6c 20 74 72 61 63 65 20 69   it will trace i
2400: 74 73 0a 65 78 65 63 75 74 69 6f 6e 20 62 79 20  ts.execution by 
2410: 77 72 69 74 69 6e 67 20 6d 65 73 73 61 67 65 73  writing messages
2420: 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74   to standard out
2430: 70 75 74 2e 20 20 54 68 65 20 6e 6f 6e 2d 73 74  put.  The non-st
2440: 61 6e 64 61 72 64 0a 53 51 4c 20 22 50 52 41 47  andard.SQL "PRAG
2450: 4d 41 22 20 63 6f 6d 6d 65 6e 74 73 20 63 61 6e  MA" comments can
2460: 20 62 65 20 75 73 65 64 20 74 6f 20 74 75 72 6e   be used to turn
2470: 20 74 72 61 63 69 6e 67 20 6f 6e 20 61 6e 64 20   tracing on and 
2480: 6f 66 66 2e 20 20 54 6f 0a 74 75 72 6e 20 74 72  off.  To.turn tr
2490: 61 63 69 6e 67 20 6f 6e 2c 20 65 6e 74 65 72 3a  acing on, enter:
24a0: 0a 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f  .</p>..<blockquo
24b0: 74 65 3e 3c 70 72 65 3e 0a 50 52 41 47 4d 41 20  te><pre>.PRAGMA 
24c0: 76 64 62 65 5f 74 72 61 63 65 3d 6f 6e 3b 0a 3c  vdbe_trace=on;.<
24d0: 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74  /pre></blockquot
24e0: 65 3e 0a 0a 3c 70 3e 0a 59 6f 75 20 63 61 6e 20  e>..<p>.You can 
24f0: 74 75 72 6e 20 74 72 61 63 69 6e 67 20 62 61 63  turn tracing bac
2500: 6b 20 6f 66 66 20 62 79 20 65 6e 74 65 72 69 6e  k off by enterin
2510: 67 20 61 20 73 69 6d 69 6c 61 72 20 73 74 61 74  g a similar stat
2520: 65 6d 65 6e 74 20 62 75 74 0a 63 68 61 6e 67 69  ement but.changi
2530: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 22 6f 6e  ng the value "on
2540: 22 20 74 6f 20 22 6f 66 66 22 2e 3c 2f 70 3e 0a  " to "off".</p>.
2550: 0a 3c 68 33 3e 54 68 65 20 4f 70 63 6f 64 65 73  .<h3>The Opcodes
2560: 3c 2f 68 33 3e 0a 7d 0a 0a 70 75 74 73 20 22 3c  </h3>.}..puts "<
2570: 70 3e 54 68 65 72 65 20 61 72 65 20 63 75 72 72  p>There are curr
2580: 65 6e 74 6c 79 20 5b 6c 6c 65 6e 67 74 68 20 24  ently [llength $
2590: 4f 70 63 6f 64 65 4c 69 73 74 5d 20 6f 70 63 6f  OpcodeList] opco
25a0: 64 65 73 20 64 65 66 69 6e 65 64 20 62 79 0a 74  des defined by.t
25b0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
25c0: 6e 65 2e 22 0a 70 75 74 73 20 7b 41 6c 6c 20 63  ne.".puts {All c
25d0: 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
25e0: 20 6f 70 63 6f 64 65 73 20 61 72 65 20 64 65 73   opcodes are des
25f0: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 74 61  cribed in the ta
2600: 62 6c 65 20 62 65 6c 6f 77 2e 0a 54 68 69 73 20  ble below..This 
2610: 74 61 62 6c 65 20 77 61 73 20 67 65 6e 65 72 61  table was genera
2620: 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
2630: 79 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68  y by scanning th
2640: 65 20 73 6f 75 72 63 65 20 63 6f 64 65 0a 66 72  e source code.fr
2650: 6f 6d 20 74 68 65 20 66 69 6c 65 20 3c 62 3e 76  om the file <b>v
2660: 64 62 65 2e 63 3c 2f 62 3e 2e 3c 2f 70 3e 7d 0a  dbe.c</b>.</p>}.
2670: 0a 70 75 74 73 20 7b 0a 3c 70 3e 3c 74 61 62 6c  .puts {.<p><tabl
2680: 65 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d 22 31  e cellspacing="1
2690: 22 20 62 6f 72 64 65 72 3d 22 31 22 20 63 65 6c  " border="1" cel
26a0: 6c 70 61 64 64 69 6e 67 3d 22 31 30 22 3e 0a 3c  lpadding="10">.<
26b0: 74 72 3e 3c 74 68 3e 4f 70 63 6f 64 65 26 6e 62  tr><th>Opcode&nb
26c0: 73 70 3b 4e 61 6d 65 3c 2f 74 68 3e 3c 74 68 3e  sp;Name</th><th>
26d0: 44 65 73 63 72 69 70 74 69 6f 6e 3c 2f 74 68 3e  Description</th>
26e0: 3c 2f 74 72 3e 7d 0a 66 6f 72 65 61 63 68 20 6f  </tr>}.foreach o
26f0: 70 20 5b 6c 73 6f 72 74 20 2d 64 69 63 74 69 6f  p [lsort -dictio
2700: 6e 61 72 79 20 24 4f 70 63 6f 64 65 4c 69 73 74  nary $OpcodeList
2710: 5d 20 7b 0a 20 20 70 75 74 73 20 7b 3c 74 72 3e  ] {.  puts {<tr>
2720: 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22  <td valign="top"
2730: 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e   align="center">
2740: 7d 0a 20 20 70 75 74 73 20 22 3c 61 20 6e 61 6d  }.  puts "<a nam
2750: 65 3d 5c 22 24 6f 70 5c 22 3e 24 6f 70 3c 2f 61  e=\"$op\">$op</a
2760: 3e 22 0a 20 20 70 75 74 73 20 22 3c 74 64 3e 5b  >".  puts "<td>[
2770: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 4f 70 63  string trim $Opc
2780: 6f 64 65 28 24 6f 70 3a 74 65 78 74 29 5d 3c 2f  ode($op:text)]</
2790: 74 64 3e 3c 2f 74 72 3e 22 0a 7d 0a 70 75 74 73  td></tr>".}.puts
27a0: 20 7b 3c 2f 74 61 62 6c 65 3e 3c 2f 70 3e 7d 0a   {</table></p>}.
27b0: 66 6f 6f 74 65 72 20 24 72 63 73 69 64 0a        footer $rcsid.