Documentation Source Text

Hex Artifact Content
Login

Artifact c33c2228a6cf45f7ee900a654f6ce9de2da9d6eec2b68da7498f54c83cc56d93:


0000: 3c 74 69 74 6c 65 3e 54 68 65 20 53 51 4c 69 74  <title>The SQLit
0010: 65 20 42 79 74 65 63 6f 64 65 20 45 6e 67 69 6e  e Bytecode Engin
0020: 65 3c 2f 74 69 74 6c 65 3e 0a 3c 74 63 6c 3e 68  e</title>.<tcl>h
0030: 64 5f 6b 65 79 77 6f 72 64 73 20 7b 76 69 72 74  d_keywords {virt
0040: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 6e 73 74  ual machine inst
0050: 72 75 63 74 69 6f 6e 73 7d 20 7b 56 44 42 45 7d  ructions} {VDBE}
0060: 20 7b 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e   {virtual machin
0070: 65 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 7b 6f  e} \.         {o
0080: 70 63 6f 64 65 73 7d 20 7b 62 79 74 65 63 6f 64  pcodes} {bytecod
0090: 65 20 65 6e 67 69 6e 65 7d 20 7b 62 79 74 65 63  e engine} {bytec
00a0: 6f 64 65 73 7d 20 7b 62 79 74 65 63 6f 64 65 7d  odes} {bytecode}
00b0: 3c 2f 74 63 6c 3e 0a 0a 3c 74 61 62 6c 65 5f 6f  </tcl>..<table_o
00c0: 66 5f 63 6f 6e 74 65 6e 74 73 3e 0a 0a 3c 68 31  f_contents>..<h1
00d0: 3e 45 78 65 63 75 74 69 76 65 20 53 75 6d 6d 61  >Executive Summa
00e0: 72 79 3c 2f 68 31 3e 0a 0a 3c 70 3e 53 51 4c 69  ry</h1>..<p>SQLi
00f0: 74 65 20 77 6f 72 6b 73 20 62 79 20 74 72 61 6e  te works by tran
0100: 73 6c 61 74 69 6e 67 20 53 51 4c 20 73 74 61 74  slating SQL stat
0110: 65 6d 65 6e 74 73 20 69 6e 74 6f 20 62 79 74 65  ements into byte
0120: 63 6f 64 65 20 61 6e 64 0a 74 68 65 6e 20 72 75  code and.then ru
0130: 6e 6e 69 6e 67 20 74 68 61 74 20 62 79 74 65 63  nning that bytec
0140: 6f 64 65 20 69 6e 20 61 20 76 69 72 74 75 61 6c  ode in a virtual
0150: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20   machine.  This 
0160: 64 6f 63 75 6d 65 6e 74 0a 64 65 73 63 72 69 62  document.describ
0170: 65 73 20 68 6f 77 20 68 6f 77 20 74 68 65 20 62  es how how the b
0180: 79 74 65 63 6f 64 65 20 65 6e 67 69 6e 65 20 77  ytecode engine w
0190: 6f 72 6b 73 2e 0a 0a 3c 70 3e 54 68 69 73 20 64  orks...<p>This d
01a0: 6f 63 75 6d 65 6e 74 20 64 65 73 63 72 69 62 65  ocument describe
01b0: 73 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6e 61  s SQLite interna
01c0: 6c 73 2e 20 20 54 68 65 20 69 6e 66 6f 72 6d 61  ls.  The informa
01d0: 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 0a 68 65  tion provided.he
01e0: 72 65 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64  re is not needed
01f0: 20 66 6f 72 20 72 6f 75 74 69 6e 65 20 61 70 70   for routine app
0200: 6c 69 63 61 74 69 6f 6e 20 64 65 76 65 6c 6f 70  lication develop
0210: 6d 65 6e 74 20 75 73 69 6e 67 20 53 51 4c 69 74  ment using SQLit
0220: 65 2e 0a 54 68 69 73 20 64 6f 63 75 6d 65 6e 74  e..This document
0230: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72   is intended for
0240: 20 70 65 6f 70 6c 65 20 77 68 6f 20 77 61 6e 74   people who want
0250: 20 74 6f 20 64 65 6c 76 65 20 6d 6f 72 65 20 64   to delve more d
0260: 65 65 70 6c 79 20 69 6e 74 6f 0a 74 68 65 20 69  eeply into.the i
0270: 6e 74 65 72 6e 61 6c 20 6f 70 65 72 61 74 69 6f  nternal operatio
0280: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 0a 3c 70  n of SQLite...<p
0290: 3e 54 68 65 20 62 79 74 65 63 6f 64 65 20 65 6e  >The bytecode en
02a0: 67 69 6e 65 20 69 73 20 3c 75 3e 6e 6f 74 3c 2f  gine is <u>not</
02b0: 75 3e 20 61 6e 20 41 50 49 20 6f 66 20 53 51 4c  u> an API of SQL
02c0: 69 74 65 2e 20 20 44 65 74 61 69 6c 73 0a 61 62  ite.  Details.ab
02d0: 6f 75 74 20 74 68 65 20 62 79 74 65 63 6f 64 65  out the bytecode
02e0: 20 65 6e 67 69 6e 65 20 63 68 61 6e 67 65 20 66   engine change f
02f0: 72 6f 6d 20 6f 6e 65 20 72 65 6c 65 61 73 65 20  rom one release 
0300: 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 74 68 65  of SQLite to the
0310: 20 6e 65 78 74 2e 0a 41 70 70 6c 69 63 61 74 69   next..Applicati
0320: 6f 6e 73 20 74 68 61 74 20 75 73 65 20 53 51 4c  ons that use SQL
0330: 69 74 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 64  ite should not d
0340: 65 70 65 6e 64 20 6f 6e 20 61 6e 79 20 6f 66 20  epend on any of 
0350: 74 68 65 20 64 65 74 61 69 6c 73 0a 66 6f 75 6e  the details.foun
0360: 64 20 69 6e 20 74 68 69 73 20 64 6f 63 75 6d 65  d in this docume
0370: 6e 74 2e 0a 0a 3c 74 63 6c 3e 0a 73 65 74 20 75  nt...<tcl>.set u
0380: 75 69 64 20 7b 7d 0a 63 61 74 63 68 20 7b 0a 20  uid {}.catch {. 
0390: 20 65 78 65 63 20 66 6f 73 73 69 6c 20 73 68 61   exec fossil sha
03a0: 33 73 75 6d 20 24 3a 3a 53 52 43 2f 73 72 63 2f  3sum $::SRC/src/
03b0: 76 64 62 65 2e 63 20 0a 7d 20 75 75 69 64 0a 73  vdbe.c .} uuid.s
03c0: 65 74 20 75 75 69 64 20 5b 6c 69 6e 64 65 78 20  et uuid [lindex 
03d0: 24 75 75 69 64 20 30 5d 0a 73 65 74 20 66 64 20  $uuid 0].set fd 
03e0: 5b 6f 70 65 6e 20 24 3a 3a 53 52 43 2f 73 72 63  [open $::SRC/src
03f0: 2f 76 64 62 65 2e 63 20 72 5d 0a 73 65 74 20 66  /vdbe.c r].set f
0400: 69 6c 65 20 5b 72 65 61 64 20 24 66 64 5d 0a 63  ile [read $fd].c
0410: 6c 6f 73 65 20 24 66 64 0a 73 65 74 20 63 75 72  lose $fd.set cur
0420: 72 65 6e 74 5f 6f 70 20 7b 7d 0a 75 6e 73 65 74  rent_op {}.unset
0430: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 4f 70 63   -nocomplain Opc
0440: 6f 64 65 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  ode.unset -nocom
0450: 70 6c 61 69 6e 20 4f 70 63 6f 64 65 4c 69 73 74  plain OpcodeList
0460: 0a 66 6f 72 65 61 63 68 20 6c 69 6e 65 20 5b 73  .foreach line [s
0470: 70 6c 69 74 20 24 66 69 6c 65 20 5c 6e 5d 20 7b  plit $file \n] {
0480: 0a 20 20 73 65 74 20 6c 69 6e 65 20 5b 73 74 72  .  set line [str
0490: 69 6e 67 20 74 72 69 6d 20 24 6c 69 6e 65 5d 0a  ing trim $line].
04a0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 6e    if {[string in
04b0: 64 65 78 20 24 6c 69 6e 65 20 31 5d 21 3d 22 2a  dex $line 1]!="*
04c0: 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 63 75 72  "} {.    set cur
04d0: 72 65 6e 74 5f 6f 70 20 7b 7d 0a 20 20 20 20 63  rent_op {}.    c
04e0: 6f 6e 74 69 6e 75 65 0a 20 20 7d 0a 20 20 69 66  ontinue.  }.  if
04f0: 20 7b 5b 72 65 67 65 78 70 20 7b 5e 5c 2a 5c 2a   {[regexp {^\*\*
0500: 20 53 79 6e 6f 70 73 69 73 3a 7d 20 24 6c 69 6e   Synopsis:} $lin
0510: 65 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 69  e]} continue.  i
0520: 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 2f 5c 2a  f {[regexp {^/\*
0530: 20 4f 70 63 6f 64 65 3a 20 7d 20 24 6c 69 6e 65   Opcode: } $line
0540: 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 63 75 72  ]} {.    set cur
0550: 72 65 6e 74 5f 6f 70 20 5b 6c 69 6e 64 65 78 20  rent_op [lindex 
0560: 24 6c 69 6e 65 20 32 5d 0a 20 20 20 20 73 65 74  $line 2].    set
0570: 20 74 78 74 20 5b 6c 72 61 6e 67 65 20 24 6c 69   txt [lrange $li
0580: 6e 65 20 33 20 65 6e 64 5d 0a 20 20 20 20 72 65  ne 3 end].    re
0590: 67 73 75 62 20 2d 61 6c 6c 20 7b 3e 7d 20 24 74  gsub -all {>} $t
05a0: 78 74 20 7b 5c 26 67 74 3b 7d 20 74 78 74 0a 20  xt {\&gt;} txt. 
05b0: 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b     regsub -all {
05c0: 3c 7d 20 24 74 78 74 20 7b 5c 26 6c 74 3b 7d 20  <} $txt {\&lt;} 
05d0: 74 78 74 0a 20 20 20 20 73 65 74 20 4f 70 63 6f  txt.    set Opco
05e0: 64 65 28 24 63 75 72 72 65 6e 74 5f 6f 70 3a 61  de($current_op:a
05f0: 72 67 73 29 20 24 74 78 74 0a 20 20 20 20 6c 61  rgs) $txt.    la
0600: 70 70 65 6e 64 20 4f 70 63 6f 64 65 4c 69 73 74  ppend OpcodeList
0610: 20 24 63 75 72 72 65 6e 74 5f 6f 70 0a 20 20 20   $current_op.   
0620: 20 73 65 74 20 70 65 6e 64 20 7b 7d 0a 20 20 20   set pend {}.   
0630: 20 73 65 74 20 70 73 74 61 72 74 20 7b 7d 0a 20   set pstart {}. 
0640: 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20 7d 0a     continue.  }.
0650: 20 20 69 66 20 7b 24 63 75 72 72 65 6e 74 5f 6f    if {$current_o
0660: 70 3d 3d 22 22 7d 20 63 6f 6e 74 69 6e 75 65 0a  p==""} continue.
0670: 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e    if {[regexp {^
0680: 5c 2a 2f 7d 20 24 6c 69 6e 65 5d 7d 20 7b 0a 20  \*/} $line]} {. 
0690: 20 20 20 73 65 74 20 63 75 72 72 65 6e 74 5f 6f     set current_o
06a0: 70 20 7b 7d 0a 20 20 20 20 63 6f 6e 74 69 6e 75  p {}.    continu
06b0: 65 0a 20 20 7d 0a 20 20 73 65 74 20 6c 69 6e 65  e.  }.  set line
06c0: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 73   [string trim [s
06d0: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6c 69 6e  tring range $lin
06e0: 65 20 33 20 65 6e 64 5d 5d 0a 20 20 69 66 20 7b  e 3 end]].  if {
06f0: 24 6c 69 6e 65 3d 3d 22 22 7d 20 7b 0a 20 20 20  $line==""} {.   
0700: 20 61 70 70 65 6e 64 20 4f 70 63 6f 64 65 28 24   append Opcode($
0710: 63 75 72 72 65 6e 74 5f 6f 70 3a 74 65 78 74 29  current_op:text)
0720: 20 24 70 65 6e 64 0a 20 20 20 20 73 65 74 20 70   $pend.    set p
0730: 65 6e 64 20 7b 7d 0a 20 20 20 20 73 65 74 20 70  end {}.    set p
0740: 73 74 61 72 74 20 7b 3c 70 3e 7d 0a 20 20 7d 20  start {<p>}.  } 
0750: 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 20 7b 21  else {.    if {!
0760: 5b 72 65 67 65 78 70 20 7b 3c 2f 3f 28 75 6c 7c  [regexp {</?(ul|
0770: 6c 69 7c 6f 6c 29 7d 20 24 6c 69 6e 65 5d 7d 20  li|ol)} $line]} 
0780: 7b 0a 20 20 20 20 20 20 72 65 67 73 75 62 20 2d  {.      regsub -
0790: 61 6c 6c 20 7b 3e 7d 20 24 6c 69 6e 65 20 7b 5c  all {>} $line {\
07a0: 26 67 74 3b 7d 20 6c 69 6e 65 0a 20 20 20 20 20  &gt;} line.     
07b0: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 3c 7d   regsub -all {<}
07c0: 20 24 6c 69 6e 65 20 7b 5c 26 6c 74 3b 7d 20 6c   $line {\&lt;} l
07d0: 69 6e 65 0a 20 20 20 20 7d 0a 20 20 20 20 61 70  ine.    }.    ap
07e0: 70 65 6e 64 20 4f 70 63 6f 64 65 28 24 63 75 72  pend Opcode($cur
07f0: 72 65 6e 74 5f 6f 70 3a 74 65 78 74 29 20 5c 6e  rent_op:text) \n
0800: 24 70 73 74 61 72 74 24 6c 69 6e 65 0a 20 20 20  $pstart$line.   
0810: 20 73 65 74 20 70 73 74 61 72 74 20 7b 7d 0a 20   set pstart {}. 
0820: 20 20 20 73 65 74 20 70 65 6e 64 20 22 3c 2f 70     set pend "</p
0830: 3e 5c 6e 22 0a 20 20 7d 0a 7d 0a 75 6e 73 65 74  >\n".  }.}.unset
0840: 20 66 69 6c 65 0a 73 65 74 20 66 64 20 5b 6f 70   file.set fd [op
0850: 65 6e 20 24 3a 3a 53 52 43 2f 56 45 52 53 49 4f  en $::SRC/VERSIO
0860: 4e 20 72 5d 0a 73 65 74 20 53 51 4c 49 54 45 5f  N r].set SQLITE_
0870: 56 45 52 53 49 4f 4e 20 5b 73 74 72 69 6e 67 20  VERSION [string 
0880: 74 72 69 6d 20 5b 72 65 61 64 20 24 66 64 5d 5d  trim [read $fd]]
0890: 0a 63 6c 6f 73 65 20 24 66 64 0a 73 65 74 20 66  .close $fd.set f
08a0: 64 20 5b 6f 70 65 6e 20 24 3a 3a 53 52 43 2f 6d  d [open $::SRC/m
08b0: 61 6e 69 66 65 73 74 2e 75 75 69 64 20 72 5d 0a  anifest.uuid r].
08c0: 73 65 74 20 53 51 4c 49 54 45 5f 53 48 41 31 5f  set SQLITE_SHA1_
08d0: 56 45 52 53 49 4f 4e 20 5b 73 74 72 69 6e 67 20  VERSION [string 
08e0: 74 72 69 6d 20 5b 72 65 61 64 20 24 66 64 5d 5d  trim [read $fd]]
08f0: 0a 73 65 74 20 53 51 4c 49 54 45 5f 48 41 53 48  .set SQLITE_HASH
0900: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
0910: 53 51 4c 49 54 45 5f 53 48 41 31 5f 56 45 52 53  SQLITE_SHA1_VERS
0920: 49 4f 4e 20 30 20 31 32 5d 0a 63 6c 6f 73 65 20  ION 0 12].close 
0930: 24 66 64 0a 73 65 74 20 66 64 20 5b 6f 70 65 6e  $fd.set fd [open
0940: 20 24 3a 3a 53 52 43 2f 6d 61 6e 69 66 65 73 74   $::SRC/manifest
0950: 20 72 5d 0a 73 65 74 20 66 69 6c 65 20 5b 72 65   r].set file [re
0960: 61 64 20 24 66 64 5d 0a 63 6c 6f 73 65 20 24 66  ad $fd].close $f
0970: 64 0a 73 65 74 20 53 51 4c 49 54 45 5f 43 4b 49  d.set SQLITE_CKI
0980: 4e 5f 44 41 54 45 20 7b 75 6e 6b 6e 6f 77 6e 7d  N_DATE {unknown}
0990: 0a 72 65 67 65 78 70 20 7b 5c 6e 44 20 28 5c 64  .regexp {\nD (\d
09a0: 5c 64 5c 64 5c 64 2d 5c 64 5c 64 2d 5c 64 5c 64  \d\d\d-\d\d-\d\d
09b0: 29 7d 20 24 66 69 6c 65 20 61 6c 6c 20 53 51 4c  )} $file all SQL
09c0: 49 54 45 5f 43 4b 49 4e 5f 44 41 54 45 0a 75 6e  ITE_CKIN_DATE.un
09d0: 73 65 74 20 66 69 6c 65 0a 0a 23 20 53 63 61 6e  set file..# Scan
09e0: 20 24 74 78 74 20 61 6e 64 20 72 65 70 6c 61 63   $txt and replac
09f0: 65 20 65 76 65 72 79 20 6f 70 63 6f 64 65 20 6e  e every opcode n
0a00: 61 6d 65 20 77 69 74 68 20 61 20 6c 69 6e 6b 20  ame with a link 
0a10: 74 6f 20 69 74 73 20 64 6f 63 75 6d 65 6e 74 61  to its documenta
0a20: 74 69 6f 6e 0a 23 0a 70 72 6f 63 20 4c 69 6e 6b  tion.#.proc Link
0a30: 4f 70 63 6f 64 65 4e 61 6d 65 73 20 7b 74 78 74  OpcodeNames {txt
0a40: 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 4f 70 63  } {.  global Opc
0a50: 6f 64 65 0a 20 20 73 65 74 20 6f 75 74 20 7b 7d  ode.  set out {}
0a60: 0a 20 20 77 68 69 6c 65 20 7b 5b 72 65 67 65 78  .  while {[regex
0a70: 70 20 7b 5e 28 2e 2a 3f 29 28 4f 50 5f 5b 41 2d  p {^(.*?)(OP_[A-
0a80: 5a 5d 5b 61 2d 7a 5d 29 5c 79 28 2e 2a 29 24 7d  Z][a-z])\y(.*)$}
0a90: 20 24 74 78 74 20 5c 0a 20 20 20 20 20 20 20 20   $txt \.        
0aa0: 20 20 20 20 20 61 6c 6c 20 70 72 65 20 6f 70 20       all pre op 
0ab0: 74 61 69 6c 5d 20 7c 7c 0a 20 20 20 20 20 20 20  tail] ||.       
0ac0: 20 5b 72 65 67 65 78 70 20 7b 5e 28 2e 2a 3f 29   [regexp {^(.*?)
0ad0: 5c 79 28 28 4f 50 5f 29 3f 5b 41 2d 5a 5d 5b 41  \y((OP_)?[A-Z][A
0ae0: 2d 5a 61 2d 7a 5d 5b 41 2d 5a 61 2d 7a 30 2d 39  -Za-z][A-Za-z0-9
0af0: 5d 2b 29 5c 79 28 2e 2a 29 24 7d 20 24 74 78 74  ]+)\y(.*)$} $txt
0b00: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
0b10: 61 6c 6c 20 70 72 65 20 6f 70 20 6f 70 78 20 74  all pre op opx t
0b20: 61 69 6c 5d 7d 20 7b 0a 20 20 20 20 68 64 5f 72  ail]} {.    hd_r
0b30: 65 73 6f 6c 76 65 20 24 70 72 65 0a 20 20 20 20  esolve $pre.    
0b40: 69 66 20 7b 28 24 70 72 65 3d 3d 22 22 20 7c 7c  if {($pre=="" ||
0b50: 20 5b 72 65 67 65 78 70 20 7b 3e 20 2a 24 7d 20   [regexp {> *$} 
0b60: 24 70 72 65 5d 29 20 26 26 20 21 5b 72 65 67 65  $pre]) && ![rege
0b70: 78 70 20 7b 5e 4f 50 5f 7d 20 24 6f 70 5d 0a 20  xp {^OP_} $op]. 
0b80: 20 20 20 20 20 20 20 20 7c 7c 20 5b 72 65 67 65          || [rege
0b90: 78 70 20 7b 5e 6f 62 6a 65 63 74 7d 20 5b 73 74  xp {^object} [st
0ba0: 72 69 6e 67 20 74 72 69 6d 20 24 74 61 69 6c 5d  ring trim $tail]
0bb0: 5d 7d 20 7b 0a 20 20 20 20 20 20 68 64 5f 70 75  ]} {.      hd_pu
0bc0: 74 73 20 24 6f 70 0a 20 20 20 20 7d 20 65 6c 73  ts $op.    } els
0bd0: 65 20 7b 0a 20 20 20 20 20 20 72 65 67 73 75 62  e {.      regsub
0be0: 20 7b 5e 4f 50 5f 7d 20 24 6f 70 20 7b 7d 20 6b   {^OP_} $op {} k
0bf0: 65 79 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  ey.      if {[in
0c00: 66 6f 20 65 78 69 73 74 73 20 4f 70 63 6f 64 65  fo exists Opcode
0c10: 28 24 6b 65 79 3a 74 65 78 74 29 5d 7d 20 7b 0a  ($key:text)]} {.
0c20: 20 20 20 20 20 20 20 20 68 64 5f 70 75 74 73 20          hd_puts 
0c30: 22 3c 61 20 68 72 65 66 3d 5c 22 6f 70 63 6f 64  "<a href=\"opcod
0c40: 65 2e 68 74 6d 6c 23 24 6b 65 79 5c 22 3e 24 6b  e.html#$key\">$k
0c50: 65 79 3c 2f 61 3e 22 0a 20 20 20 20 20 20 7d 20  ey</a>".      } 
0c60: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 68  else {.        h
0c70: 64 5f 70 75 74 73 20 24 6f 70 0a 20 20 20 20 20  d_puts $op.     
0c80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74   }.    }.    set
0c90: 20 74 78 74 20 24 74 61 69 6c 0a 20 20 7d 0a 20   txt $tail.  }. 
0ca0: 20 68 64 5f 72 65 73 6f 6c 76 65 20 24 74 78 74   hd_resolve $txt
0cb0: 0a 7d 0a 3c 2f 74 63 6c 3e 0a 0a 3c 68 31 3e 49  .}.</tcl>..<h1>I
0cc0: 6e 74 72 6f 64 75 63 74 69 6f 6e 3c 2f 68 31 3e  ntroduction</h1>
0cd0: 0a 0a 3c 70 3e 53 51 4c 69 74 65 20 77 6f 72 6b  ..<p>SQLite work
0ce0: 73 20 62 79 20 74 72 61 6e 73 6c 61 74 69 6e 67  s by translating
0cf0: 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
0d00: 65 6e 74 20 69 6e 74 6f 20 62 79 74 65 63 6f 64  ent into bytecod
0d10: 65 20 61 6e 64 0a 74 68 65 6e 20 72 75 6e 6e 69  e and.then runni
0d20: 6e 67 20 74 68 61 74 20 62 79 74 65 63 6f 64 65  ng that bytecode
0d30: 2e 0a 41 20 5b 70 72 65 70 61 72 65 64 20 73 74  ..A [prepared st
0d40: 61 74 65 6d 65 6e 74 5d 20 69 6e 20 53 51 4c 69  atement] in SQLi
0d50: 74 65 20 69 73 20 6d 6f 73 74 6c 79 20 6a 75 73  te is mostly jus
0d60: 74 20 74 68 65 20 62 79 74 65 63 6f 64 65 20 6e  t the bytecode n
0d70: 65 65 64 65 64 20 74 6f 0a 69 6d 70 6c 65 6d 65  eeded to.impleme
0d80: 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
0d90: 64 69 6e 67 20 53 51 4c 2e 20 20 54 68 65 20 5b  ding SQL.  The [
0da0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
0db0: 76 32 28 29 5d 20 69 6e 74 65 72 66 61 63 65 0a  v2()] interface.
0dc0: 69 73 20 61 20 63 6f 6d 70 69 6c 65 72 20 74 68  is a compiler th
0dd0: 61 74 20 74 72 61 6e 73 6c 61 74 65 73 20 53 51  at translates SQ
0de0: 4c 20 69 6e 74 6f 20 62 79 74 65 63 6f 64 65 2e  L into bytecode.
0df0: 0a 54 68 65 20 5b 73 71 6c 69 74 65 33 5f 73 74  .The [sqlite3_st
0e00: 65 70 28 29 5d 20 69 6e 74 65 72 66 61 63 65 20  ep()] interface 
0e10: 69 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  is the virtual m
0e20: 61 63 68 69 6e 65 20 74 68 61 74 20 72 75 6e 73  achine that runs
0e30: 20 74 68 65 0a 62 79 74 65 63 6f 64 65 20 63 6f   the.bytecode co
0e40: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
0e50: 68 65 20 5b 70 72 65 70 61 72 65 64 20 73 74 61  he [prepared sta
0e60: 74 65 6d 65 6e 74 5d 2e 0a 0a 3c 70 3e 54 68 65  tement]...<p>The
0e70: 20 62 79 74 65 63 6f 64 65 20 76 69 72 74 75 61   bytecode virtua
0e80: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 74 68 65  l machine is the
0e90: 20 68 65 61 72 74 20 6f 66 20 53 51 4c 69 74 65   heart of SQLite
0ea0: 2e 0a 50 72 6f 67 72 61 6d 6d 65 72 73 20 77 68  ..Programmers wh
0eb0: 6f 20 77 61 6e 74 20 74 6f 20 75 6e 64 65 72 73  o want to unders
0ec0: 74 61 6e 64 20 68 6f 77 20 53 51 4c 69 74 65 20  tand how SQLite 
0ed0: 6f 70 65 72 61 74 65 73 20 69 6e 74 65 72 6e 61  operates interna
0ee0: 6c 6c 79 0a 6d 75 73 74 20 62 65 20 66 61 6d 69  lly.must be fami
0ef0: 6c 69 61 72 20 77 69 74 68 20 74 68 65 20 62 79  liar with the by
0f00: 74 65 63 6f 64 65 20 65 6e 67 69 6e 65 2e 0a 0a  tecode engine...
0f10: 3c 70 3e 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c  <p>Historically,
0f20: 20 74 68 65 20 62 79 74 65 63 6f 64 65 20 65 6e   the bytecode en
0f30: 67 69 6e 65 20 69 6e 20 53 51 4c 69 74 65 20 69  gine in SQLite i
0f40: 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 22 56 69  s called the."Vi
0f50: 72 74 75 61 6c 20 44 61 74 61 42 61 73 65 20 45  rtual DataBase E
0f60: 6e 67 69 6e 65 22 20 6f 72 20 22 56 44 42 45 22  ngine" or "VDBE"
0f70: 2e 20 20 54 68 69 73 20 77 65 62 73 69 74 65 20  .  This website 
0f80: 75 73 65 73 20 74 68 65 20 74 65 72 6d 73 0a 22  uses the terms."
0f90: 62 79 74 65 63 6f 64 65 20 65 6e 67 69 6e 65 22  bytecode engine"
0fa0: 2c 20 22 56 44 42 45 22 2c 20 22 76 69 72 74 75  , "VDBE", "virtu
0fb0: 61 6c 20 6d 61 63 68 69 6e 65 22 2c 20 61 6e 64  al machine", and
0fc0: 20 22 62 79 74 65 63 6f 64 65 20 76 69 72 74 75   "bytecode virtu
0fd0: 61 6c 0a 6d 61 63 68 69 6e 65 22 20 69 6e 74 65  al.machine" inte
0fe0: 72 63 68 61 6e 67 65 61 62 6c 79 2c 20 61 73 20  rchangeably, as 
0ff0: 74 68 65 79 20 61 6c 6c 20 6d 65 61 6e 20 74 68  they all mean th
1000: 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 0a 3c  e same thing...<
1010: 70 3e 0a 54 68 69 73 20 61 72 74 69 63 6c 65 20  p>.This article 
1020: 61 6c 73 6f 20 75 73 65 73 20 74 68 65 20 74 65  also uses the te
1030: 72 6d 73 20 22 62 79 74 65 63 6f 64 65 20 70 72  rms "bytecode pr
1040: 6f 67 72 61 6d 22 20 61 6e 64 0a 22 70 72 65 70  ogram" and."prep
1050: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 22 20  ared statement" 
1060: 69 6e 74 65 72 63 68 61 6e 67 65 61 62 6c 79 2c  interchangeably,
1070: 20 61 73 20 74 68 65 79 20 61 72 65 20 6d 6f 73   as they are mos
1080: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 74 68 69  tly the same thi
1090: 6e 67 2e 0a 0a 3c 68 32 3e 56 44 42 45 20 53 6f  ng...<h2>VDBE So
10a0: 75 72 63 65 20 43 6f 64 65 3c 2f 68 32 3e 0a 0a  urce Code</h2>..
10b0: 3c 70 3e 54 68 65 20 73 6f 75 72 63 65 20 63 6f  <p>The source co
10c0: 64 65 20 74 6f 20 74 68 65 20 62 79 74 65 63 6f  de to the byteco
10d0: 64 65 20 65 6e 67 69 6e 65 20 69 73 20 69 6e 20  de engine is in 
10e0: 74 68 65 20 0a 5b 68 74 74 70 3a 2f 2f 77 77 77  the .[http://www
10f0: 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
1100: 66 69 6c 65 2f 73 72 63 2f 76 64 62 65 2e 63 20  file/src/vdbe.c 
1110: 7c 20 76 64 62 65 2e 63 5d 20 73 6f 75 72 63 65  | vdbe.c] source
1120: 0a 66 69 6c 65 2e 20 20 54 68 65 20 5b 6f 70 63  .file.  The [opc
1130: 6f 64 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 5d  ode definitions]
1140: 20 69 6e 20 74 68 69 73 20 64 6f 63 75 6d 65 6e   in this documen
1150: 74 20 61 72 65 20 64 65 72 69 76 65 64 0a 66 72  t are derived.fr
1160: 6f 6d 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  om comments in t
1170: 68 61 74 20 73 6f 75 72 63 65 20 66 69 6c 65 2e  hat source file.
1180: 20 54 68 65 20 0a 73 6f 75 72 63 65 20 63 6f 64   The .source cod
1190: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 72 65 20 74  e comments are t
11a0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 73 6f 75  he canonical sou
11b0: 72 63 65 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69  rce of informati
11c0: 6f 6e 0a 61 62 6f 75 74 20 74 68 65 20 62 79 74  on.about the byt
11d0: 65 63 6f 64 65 20 65 6e 67 69 6e 65 2e 20 20 57  ecode engine.  W
11e0: 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
11f0: 66 65 72 20 74 6f 20 74 68 65 20 73 6f 75 72 63  fer to the sourc
1200: 65 20 63 6f 64 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e  e code.</p>..<p>
1210: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
1220: 68 65 20 70 72 69 6d 61 72 79 20 76 64 62 65 2e  he primary vdbe.
1230: 63 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 69  c source code fi
1240: 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 0a 6f  le, there are .o
1250: 74 68 65 72 20 68 65 6c 70 65 72 20 63 6f 64 65  ther helper code
1260: 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20 73 6f   files in the so
1270: 75 72 63 65 20 74 72 65 65 2c 20 61 6c 6c 20 6f  urce tree, all o
1280: 66 20 77 68 6f 73 65 20 6e 61 6d 65 73 0a 62 65  f whose names.be
1290: 67 69 6e 20 77 69 74 68 20 22 76 64 62 65 22 20  gin with "vdbe" 
12a0: 2d 20 73 68 6f 72 74 20 66 6f 72 20 22 56 69 72  - short for "Vir
12b0: 74 75 61 6c 20 44 61 74 61 42 61 73 65 20 45 6e  tual DataBase En
12c0: 67 69 6e 65 22 2e 0a 0a 3c 70 3e 52 65 6d 65 6d  gine"...<p>Remem
12d0: 62 65 72 20 74 68 61 74 20 74 68 65 20 6e 61 6d  ber that the nam
12e0: 65 73 20 61 6e 64 20 6d 65 61 6e 69 6e 67 73 20  es and meanings 
12f0: 6f 66 20 6f 70 63 6f 64 65 73 20 6f 66 74 65 6e  of opcodes often
1300: 20 63 68 61 6e 67 65 20 66 72 6f 6d 0a 6f 6e 65   change from.one
1310: 20 72 65 6c 65 61 73 65 20 6f 66 20 53 51 4c 69   release of SQLi
1320: 74 65 20 74 6f 20 74 68 65 20 6e 65 78 74 2e 20  te to the next. 
1330: 20 53 6f 20 69 66 20 79 6f 75 20 61 72 65 20 73   So if you are s
1340: 74 75 64 79 69 6e 67 20 74 68 65 20 5b 45 58 50  tudying the [EXP
1350: 4c 41 49 4e 5d 0a 6f 75 74 70 75 74 20 66 72 6f  LAIN].output fro
1360: 6d 20 53 51 4c 69 74 65 2c 20 79 6f 75 20 73 68  m SQLite, you sh
1370: 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 74  ould reference t
1380: 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  he version of th
1390: 69 73 20 64 6f 63 75 6d 65 6e 74 0a 28 6f 72 20  is document.(or 
13a0: 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63  the vdbe.c sourc
13b0: 65 20 63 6f 64 65 29 0a 74 68 61 74 20 63 6f 72  e code).that cor
13c0: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
13d0: 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69 74  version of SQLit
13e0: 65 20 74 68 61 74 20 72 61 6e 20 74 68 65 20 5b  e that ran the [
13f0: 45 58 50 4c 41 49 4e 5d 2e 0a 4f 74 68 65 72 77  EXPLAIN]..Otherw
1400: 69 73 65 2c 20 74 68 65 20 64 65 73 63 72 69 70  ise, the descrip
1410: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 63 6f  tion of the opco
1420: 64 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  des may not be a
1430: 63 63 75 72 61 74 65 2e 0a 54 68 69 73 20 64 6f  ccurate..This do
1440: 63 75 6d 65 6e 74 20 69 73 20 64 65 72 69 76 65  cument is derive
1450: 64 20 66 72 6f 6d 20 53 51 4c 69 74 65 0a 3c 74  d from SQLite.<t
1460: 63 6c 3e 0a 68 64 5f 70 75 74 73 20 22 20 76 65  cl>.hd_puts " ve
1470: 72 73 69 6f 6e 20 24 53 51 4c 49 54 45 5f 56 45  rsion $SQLITE_VE
1480: 52 53 49 4f 4e 20 63 68 65 63 6b 2d 69 6e 5c 6e  RSION check-in\n
1490: 22 0a 73 65 74 20 75 72 6c 20 68 74 74 70 73 3a  ".set url https:
14a0: 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
14b0: 2f 73 72 63 2f 74 69 6d 65 6c 69 6e 65 3f 63 3d  /src/timeline?c=
14c0: 24 53 51 4c 49 54 45 5f 48 41 53 48 0a 68 64 5f  $SQLITE_HASH.hd_
14d0: 70 75 74 73 20 22 3c 61 20 68 72 65 66 3d 27 24  puts "<a href='$
14e0: 75 72 6c 27 3e 24 53 51 4c 49 54 45 5f 48 41 53  url'>$SQLITE_HAS
14f0: 48 3c 2f 61 3e 20 64 61 74 65 64 20 24 53 51 4c  H</a> dated $SQL
1500: 49 54 45 5f 43 4b 49 4e 5f 44 41 54 45 2e 5c 6e  ITE_CKIN_DATE.\n
1510: 5c 6e 22 0a 3c 2f 74 63 6c 3e 0a 0a 0a 3c 68 32  \n".</tcl>...<h2
1520: 3e 49 6e 73 74 72 75 63 74 69 6f 6e 20 46 6f 72  >Instruction For
1530: 6d 61 74 3c 2f 68 32 3e 0a 0a 3c 74 63 6c 3e 0a  mat</h2>..<tcl>.
1540: 4c 69 6e 6b 4f 70 63 6f 64 65 4e 61 6d 65 73 20  LinkOpcodeNames 
1550: 7b 0a 3c 70 3e 41 20 62 79 74 65 63 6f 64 65 64  {.<p>A bytecoded
1560: 20 70 72 6f 67 72 61 6d 20 69 6e 20 53 51 4c 69   program in SQLi
1570: 74 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 6f  te consists of o
1580: 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 73 74 72  ne or more instr
1590: 75 63 74 69 6f 6e 73 2e 0a 45 61 63 68 20 69 6e  uctions..Each in
15a0: 73 74 72 75 63 74 69 6f 6e 20 68 61 73 20 61 6e  struction has an
15b0: 20 6f 70 63 6f 64 65 20 61 6e 64 0a 66 69 76 65   opcode and.five
15c0: 20 6f 70 65 72 61 6e 64 73 20 6e 61 6d 65 64 20   operands named 
15d0: 50 31 2c 20 50 32 20 20 50 33 2c 20 50 34 2c 20  P1, P2  P3, P4, 
15e0: 61 6e 64 20 50 35 2e 20 20 54 68 65 20 50 31 2c  and P5.  The P1,
15f0: 20 50 32 2c 20 61 6e 64 20 50 33 20 0a 6f 70 65   P2, and P3 .ope
1600: 72 61 6e 64 73 20 61 72 65 20 33 32 2d 62 69 74  rands are 32-bit
1610: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73   signed integers
1620: 2e 20 20 54 68 65 73 65 20 6f 70 65 72 61 6e 64  .  These operand
1630: 73 20 6f 66 74 65 6e 20 72 65 66 65 72 20 74 6f  s often refer to
1640: 20 0a 72 65 67 69 73 74 65 72 73 2e 20 20 46 6f   .registers.  Fo
1650: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  r instructions t
1660: 68 61 74 20 6f 70 65 72 61 74 65 20 6f 6e 20 62  hat operate on b
1670: 2d 74 72 65 65 20 63 75 72 73 6f 72 73 2c 0a 74  -tree cursors,.t
1680: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 69 73  he P1 operand is
1690: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 63 75 72   usually the cur
16a0: 73 6f 72 20 6e 75 6d 62 65 72 2e 0a 46 6f 72 20  sor number..For 
16b0: 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  jump instruction
16c0: 73 2c 20 50 32 20 69 73 20 75 73 75 61 6c 6c 79  s, P2 is usually
16d0: 20 74 68 65 20 6a 75 6d 70 20 64 65 73 74 69 6e   the jump destin
16e0: 61 74 69 6f 6e 2e 0a 50 34 20 6d 61 79 20 62 65  ation..P4 may be
16f0: 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64   a 32-bit signed
1700: 20 69 6e 74 65 67 65 72 2c 20 61 20 36 34 2d 62   integer, a 64-b
1710: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
1720: 72 2c 20 61 0a 36 34 2d 62 69 74 20 66 6c 6f 61  r, a.64-bit floa
1730: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
1740: 2c 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  , a string liter
1750: 61 6c 2c 20 61 20 42 6c 6f 62 20 6c 69 74 65 72  al, a Blob liter
1760: 61 6c 2c 0a 61 20 70 6f 69 6e 74 65 72 20 74 6f  al,.a pointer to
1770: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
1780: 75 65 6e 63 65 20 63 6f 6d 70 61 72 69 73 6f 6e  uence comparison
1790: 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 61 0a   function, or a.
17a0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69  pointer to the i
17b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
17c0: 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d   an application-
17d0: 64 65 66 69 6e 65 64 20 53 51 4c 0a 66 75 6e 63  defined SQL.func
17e0: 74 69 6f 6e 2c 20 6f 72 20 76 61 72 69 6f 75 73  tion, or various
17f0: 20 6f 74 68 65 72 20 74 68 69 6e 67 73 2e 20 20   other things.  
1800: 50 35 20 69 73 20 61 6e 20 31 36 2d 62 69 74 20  P5 is an 16-bit 
1810: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
1820: 0a 6e 6f 72 6d 61 6c 6c 79 20 75 73 65 64 20 74  .normally used t
1830: 6f 20 68 6f 6c 64 20 66 6c 61 67 73 2e 20 20 42  o hold flags.  B
1840: 69 74 73 20 6f 66 20 74 68 65 20 50 35 20 66 6c  its of the P5 fl
1850: 61 67 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73  ag can sometimes
1860: 20 61 66 66 65 63 74 0a 74 68 65 20 6f 70 63 6f   affect.the opco
1870: 64 65 20 69 6e 20 73 75 62 74 6c 65 20 77 61 79  de in subtle way
1880: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  s.  For example,
1890: 20 69 66 20 74 68 65 20 0a 53 51 4c 49 54 45 5f   if the .SQLITE_
18a0: 4e 55 4c 4c 45 51 20 28 30 78 30 30 38 30 29 20  NULLEQ (0x0080) 
18b0: 62 69 74 20 6f 66 20 74 68 65 20 50 35 20 6f 70  bit of the P5 op
18c0: 65 72 61 6e 64 0a 69 73 20 73 65 74 20 6f 6e 20  erand.is set on 
18d0: 74 68 65 20 4f 50 5f 45 71 20 6f 70 63 6f 64 65  the OP_Eq opcode
18e0: 2c 20 74 68 65 6e 20 74 68 65 20 4e 55 4c 4c 20  , then the NULL 
18f0: 76 61 6c 75 65 73 20 63 6f 6d 70 61 72 65 0a 65  values compare.e
1900: 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  qual to one anot
1910: 68 65 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20  her.  Otherwise 
1920: 4e 55 4c 4c 20 76 61 6c 75 65 73 20 63 6f 6d 70  NULL values comp
1930: 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 66 72  are different.fr
1940: 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 0a  om one another..
1950: 7d 0a 3c 2f 74 63 6c 3e 0a 0a 3c 70 3e 53 6f 6d  }.</tcl>..<p>Som
1960: 65 20 6f 70 63 6f 64 65 73 20 75 73 65 20 61 6c  e opcodes use al
1970: 6c 20 66 69 76 65 20 6f 70 65 72 61 6e 64 73 2e  l five operands.
1980: 20 20 53 6f 6d 65 20 6f 70 63 6f 64 65 73 20 75    Some opcodes u
1990: 73 65 0a 6f 6e 65 20 6f 72 20 74 77 6f 2e 20 20  se.one or two.  
19a0: 53 6f 6d 65 20 6f 70 63 6f 64 65 73 20 75 73 65  Some opcodes use
19b0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65   none of the ope
19c0: 72 61 6e 64 73 2e 3c 70 3e 0a 0a 3c 74 63 6c 3e  rands.<p>..<tcl>
19d0: 0a 4c 69 6e 6b 4f 70 63 6f 64 65 4e 61 6d 65 73  .LinkOpcodeNames
19e0: 20 7b 0a 3c 70 3e 54 68 65 20 62 79 74 65 63 6f   {.<p>The byteco
19f0: 64 65 20 65 6e 67 69 6e 65 20 62 65 67 69 6e 73  de engine begins
1a00: 20 65 78 65 63 75 74 69 6f 6e 20 6f 6e 20 69 6e   execution on in
1a10: 73 74 72 75 63 74 69 6f 6e 20 6e 75 6d 62 65 72  struction number
1a20: 20 30 2e 0a 45 78 65 63 75 74 69 6f 6e 20 63 6f   0..Execution co
1a30: 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 61 20  ntinues until a 
1a40: 4f 50 5f 48 61 6c 74 20 69 6e 73 74 72 75 63 74  OP_Halt instruct
1a50: 69 6f 6e 20 69 73 20 73 65 65 6e 2c 20 6f 72 20  ion is seen, or 
1a60: 75 6e 74 69 6c 0a 74 68 65 20 70 72 6f 67 72 61  until.the progra
1a70: 6d 20 63 6f 75 6e 74 65 72 20 62 65 63 6f 6d 65  m counter become
1a80: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
1a90: 68 65 20 61 64 64 72 65 73 73 20 6f 66 0a 6c 61  he address of.la
1aa0: 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  st instruction, 
1ab0: 6f 72 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  or until there i
1ac0: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 57 68 65 6e  s an error..When
1ad0: 20 74 68 65 20 62 79 74 65 63 6f 64 65 20 65 6e   the bytecode en
1ae0: 67 69 6e 65 20 68 61 6c 74 73 2c 20 61 6c 6c 20  gine halts, all 
1af0: 6d 65 6d 6f 72 79 0a 74 68 61 74 20 69 74 20 61  memory.that it a
1b00: 6c 6c 6f 63 61 74 65 64 20 69 73 20 72 65 6c 65  llocated is rele
1b10: 61 73 65 64 20 61 6e 64 20 61 6c 6c 20 64 61 74  ased and all dat
1b20: 61 62 61 73 65 20 63 75 72 73 6f 72 73 20 69 74  abase cursors it
1b30: 20 6d 61 79 0a 68 61 76 65 20 68 61 64 20 6f 70   may.have had op
1b40: 65 6e 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 20  en are closed.  
1b50: 49 66 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  If the execution
1b60: 20 73 74 6f 70 70 65 64 20 64 75 65 20 74 6f 20   stopped due to 
1b70: 61 6e 0a 65 72 72 6f 72 2c 20 61 6e 79 20 70 65  an.error, any pe
1b80: 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  nding transactio
1b90: 6e 73 20 61 72 65 20 74 65 72 6d 69 6e 61 74 65  ns are terminate
1ba0: 64 20 61 6e 64 20 63 68 61 6e 67 65 73 20 6d 61  d and changes ma
1bb0: 64 65 0a 74 6f 20 74 68 65 20 64 61 74 61 62 61  de.to the databa
1bc0: 73 65 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  se are rolled ba
1bd0: 63 6b 2e 3c 2f 70 3e 0a 7d 0a 3c 2f 74 63 6c 3e  ck.</p>.}.</tcl>
1be0: 0a 0a 3c 74 63 6c 3e 0a 4c 69 6e 6b 4f 70 63 6f  ..<tcl>.LinkOpco
1bf0: 64 65 4e 61 6d 65 73 20 7b 0a 3c 70 3e 54 68 65  deNames {.<p>The
1c00: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70   OP_ResultRow op
1c10: 63 6f 64 65 20 63 61 75 73 65 73 20 74 68 65 0a  code causes the.
1c20: 62 79 74 65 63 6f 64 65 20 65 6e 67 69 6e 65 20  bytecode engine 
1c30: 74 6f 20 70 61 75 73 65 20 61 6e 64 20 74 68 65  to pause and the
1c40: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 5b   corresponding [
1c50: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 5d 0a  sqlite3_step()].
1c60: 63 61 6c 6c 20 74 6f 20 72 65 74 75 72 6e 20 5b  call to return [
1c70: 53 51 4c 49 54 45 5f 52 4f 57 5d 2e 20 20 42 65  SQLITE_ROW].  Be
1c80: 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 0a 4f 50  fore invoking.OP
1c90: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 74 68 65 20  _ResultRow, the 
1ca0: 62 79 74 65 63 6f 64 65 64 20 70 72 6f 67 72 61  bytecoded progra
1cb0: 6d 20 77 69 6c 6c 0a 68 61 76 65 20 6c 6f 61 64  m will.have load
1cc0: 65 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  ed the results f
1cd0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  or a single row 
1ce0: 6f 66 20 61 20 71 75 65 72 79 20 69 6e 74 6f 20  of a query into 
1cf0: 61 20 73 65 72 69 65 73 0a 6f 66 20 72 65 67 69  a series.of regi
1d00: 73 74 65 72 73 2e 20 20 43 2d 6c 61 6e 67 75 61  sters.  C-langua
1d10: 67 65 20 41 50 49 73 20 73 75 63 68 20 61 73 20  ge APIs such as 
1d20: 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  [sqlite3_column_
1d30: 69 6e 74 28 29 5d 0a 6f 72 20 5b 73 71 6c 69 74  int()].or [sqlit
1d40: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29  e3_column_text()
1d50: 5d 20 65 78 74 72 61 63 74 20 74 68 65 20 71 75  ] extract the qu
1d60: 65 72 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  ery results from
1d70: 20 74 68 6f 73 65 0a 72 65 67 69 73 74 65 72 73   those.registers
1d80: 2e 20 20 54 68 65 20 62 79 74 65 63 6f 64 65 20  .  The bytecode 
1d90: 65 6e 67 69 6e 65 20 72 65 73 75 6d 65 73 20 77  engine resumes w
1da0: 69 74 68 20 74 68 65 20 6e 65 78 74 20 69 6e 73  ith the next ins
1db0: 74 72 75 63 74 69 6f 6e 0a 61 66 74 65 72 20 74  truction.after t
1dc0: 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
1dd0: 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
1de0: 0a 74 6f 20 5b 73 71 6c 69 74 65 33 5f 73 74 65  .to [sqlite3_ste
1df0: 70 28 29 5d 2e 0a 7d 0a 3c 2f 74 63 6c 3e 0a 0a  p()]..}.</tcl>..
1e00: 3c 68 32 3e 52 65 67 69 73 74 65 72 73 3c 2f 68  <h2>Registers</h
1e10: 32 3e 0a 0a 3c 74 63 6c 3e 0a 4c 69 6e 6b 4f 70  2>..<tcl>.LinkOp
1e20: 63 6f 64 65 4e 61 6d 65 73 20 7b 0a 3c 70 3e 45  codeNames {.<p>E
1e30: 76 65 72 79 20 62 79 74 65 63 6f 64 65 20 70 72  very bytecode pr
1e40: 6f 67 72 61 6d 20 68 61 73 20 61 20 66 69 78 65  ogram has a fixe
1e50: 64 20 28 62 75 74 20 70 6f 74 65 6e 74 69 61 6c  d (but potential
1e60: 6c 79 20 6c 61 72 67 65 29 20 6e 75 6d 62 65 72  ly large) number
1e70: 20 6f 66 0a 72 65 67 69 73 74 65 72 73 2e 20 20   of.registers.  
1e80: 41 20 73 69 6e 67 6c 65 20 72 65 67 69 73 74 65  A single registe
1e90: 72 20 63 61 6e 20 68 6f 6c 64 20 61 20 76 61 72  r can hold a var
1ea0: 69 65 74 79 20 6f 66 20 6f 62 6a 65 63 74 73 3a  iety of objects:
1eb0: 0a 3c 75 6c 3e 0a 3c 6c 69 3e 20 41 20 4e 55 4c  .<ul>.<li> A NUL
1ec0: 4c 20 76 61 6c 75 65 0a 3c 6c 69 3e 20 41 20 73  L value.<li> A s
1ed0: 69 67 6e 65 64 20 36 34 2d 62 69 74 20 69 6e 74  igned 64-bit int
1ee0: 65 67 65 72 0a 3c 6c 69 3e 20 41 6e 20 49 45 45  eger.<li> An IEE
1ef0: 45 20 64 6f 75 62 6c 65 2d 70 72 65 63 69 73 69  E double-precisi
1f00: 6f 6e 20 28 36 34 2d 62 69 74 29 20 66 6c 6f 61  on (64-bit) floa
1f10: 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65  ting point numbe
1f20: 72 0a 3c 6c 69 3e 20 41 6e 20 61 72 62 69 74 72  r.<li> An arbitr
1f30: 61 72 79 20 6c 65 6e 67 74 68 20 73 74 72 69 6e  ary length strin
1f40: 67 73 0a 3c 6c 69 3e 20 41 6e 20 61 72 62 69 74  gs.<li> An arbit
1f50: 72 61 72 79 20 6c 65 6e 67 74 68 20 42 4c 4f 42  rary length BLOB
1f60: 0a 3c 6c 69 3e 20 41 20 52 6f 77 53 65 74 20 6f  .<li> A RowSet o
1f70: 62 6a 65 63 74 20 28 53 65 65 20 74 68 65 20 4f  bject (See the O
1f80: 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 4f 50 5f  P_RowSetAdd, OP_
1f90: 52 6f 77 53 65 74 52 65 61 64 2c 20 61 6e 64 0a  RowSetRead, and.
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 4f 50 5f 52 6f 77 53 65 74 54        OP_RowSetT
1fc0: 65 73 74 20 6f 70 63 6f 64 65 73 29 0a 3c 6c 69  est opcodes).<li
1fd0: 3e 20 41 20 46 72 61 6d 65 20 6f 62 6a 65 63 74  > A Frame object
1fe0: 20 28 55 73 65 64 20 62 79 20 5b 73 75 62 70 72   (Used by [subpr
1ff0: 6f 67 72 61 6d 73 5d 20 2d 20 73 65 65 20 4f 50  ograms] - see OP
2000: 5f 50 72 6f 67 72 61 6d 29 0a 3c 2f 75 6c 3e 0a  _Program).</ul>.
2010: 7d 0a 3c 2f 74 63 6c 3e 0a 0a 3c 70 3e 41 20 72  }.</tcl>..<p>A r
2020: 65 67 69 73 74 65 72 20 63 61 6e 20 61 6c 73 6f  egister can also
2030: 20 62 65 20 22 55 6e 64 65 66 69 6e 65 64 22 20   be "Undefined" 
2040: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20  meaning that it 
2050: 68 6f 6c 64 73 20 6e 6f 20 76 61 6c 75 65 0a 61  holds no value.a
2060: 74 20 61 6c 6c 2e 20 20 55 6e 64 65 66 69 6e 65  t all.  Undefine
2070: 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  d is different f
2080: 72 6f 6d 20 4e 55 4c 4c 2e 20 20 44 65 70 65 6e  rom NULL.  Depen
2090: 64 69 6e 67 20 6f 6e 20 63 6f 6d 70 69 6c 65 2d  ding on compile-
20a0: 74 69 6d 65 0a 6f 70 74 69 6f 6e 73 2c 20 61 6e  time.options, an
20b0: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
20c0: 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 20 72 65   an undefined re
20d0: 67 69 73 74 65 72 20 77 69 6c 6c 20 75 73 75 61  gister will usua
20e0: 6c 6c 79 20 63 61 75 73 65 0a 61 20 72 75 6e 2d  lly cause.a run-
20f0: 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 49 66 20  time error.  If 
2100: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
2110: 6f 72 20 28 5b 73 71 6c 69 74 65 33 5f 70 72 65  or ([sqlite3_pre
2120: 70 61 72 65 5f 76 32 28 29 5d 29 0a 65 76 65 72  pare_v2()]).ever
2130: 20 67 65 6e 65 72 61 74 65 73 20 61 20 5b 70 72   generates a [pr
2140: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
2150: 5d 20 74 68 61 74 20 72 65 61 64 73 20 61 6e 20  ] that reads an 
2160: 55 6e 64 65 66 69 6e 65 64 20 72 65 67 69 73 74  Undefined regist
2170: 65 72 2c 0a 74 68 61 74 20 69 73 20 61 20 62 75  er,.that is a bu
2180: 67 20 69 6e 20 74 68 65 20 63 6f 64 65 20 67 65  g in the code ge
2190: 6e 65 72 61 74 6f 72 2e 0a 0a 3c 70 3e 0a 52 65  nerator...<p>.Re
21a0: 67 69 73 74 65 72 73 20 61 72 65 20 6e 75 6d 62  gisters are numb
21b0: 65 72 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77  ered beginning w
21c0: 69 74 68 20 30 2e 0a 4d 6f 73 74 20 6f 70 63 6f  ith 0..Most opco
21d0: 64 65 73 20 72 65 66 65 72 20 74 6f 20 61 74 20  des refer to at 
21e0: 6c 65 61 73 74 20 6f 6e 65 20 72 65 67 69 73 74  least one regist
21f0: 65 72 2e 0a 0a 3c 70 3e 54 68 65 20 6e 75 6d 62  er...<p>The numb
2200: 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
2210: 69 6e 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  in a single prep
2220: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69  ared statement i
2230: 73 20 66 69 78 65 64 0a 61 74 20 63 6f 6d 70 69  s fixed.at compi
2240: 6c 65 2d 74 69 6d 65 2e 20 20 54 68 65 20 63 6f  le-time.  The co
2250: 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 72 65 67  ntent of all reg
2260: 69 73 74 65 72 73 20 69 73 20 63 6c 65 61 72 65  isters is cleare
2270: 64 20 77 68 65 6e 0a 61 20 70 72 65 70 61 72 65  d when.a prepare
2280: 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 5b  d statement is [
2290: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 7c  sqlite3_reset()|
22a0: 72 65 73 65 74 5d 20 6f 72 0a 5b 73 71 6c 69 74  reset] or.[sqlit
22b0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 7c 66 69  e3_finalize()|fi
22c0: 6e 61 6c 69 7a 65 64 5d 2e 0a 0a 3c 70 3e 54 68  nalized]...<p>Th
22d0: 65 20 69 6e 74 65 72 6e 61 6c 20 4d 65 6d 20 6f  e internal Mem o
22e0: 62 6a 65 63 74 20 73 74 6f 72 65 73 20 74 68 65  bject stores the
22f0: 20 76 61 6c 75 65 20 66 6f 72 20 61 20 73 69 6e   value for a sin
2300: 67 6c 65 20 72 65 67 69 73 74 65 72 2e 0a 54 68  gle register..Th
2310: 65 20 61 62 73 74 72 61 63 74 20 5b 73 71 6c 69  e abstract [sqli
2320: 74 65 33 5f 76 61 6c 75 65 5d 20 6f 62 6a 65 63  te3_value] objec
2330: 74 20 74 68 61 74 20 69 73 20 65 78 70 6f 73 65  t that is expose
2340: 64 20 69 6e 20 74 68 65 20 41 50 49 20 69 73 20  d in the API is 
2350: 72 65 61 6c 6c 79 0a 6a 75 73 74 20 61 20 4d 65  really.just a Me
2360: 6d 20 6f 62 6a 65 63 74 20 6f 72 20 72 65 67 69  m object or regi
2370: 73 74 65 72 2e 0a 0a 3c 68 32 3e 42 2d 54 72 65  ster...<h2>B-Tre
2380: 65 20 43 75 72 73 6f 72 73 3c 2f 68 32 3e 0a 0a  e Cursors</h2>..
2390: 3c 74 63 6c 3e 0a 4c 69 6e 6b 4f 70 63 6f 64 65  <tcl>.LinkOpcode
23a0: 4e 61 6d 65 73 20 7b 0a 3c 70 3e 41 20 70 72 65  Names {.<p>A pre
23b0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
23c0: 63 61 6e 20 68 61 76 65 0a 7a 65 72 6f 20 6f 72  can have.zero or
23d0: 20 6d 6f 72 65 20 6f 70 65 6e 20 63 75 72 73 6f   more open curso
23e0: 72 73 2e 20 20 45 61 63 68 20 63 75 72 73 6f 72  rs.  Each cursor
23f0: 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62   is identified b
2400: 79 20 61 0a 73 6d 61 6c 6c 20 69 6e 74 65 67 65  y a.small intege
2410: 72 2c 20 77 68 69 63 68 20 69 73 20 75 73 75 61  r, which is usua
2420: 6c 6c 79 20 74 68 65 20 50 31 20 70 61 72 61 6d  lly the P1 param
2430: 65 74 65 72 20 74 6f 20 74 68 65 20 6f 70 63 6f  eter to the opco
2440: 64 65 0a 74 68 61 74 20 75 73 65 73 20 74 68 65  de.that uses the
2450: 20 63 75 72 73 6f 72 2e 0a 54 68 65 72 65 20 63   cursor..There c
2460: 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 63  an be multiple c
2470: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
2480: 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 6f 72  he same index or
2490: 20 74 61 62 6c 65 2e 0a 41 6c 6c 20 63 75 72 73   table..All curs
24a0: 6f 72 73 20 6f 70 65 72 61 74 65 20 69 6e 64 65  ors operate inde
24b0: 70 65 6e 64 65 6e 74 6c 79 2c 20 65 76 65 6e 20  pendently, even 
24c0: 63 75 72 73 6f 72 73 20 70 6f 69 6e 74 69 6e 67  cursors pointing
24d0: 20 74 6f 20 74 68 65 20 73 61 6d 65 0a 69 6e 64   to the same.ind
24e0: 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 2e 0a  ices or tables..
24f0: 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72  The only way for
2500: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
2510: 68 69 6e 65 20 74 6f 20 69 6e 74 65 72 61 63 74  hine to interact
2520: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
2530: 0a 66 69 6c 65 20 69 73 20 74 68 72 6f 75 67 68  .file is through
2540: 20 61 20 63 75 72 73 6f 72 2e 0a 49 6e 73 74 72   a cursor..Instr
2550: 75 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 76  uctions in the v
2560: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 63  irtual machine c
2570: 61 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  an create a new 
2580: 63 75 72 73 6f 72 20 0a 28 65 78 3a 20 4f 50 5f  cursor .(ex: OP_
2590: 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f  OpenRead or OP_O
25a0: 70 65 6e 57 72 69 74 65 29 2c 0a 72 65 61 64 20  penWrite),.read 
25b0: 64 61 74 61 20 66 72 6f 6d 20 61 20 63 75 72 73  data from a curs
25c0: 6f 72 20 28 4f 50 5f 43 6f 6c 75 6d 6e 29 2c 0a  or (OP_Column),.
25d0: 61 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  advance the curs
25e0: 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
25f0: 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2600: 65 0a 28 65 78 3a 20 4f 50 5f 4e 65 78 74 20 6f  e.(ex: OP_Next o
2610: 72 20 4f 50 5f 50 72 65 76 29 2c 20 61 6e 64 20  r OP_Prev), and 
2620: 73 6f 20 66 6f 72 74 68 2e 0a 41 6c 6c 20 63 75  so forth..All cu
2630: 72 73 6f 72 73 20 61 72 65 20 61 75 74 6f 6d 61  rsors are automa
2640: 74 69 63 61 6c 6c 79 0a 63 6c 6f 73 65 64 20 77  tically.closed w
2650: 68 65 6e 20 74 68 65 20 70 72 65 70 61 72 65 64  hen the prepared
2660: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 5b 73   statement is [s
2670: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 7c 72  qlite3_reset()|r
2680: 65 73 65 74 5d 20 6f 72 0a 5b 73 71 6c 69 74 65  eset] or.[sqlite
2690: 33 5f 66 69 6e 61 6c 69 7a 65 28 29 7c 66 69 6e  3_finalize()|fin
26a0: 61 6c 69 7a 65 64 5d 2e 0a 7d 0a 3c 2f 74 63 6c  alized]..}.</tcl
26b0: 3e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  >..<tcl>hd_fragm
26c0: 65 6e 74 20 73 75 62 70 72 6f 67 20 73 75 62 70  ent subprog subp
26d0: 72 6f 67 72 61 6d 73 3c 2f 74 63 6c 3e 0a 3c 68  rograms</tcl>.<h
26e0: 32 3e 53 75 62 72 6f 75 74 69 6e 65 73 2c 20 43  2>Subroutines, C
26f0: 6f 72 6f 75 74 69 6e 65 73 2c 20 61 6e 64 20 53  oroutines, and S
2700: 75 62 70 72 6f 67 72 61 6d 73 3c 2f 68 32 3e 0a  ubprograms</h2>.
2710: 0a 3c 70 3e 54 68 65 20 62 79 74 65 63 6f 64 65  .<p>The bytecode
2720: 20 65 6e 67 69 6e 65 20 68 61 73 20 6e 6f 20 73   engine has no s
2730: 74 61 63 6b 20 6f 6e 20 77 68 69 63 68 20 74 6f  tack on which to
2740: 20 73 74 6f 72 65 20 74 68 65 20 72 65 74 75 72   store the retur
2750: 6e 20 61 64 64 72 65 73 73 0a 6f 66 20 61 20 73  n address.of a s
2760: 75 62 72 6f 75 74 69 6e 65 2e 20 20 52 65 74 75  ubroutine.  Retu
2770: 72 6e 20 61 64 64 72 65 73 73 65 73 20 6d 75 73  rn addresses mus
2780: 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 72  t be stored in r
2790: 65 67 69 73 74 65 72 73 2e 0a 48 65 6e 63 65 2c  egisters..Hence,
27a0: 20 62 79 74 65 63 6f 64 65 20 73 75 62 72 6f 75   bytecode subrou
27b0: 74 69 6e 65 73 20 61 72 65 20 6e 6f 74 20 72 65  tines are not re
27c0: 65 6e 74 72 61 6e 74 2e 0a 0a 3c 74 63 6c 3e 0a  entrant...<tcl>.
27d0: 4c 69 6e 6b 4f 70 63 6f 64 65 4e 61 6d 65 73 20  LinkOpcodeNames 
27e0: 7b 0a 3c 70 3e 54 68 65 20 4f 50 5f 47 6f 73 75  {.<p>The OP_Gosu
27f0: 62 20 6f 70 63 6f 64 65 20 73 74 6f 72 65 73 20  b opcode stores 
2800: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 67  the current prog
2810: 72 61 6d 20 63 6f 75 6e 74 65 72 20 69 6e 74 6f  ram counter into
2820: 0a 72 65 67 69 73 74 65 72 20 50 31 20 74 68 65  .register P1 the
2830: 6e 20 6a 75 6d 70 73 20 74 6f 20 61 64 64 72 65  n jumps to addre
2840: 73 73 20 50 32 2e 20 20 54 68 65 20 4f 50 5f 52  ss P2.  The OP_R
2850: 65 74 75 72 6e 20 6f 70 63 6f 64 65 20 6a 75 6d  eturn opcode jum
2860: 70 73 0a 74 6f 20 61 64 64 72 65 73 73 20 50 31  ps.to address P1
2870: 2b 31 2e 20 20 48 65 6e 63 65 2c 20 65 76 65 72  +1.  Hence, ever
2880: 79 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  y subroutine is 
2890: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
28a0: 74 77 6f 20 69 6e 74 65 67 65 72 73 3a 0a 74 68  two integers:.th
28b0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
28c0: 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 6e 20   entry point in 
28d0: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 61  the subroutine a
28e0: 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20  nd the register 
28f0: 6e 75 6d 62 65 72 0a 74 68 61 74 20 69 73 20 75  number.that is u
2900: 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  sed to hold the 
2910: 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
2920: 0a 3c 70 3e 54 68 65 20 4f 50 5f 59 69 65 6c 64  .<p>The OP_Yield
2930: 20 6f 70 63 6f 64 65 20 73 77 61 70 73 20 74 68   opcode swaps th
2940: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70  e value of the p
2950: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 77  rogram counter w
2960: 69 74 68 0a 74 68 65 20 69 6e 74 65 67 65 72 20  ith.the integer 
2970: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
2980: 72 20 50 31 2e 20 20 54 68 69 73 20 6f 70 63 6f  r P1.  This opco
2990: 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  de is used to im
29a0: 70 6c 65 6d 65 6e 74 0a 63 6f 72 6f 75 74 69 6e  plement.coroutin
29b0: 65 73 2e 20 20 43 6f 72 6f 75 74 69 6e 65 73 20  es.  Coroutines 
29c0: 61 72 65 20 6f 66 74 65 6e 20 75 73 65 64 20 74  are often used t
29d0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 75 62 71  o implement subq
29e0: 75 65 72 69 65 73 20 66 72 6f 6d 0a 77 68 69 63  ueries from.whic
29f0: 68 20 63 6f 6e 74 65 6e 74 20 69 73 20 70 75 6c  h content is pul
2a00: 6c 65 64 20 6f 6e 20 61 6e 20 61 73 2d 6e 65 65  led on an as-nee
2a10: 64 65 64 20 62 61 73 69 73 2e 0a 7d 0a 3c 2f 74  ded basis..}.</t
2a20: 63 6c 3e 0a 0a 3c 70 3e 5b 43 52 45 41 54 45 20  cl>..<p>[CREATE 
2a30: 54 52 49 47 47 45 52 7c 54 72 69 67 67 65 72 73  TRIGGER|Triggers
2a40: 5d 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 65  ] need to be ree
2a50: 6e 74 72 61 6e 74 2e 0a 0a 3c 74 63 6c 3e 0a 4c  ntrant...<tcl>.L
2a60: 69 6e 6b 4f 70 63 6f 64 65 4e 61 6d 65 73 20 7b  inkOpcodeNames {
2a70: 0a 53 69 6e 63 65 20 62 79 74 65 63 6f 64 65 0a  .Since bytecode.
2a80: 73 75 62 72 6f 75 74 69 6e 65 73 20 61 72 65 20  subroutines are 
2a90: 6e 6f 74 20 72 65 65 6e 74 72 61 6e 74 20 61 20  not reentrant a 
2aa0: 64 69 66 66 65 72 65 6e 74 20 6d 65 63 68 61 6e  different mechan
2ab0: 69 73 6d 20 6d 75 73 74 20 62 65 20 75 73 65 64  ism must be used
2ac0: 20 74 6f 0a 69 6d 70 6c 65 6d 65 6e 74 20 74 72   to.implement tr
2ad0: 69 67 67 65 72 73 2e 20 20 45 61 63 68 20 74 72  iggers.  Each tr
2ae0: 69 67 67 65 72 20 69 73 20 69 6d 70 6c 65 6d 65  igger is impleme
2af0: 6e 74 65 64 20 75 73 69 6e 67 20 61 20 73 65 70  nted using a sep
2b00: 61 72 61 74 65 20 62 79 74 65 63 6f 64 65 0a 70  arate bytecode.p
2b10: 72 6f 67 72 61 6d 20 77 69 74 68 20 69 74 73 20  rogram with its 
2b20: 6f 77 6e 20 6f 70 63 6f 64 65 73 2c 20 70 72 6f  own opcodes, pro
2b30: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2c 20 61 6e  gram counter, an
2b40: 64 20 72 65 67 69 73 74 65 72 20 73 65 74 2e 20  d register set. 
2b50: 20 54 68 65 0a 4f 50 5f 50 72 6f 67 72 61 6d 20   The.OP_Program 
2b60: 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74  opcode invokes t
2b70: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
2b80: 6f 67 72 61 6d 2e 20 20 54 68 65 20 4f 50 5f 50  ogram.  The OP_P
2b90: 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69  rogram instructi
2ba0: 6f 6e 0a 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  on.allocates and
2bb0: 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 20 66   initializes a f
2bc0: 72 65 73 68 20 72 65 67 69 73 74 65 72 20 73 65  resh register se
2bd0: 74 20 66 6f 72 20 65 61 63 68 20 69 6e 76 6f 63  t for each invoc
2be0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 73 75 62  ation of the.sub
2bf0: 70 72 6f 67 72 61 6d 2c 20 73 6f 20 73 75 62 70  program, so subp
2c00: 72 6f 67 72 61 6d 73 20 63 61 6e 20 62 65 20 72  rograms can be r
2c10: 65 65 6e 74 72 61 6e 74 20 61 6e 64 20 72 65 63  eentrant and rec
2c20: 75 72 73 69 76 65 2e 20 20 54 68 65 0a 4f 50 5f  ursive.  The.OP_
2c30: 50 61 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  Param opcode is 
2c40: 75 73 65 64 20 62 79 20 73 75 62 70 72 6f 67 72  used by subprogr
2c50: 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20 63 6f  ams to access co
2c60: 6e 74 65 6e 74 20 69 6e 20 72 65 67 69 73 74 65  ntent in registe
2c70: 72 73 0a 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e  rs.of the callin
2c80: 67 20 62 79 74 65 63 6f 64 65 20 70 72 6f 67 72  g bytecode progr
2c90: 61 6d 2e 0a 7d 0a 3c 2f 74 63 6c 3e 0a 0a 3c 68  am..}.</tcl>..<h
2ca0: 32 3e 53 65 6c 66 2d 41 6c 74 65 72 69 6e 67 20  2>Self-Altering 
2cb0: 43 6f 64 65 3c 2f 68 32 3e 0a 0a 3c 74 63 6c 3e  Code</h2>..<tcl>
2cc0: 0a 4c 69 6e 6b 4f 70 63 6f 64 65 4e 61 6d 65 73  .LinkOpcodeNames
2cd0: 20 7b 0a 3c 70 3e 53 6f 6d 65 20 6f 70 63 6f 64   {.<p>Some opcod
2ce0: 65 73 20 61 72 65 20 73 65 6c 66 2d 61 6c 74 65  es are self-alte
2cf0: 72 69 6e 67 2e 0a 46 6f 72 20 65 78 61 6d 70 6c  ring..For exampl
2d00: 65 2c 20 74 68 65 20 4f 50 5f 49 6e 69 74 20 6f  e, the OP_Init o
2d10: 70 63 6f 64 65 20 28 77 68 69 63 68 20 69 73 20  pcode (which is 
2d20: 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
2d30: 20 6f 70 63 6f 64 65 0a 72 75 6e 20 61 20 62 79   opcode.run a by
2d40: 74 65 63 6f 64 65 20 70 72 6f 67 72 61 6d 29 20  tecode program) 
2d50: 69 6e 63 72 65 6d 65 6e 74 73 20 69 74 73 20 50  increments its P
2d60: 31 20 6f 70 65 72 61 6e 64 2e 20 20 53 75 62 73  1 operand.  Subs
2d70: 65 71 75 65 6e 74 0a 4f 50 5f 4f 6e 63 65 20 6f  equent.OP_Once o
2d80: 70 63 6f 64 65 73 20 63 6f 6d 70 61 72 65 20 74  pcodes compare t
2d90: 68 65 69 72 20 50 31 20 6f 70 65 72 61 6e 64 73  heir P1 operands
2da0: 20 74 6f 20 74 68 65 20 50 31 20 76 61 6c 75 65   to the P1 value
2db0: 20 66 6f 72 0a 74 68 65 20 4f 50 5f 49 6e 69 74   for.the OP_Init
2dc0: 20 6f 70 63 6f 64 65 20 69 6e 20 6f 72 64 65 72   opcode in order
2dd0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2de0: 20 74 68 65 20 6f 6e 65 2d 74 69 6d 65 20 69 6e   the one-time in
2df0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 63 6f 64  itialization.cod
2e00: 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 73  e that follows s
2e10: 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64  hould be skipped
2e20: 2e 0a 41 6e 6f 74 68 65 72 20 65 78 61 6d 70 6c  ..Another exampl
2e30: 65 20 69 73 20 74 68 65 20 4f 50 5f 53 74 72 69  e is the OP_Stri
2e40: 6e 67 38 20 6f 70 63 6f 64 65 20 77 68 69 63 68  ng8 opcode which
2e50: 20 63 6f 6e 76 65 72 74 73 20 69 74 73 20 50 34   converts its P4
2e60: 0a 6f 70 65 72 61 6e 64 20 66 72 6f 6d 20 55 54  .operand from UT
2e70: 46 2d 38 20 69 6e 74 6f 20 74 68 65 20 63 6f 72  F-8 into the cor
2e80: 72 65 63 74 20 64 61 74 61 62 61 73 65 20 73 74  rect database st
2e90: 72 69 6e 67 20 65 6e 63 6f 64 69 6e 67 2c 20 74  ring encoding, t
2ea0: 68 65 6e 0a 63 6f 6e 76 65 72 74 73 20 69 74 73  hen.converts its
2eb0: 65 6c 66 20 69 6e 74 6f 20 61 20 4f 50 5f 53 74  elf into a OP_St
2ec0: 72 69 6e 67 20 6f 70 63 6f 64 65 2e 0a 7d 0a 3c  ring opcode..}.<
2ed0: 2f 74 63 6c 3e 0a 0a 0a 3c 68 31 3e 56 69 65 77  /tcl>...<h1>View
2ee0: 69 6e 67 20 54 68 65 20 42 79 74 65 63 6f 64 65  ing The Bytecode
2ef0: 3c 2f 68 31 3e 0a 0a 3c 70 3e 45 76 65 72 79 20  </h1>..<p>Every 
2f00: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
2f10: 61 74 20 53 51 4c 69 74 65 20 69 6e 74 65 72 70  at SQLite interp
2f20: 72 65 74 73 20 72 65 73 75 6c 74 73 20 69 6e 20  rets results in 
2f30: 61 20 70 72 6f 67 72 61 6d 0a 66 6f 72 20 74 68  a program.for th
2f40: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
2f50: 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 53  e.  But if the S
2f60: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67  QL statement beg
2f70: 69 6e 73 20 77 69 74 68 0a 74 68 65 20 6b 65 79  ins with.the key
2f80: 77 6f 72 64 20 5b 45 58 50 4c 41 49 4e 5d 20 74  word [EXPLAIN] t
2f90: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
2fa0: 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 65 78 65 63  ne will not exec
2fb0: 75 74 65 20 74 68 65 0a 70 72 6f 67 72 61 6d 2e  ute the.program.
2fc0: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
2fd0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 6f 66 20 74  nstructions of t
2fe0: 68 65 20 70 72 6f 67 72 61 6d 20 77 69 6c 6c 20  he program will 
2ff0: 62 65 20 72 65 74 75 72 6e 65 64 2c 0a 6f 6e 65  be returned,.one
3000: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 70 65 72   instruction per
3010: 20 72 6f 77 2c 0a 6c 69 6b 65 20 61 20 71 75 65   row,.like a que
3020: 72 79 20 72 65 73 75 6c 74 2e 20 20 54 68 69 73  ry result.  This
3030: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 66   feature is usef
3040: 75 6c 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ul for debugging
3050: 20 61 6e 64 0a 66 6f 72 20 6c 65 61 72 6e 69 6e   and.for learnin
3060: 67 20 68 6f 77 20 74 68 65 20 76 69 72 74 75 61  g how the virtua
3070: 6c 20 6d 61 63 68 69 6e 65 20 6f 70 65 72 61 74  l machine operat
3080: 65 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  es.  For example
3090: 3a 0a 3c 2f 70 3e 0a 0a 3c 74 63 6c 3e 0a 70 72  :.</p>..<tcl>.pr
30a0: 6f 63 20 43 6f 64 65 20 7b 62 6f 64 79 7d 20 7b  oc Code {body} {
30b0: 0a 20 20 68 64 5f 70 75 74 73 20 7b 3c 62 6c 6f  .  hd_puts {<blo
30c0: 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 7d 0a 20  ckquote><pre>}. 
30d0: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 26 7d   regsub -all {&}
30e0: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 62   [string trim $b
30f0: 6f 64 79 5d 20 7b 5c 26 61 6d 70 3b 7d 20 62 6f  ody] {\&amp;} bo
3100: 64 79 0a 20 20 72 65 67 73 75 62 20 2d 61 6c 6c  dy.  regsub -all
3110: 20 7b 3e 7d 20 24 62 6f 64 79 20 7b 5c 26 67 74   {>} $body {\&gt
3120: 3b 7d 20 62 6f 64 79 0a 20 20 72 65 67 73 75 62  ;} body.  regsub
3130: 20 2d 61 6c 6c 20 7b 3c 7d 20 24 62 6f 64 79 20   -all {<} $body 
3140: 7b 5c 26 6c 74 3b 7d 20 62 6f 64 79 0a 20 20 72  {\&lt;} body.  r
3150: 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5c 28 5c 28  egsub -all {\(\(
3160: 5c 28 7d 20 24 62 6f 64 79 20 7b 3c 62 3e 7d 20  \(} $body {<b>} 
3170: 62 6f 64 79 0a 20 20 72 65 67 73 75 62 20 2d 61  body.  regsub -a
3180: 6c 6c 20 7b 5c 29 5c 29 5c 29 7d 20 24 62 6f 64  ll {\)\)\)} $bod
3190: 79 20 7b 3c 2f 62 3e 7d 20 62 6f 64 79 0a 20 20  y {</b>} body.  
31a0: 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 20 7d 20  regsub -all { } 
31b0: 24 62 6f 64 79 20 7b 5c 26 6e 62 73 70 3b 7d 20  $body {\&nbsp;} 
31c0: 62 6f 64 79 0a 20 20 68 64 5f 70 75 74 73 20 24  body.  hd_puts $
31d0: 62 6f 64 79 0a 20 20 68 64 5f 70 75 74 73 20 7b  body.  hd_puts {
31e0: 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f  </pre></blockquo
31f0: 74 65 3e 7d 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 24  te>}.}..Code {.$
3200: 20 28 28 28 73 71 6c 69 74 65 33 20 65 78 31 2e   (((sqlite3 ex1.
3210: 64 62 29 29 29 0a 73 71 6c 69 74 65 3e 20 28 28  db))).sqlite> ((
3220: 28 65 78 70 6c 61 69 6e 20 64 65 6c 65 74 65 20  (explain delete 
3230: 66 72 6f 6d 20 74 62 6c 31 20 77 68 65 72 65 20  from tbl1 where 
3240: 74 77 6f 3c 32 30 3b 29 29 29 0a 61 64 64 72 20  two<20;))).addr 
3250: 20 6f 70 63 6f 64 65 20 20 20 20 20 20 20 20 20   opcode         
3260: 70 31 20 20 20 20 70 32 20 20 20 20 70 33 20 20  p1    p2    p3  
3270: 20 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20    p4            
3280: 20 70 35 20 20 63 6f 6d 6d 65 6e 74 20 20 20 20   p5  comment    
3290: 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d    .----  -------
32a0: 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 20 20 2d 2d  ------  ----  --
32b0: 2d 2d 20 20 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --  ----  ------
32c0: 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 20 20 2d 2d 2d  -------  --  ---
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20  ----------.0    
32e0: 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20   Init           
32f0: 30 20 20 20 20 20 31 32 20 20 20 20 30 20 20 20  0     12    0   
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3310: 20 30 30 20 20 53 74 61 72 74 20 61 74 20 31 32   00  Start at 12
3320: 20 20 0a 31 20 20 20 20 20 4e 75 6c 6c 20 20 20    .1     Null   
3330: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 31 20          0     1 
3340: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
3350: 20 20 20 20 20 20 20 20 20 30 30 20 20 72 5b 31           00  r[1
3360: 5d 3d 4e 55 4c 4c 20 20 20 20 0a 32 20 20 20 20  ]=NULL    .2    
3370: 20 4f 70 65 6e 57 72 69 74 65 20 20 20 20 20 20   OpenWrite      
3380: 30 20 20 20 20 20 32 20 20 20 20 20 30 20 20 20  0     2     0   
3390: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
33a0: 20 30 30 20 20 72 6f 6f 74 3d 32 20 69 44 62 3d   00  root=2 iDb=
33b0: 30 3b 20 74 62 6c 31 0a 33 20 20 20 20 20 52 65  0; tbl1.3     Re
33c0: 77 69 6e 64 20 20 20 20 20 20 20 20 20 30 20 20  wind         0  
33d0: 20 20 20 31 30 20 20 20 20 30 20 20 20 20 20 20     10    0      
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 30                00
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
3400: 34 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 20  4       Column  
3410: 20 20 20 20 20 20 20 30 20 20 20 20 20 31 20 20         0     1  
3420: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
3430: 20 20 20 20 20 20 20 20 30 30 20 20 72 5b 32 5d          00  r[2]
3440: 3d 74 62 6c 31 2e 74 77 6f 0a 35 20 20 20 20 20  =tbl1.two.5     
3450: 20 20 47 65 20 20 20 20 20 20 20 20 20 20 20 20    Ge            
3460: 20 33 20 20 20 20 20 39 20 20 20 20 20 32 20 20   3     9     2  
3470: 20 20 20 28 42 49 4e 41 52 59 29 20 20 20 20 20     (BINARY)     
3480: 20 20 35 31 20 20 69 66 20 72 5b 32 5d 3e 3d 72    51  if r[2]>=r
3490: 5b 33 5d 20 67 6f 74 6f 20 39 0a 36 20 20 20 20  [3] goto 9.6    
34a0: 20 20 20 52 6f 77 69 64 20 20 20 20 20 20 20 20     Rowid        
34b0: 20 20 30 20 20 20 20 20 34 20 20 20 20 20 30 20    0     4     0 
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 20 30 30 20 20 72 5b 34 5d 3d 72 6f 77 69     00  r[4]=rowi
34e0: 64 20 20 20 0a 37 20 20 20 20 20 20 20 4f 6e 63  d   .7       Onc
34f0: 65 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20  e           0   
3500: 20 20 38 20 20 20 20 20 30 20 20 20 20 20 20 20    8     0       
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 30 20               00 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 38                .8
3530: 20 20 20 20 20 20 20 44 65 6c 65 74 65 20 20 20         Delete   
3540: 20 20 20 20 20 20 30 20 20 20 20 20 31 20 20 20        0     1   
3550: 20 20 30 20 20 20 20 20 74 62 6c 31 20 20 20 20    0     tbl1    
3560: 20 20 20 20 20 20 20 30 32 20 20 20 20 20 20 20         02       
3570: 20 20 20 20 20 20 20 20 0a 39 20 20 20 20 20 4e          .9     N
3580: 65 78 74 20 20 20 20 20 20 20 20 20 20 20 30 20  ext           0 
3590: 20 20 20 20 34 20 20 20 20 20 30 20 20 20 20 20      4     0     
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
35b0: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
35c0: 0a 31 30 20 20 20 20 4e 6f 6f 70 20 20 20 20 20  .10    Noop     
35d0: 20 20 20 20 20 20 30 20 20 20 20 20 30 20 20 20        0     0   
35e0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
35f0: 20 20 20 20 20 20 20 30 30 20 20 20 20 20 20 20         00       
3600: 20 20 20 20 20 20 20 20 0a 31 31 20 20 20 20 48          .11    H
3610: 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 30 20  alt           0 
3620: 20 20 20 20 30 20 20 20 20 20 30 20 20 20 20 20      0     0     
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3640: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
3650: 0a 31 32 20 20 20 20 54 72 61 6e 73 61 63 74 69  .12    Transacti
3660: 6f 6e 20 20 20 20 30 20 20 20 20 20 31 20 20 20  on    0     1   
3670: 20 20 31 20 20 20 20 20 30 20 20 20 20 20 20 20    1     0       
3680: 20 20 20 20 20 20 20 30 31 20 20 75 73 65 73 53         01  usesS
3690: 74 6d 74 4a 6f 75 72 6e 61 6c 3d 30 0a 31 33 20  tmtJournal=0.13 
36a0: 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 20 20 20     TableLock    
36b0: 20 20 30 20 20 20 20 20 32 20 20 20 20 20 31 20    0     2     1 
36c0: 20 20 20 20 74 62 6c 31 20 20 20 20 20 20 20 20      tbl1        
36d0: 20 20 20 30 30 20 20 69 44 62 3d 30 20 72 6f 6f     00  iDb=0 roo
36e0: 74 3d 32 20 77 72 69 74 65 3d 31 0a 31 34 20 20  t=2 write=1.14  
36f0: 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20    Integer       
3700: 20 32 30 20 20 20 20 33 20 20 20 20 20 30 20 20   20    3     0  
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 30 30 20 20 72 5b 33 5d 3d 32 30 20 20 20    00  r[3]=20   
3730: 20 20 20 0a 31 35 20 20 20 20 47 6f 74 6f 20 20     .15    Goto  
3740: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 31           0     1
3750: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
3760: 20 20 20 20 20 20 20 20 20 20 30 30 20 20 20 20            00    
3770: 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 3c 2f             .}.</
3780: 74 63 6c 3e 0a 0a 3c 70 3e 41 6e 79 20 61 70 70  tcl>..<p>Any app
3790: 6c 69 63 61 74 69 6f 6e 20 63 61 6e 20 72 75 6e  lication can run
37a0: 20 61 6e 20 5b 45 58 50 4c 41 49 4e 5d 20 71 75   an [EXPLAIN] qu
37b0: 65 72 79 20 74 6f 20 67 65 74 20 6f 75 74 70 75  ery to get outpu
37c0: 74 20 73 69 6d 69 6c 61 72 20 74 6f 20 0a 74 68  t similar to .th
37d0: 65 20 61 62 6f 76 65 2e 0a 48 6f 77 65 76 65 72  e above..However
37e0: 2c 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 74 6f  , indentation to
37f0: 20 73 68 6f 77 20 74 68 65 20 6c 6f 6f 70 20 73   show the loop s
3800: 74 72 75 63 74 75 72 65 20 69 73 20 6e 6f 74 20  tructure is not 
3810: 67 65 6e 65 72 61 74 65 64 0a 62 79 20 74 68 65  generated.by the
3820: 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 20 20 54   SQLite core.  T
3830: 68 65 20 5b 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  he [command-line
3840: 20 73 68 65 6c 6c 5d 20 63 6f 6e 74 61 69 6e 73   shell] contains
3850: 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 66 6f 72   extra logic.for
3860: 20 69 6e 64 65 6e 74 69 6e 67 20 6c 6f 6f 70 73   indenting loops
3870: 2e 0a 41 6c 73 6f 2c 20 74 68 65 20 22 63 6f 6d  ..Also, the "com
3880: 6d 65 6e 74 22 20 63 6f 6c 75 6d 6e 20 69 6e 20  ment" column in 
3890: 74 68 65 20 5b 45 58 50 4c 41 49 4e 5d 20 6f 75  the [EXPLAIN] ou
38a0: 74 70 75 74 0a 69 73 20 6f 6e 6c 79 20 70 72 6f  tput.is only pro
38b0: 76 69 64 65 64 20 69 66 20 53 51 4c 69 74 65 20  vided if SQLite 
38c0: 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  is compiled with
38d0: 20 74 68 65 0a 5b 2d 44 53 51 4c 49 54 45 5f 45   the.[-DSQLITE_E
38e0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
38f0: 4d 4d 45 4e 54 53 5d 20 6f 70 74 69 6f 6e 73 2e  MMENTS] options.
3900: 0a 0a 3c 70 3e 57 68 65 6e 20 53 51 4c 69 74 65  ..<p>When SQLite
3910: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
3920: 68 20 74 68 65 20 5b 53 51 4c 49 54 45 5f 44 45  h the [SQLITE_DE
3930: 42 55 47 5d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  BUG] compile-tim
3940: 65 20 6f 70 74 69 6f 6e 2c 0a 65 78 74 72 61 20  e option,.extra 
3950: 5b 50 52 41 47 4d 41 5d 20 63 6f 6d 6d 61 6e 64  [PRAGMA] command
3960: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
3970: 74 68 61 74 20 61 72 65 20 75 73 65 66 75 6c 20  that are useful 
3980: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 6e  for debugging an
3990: 64 0a 66 6f 72 20 65 78 70 6c 6f 72 69 6e 67 20  d.for exploring 
39a0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  the operation of
39b0: 20 74 68 65 20 56 44 42 45 2e 20 20 46 6f 72 20   the VDBE.  For 
39c0: 65 78 61 6d 70 6c 65 20 74 68 65 20 5b 76 64 62  example the [vdb
39d0: 65 5f 74 72 61 63 65 5d 0a 70 72 61 67 6d 61 20  e_trace].pragma 
39e0: 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 74  can be enabled t
39f0: 6f 20 63 61 75 73 65 20 61 20 64 69 73 61 73 73  o cause a disass
3a00: 65 6d 62 6c 79 20 6f 66 20 65 61 63 68 20 56 44  embly of each VD
3a10: 42 45 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 0a  BE opcode to be.
3a20: 70 72 69 6e 74 65 64 20 6f 6e 20 73 74 61 6e 64  printed on stand
3a30: 61 72 64 20 6f 75 74 70 75 74 20 61 73 20 74 68  ard output as th
3a40: 65 20 6f 70 63 6f 64 65 20 69 73 20 65 78 65 63  e opcode is exec
3a50: 75 74 65 64 2e 20 20 54 68 65 73 65 20 64 65 62  uted.  These deb
3a60: 75 67 67 69 6e 67 0a 70 72 61 67 6d 61 73 20 69  ugging.pragmas i
3a70: 6e 63 6c 75 64 65 3a 0a 3c 75 6c 3e 0a 3c 6c 69  nclude:.<ul>.<li
3a80: 3e 20 5b 50 52 41 47 4d 41 20 70 61 72 73 65 72  > [PRAGMA parser
3a90: 5f 74 72 61 63 65 5d 0a 3c 6c 69 3e 20 5b 50 52  _trace].<li> [PR
3aa0: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
3ab0: 72 61 63 65 5d 0a 3c 6c 69 3e 20 5b 50 52 41 47  race].<li> [PRAG
3ac0: 4d 41 20 76 64 62 65 5f 64 65 62 75 67 5d 0a 3c  MA vdbe_debug].<
3ad0: 6c 69 3e 20 5b 50 52 41 47 4d 41 20 76 64 62 65  li> [PRAGMA vdbe
3ae0: 5f 6c 69 73 74 69 6e 67 5d 0a 3c 6c 69 3e 20 5b  _listing].<li> [
3af0: 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72 61 63  PRAGMA vdbe_trac
3b00: 65 5d 0a 3c 2f 75 6c 3e 0a 3c 2f 70 3e 0a 0a 3c  e].</ul>.</p>..<
3b10: 68 31 3e 54 68 65 20 4f 70 63 6f 64 65 73 3c 2f  h1>The Opcodes</
3b20: 68 31 3e 0a 0a 3c 70 3e 54 68 65 72 65 20 61 72  h1>..<p>There ar
3b30: 65 20 63 75 72 72 65 6e 74 6c 79 20 3c 74 63 6c  e currently <tcl
3b40: 3e 68 64 5f 70 75 74 73 20 5b 6c 6c 65 6e 67 74  >hd_puts [llengt
3b50: 68 20 24 4f 70 63 6f 64 65 4c 69 73 74 5d 3c 2f  h $OpcodeList]</
3b60: 74 63 6c 3e 0a 6f 70 63 6f 64 65 73 20 64 65 66  tcl>.opcodes def
3b70: 69 6e 65 64 20 62 79 20 74 68 65 20 76 69 72 74  ined by the virt
3b80: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 41 6c 6c  ual machine..All
3b90: 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
3ba0: 65 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20 64  ed opcodes are d
3bb0: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
3bc0: 74 61 62 6c 65 20 62 65 6c 6f 77 2e 0a 54 68 69  table below..Thi
3bd0: 73 20 74 61 62 6c 65 20 77 61 73 20 67 65 6e 65  s table was gene
3be0: 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  rated automatica
3bf0: 6c 6c 79 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  lly by scanning 
3c00: 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 0a  the source code.
3c10: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 0a 3c 74  from the file.<t
3c20: 63 6c 3e 0a 69 66 20 7b 24 75 75 69 64 3d 3d 22  cl>.if {$uuid=="
3c30: 22 7d 20 7b 0a 20 20 68 64 5f 70 75 74 73 20 22  "} {.  hd_puts "
3c40: 3c 62 3e 76 64 62 65 2e 63 3c 2f 62 3e 2e 5c 6e  <b>vdbe.c</b>.\n
3c50: 22 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 68 64 5f  ".} else {.  hd_
3c60: 70 75 74 73 20 22 3c 61 20 68 72 65 66 3d 5c 22  puts "<a href=\"
3c70: 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
3c80: 65 2e 6f 72 67 2f 73 72 63 2f 61 72 74 69 66 61  e.org/src/artifa
3c90: 63 74 2f 24 75 75 69 64 5c 22 3e 76 64 62 65 2e  ct/$uuid\">vdbe.
3ca0: 63 3c 2f 61 3e 2e 5c 6e 22 0a 7d 0a 3c 2f 74 63  c</a>.\n".}.</tc
3cb0: 6c 3e 0a 0a 3c 70 3e 52 65 6d 65 6d 62 65 72 3a  l>..<p>Remember:
3cc0: 20 54 68 65 20 56 44 42 45 20 6f 70 63 6f 64 65   The VDBE opcode
3cd0: 73 20 61 72 65 20 3c 75 3e 6e 6f 74 3c 2f 75 3e  s are <u>not</u>
3ce0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 74   part of the int
3cf0: 65 72 66 61 63 65 20 0a 64 65 66 69 6e 69 74 69  erface .definiti
3d00: 6f 6e 20 66 6f 72 20 53 51 4c 69 74 65 2e 20 20  on for SQLite.  
3d10: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 70  The number of op
3d20: 63 6f 64 65 73 20 61 6e 64 20 74 68 65 69 72 20  codes and their 
3d30: 6e 61 6d 65 73 20 61 6e 64 20 6d 65 61 6e 69 6e  names and meanin
3d40: 67 73 0a 63 68 61 6e 67 65 20 66 72 6f 6d 20 6f  gs.change from o
3d50: 6e 65 20 72 65 6c 65 61 73 65 20 6f 66 20 53 51  ne release of SQ
3d60: 4c 69 74 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Lite to the next
3d70: 2e 0a 54 68 65 20 6f 70 63 6f 64 65 73 20 73 68  ..The opcodes sh
3d80: 6f 77 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  own in the table
3d90: 20 62 65 6c 6f 77 20 61 72 65 20 76 61 6c 69 64   below are valid
3da0: 20 66 6f 72 20 53 51 4c 69 74 65 0a 3c 74 63 6c   for SQLite.<tcl
3db0: 3e 0a 68 64 5f 70 75 74 73 20 22 20 76 65 72 73  >.hd_puts " vers
3dc0: 69 6f 6e 20 24 53 51 4c 49 54 45 5f 56 45 52 53  ion $SQLITE_VERS
3dd0: 49 4f 4e 20 63 68 65 63 6b 2d 69 6e 5c 6e 22 0a  ION check-in\n".
3de0: 68 64 5f 70 75 74 73 20 22 3c 61 20 68 72 65 66  hd_puts "<a href
3df0: 3d 27 24 75 72 6c 27 3e 24 53 51 4c 49 54 45 5f  ='$url'>$SQLITE_
3e00: 48 41 53 48 3c 2f 61 3e 20 64 61 74 65 64 20 24  HASH</a> dated $
3e10: 53 51 4c 49 54 45 5f 43 4b 49 4e 5f 44 41 54 45  SQLITE_CKIN_DATE
3e20: 2e 5c 6e 5c 6e 22 0a 0a 68 64 5f 66 72 61 67 6d  .\n\n"..hd_fragm
3e30: 65 6e 74 20 63 6f 64 65 73 20 7b 6c 69 73 74 20  ent codes {list 
3e40: 6f 66 20 63 75 72 72 65 6e 74 20 62 79 74 65 63  of current bytec
3e50: 6f 64 65 73 7d 20 7b 6f 70 63 6f 64 65 20 64 65  odes} {opcode de
3e60: 66 69 6e 69 74 69 6f 6e 73 7d 0a 20 0a 68 64 5f  finitions}. .hd_
3e70: 70 75 74 73 20 7b 0a 20 20 3c 2f 64 69 76 3e 0a  puts {.  </div>.
3e80: 20 20 3c 73 74 79 6c 65 3e 2e 6f 70 74 61 62 20    <style>.optab 
3e90: 74 64 20 7b 76 65 72 74 69 63 61 6c 2d 61 6c 69  td {vertical-ali
3ea0: 67 6e 3a 74 6f 70 3b 20 70 61 64 64 69 6e 67 3a  gn:top; padding:
3eb0: 20 31 65 78 20 31 65 78 3b 7d 3c 2f 73 74 79 6c   1ex 1ex;}</styl
3ec0: 65 3e 0a 20 20 3c 64 69 76 20 63 6c 61 73 73 3d  e>.  <div class=
3ed0: 22 6f 70 74 61 62 22 3e 0a 20 20 3c 62 6c 6f 63  "optab">.  <bloc
3ee0: 6b 71 75 6f 74 65 3e 3c 74 61 62 6c 65 20 63 65  kquote><table ce
3ef0: 6c 6c 73 70 61 63 69 6e 67 3d 30 20 62 6f 72 64  llspacing=0 bord
3f00: 65 72 3d 31 20 63 65 6c 6c 70 61 64 64 69 6e 3e  er=1 cellpaddin>
3f10: 0a 20 20 3c 74 72 3e 3c 74 68 3e 4f 70 63 6f 64  .  <tr><th>Opcod
3f20: 65 20 4e 61 6d 65 3c 2f 74 68 3e 3c 74 68 3e 44  e Name</th><th>D
3f30: 65 73 63 72 69 70 74 69 6f 6e 3c 2f 74 68 3e 3c  escription</th><
3f40: 2f 74 72 3e 0a 7d 0a 66 6f 72 65 61 63 68 20 6f  /tr>.}.foreach o
3f50: 70 20 5b 6c 73 6f 72 74 20 2d 64 69 63 74 69 6f  p [lsort -dictio
3f60: 6e 61 72 79 20 24 4f 70 63 6f 64 65 4c 69 73 74  nary $OpcodeList
3f70: 5d 20 7b 0a 20 20 68 64 5f 70 75 74 73 20 7b 3c  ] {.  hd_puts {<
3f80: 74 72 3e 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74  tr><td valign="t
3f90: 6f 70 22 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65  op" align="cente
3fa0: 72 22 3e 7d 0a 20 20 68 64 5f 70 75 74 73 20 22  r">}.  hd_puts "
3fb0: 5c 6e 3c 61 20 6e 61 6d 65 3d 5c 22 24 6f 70 5c  \n<a name=\"$op\
3fc0: 22 3e 3c 2f 61 3e 24 6f 70 5c 6e 22 0a 20 20 72  "></a>$op\n".  r
3fd0: 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5c 5b 28 50  egsub -all {\[(P
3fe0: 5b 30 2d 39 2b 5d 2b 29 5c 5d 7d 20 24 4f 70 63  [0-9+]+)\]} $Opc
3ff0: 6f 64 65 28 24 6f 70 3a 74 65 78 74 29 20 7b 5c  ode($op:text) {\
4000: 26 23 39 31 3b 5c 31 5c 26 23 39 33 7d 20 74 78  &#91;\1\&#93} tx
4010: 74 0a 20 20 68 64 5f 70 75 74 73 20 22 3c 74 64  t.  hd_puts "<td
4020: 3e 22 0a 20 20 73 65 74 20 74 78 74 20 5b 73 74  >".  set txt [st
4030: 72 69 6e 67 20 74 72 69 6d 20 24 74 78 74 5d 0a  ring trim $txt].
4040: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
4050: 74 63 68 20 3c 70 3e 2a 20 24 74 78 74 5d 7d 20  tch <p>* $txt]} 
4060: 7b 73 65 74 20 74 78 74 20 5b 73 74 72 69 6e 67  {set txt [string
4070: 20 72 61 6e 67 65 20 24 74 78 74 20 33 20 65 6e   range $txt 3 en
4080: 64 5d 7d 0a 20 20 4c 69 6e 6b 4f 70 63 6f 64 65  d]}.  LinkOpcode
4090: 4e 61 6d 65 73 20 24 74 78 74 0a 20 20 68 64 5f  Names $txt.  hd_
40a0: 70 75 74 73 20 22 3c 2f 74 64 3e 3c 2f 74 72 3e  puts "</td></tr>
40b0: 5c 6e 22 0a 7d 0a 68 64 5f 72 65 73 6f 6c 76 65  \n".}.hd_resolve
40c0: 20 7b 0a 20 20 3c 2f 74 61 62 6c 65 3e 3c 2f 62   {.  </table></b
40d0: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 3c 2f 64  lockquote>.  </d
40e0: 69 76 3e 0a 7d 0a 3c 2f 74 63 6c 3e 0a           iv>.}.</tcl>.