/ Hex Artifact Content
Login

Artifact 87a31ace769f20d3627a64fa1fade7fed47b90d0:


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 76 64 62 65 2e 68 74 6d  ate the vdbe.htm
0030: 6c 20 66 69 6c 65 2e 0a 23 0a 73 65 74 20 72 63  l file..#.set rc
0040: 73 69 64 20 7b 24 49 64 3a 20 76 64 62 65 2e 74  sid {$Id: vdbe.t
0050: 63 6c 2c 76 20 31 2e 31 34 20 32 30 30 35 2f 30  cl,v 1.14 2005/0
0060: 33 2f 31 32 20 31 35 3a 35 35 3a 31 31 20 64 72  3/12 15:55:11 dr
0070: 68 20 45 78 70 20 24 7d 0a 73 6f 75 72 63 65 20  h Exp $}.source 
0080: 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 68 65 61 64 65  common.tcl.heade
0090: 72 20 7b 54 68 65 20 56 69 72 74 75 61 6c 20 44  r {The Virtual D
00a0: 61 74 61 62 61 73 65 20 45 6e 67 69 6e 65 20 6f  atabase Engine o
00b0: 66 20 53 51 4c 69 74 65 7d 0a 70 75 74 73 20 7b  f SQLite}.puts {
00c0: 0a 3c 68 32 3e 54 68 65 20 56 69 72 74 75 61 6c  .<h2>The Virtual
00d0: 20 44 61 74 61 62 61 73 65 20 45 6e 67 69 6e 65   Database Engine
00e0: 20 6f 66 20 53 51 4c 69 74 65 3c 2f 68 32 3e 0a   of SQLite</h2>.
00f0: 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 62 3e  .<blockquote><b>
0100: 0a 54 68 69 73 20 64 6f 63 75 6d 65 6e 74 20 64  .This document d
0110: 65 73 63 72 69 62 65 73 20 74 68 65 20 76 69 72  escribes the vir
0120: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 73 65  tual machine use
0130: 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73  d in SQLite vers
0140: 69 6f 6e 20 32 2e 38 2e 30 2e 20 0a 54 68 65 20  ion 2.8.0. .The 
0150: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
0160: 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  in SQLite versio
0170: 6e 20 33 2e 30 20 61 6e 64 20 33 2e 31 20 69 73  n 3.0 and 3.1 is
0180: 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 69 6e   very similar in
0190: 0a 63 6f 6e 63 65 70 74 20 62 75 74 20 6d 61 6e  .concept but man
01a0: 79 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 73  y of the opcodes
01b0: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 61 6e   have changed an
01c0: 64 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  d the algorithms
01d0: 20 61 72 65 0a 73 6f 6d 65 77 68 61 74 20 64 69   are.somewhat di
01e0: 66 66 65 72 65 6e 74 2e 20 20 55 73 65 20 74 68  fferent.  Use th
01f0: 69 73 20 64 6f 63 75 6d 65 6e 74 20 61 73 20 61  is document as a
0200: 20 72 6f 75 67 68 20 67 75 69 64 65 20 74 6f 20   rough guide to 
0210: 74 68 65 20 69 64 65 61 0a 62 65 68 69 6e 64 20  the idea.behind 
0220: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
0230: 69 6e 65 20 69 6e 20 53 51 4c 69 74 65 20 76 65  ine in SQLite ve
0240: 72 73 69 6f 6e 20 33 2c 20 6e 6f 74 20 61 73 20  rsion 3, not as 
0250: 61 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 0a 68  a reference on.h
0260: 6f 77 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ow the virtual m
0270: 61 63 68 69 6e 65 20 77 6f 72 6b 73 2e 0a 3c 2f  achine works..</
0280: 62 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  b></blockquote>.
0290: 7d 0a 0a 70 75 74 73 20 7b 0a 3c 70 3e 49 66 20  }..puts {.<p>If 
02a0: 79 6f 75 20 77 61 6e 74 20 74 6f 20 6b 6e 6f 77  you want to know
02b0: 20 68 6f 77 20 74 68 65 20 53 51 4c 69 74 65 20   how the SQLite 
02c0: 6c 69 62 72 61 72 79 20 77 6f 72 6b 73 20 69 6e  library works in
02d0: 74 65 72 6e 61 6c 6c 79 2c 0a 79 6f 75 20 6e 65  ternally,.you ne
02e0: 65 64 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  ed to begin with
02f0: 20 61 20 73 6f 6c 69 64 20 75 6e 64 65 72 73 74   a solid underst
0300: 61 6e 64 69 6e 67 20 6f 66 20 74 68 65 20 56 69  anding of the Vi
0310: 72 74 75 61 6c 20 44 61 74 61 62 61 73 65 0a 45  rtual Database.E
0320: 6e 67 69 6e 65 20 6f 72 20 56 44 42 45 2e 20 20  ngine or VDBE.  
0330: 54 68 65 20 56 44 42 45 20 6f 63 63 75 72 73 20  The VDBE occurs 
0340: 72 69 67 68 74 20 69 6e 20 74 68 65 20 6d 69 64  right in the mid
0350: 64 6c 65 20 6f 66 20 74 68 65 0a 70 72 6f 63 65  dle of the.proce
0360: 73 73 69 6e 67 20 73 74 72 65 61 6d 20 28 73 65  ssing stream (se
0370: 65 20 74 68 65 20 3c 61 20 68 72 65 66 3d 22 61  e the <a href="a
0380: 72 63 68 2e 68 74 6d 6c 22 3e 61 72 63 68 69 74  rch.html">archit
0390: 65 63 74 75 72 65 20 64 69 61 67 72 61 6d 3c 2f  ecture diagram</
03a0: 61 3e 29 0a 61 6e 64 20 73 6f 20 69 74 20 73 65  a>).and so it se
03b0: 65 6d 73 20 74 6f 20 74 6f 75 63 68 20 6d 6f 73  ems to touch mos
03c0: 74 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 6c  t parts of the l
03d0: 69 62 72 61 72 79 2e 20 20 45 76 65 6e 0a 70 61  ibrary.  Even.pa
03e0: 72 74 73 20 6f 66 20 74 68 65 20 63 6f 64 65 20  rts of the code 
03f0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72 65  that do not dire
0400: 63 74 6c 79 20 69 6e 74 65 72 61 63 74 20 77 69  ctly interact wi
0410: 74 68 20 74 68 65 20 56 44 42 45 0a 61 72 65 20  th the VDBE.are 
0420: 75 73 75 61 6c 6c 79 20 69 6e 20 61 20 73 75 70  usually in a sup
0430: 70 6f 72 74 69 6e 67 20 72 6f 6c 65 2e 20 20 54  porting role.  T
0440: 68 65 20 56 44 42 45 20 72 65 61 6c 6c 79 20 69  he VDBE really i
0450: 73 20 74 68 65 20 68 65 61 72 74 20 6f 66 0a 53  s the heart of.S
0460: 51 4c 69 74 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54  QLite.</p>..<p>T
0470: 68 69 73 20 61 72 74 69 63 6c 65 20 69 73 20 61  his article is a
0480: 20 62 72 69 65 66 20 69 6e 74 72 6f 64 75 63 74   brief introduct
0490: 69 6f 6e 20 74 6f 20 68 6f 77 20 74 68 65 20 56  ion to how the V
04a0: 44 42 45 0a 77 6f 72 6b 73 20 61 6e 64 20 69 6e  DBE.works and in
04b0: 20 70 61 72 74 69 63 75 6c 61 72 20 68 6f 77 20   particular how 
04c0: 74 68 65 20 76 61 72 69 6f 75 73 20 56 44 42 45  the various VDBE
04d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 28 64   instructions.(d
04e0: 6f 63 75 6d 65 6e 74 65 64 20 3c 61 20 68 72 65  ocumented <a hre
04f0: 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 22 3e  f="opcode.html">
0500: 68 65 72 65 3c 2f 61 3e 29 20 77 6f 72 6b 20 74  here</a>) work t
0510: 6f 67 65 74 68 65 72 0a 74 6f 20 64 6f 20 75 73  ogether.to do us
0520: 65 66 75 6c 20 74 68 69 6e 67 73 20 77 69 74 68  eful things with
0530: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
0540: 54 68 65 20 73 74 79 6c 65 20 69 73 20 74 75 74  The style is tut
0550: 6f 72 69 61 6c 2c 0a 62 65 67 69 6e 6e 69 6e 67  orial,.beginning
0560: 20 77 69 74 68 20 73 69 6d 70 6c 65 20 74 61 73   with simple tas
0570: 6b 73 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 74  ks and working t
0580: 6f 77 61 72 64 20 73 6f 6c 76 69 6e 67 20 6d 6f  oward solving mo
0590: 72 65 0a 63 6f 6d 70 6c 65 78 20 70 72 6f 62 6c  re.complex probl
05a0: 65 6d 73 2e 20 20 41 6c 6f 6e 67 20 74 68 65 20  ems.  Along the 
05b0: 77 61 79 20 77 65 20 77 69 6c 6c 20 76 69 73 69  way we will visi
05c0: 74 20 6d 6f 73 74 0a 73 75 62 6d 6f 64 75 6c 65  t most.submodule
05d0: 73 20 69 6e 20 74 68 65 20 53 51 4c 69 74 65 20  s in the SQLite 
05e0: 6c 69 62 72 61 72 79 2e 20 20 41 66 74 65 72 20  library.  After 
05f0: 63 6f 6d 70 6c 65 74 65 69 6e 67 20 74 68 69 73  completeing this
0600: 20 74 75 74 6f 72 69 61 6c 2c 0a 79 6f 75 20 73   tutorial,.you s
0610: 68 6f 75 6c 64 20 68 61 76 65 20 61 20 70 72 65  hould have a pre
0620: 74 74 79 20 67 6f 6f 64 20 75 6e 64 65 72 73 74  tty good underst
0630: 61 6e 64 69 6e 67 20 6f 66 20 68 6f 77 20 53 51  anding of how SQ
0640: 4c 69 74 65 20 77 6f 72 6b 73 0a 61 6e 64 20 77  Lite works.and w
0650: 69 6c 6c 20 62 65 20 72 65 61 64 79 20 74 6f 20  ill be ready to 
0660: 62 65 67 69 6e 20 73 74 75 64 79 69 6e 67 20 74  begin studying t
0670: 68 65 20 61 63 74 75 61 6c 20 73 6f 75 72 63 65  he actual source
0680: 20 63 6f 64 65 2e 3c 2f 70 3e 0a 0a 3c 68 32 3e   code.</p>..<h2>
0690: 50 72 65 6c 69 6d 69 6e 61 72 69 65 73 3c 2f 68  Preliminaries</h
06a0: 32 3e 0a 0a 3c 70 3e 54 68 65 20 56 44 42 45 20  2>..<p>The VDBE 
06b0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 76 69 72  implements a vir
06c0: 74 75 61 6c 20 63 6f 6d 70 75 74 65 72 20 74 68  tual computer th
06d0: 61 74 20 72 75 6e 73 20 61 20 70 72 6f 67 72 61  at runs a progra
06e0: 6d 20 69 6e 0a 69 74 73 20 76 69 72 74 75 61 6c  m in.its virtual
06f0: 20 6d 61 63 68 69 6e 65 20 6c 61 6e 67 75 61 67   machine languag
0700: 65 2e 20 20 54 68 65 20 67 6f 61 6c 20 6f 66 20  e.  The goal of 
0710: 65 61 63 68 20 70 72 6f 67 72 61 6d 20 69 73 20  each program is 
0720: 74 6f 20 0a 69 6e 74 65 72 72 6f 67 61 74 65 20  to .interrogate 
0730: 6f 72 20 63 68 61 6e 67 65 20 74 68 65 20 64 61  or change the da
0740: 74 61 62 61 73 65 2e 20 20 54 6f 77 61 72 64 20  tabase.  Toward 
0750: 74 68 69 73 20 65 6e 64 2c 20 74 68 65 20 6d 61  this end, the ma
0760: 63 68 69 6e 65 0a 6c 61 6e 67 75 61 67 65 20 74  chine.language t
0770: 68 61 74 20 74 68 65 20 56 44 42 45 20 69 6d 70  hat the VDBE imp
0780: 6c 65 6d 65 6e 74 73 20 69 73 20 73 70 65 63 69  lements is speci
0790: 66 69 63 61 6c 6c 79 20 64 65 73 69 67 6e 65 64  fically designed
07a0: 20 74 6f 0a 73 65 61 72 63 68 2c 20 72 65 61 64   to.search, read
07b0: 2c 20 61 6e 64 20 6d 6f 64 69 66 79 20 64 61 74  , and modify dat
07c0: 61 62 61 73 65 73 2e 3c 2f 70 3e 0a 0a 3c 70 3e  abases.</p>..<p>
07d0: 45 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  Each instruction
07e0: 20 6f 66 20 74 68 65 20 56 44 42 45 20 6c 61 6e   of the VDBE lan
07f0: 67 75 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  guage contains a
0800: 6e 20 6f 70 63 6f 64 65 20 61 6e 64 0a 74 68 72  n opcode and.thr
0810: 65 65 20 6f 70 65 72 61 6e 64 73 20 6c 61 62 65  ee operands labe
0820: 6c 65 64 20 50 31 2c 20 50 32 2c 20 61 6e 64 20  led P1, P2, and 
0830: 50 33 2e 20 20 4f 70 65 72 61 6e 64 20 50 31 20  P3.  Operand P1 
0840: 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 0a  is an arbitrary.
0850: 69 6e 74 65 67 65 72 2e 20 20 20 50 32 20 69 73  integer.   P2 is
0860: 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
0870: 69 6e 74 65 67 65 72 2e 20 20 50 33 20 69 73 20  integer.  P3 is 
0880: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
0890: 61 74 61 20 0a 73 74 72 75 63 74 75 72 65 20 6f  ata .structure o
08a0: 72 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  r null-terminate
08b0: 64 20 73 74 72 69 6e 67 2c 20 70 6f 73 73 69 62  d string, possib
08c0: 6c 79 20 6e 75 6c 6c 2e 20 20 4f 6e 6c 79 20 61  ly null.  Only a
08d0: 20 66 65 77 20 56 44 42 45 0a 69 6e 73 74 72 75   few VDBE.instru
08e0: 63 74 69 6f 6e 73 20 75 73 65 20 61 6c 6c 20 74  ctions use all t
08f0: 68 72 65 65 20 6f 70 65 72 61 6e 64 73 2e 20 20  hree operands.  
0900: 4d 61 6e 79 20 69 6e 73 74 72 75 63 74 69 6f 6e  Many instruction
0910: 73 20 75 73 65 20 6f 6e 6c 79 0a 6f 6e 65 20 6f  s use only.one o
0920: 72 20 74 77 6f 20 6f 70 65 72 61 6e 64 73 2e 20  r two operands. 
0930: 20 41 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6e   A significant n
0940: 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63  umber of instruc
0950: 74 69 6f 6e 73 20 75 73 65 0a 6e 6f 20 6f 70 65  tions use.no ope
0960: 72 61 6e 64 73 20 61 74 20 61 6c 6c 20 62 75 74  rands at all but
0970: 20 69 6e 73 74 65 61 64 20 74 61 6b 65 20 74 68   instead take th
0980: 65 69 72 20 64 61 74 61 20 61 6e 64 20 73 74 6f  eir data and sto
0990: 72 65 20 74 68 65 69 72 20 72 65 73 75 6c 74 73  re their results
09a0: 0a 6f 6e 20 74 68 65 20 65 78 65 63 75 74 69 6f  .on the executio
09b0: 6e 20 73 74 61 63 6b 2e 20 20 54 68 65 20 64 65  n stack.  The de
09c0: 74 61 69 6c 73 20 6f 66 20 77 68 61 74 20 65 61  tails of what ea
09d0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 64  ch instruction.d
09e0: 6f 65 73 20 61 6e 64 20 77 68 69 63 68 20 6f 70  oes and which op
09f0: 65 72 61 6e 64 73 20 69 74 20 75 73 65 73 20 61  erands it uses a
0a00: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
0a10: 74 68 65 20 73 65 70 61 72 61 74 65 0a 3c 61 20  the separate.<a 
0a20: 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d  href="opcode.htm
0a30: 6c 22 3e 6f 70 63 6f 64 65 20 64 65 73 63 72 69  l">opcode descri
0a40: 70 74 69 6f 6e 3c 2f 61 3e 20 64 6f 63 75 6d 65  ption</a> docume
0a50: 6e 74 2e 3c 2f 70 3e 0a 0a 3c 70 3e 41 20 56 44  nt.</p>..<p>A VD
0a60: 42 45 20 70 72 6f 67 72 61 6d 20 62 65 67 69 6e  BE program begin
0a70: 73 0a 65 78 65 63 75 74 69 6f 6e 20 6f 6e 20 69  s.execution on i
0a80: 6e 73 74 72 75 63 74 69 6f 6e 20 30 20 61 6e 64  nstruction 0 and
0a90: 20 63 6f 6e 74 69 6e 75 65 73 20 77 69 74 68 20   continues with 
0aa0: 73 75 63 63 65 73 73 69 76 65 20 69 6e 73 74 72  successive instr
0ab0: 75 63 74 69 6f 6e 73 0a 75 6e 74 69 6c 20 69 74  uctions.until it
0ac0: 20 65 69 74 68 65 72 20 28 31 29 20 65 6e 63 6f   either (1) enco
0ad0: 75 6e 74 65 72 73 20 61 20 66 61 74 61 6c 20 65  unters a fatal e
0ae0: 72 72 6f 72 2c 20 28 32 29 20 65 78 65 63 75 74  rror, (2) execut
0af0: 65 73 20 61 0a 48 61 6c 74 20 69 6e 73 74 72 75  es a.Halt instru
0b00: 63 74 69 6f 6e 2c 20 6f 72 20 28 33 29 20 61 64  ction, or (3) ad
0b10: 76 61 6e 63 65 73 20 74 68 65 20 70 72 6f 67 72  vances the progr
0b20: 61 6d 20 63 6f 75 6e 74 65 72 20 70 61 73 74 20  am counter past 
0b30: 74 68 65 0a 6c 61 73 74 20 69 6e 73 74 72 75 63  the.last instruc
0b40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f 67  tion of the prog
0b50: 72 61 6d 2e 20 20 57 68 65 6e 20 74 68 65 20 56  ram.  When the V
0b60: 44 42 45 20 63 6f 6d 70 6c 65 74 65 73 20 65 78  DBE completes ex
0b70: 65 63 75 74 69 6f 6e 2c 0a 61 6c 6c 20 6f 70 65  ecution,.all ope
0b80: 6e 20 64 61 74 61 62 61 73 65 20 63 75 72 73 6f  n database curso
0b90: 72 73 20 61 72 65 20 63 6c 6f 73 65 64 2c 20 61  rs are closed, a
0ba0: 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ll memory is fre
0bb0: 65 64 2c 20 61 6e 64 20 0a 65 76 65 72 79 74 68  ed, and .everyth
0bc0: 69 6e 67 20 69 73 20 70 6f 70 70 65 64 20 66 72  ing is popped fr
0bd0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 53 6f  om the stack..So
0be0: 20 74 68 65 72 65 20 61 72 65 20 6e 65 76 65 72   there are never
0bf0: 20 61 6e 79 20 77 6f 72 72 69 65 73 20 61 62 6f   any worries abo
0c00: 75 74 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 73 20  ut memory leaks 
0c10: 6f 72 20 0a 75 6e 64 65 61 6c 6c 6f 63 61 74 65  or .undeallocate
0c20: 64 20 72 65 73 6f 75 72 63 65 73 2e 3c 2f 70 3e  d resources.</p>
0c30: 0a 0a 3c 70 3e 49 66 20 79 6f 75 20 68 61 76 65  ..<p>If you have
0c40: 20 64 6f 6e 65 20 61 6e 79 20 61 73 73 65 6d 62   done any assemb
0c50: 6c 79 20 6c 61 6e 67 75 61 67 65 20 70 72 6f 67  ly language prog
0c60: 72 61 6d 6d 69 6e 67 20 6f 72 20 68 61 76 65 0a  ramming or have.
0c70: 77 6f 72 6b 65 64 20 77 69 74 68 20 61 6e 79 20  worked with any 
0c80: 6b 69 6e 64 20 6f 66 20 61 62 73 74 72 61 63 74  kind of abstract
0c90: 20 6d 61 63 68 69 6e 65 20 62 65 66 6f 72 65 2c   machine before,
0ca0: 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 0a 64 65   all of these.de
0cb0: 74 61 69 6c 73 20 73 68 6f 75 6c 64 20 62 65 20  tails should be 
0cc0: 66 61 6d 69 6c 69 61 72 20 74 6f 20 79 6f 75 2e  familiar to you.
0cd0: 20 20 53 6f 20 6c 65 74 27 73 20 6a 75 6d 70 20    So let's jump 
0ce0: 72 69 67 68 74 20 69 6e 20 61 6e 64 0a 73 74 61  right in and.sta
0cf0: 72 74 20 6c 6f 6f 6b 69 6e 67 20 61 73 20 73 6f  rt looking as so
0d00: 6d 65 20 63 6f 64 65 2e 3c 2f 70 3e 0a 0a 3c 61  me code.</p>..<a
0d10: 20 6e 61 6d 65 3d 22 69 6e 73 65 72 74 31 22 3e   name="insert1">
0d20: 0a 3c 68 32 3e 49 6e 73 65 72 74 69 6e 67 20 52  .<h2>Inserting R
0d30: 65 63 6f 72 64 73 20 49 6e 74 6f 20 54 68 65 20  ecords Into The 
0d40: 44 61 74 61 62 61 73 65 3c 2f 68 32 3e 0a 0a 3c  Database</h2>..<
0d50: 70 3e 57 65 20 62 65 67 69 6e 20 77 69 74 68 20  p>We begin with 
0d60: 61 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 63  a problem that c
0d70: 61 6e 20 62 65 20 73 6f 6c 76 65 64 20 75 73 69  an be solved usi
0d80: 6e 67 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  ng a VDBE progra
0d90: 6d 0a 74 68 61 74 20 69 73 20 6f 6e 6c 79 20 61  m.that is only a
0da0: 20 66 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   few instruction
0db0: 73 20 6c 6f 6e 67 2e 20 20 53 75 70 70 6f 73 65  s long.  Suppose
0dc0: 20 77 65 20 68 61 76 65 20 61 6e 20 53 51 4c 0a   we have an SQL.
0dd0: 74 61 62 6c 65 20 74 68 61 74 20 77 61 73 20 63  table that was c
0de0: 72 65 61 74 65 64 20 6c 69 6b 65 20 74 68 69 73  reated like this
0df0: 3a 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f  :</p>..<blockquo
0e00: 74 65 3e 3c 70 72 65 3e 0a 43 52 45 41 54 45 20  te><pre>.CREATE 
0e10: 54 41 42 4c 45 20 65 78 61 6d 70 28 6f 6e 65 20  TABLE examp(one 
0e20: 74 65 78 74 2c 20 74 77 6f 20 69 6e 74 29 3b 0a  text, two int);.
0e30: 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f  </pre></blockquo
0e40: 74 65 3e 0a 0a 3c 70 3e 49 6e 20 77 6f 72 64 73  te>..<p>In words
0e50: 2c 20 77 65 20 68 61 76 65 20 61 20 64 61 74 61  , we have a data
0e60: 62 61 73 65 20 74 61 62 6c 65 20 6e 61 6d 65 64  base table named
0e70: 20 22 65 78 61 6d 70 22 20 74 68 61 74 20 68 61   "examp" that ha
0e80: 73 20 74 77 6f 0a 63 6f 6c 75 6d 6e 73 20 6f 66  s two.columns of
0e90: 20 64 61 74 61 20 6e 61 6d 65 64 20 22 6f 6e 65   data named "one
0ea0: 22 20 61 6e 64 20 22 74 77 6f 22 2e 20 20 4e 6f  " and "two".  No
0eb0: 77 20 73 75 70 70 6f 73 65 20 77 65 20 77 61 6e  w suppose we wan
0ec0: 74 20 74 6f 20 69 6e 73 65 72 74 20 61 20 73 69  t to insert a si
0ed0: 6e 67 6c 65 0a 72 65 63 6f 72 64 20 69 6e 74 6f  ngle.record into
0ee0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 4c 69   this table.  Li
0ef0: 6b 65 20 74 68 69 73 3a 3c 2f 70 3e 0a 0a 3c 62  ke this:</p>..<b
0f00: 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a  lockquote><pre>.
0f10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 78 61 6d  INSERT INTO exam
0f20: 70 20 56 41 4c 55 45 53 28 27 48 65 6c 6c 6f 2c  p VALUES('Hello,
0f30: 20 57 6f 72 6c 64 21 27 2c 39 39 29 3b 0a 3c 2f   World!',99);.</
0f40: 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65  pre></blockquote
0f50: 3e 0a 0a 3c 70 3e 57 65 20 63 61 6e 20 73 65 65  >..<p>We can see
0f60: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
0f70: 6d 20 74 68 61 74 20 53 51 4c 69 74 65 20 75 73  m that SQLite us
0f80: 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  es to implement 
0f90: 74 68 69 73 0a 49 4e 53 45 52 54 20 75 73 69 6e  this.INSERT usin
0fa0: 67 20 74 68 65 20 3c 62 3e 73 71 6c 69 74 65 3c  g the <b>sqlite<
0fb0: 2f 62 3e 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  /b> command-line
0fc0: 20 75 74 69 6c 69 74 79 2e 20 20 46 69 72 73 74   utility.  First
0fd0: 20 73 74 61 72 74 0a 75 70 20 3c 62 3e 73 71 6c   start.up <b>sql
0fe0: 69 74 65 3c 2f 62 3e 20 6f 6e 20 61 20 6e 65 77  ite</b> on a new
0ff0: 2c 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  , empty database
1000: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  , then create th
1010: 65 20 74 61 62 6c 65 2e 0a 4e 65 78 74 20 63 68  e table..Next ch
1020: 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74 20  ange the output 
1030: 66 6f 72 6d 61 74 20 6f 66 20 3c 62 3e 73 71 6c  format of <b>sql
1040: 69 74 65 3c 2f 62 3e 20 74 6f 20 61 20 66 6f 72  ite</b> to a for
1050: 6d 20 74 68 61 74 0a 69 73 20 64 65 73 69 67 6e  m that.is design
1060: 65 64 20 74 6f 20 77 6f 72 6b 20 77 69 74 68 20  ed to work with 
1070: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 64 75 6d  VDBE program dum
1080: 70 73 20 62 79 20 65 6e 74 65 72 69 6e 67 20 74  ps by entering t
1090: 68 65 0a 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f  he.".explain" co
10a0: 6d 6d 61 6e 64 2e 0a 46 69 6e 61 6c 6c 79 2c 20  mmand..Finally, 
10b0: 65 6e 74 65 72 20 74 68 65 20 49 4e 53 45 52 54  enter the INSERT
10c0: 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f 77 6e   statement shown
10d0: 20 61 62 6f 76 65 2c 20 62 75 74 20 70 72 65 63   above, but prec
10e0: 65 64 65 20 74 68 65 0a 49 4e 53 45 52 54 20 77  ede the.INSERT w
10f0: 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
1100: 6b 65 79 77 6f 72 64 20 22 45 58 50 4c 41 49 4e  keyword "EXPLAIN
1110: 22 2e 20 20 54 68 65 20 45 58 50 4c 41 49 4e 20  ".  The EXPLAIN 
1120: 6b 65 79 77 6f 72 64 0a 77 69 6c 6c 20 63 61 75  keyword.will cau
1130: 73 65 20 3c 62 3e 73 71 6c 69 74 65 3c 2f 62 3e  se <b>sqlite</b>
1140: 20 74 6f 20 70 72 69 6e 74 20 74 68 65 20 56 44   to print the VD
1150: 42 45 20 70 72 6f 67 72 61 6d 20 72 61 74 68 65  BE program rathe
1160: 72 20 74 68 61 6e 20 0a 65 78 65 63 75 74 65 20  r than .execute 
1170: 69 74 2e 20 20 57 65 20 68 61 76 65 3a 3c 2f 70  it.  We have:</p
1180: 3e 0a 7d 0a 70 72 6f 63 20 43 6f 64 65 20 7b 62  >.}.proc Code {b
1190: 6f 64 79 7d 20 7b 0a 20 20 70 75 74 73 20 7b 3c  ody} {.  puts {<
11a0: 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 74 74 3e 7d  blockquote><tt>}
11b0: 0a 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b  .  regsub -all {
11c0: 26 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  &} [string trim 
11d0: 24 62 6f 64 79 5d 20 7b 5c 26 61 6d 70 3b 7d 20  $body] {\&amp;} 
11e0: 62 6f 64 79 0a 20 20 72 65 67 73 75 62 20 2d 61  body.  regsub -a
11f0: 6c 6c 20 7b 3e 7d 20 24 62 6f 64 79 20 7b 5c 26  ll {>} $body {\&
1200: 67 74 3b 7d 20 62 6f 64 79 0a 20 20 72 65 67 73  gt;} body.  regs
1210: 75 62 20 2d 61 6c 6c 20 7b 3c 7d 20 24 62 6f 64  ub -all {<} $bod
1220: 79 20 7b 5c 26 6c 74 3b 7d 20 62 6f 64 79 0a 20  y {\&lt;} body. 
1230: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5c 28   regsub -all {\(
1240: 5c 28 5c 28 7d 20 24 62 6f 64 79 20 7b 3c 62 3e  \(\(} $body {<b>
1250: 7d 20 62 6f 64 79 0a 20 20 72 65 67 73 75 62 20  } body.  regsub 
1260: 2d 61 6c 6c 20 7b 5c 29 5c 29 5c 29 7d 20 24 62  -all {\)\)\)} $b
1270: 6f 64 79 20 7b 3c 2f 62 3e 7d 20 62 6f 64 79 0a  ody {</b>} body.
1280: 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 20    regsub -all { 
1290: 7d 20 24 62 6f 64 79 20 7b 5c 26 6e 62 73 70 3b  } $body {\&nbsp;
12a0: 7d 20 62 6f 64 79 0a 20 20 72 65 67 73 75 62 20  } body.  regsub 
12b0: 2d 61 6c 6c 20 5c 6e 20 24 62 6f 64 79 20 3c 62  -all \n $body <b
12c0: 72 3e 5c 6e 20 62 6f 64 79 0a 20 20 70 75 74 73  r>\n body.  puts
12d0: 20 24 62 6f 64 79 0a 20 20 70 75 74 73 20 7b 3c   $body.  puts {<
12e0: 2f 74 74 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65  /tt></blockquote
12f0: 3e 7d 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 24 20 28  >}.}..Code {.$ (
1300: 28 28 73 71 6c 69 74 65 20 74 65 73 74 5f 64 61  ((sqlite test_da
1310: 74 61 62 61 73 65 5f 31 29 29 29 0a 73 71 6c 69  tabase_1))).sqli
1320: 74 65 3e 20 28 28 28 43 52 45 41 54 45 20 54 41  te> (((CREATE TA
1330: 42 4c 45 20 65 78 61 6d 70 28 6f 6e 65 20 74 65  BLE examp(one te
1340: 78 74 2c 20 74 77 6f 20 69 6e 74 29 3b 29 29 29  xt, two int);)))
1350: 0a 73 71 6c 69 74 65 3e 20 28 28 28 2e 65 78 70  .sqlite> (((.exp
1360: 6c 61 69 6e 29 29 29 0a 73 71 6c 69 74 65 3e 20  lain))).sqlite> 
1370: 28 28 28 45 58 50 4c 41 49 4e 20 49 4e 53 45 52  (((EXPLAIN INSER
1380: 54 20 49 4e 54 4f 20 65 78 61 6d 70 20 56 41 4c  T INTO examp VAL
1390: 55 45 53 28 27 48 65 6c 6c 6f 2c 20 57 6f 72 6c  UES('Hello, Worl
13a0: 64 21 27 2c 39 39 29 3b 29 29 29 0a 61 64 64 72  d!',99);))).addr
13b0: 20 20 6f 70 63 6f 64 65 20 20 20 20 20 20 20 20    opcode        
13c0: 70 31 20 20 20 20 20 70 32 20 20 20 20 20 70 33  p1     p2     p3
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d        .----  ---
1400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
1410: 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d    -----  -------
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20  ------------.0  
1440: 20 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 20     Transaction  
1450: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 0a 31 20 20 20 20 20 56 65 72 69 66 79 43    .1     VerifyC
1490: 6f 6f 6b 69 65 20 20 30 20 20 20 20 20 20 38 31  ookie  0      81
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 20 20 20 20 20 0a 32 20 20 20 20 20 54          .2     T
14d0: 72 61 6e 73 61 63 74 69 6f 6e 20 20 20 31 20 20  ransaction   1  
14e0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 33                .3
1510: 20 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20       Integer    
1520: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 0a 34 20 20 20 20 20 4f 70 65 6e 57      .4     OpenW
1560: 72 69 74 65 20 20 20 20 20 30 20 20 20 20 20 20  rite     0      
1570: 33 20 20 20 20 20 20 65 78 61 6d 70 20 20 20 20  3      examp    
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 20 0a 35 20 20 20 20            .5    
15a0: 20 4e 65 77 52 65 63 6e 6f 20 20 20 20 20 20 30   NewRecno      0
15b0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 0a 36 20 20 20 20 20 53 74 72 69 6e 67 20 20 20  .6     String   
15f0: 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20       0      0   
1600: 20 20 20 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21     Hello, World!
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 20 20 20 0a 37 20 20 20 20 20 49 6e 74        .7     Int
1630: 65 67 65 72 20 20 20 20 20 20 20 39 39 20 20 20  eger       99   
1640: 20 20 30 20 20 20 20 20 20 39 39 20 20 20 20 20    0      99     
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 20 20 20 20 20 0a 38 20 20              .8  
1670: 20 20 20 4d 61 6b 65 52 65 63 6f 72 64 20 20 20     MakeRecord   
1680: 20 32 20 20 20 20 20 20 30 20 20 20 20 20 20 20   2      0       
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 0a 39 20 20 20 20 20 50 75 74 49 6e 74 4b    .9     PutIntK
16c0: 65 79 20 20 20 20 20 30 20 20 20 20 20 20 31 20  ey     0      1 
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 0a 31 30 20 20 20 20 43          .10    C
1700: 6c 6f 73 65 20 20 20 20 20 20 20 20 20 30 20 20  lose         0  
1710: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
1740: 31 20 20 20 20 43 6f 6d 6d 69 74 20 20 20 20 20  1    Commit     
1750: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 20 20 20 0a 31 32 20 20 20 20 48 61 6c 74 20      .12    Halt 
1790: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
17a0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 0a 70 75            .}..pu
17d0: 74 73 20 7b 3c 70 3e 41 73 20 79 6f 75 20 63 61  ts {<p>As you ca
17e0: 6e 20 73 65 65 20 61 62 6f 76 65 2c 20 6f 75 72  n see above, our
17f0: 20 73 69 6d 70 6c 65 20 69 6e 73 65 72 74 20 73   simple insert s
1800: 74 61 74 65 6d 65 6e 74 20 69 73 0a 69 6d 70 6c  tatement is.impl
1810: 65 6d 65 6e 74 65 64 20 69 6e 20 31 32 20 69 6e  emented in 12 in
1820: 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 65  structions.  The
1830: 20 66 69 72 73 74 20 33 20 61 6e 64 20 6c 61 73   first 3 and las
1840: 74 20 32 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  t 2 instructions
1850: 20 61 72 65 20 0a 61 20 73 74 61 6e 64 61 72 64   are .a standard
1860: 20 70 72 6f 6c 6f 67 75 65 20 61 6e 64 20 65 70   prologue and ep
1870: 69 6c 6f 67 75 65 2c 20 73 6f 20 74 68 65 20 72  ilogue, so the r
1880: 65 61 6c 20 77 6f 72 6b 20 69 73 20 64 6f 6e 65  eal work is done
1890: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 0a   in the middle .
18a0: 37 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  7 instructions. 
18b0: 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6a 75   There are no ju
18c0: 6d 70 73 2c 20 73 6f 20 74 68 65 20 70 72 6f 67  mps, so the prog
18d0: 72 61 6d 20 65 78 65 63 75 74 65 73 20 6f 6e 63  ram executes onc
18e0: 65 20 74 68 72 6f 75 67 68 20 0a 66 72 6f 6d 20  e through .from 
18f0: 74 6f 70 20 74 6f 20 62 6f 74 74 6f 6d 2e 20 20  top to bottom.  
1900: 4c 65 74 27 73 20 6e 6f 77 20 6c 6f 6f 6b 20 61  Let's now look a
1910: 74 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  t each instructi
1920: 6f 6e 20 69 6e 20 64 65 74 61 69 6c 2e 3c 70 3e  on in detail.<p>
1930: 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 30 20 20 20 20  .}..Code {.0    
1940: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 20 20 30   Transaction   0
1950: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 0a 31 20 20 20 20 20 56 65 72 69 66 79 43 6f 6f  .1     VerifyCoo
1990: 6b 69 65 20 20 30 20 20 20 20 20 20 38 31 20 20  kie  0      81  
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 20 20 20 20 20 0a 32 20 20 20 20 20 54 72 61        .2     Tra
19d0: 6e 73 61 63 74 69 6f 6e 20 20 20 31 20 20 20 20  nsaction   1    
19e0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 70              .}.p
1a10: 75 74 73 20 7b 0a 3c 70 3e 54 68 65 20 69 6e 73  uts {.<p>The ins
1a20: 74 72 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66  truction <a href
1a30: 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 54 72  ="opcode.html#Tr
1a40: 61 6e 73 61 63 74 69 6f 6e 22 3e 54 72 61 6e 73  ansaction">Trans
1a50: 61 63 74 69 6f 6e 3c 2f 61 3e 20 0a 62 65 67 69  action</a> .begi
1a60: 6e 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ns a transaction
1a70: 2e 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  .  The transacti
1a80: 6f 6e 20 65 6e 64 73 20 77 68 65 6e 20 61 20 43  on ends when a C
1a90: 6f 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c 62 61 63  ommit or Rollbac
1aa0: 6b 20 0a 6f 70 63 6f 64 65 20 69 73 20 65 6e 63  k .opcode is enc
1ab0: 6f 75 6e 74 65 72 65 64 2e 20 20 50 31 20 69 73  ountered.  P1 is
1ac0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1ad0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ae0: 6f 6e 20 77 68 69 63 68 20 0a 74 68 65 20 74 72  on which .the tr
1af0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1b00: 72 74 65 64 2e 20 20 49 6e 64 65 78 20 30 20 69  rted.  Index 0 i
1b10: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
1b20: 61 73 65 20 66 69 6c 65 2e 20 20 41 20 77 72 69  ase file.  A wri
1b30: 74 65 20 0a 6c 6f 63 6b 20 69 73 20 6f 62 74 61  te .lock is obta
1b40: 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ined on the data
1b50: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 61  base file when a
1b60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1b70: 73 74 61 72 74 65 64 2e 20 20 0a 4e 6f 20 6f 74  started.  .No ot
1b80: 68 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20  her process can 
1b90: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
1ba0: 65 20 66 69 6c 65 20 77 68 69 6c 65 20 74 68 65  e file while the
1bb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1bc0: 0a 75 6e 64 65 72 77 61 79 2e 20 20 53 74 61 72  .underway.  Star
1bd0: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
1be0: 6f 6e 20 61 6c 73 6f 20 63 72 65 61 74 65 73 20  on also creates 
1bf0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
1c00: 61 6c 2e 20 20 41 20 0a 74 72 61 6e 73 61 63 74  al.  A .transact
1c10: 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
1c20: 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ted before any c
1c30: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 6d 61  hanges can be ma
1c40: 64 65 20 74 6f 20 74 68 65 20 0a 64 61 74 61 62  de to the .datab
1c50: 61 73 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65  ase.</p>..<p>The
1c60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3c 61 20   instruction <a 
1c70: 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d  href="opcode.htm
1c80: 6c 23 56 65 72 69 66 79 43 6f 6f 6b 69 65 22 3e  l#VerifyCookie">
1c90: 56 65 72 69 66 79 43 6f 6f 6b 69 65 3c 2f 61 3e  VerifyCookie</a>
1ca0: 0a 63 68 65 63 6b 73 20 63 6f 6f 6b 69 65 20 30  .checks cookie 0
1cb0: 20 28 74 68 65 20 64 61 74 61 62 61 73 65 20 73   (the database s
1cc0: 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 29 20 74  chema version) t
1cd0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
1ce0: 73 20 65 71 75 61 6c 20 0a 74 6f 20 50 32 20 28  s equal .to P2 (
1cf0: 74 68 65 20 76 61 6c 75 65 20 6f 62 74 61 69 6e  the value obtain
1d00: 65 64 20 77 68 65 6e 20 74 68 65 20 64 61 74 61  ed when the data
1d10: 62 61 73 65 20 73 63 68 65 6d 61 20 77 61 73 20  base schema was 
1d20: 6c 61 73 74 20 72 65 61 64 29 2e 20 20 0a 50 31  last read).  .P1
1d30: 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
1d40: 20 6e 75 6d 62 65 72 20 28 30 20 66 6f 72 20 74   number (0 for t
1d50: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1d60: 29 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ).  This is done
1d70: 20 74 6f 20 0a 6d 61 6b 65 20 73 75 72 65 20 74   to .make sure t
1d80: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1d90: 6d 61 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  ma hasn't been c
1da0: 68 61 6e 67 65 64 20 62 79 20 61 6e 6f 74 68 65  hanged by anothe
1db0: 72 20 74 68 72 65 61 64 2c 20 69 6e 20 0a 77 68  r thread, in .wh
1dc0: 69 63 68 20 63 61 73 65 20 69 74 20 68 61 73 20  ich case it has 
1dd0: 74 6f 20 62 65 20 72 65 72 65 61 64 2e 3c 2f 70  to be reread.</p
1de0: 3e 0a 0a 3c 70 3e 20 54 68 65 20 73 65 63 6f 6e  >..<p> The secon
1df0: 64 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64  d <a href="opcod
1e00: 65 2e 68 74 6d 6c 23 54 72 61 6e 73 61 63 74 69  e.html#Transacti
1e10: 6f 6e 22 3e 54 72 61 6e 73 61 63 74 69 6f 6e 3c  on">Transaction<
1e20: 2f 61 3e 20 0a 69 6e 73 74 72 75 63 74 69 6f 6e  /a> .instruction
1e30: 20 62 65 67 69 6e 73 20 61 20 74 72 61 6e 73 61   begins a transa
1e40: 63 74 69 6f 6e 20 61 6e 64 20 73 74 61 72 74 73  ction and starts
1e50: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
1e60: 6e 61 6c 20 66 6f 72 20 0a 64 61 74 61 62 61 73  nal for .databas
1e70: 65 20 31 2c 20 74 68 65 20 64 61 74 61 62 61 73  e 1, the databas
1e80: 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f  e used for tempo
1e90: 72 61 72 79 20 74 61 62 6c 65 73 2e 3c 2f 70 3e  rary tables.</p>
1ea0: 0a 7d 0a 0a 70 72 6f 63 20 73 74 61 63 6b 20 61  .}..proc stack a
1eb0: 72 67 73 20 7b 0a 20 20 70 75 74 73 20 22 3c 62  rgs {.  puts "<b
1ec0: 6c 6f 63 6b 71 75 6f 74 65 3e 3c 74 61 62 6c 65  lockquote><table
1ed0: 20 62 6f 72 64 65 72 3d 32 3e 22 0a 20 20 66 6f   border=2>".  fo
1ee0: 72 65 61 63 68 20 65 6c 65 6d 20 24 61 72 67 73  reach elem $args
1ef0: 20 7b 0a 20 20 20 20 70 75 74 73 20 22 3c 74 72   {.    puts "<tr
1f00: 3e 3c 74 64 20 61 6c 69 67 6e 3d 6c 65 66 74 3e  ><td align=left>
1f10: 24 65 6c 65 6d 3c 2f 74 64 3e 3c 2f 74 72 3e 22  $elem</td></tr>"
1f20: 0a 20 20 7d 0a 20 20 70 75 74 73 20 22 3c 2f 74  .  }.  puts "</t
1f30: 61 62 6c 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74  able></blockquot
1f40: 65 3e 22 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 33 20  e>".}..Code {.3 
1f50: 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20      Integer     
1f60: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 34                .4
1f90: 20 20 20 20 20 4f 70 65 6e 57 72 69 74 65 20 20       OpenWrite  
1fa0: 20 20 20 30 20 20 20 20 20 20 33 20 20 20 20 20     0      3     
1fb0: 20 65 78 61 6d 70 20 20 20 20 20 20 20 20 20 20   examp          
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
1fd0: 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e 20 54 68 65  }.puts {.<p> The
1fe0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3c 61 20   instruction <a 
1ff0: 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d  href="opcode.htm
2000: 6c 23 49 6e 74 65 67 65 72 22 3e 49 6e 74 65 67  l#Integer">Integ
2010: 65 72 3c 2f 61 3e 20 70 75 73 68 65 73 20 0a 74  er</a> pushes .t
2020: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
2030: 20 50 31 20 28 30 29 20 6f 6e 74 6f 20 74 68 65   P1 (0) onto the
2040: 20 73 74 61 63 6b 2e 20 20 48 65 72 65 20 30 20   stack.  Here 0 
2050: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2060: 20 74 68 65 20 0a 64 61 74 61 62 61 73 65 20 74   the .database t
2070: 6f 20 75 73 65 20 69 6e 20 74 68 65 20 66 6f 6c  o use in the fol
2080: 6c 6f 77 69 6e 67 20 4f 70 65 6e 57 72 69 74 65  lowing OpenWrite
2090: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49   instruction.  I
20a0: 66 20 50 33 20 69 73 20 6e 6f 74 20 0a 4e 55 4c  f P3 is not .NUL
20b0: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 73  L then it is a s
20c0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
20d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
20e0: 20 69 6e 74 65 67 65 72 2e 20 20 41 66 74 65 72   integer.  After
20f0: 77 61 72 64 73 20 0a 74 68 65 20 73 74 61 63 6b  wards .the stack
2100: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
2110: 3a 3c 2f 70 3e 0a 7d 0a 73 74 61 63 6b 20 7b 28  :</p>.}.stack {(
2120: 69 6e 74 65 67 65 72 29 20 30 7d 0a 0a 70 75 74  integer) 0}..put
2130: 73 20 7b 0a 3c 70 3e 20 54 68 65 20 69 6e 73 74  s {.<p> The inst
2140: 72 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66 3d  ruction <a href=
2150: 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 4f 70 65  "opcode.html#Ope
2160: 6e 57 72 69 74 65 22 3e 4f 70 65 6e 57 72 69 74  nWrite">OpenWrit
2170: 65 3c 2f 61 3e 20 6f 70 65 6e 73 20 0a 61 20 6e  e</a> opens .a n
2180: 65 77 20 72 65 61 64 2f 77 72 69 74 65 20 63 75  ew read/write cu
2190: 72 73 6f 72 20 77 69 74 68 20 68 61 6e 64 6c 65  rsor with handle
21a0: 20 50 31 20 28 30 20 69 6e 20 74 68 69 73 20 63   P1 (0 in this c
21b0: 61 73 65 29 20 6f 6e 20 74 61 62 6c 65 20 22 65  ase) on table "e
21c0: 78 61 6d 70 22 2c 20 0a 77 68 6f 73 65 20 72 6f  xamp", .whose ro
21d0: 6f 74 20 70 61 67 65 20 69 73 20 50 32 20 28 33  ot page is P2 (3
21e0: 2c 20 69 6e 20 74 68 69 73 20 64 61 74 61 62 61  , in this databa
21f0: 73 65 20 66 69 6c 65 29 2e 20 20 43 75 72 73 6f  se file).  Curso
2200: 72 20 68 61 6e 64 6c 65 73 20 63 61 6e 20 62 65  r handles can be
2210: 20 0a 61 6e 79 20 6e 6f 6e 2d 6e 65 67 61 74 69   .any non-negati
2220: 76 65 20 69 6e 74 65 67 65 72 2e 20 20 42 75 74  ve integer.  But
2230: 20 74 68 65 20 56 44 42 45 20 61 6c 6c 6f 63 61   the VDBE alloca
2240: 74 65 73 20 63 75 72 73 6f 72 73 20 69 6e 20 61  tes cursors in a
2250: 6e 20 61 72 72 61 79 20 0a 77 69 74 68 20 74 68  n array .with th
2260: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  e size of the ar
2270: 72 61 79 20 62 65 69 6e 67 20 6f 6e 65 20 6d 6f  ray being one mo
2280: 72 65 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  re than the larg
2290: 65 73 74 20 63 75 72 73 6f 72 2e 20 20 53 6f 20  est cursor.  So 
22a0: 0a 74 6f 20 63 6f 6e 73 65 72 76 65 20 6d 65 6d  .to conserve mem
22b0: 6f 72 79 2c 20 69 74 20 69 73 20 62 65 73 74 20  ory, it is best 
22c0: 74 6f 20 75 73 65 20 68 61 6e 64 6c 65 73 20 62  to use handles b
22d0: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 7a 65  eginning with ze
22e0: 72 6f 20 61 6e 64 20 0a 77 6f 72 6b 69 6e 67 20  ro and .working 
22f0: 75 70 77 61 72 64 20 63 6f 6e 73 65 63 75 74 69  upward consecuti
2300: 76 65 6c 79 2e 20 20 48 65 72 65 20 50 33 20 28  vely.  Here P3 (
2310: 22 65 78 61 6d 70 22 29 20 69 73 20 74 68 65 20  "examp") is the 
2320: 6e 61 6d 65 20 6f 66 20 74 68 65 20 0a 74 61 62  name of the .tab
2330: 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2c  le being opened,
2340: 20 62 75 74 20 74 68 69 73 20 69 73 20 75 6e 75   but this is unu
2350: 73 65 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 67 65  sed, and only ge
2360: 6e 65 72 61 74 65 64 20 74 6f 20 6d 61 6b 65 20  nerated to make 
2370: 74 68 65 20 0a 63 6f 64 65 20 65 61 73 69 65 72  the .code easier
2380: 20 74 6f 20 72 65 61 64 2e 20 20 54 68 69 73 20   to read.  This 
2390: 69 6e 73 74 72 75 63 74 69 6f 6e 20 70 6f 70 73  instruction pops
23a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 75   the database nu
23b0: 6d 62 65 72 20 74 6f 20 75 73 65 20 0a 28 30 2c  mber to use .(0,
23c0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
23d0: 73 65 29 20 66 72 6f 6d 20 74 68 65 20 74 6f 70  se) from the top
23e0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2c 20 73   of the stack, s
23f0: 6f 20 61 66 74 65 72 77 61 72 64 73 20 74 68 65  o afterwards the
2400: 20 0a 73 74 61 63 6b 20 69 73 20 65 6d 70 74 79   .stack is empty
2410: 20 61 67 61 69 6e 2e 3c 2f 70 3e 0a 7d 0a 0a 43   again.</p>.}..C
2420: 6f 64 65 20 7b 0a 35 20 20 20 20 20 4e 65 77 52  ode {.5     NewR
2430: 65 63 6e 6f 20 20 20 20 20 20 30 20 20 20 20 20  ecno      0     
2440: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 20 20 0a 7d 0a 70 75 74 73 20 7b 0a        .}.puts {.
2470: 3c 70 3e 20 54 68 65 20 69 6e 73 74 72 75 63 74  <p> The instruct
2480: 69 6f 6e 20 3c 61 20 68 72 65 66 3d 22 6f 70 63  ion <a href="opc
2490: 6f 64 65 2e 68 74 6d 6c 23 4e 65 77 52 65 63 6e  ode.html#NewRecn
24a0: 6f 22 3e 4e 65 77 52 65 63 6e 6f 3c 2f 61 3e 20  o">NewRecno</a> 
24b0: 63 72 65 61 74 65 73 20 0a 61 20 6e 65 77 20 69  creates .a new i
24c0: 6e 74 65 67 65 72 20 72 65 63 6f 72 64 20 6e 75  nteger record nu
24d0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
24e0: 6c 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  le pointed to by
24f0: 20 63 75 72 73 6f 72 20 50 31 2e 20 20 54 68 65   cursor P1.  The
2500: 20 0a 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20   .record number 
2510: 69 73 20 6f 6e 65 20 6e 6f 74 20 63 75 72 72 65  is one not curre
2520: 6e 74 6c 79 20 75 73 65 64 20 61 73 20 61 20 6b  ntly used as a k
2530: 65 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ey in the table.
2540: 20 20 54 68 65 20 6e 65 77 20 0a 72 65 63 6f 72    The new .recor
2550: 64 20 6e 75 6d 62 65 72 20 69 73 20 70 75 73 68  d number is push
2560: 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ed onto the stac
2570: 6b 2e 20 20 41 66 74 65 72 77 61 72 64 73 20 74  k.  Afterwards t
2580: 68 65 20 73 74 61 63 6b 20 6c 6f 6f 6b 73 20 6c  he stack looks l
2590: 69 6b 65 20 0a 74 68 69 73 3a 3c 2f 70 3e 0a 7d  ike .this:</p>.}
25a0: 0a 73 74 61 63 6b 20 7b 28 69 6e 74 65 67 65 72  .stack {(integer
25b0: 29 20 6e 65 77 20 72 65 63 6f 72 64 20 6b 65 79  ) new record key
25c0: 7d 0a 0a 43 6f 64 65 20 7b 0a 36 20 20 20 20 20  }..Code {.6     
25d0: 53 74 72 69 6e 67 20 20 20 20 20 20 20 20 30 20  String        0 
25e0: 20 20 20 20 20 30 20 20 20 20 20 20 48 65 6c 6c       0      Hell
25f0: 6f 2c 20 57 6f 72 6c 64 21 20 20 20 20 20 20 20  o, World!       
2600: 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75 74            .}.put
2610: 73 20 7b 0a 3c 70 3e 20 54 68 65 20 69 6e 73 74  s {.<p> The inst
2620: 72 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66 3d  ruction <a href=
2630: 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 53 74 72  "opcode.html#Str
2640: 69 6e 67 22 3e 53 74 72 69 6e 67 3c 2f 61 3e 20  ing">String</a> 
2650: 70 75 73 68 65 73 20 69 74 73 20 0a 50 33 20 6f  pushes its .P3 o
2660: 70 65 72 61 6e 64 20 6f 6e 74 6f 20 74 68 65 20  perand onto the 
2670: 73 74 61 63 6b 2e 20 20 41 66 74 65 72 77 61 72  stack.  Afterwar
2680: 64 73 20 74 68 65 20 73 74 61 63 6b 20 6c 6f 6f  ds the stack loo
2690: 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 3c 2f 70  ks like this:</p
26a0: 3e 0a 7d 0a 73 74 61 63 6b 20 7b 28 73 74 72 69  >.}.stack {(stri
26b0: 6e 67 29 20 22 48 65 6c 6c 6f 2c 20 57 6f 72 6c  ng) "Hello, Worl
26c0: 64 21 22 7d 20 5c 0a 20 7b 28 69 6e 74 65 67 65  d!"} \. {(intege
26d0: 72 29 20 6e 65 77 20 72 65 63 6f 72 64 20 6b 65  r) new record ke
26e0: 79 7d 0a 0a 43 6f 64 65 20 7b 0a 37 20 20 20 20  y}..Code {.7    
26f0: 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 39   Integer       9
2700: 39 20 20 20 20 20 30 20 20 20 20 20 20 39 39 20  9     0      99 
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75             .}.pu
2730: 74 73 20 7b 0a 3c 70 3e 20 54 68 65 20 69 6e 73  ts {.<p> The ins
2740: 74 72 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66  truction <a href
2750: 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 49 6e  ="opcode.html#In
2760: 74 65 67 65 72 22 3e 49 6e 74 65 67 65 72 3c 2f  teger">Integer</
2770: 61 3e 20 70 75 73 68 65 73 20 0a 69 74 73 20 50  a> pushes .its P
2780: 31 20 6f 70 65 72 61 6e 64 20 28 39 39 29 20 6f  1 operand (99) o
2790: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20  nto the stack.  
27a0: 41 66 74 65 72 77 61 72 64 73 20 74 68 65 20 73  Afterwards the s
27b0: 74 61 63 6b 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  tack looks like 
27c0: 0a 74 68 69 73 3a 3c 2f 70 3e 0a 7d 0a 73 74 61  .this:</p>.}.sta
27d0: 63 6b 20 7b 28 69 6e 74 65 67 65 72 29 20 39 39  ck {(integer) 99
27e0: 7d 20 5c 0a 20 7b 28 73 74 72 69 6e 67 29 20 22  } \. {(string) "
27f0: 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 22 7d 20  Hello, World!"} 
2800: 5c 0a 20 7b 28 69 6e 74 65 67 65 72 29 20 6e 65  \. {(integer) ne
2810: 77 20 72 65 63 6f 72 64 20 6b 65 79 7d 0a 0a 43  w record key}..C
2820: 6f 64 65 20 7b 0a 38 20 20 20 20 20 4d 61 6b 65  ode {.8     Make
2830: 52 65 63 6f 72 64 20 20 20 20 32 20 20 20 20 20  Record    2     
2840: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 20 20 20 20 20 0a 7d 0a 70 75 74 73 20 7b 0a        .}.puts {.
2870: 3c 70 3e 20 54 68 65 20 69 6e 73 74 72 75 63 74  <p> The instruct
2880: 69 6f 6e 20 3c 61 20 68 72 65 66 3d 22 6f 70 63  ion <a href="opc
2890: 6f 64 65 2e 68 74 6d 6c 23 4d 61 6b 65 52 65 63  ode.html#MakeRec
28a0: 6f 72 64 22 3e 4d 61 6b 65 52 65 63 6f 72 64 3c  ord">MakeRecord<
28b0: 2f 61 3e 20 70 6f 70 73 20 0a 74 68 65 20 74 6f  /a> pops .the to
28c0: 70 20 50 31 20 65 6c 65 6d 65 6e 74 73 20 6f 66  p P1 elements of
28d0: 66 20 74 68 65 20 73 74 61 63 6b 20 28 32 20 69  f the stack (2 i
28e0: 6e 20 74 68 69 73 20 63 61 73 65 29 20 61 6e 64  n this case) and
28f0: 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69   converts them i
2900: 6e 74 6f 20 0a 74 68 65 20 62 69 6e 61 72 79 20  nto .the binary 
2910: 66 6f 72 6d 61 74 20 75 73 65 64 20 66 6f 72 20  format used for 
2920: 73 74 6f 72 69 6e 67 20 72 65 63 6f 72 64 73 20  storing records 
2930: 69 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  in a database fi
2940: 6c 65 2e 20 20 0a 28 53 65 65 20 74 68 65 20 3c  le.  .(See the <
2950: 61 20 68 72 65 66 3d 22 66 69 6c 65 66 6f 72 6d  a href="fileform
2960: 61 74 2e 68 74 6d 6c 22 3e 66 69 6c 65 20 66 6f  at.html">file fo
2970: 72 6d 61 74 3c 2f 61 3e 20 64 65 73 63 72 69 70  rmat</a> descrip
2980: 74 69 6f 6e 20 66 6f 72 20 0a 64 65 74 61 69 6c  tion for .detail
2990: 73 2e 29 20 20 54 68 65 20 6e 65 77 20 72 65 63  s.)  The new rec
29a0: 6f 72 64 20 67 65 6e 65 72 61 74 65 64 20 62 79  ord generated by
29b0: 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20   the MakeRecord 
29c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 0a  instruction is .
29d0: 70 75 73 68 65 64 20 62 61 63 6b 20 6f 6e 74 6f  pushed back onto
29e0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41 66 74   the stack.  Aft
29f0: 65 72 77 61 72 64 73 20 74 68 65 20 73 74 61 63  erwards the stac
2a00: 6b 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  k looks like thi
2a10: 73 3a 3c 2f 70 3e 0a 3c 2f 75 6c 3e 0a 7d 0a 73  s:</p>.</ul>.}.s
2a20: 74 61 63 6b 20 7b 28 72 65 63 6f 72 64 29 20 22  tack {(record) "
2a30: 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 22 2c 20  Hello, World!", 
2a40: 39 39 7d 20 5c 0a 20 7b 28 69 6e 74 65 67 65 72  99} \. {(integer
2a50: 29 20 6e 65 77 20 72 65 63 6f 72 64 20 6b 65 79  ) new record key
2a60: 7d 0a 0a 43 6f 64 65 20 7b 0a 39 20 20 20 20 20  }..Code {.9     
2a70: 50 75 74 49 6e 74 4b 65 79 20 20 20 20 20 30 20  PutIntKey     0 
2a80: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75 74            .}.put
2ab0: 73 20 7b 0a 3c 70 3e 20 54 68 65 20 69 6e 73 74  s {.<p> The inst
2ac0: 72 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66 3d  ruction <a href=
2ad0: 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 50 75 74  "opcode.html#Put
2ae0: 49 6e 74 4b 65 79 22 3e 50 75 74 49 6e 74 4b 65  IntKey">PutIntKe
2af0: 79 3c 2f 61 3e 20 75 73 65 73 20 0a 74 68 65 20  y</a> uses .the 
2b00: 74 6f 70 20 32 20 73 74 61 63 6b 20 65 6e 74 72  top 2 stack entr
2b10: 69 65 73 20 74 6f 20 77 72 69 74 65 20 61 6e 20  ies to write an 
2b20: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 74  entry into the t
2b30: 61 62 6c 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  able pointed to 
2b40: 62 79 20 0a 63 75 72 73 6f 72 20 50 31 2e 20 20  by .cursor P1.  
2b50: 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
2b60: 72 65 61 74 65 64 20 69 66 20 69 74 20 64 6f 65  reated if it doe
2b70: 73 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78 69  sn't already exi
2b80: 73 74 20 6f 72 20 74 68 65 20 0a 64 61 74 61 20  st or the .data 
2b90: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
2ba0: 65 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72 69  entry is overwri
2bb0: 74 74 65 6e 2e 20 20 54 68 65 20 72 65 63 6f 72  tten.  The recor
2bc0: 64 20 64 61 74 61 20 69 73 20 74 68 65 20 74 6f  d data is the to
2bd0: 70 20 0a 73 74 61 63 6b 20 65 6e 74 72 79 2c 20  p .stack entry, 
2be0: 61 6e 64 20 74 68 65 20 6b 65 79 20 69 73 20 74  and the key is t
2bf0: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 64 6f  he next entry do
2c00: 77 6e 2e 20 20 54 68 65 20 73 74 61 63 6b 20 69  wn.  The stack i
2c10: 73 20 70 6f 70 70 65 64 20 0a 74 77 69 63 65 20  s popped .twice 
2c20: 62 79 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  by this instruct
2c30: 69 6f 6e 2e 20 20 42 65 63 61 75 73 65 20 6f 70  ion.  Because op
2c40: 65 72 61 6e 64 20 50 32 20 69 73 20 31 20 74 68  erand P2 is 1 th
2c50: 65 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75  e row change cou
2c60: 6e 74 20 0a 69 73 20 69 6e 63 72 65 6d 65 6e 74  nt .is increment
2c70: 65 64 20 61 6e 64 20 74 68 65 20 72 6f 77 69 64  ed and the rowid
2c80: 20 69 73 20 73 74 6f 72 65 64 20 66 6f 72 20 73   is stored for s
2c90: 75 62 73 65 71 75 65 6e 74 20 72 65 74 75 72 6e  ubsequent return
2ca0: 20 62 79 20 74 68 65 20 0a 73 71 6c 69 74 65 5f   by the .sqlite_
2cb0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
2cc0: 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  d() function.  I
2cd0: 66 20 50 32 20 69 73 20 30 20 74 68 65 20 72 6f  f P2 is 0 the ro
2ce0: 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69  w change count i
2cf0: 73 20 0a 75 6e 6d 6f 64 69 66 69 65 64 2e 20 20  s .unmodified.  
2d00: 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
2d10: 20 69 73 20 77 68 65 72 65 20 74 68 65 20 69 6e   is where the in
2d20: 73 65 72 74 20 61 63 74 75 61 6c 6c 79 20 6f 63  sert actually oc
2d30: 63 75 72 73 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64  curs.</p>.}..Cod
2d40: 65 20 7b 0a 31 30 20 20 20 20 43 6c 6f 73 65 20  e {.10    Close 
2d50: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30          0      0
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75 74 73           .}.puts
2d90: 20 7b 0a 3c 70 3e 20 54 68 65 20 69 6e 73 74 72   {.<p> The instr
2da0: 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66 3d 22  uction <a href="
2db0: 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 43 6c 6f 73  opcode.html#Clos
2dc0: 65 22 3e 43 6c 6f 73 65 3c 2f 61 3e 20 63 6c 6f  e">Close</a> clo
2dd0: 73 65 73 20 61 20 0a 63 75 72 73 6f 72 20 70 72  ses a .cursor pr
2de0: 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
2df0: 61 73 20 50 31 20 28 30 2c 20 74 68 65 20 6f 6e  as P1 (0, the on
2e00: 6c 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 29 2e  ly open cursor).
2e10: 20 49 66 20 50 31 20 69 73 20 6e 6f 74 20 0a 63   If P1 is not .c
2e20: 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74  urrently open, t
2e30: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
2e40: 69 73 20 61 20 6e 6f 2d 6f 70 2e 3c 2f 70 3e 0a  is a no-op.</p>.
2e50: 7d 0a 0a 43 6f 64 65 20 7b 0a 31 31 20 20 20 20  }..Code {.11    
2e60: 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 30 20  Commit        0 
2e70: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
2ea0: 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e 20 54 68 65  }.puts {.<p> The
2eb0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3c 61 20   instruction <a 
2ec0: 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d  href="opcode.htm
2ed0: 6c 23 43 6f 6d 6d 69 74 22 3e 43 6f 6d 6d 69 74  l#Commit">Commit
2ee0: 3c 2f 61 3e 20 63 61 75 73 65 73 20 61 6c 6c 20  </a> causes all 
2ef0: 0a 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74  .modifications t
2f00: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  o the database t
2f10: 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 6d 61  hat have been ma
2f20: 64 65 20 73 69 6e 63 65 20 74 68 65 20 6c 61 73  de since the las
2f30: 74 20 0a 54 72 61 6e 73 61 63 74 69 6f 6e 20 74  t .Transaction t
2f40: 6f 20 61 63 74 75 61 6c 6c 79 20 74 61 6b 65 20  o actually take 
2f50: 65 66 66 65 63 74 2e 20 20 4e 6f 20 61 64 64 69  effect.  No addi
2f60: 74 69 6f 6e 61 6c 20 6d 6f 64 69 66 69 63 61 74  tional modificat
2f70: 69 6f 6e 73 20 61 72 65 20 0a 61 6c 6c 6f 77 65  ions are .allowe
2f80: 64 20 75 6e 74 69 6c 20 61 6e 6f 74 68 65 72 20  d until another 
2f90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
2fa0: 74 61 72 74 65 64 2e 20 20 54 68 65 20 43 6f 6d  tarted.  The Com
2fb0: 6d 69 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  mit instruction 
2fc0: 0a 64 65 6c 65 74 65 73 20 74 68 65 20 6a 6f 75  .deletes the jou
2fd0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 72 65  rnal file and re
2fe0: 6c 65 61 73 65 73 20 74 68 65 20 77 72 69 74 65  leases the write
2ff0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
3000: 61 62 61 73 65 2e 20 20 0a 41 20 72 65 61 64 20  abase.  .A read 
3010: 6c 6f 63 6b 20 63 6f 6e 74 69 6e 75 65 73 20 74  lock continues t
3020: 6f 20 62 65 20 68 65 6c 64 20 69 66 20 74 68 65  o be held if the
3030: 72 65 20 61 72 65 20 73 74 69 6c 6c 20 63 75 72  re are still cur
3040: 73 6f 72 73 20 6f 70 65 6e 2e 3c 2f 70 3e 0a 7d  sors open.</p>.}
3050: 0a 0a 43 6f 64 65 20 7b 0a 31 32 20 20 20 20 48  ..Code {.12    H
3060: 61 6c 74 20 20 20 20 20 20 20 20 20 20 30 20 20  alt          0  
3070: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d                .}
30a0: 0a 70 75 74 73 20 7b 0a 3c 70 3e 20 54 68 65 20  .puts {.<p> The 
30b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 3c 61 20 68  instruction <a h
30c0: 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c  ref="opcode.html
30d0: 23 48 61 6c 74 22 3e 48 61 6c 74 3c 2f 61 3e 20  #Halt">Halt</a> 
30e0: 63 61 75 73 65 73 20 74 68 65 20 56 44 42 45 20  causes the VDBE 
30f0: 0a 65 6e 67 69 6e 65 20 74 6f 20 65 78 69 74 20  .engine to exit 
3100: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 41 6c  immediately.  Al
3110: 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2c 20  l open cursors, 
3120: 4c 69 73 74 73 2c 20 53 6f 72 74 73 2c 20 65 74  Lists, Sorts, et
3130: 63 20 61 72 65 20 0a 63 6c 6f 73 65 64 20 61 75  c are .closed au
3140: 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 31  tomatically.  P1
3150: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
3160: 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  ode returned by 
3170: 73 71 6c 69 74 65 5f 65 78 65 63 28 29 2e 20 20  sqlite_exec().  
3180: 0a 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61  .For a normal ha
3190: 6c 74 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20  lt, this should 
31a0: 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29  be SQLITE_OK (0)
31b0: 2e 20 20 46 6f 72 20 65 72 72 6f 72 73 2c 20 69  .  For errors, i
31c0: 74 20 63 61 6e 20 62 65 20 0a 73 6f 6d 65 20 6f  t can be .some o
31d0: 74 68 65 72 20 76 61 6c 75 65 2e 20 20 54 68 65  ther value.  The
31e0: 20 6f 70 65 72 61 6e 64 20 50 32 20 69 73 20 6f   operand P2 is o
31f0: 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
3200: 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  ere is an error.
3210: 20 20 0a 54 68 65 72 65 20 69 73 20 61 6e 20 69    .There is an i
3220: 6d 70 6c 69 65 64 20 22 48 61 6c 74 20 30 20 30  mplied "Halt 0 0
3230: 20 30 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   0" instruction 
3240: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
3250: 65 72 79 20 0a 70 72 6f 67 72 61 6d 2c 20 77 68  ery .program, wh
3260: 69 63 68 20 74 68 65 20 56 44 42 45 20 61 70 70  ich the VDBE app
3270: 65 6e 64 73 20 77 68 65 6e 20 69 74 20 70 72 65  ends when it pre
3280: 70 61 72 65 73 20 61 20 70 72 6f 67 72 61 6d 20  pares a program 
3290: 74 6f 20 72 75 6e 2e 3c 2f 70 3e 0a 0a 0a 3c 61  to run.</p>...<a
32a0: 20 6e 61 6d 65 3d 22 74 72 61 63 65 22 3e 0a 3c   name="trace">.<
32b0: 68 32 3e 54 72 61 63 69 6e 67 20 56 44 42 45 20  h2>Tracing VDBE 
32c0: 50 72 6f 67 72 61 6d 20 45 78 65 63 75 74 69 6f  Program Executio
32d0: 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 49 66 20 74 68  n</h2>..<p>If th
32e0: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
32f0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
3300: 68 6f 75 74 20 74 68 65 20 4e 44 45 42 55 47 20  hout the NDEBUG 
3310: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 0a 6d 61  preprocessor .ma
3320: 63 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 50 52  cro, then the PR
3330: 41 47 4d 41 20 3c 61 20 68 72 65 66 3d 22 70 72  AGMA <a href="pr
3340: 61 67 6d 61 2e 68 74 6d 6c 23 70 72 61 67 6d 61  agma.html#pragma
3350: 5f 76 64 62 65 5f 74 72 61 63 65 22 3e 76 64 62  _vdbe_trace">vdb
3360: 65 5f 74 72 61 63 65 0a 3c 2f 61 3e 20 63 61 75  e_trace.</a> cau
3370: 73 65 73 20 74 68 65 20 56 44 42 45 20 74 6f 20  ses the VDBE to 
3380: 74 72 61 63 65 20 74 68 65 20 65 78 65 63 75 74  trace the execut
3390: 69 6f 6e 20 6f 66 20 70 72 6f 67 72 61 6d 73 2e  ion of programs.
33a0: 20 20 54 68 6f 75 67 68 20 74 68 69 73 20 0a 66    Though this .f
33b0: 65 61 74 75 72 65 20 77 61 73 20 6f 72 69 67 69  eature was origi
33c0: 6e 61 6c 6c 79 20 69 6e 74 65 6e 64 65 64 20 66  nally intended f
33d0: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
33e0: 65 62 75 67 67 69 6e 67 2c 20 69 74 20 63 61 6e  ebugging, it can
33f0: 20 61 6c 73 6f 20 0a 62 65 20 75 73 65 66 75 6c   also .be useful
3400: 20 69 6e 20 6c 65 61 72 6e 69 6e 67 20 61 62 6f   in learning abo
3410: 75 74 20 68 6f 77 20 74 68 65 20 56 44 42 45 20  ut how the VDBE 
3420: 6f 70 65 72 61 74 65 73 2e 20 20 0a 55 73 65 20  operates.  .Use 
3430: 22 3c 74 74 3e 50 52 41 47 4d 41 26 6e 62 73 70  "<tt>PRAGMA&nbsp
3440: 3b 76 64 62 65 5f 74 72 61 63 65 3d 4f 4e 3b 3c  ;vdbe_trace=ON;<
3450: 2f 74 74 3e 22 20 74 6f 20 74 75 72 6e 20 74 72  /tt>" to turn tr
3460: 61 63 69 6e 67 20 6f 6e 20 61 6e 64 20 0a 22 3c  acing on and ."<
3470: 74 74 3e 50 52 41 47 4d 41 26 6e 62 73 70 3b 76  tt>PRAGMA&nbsp;v
3480: 64 62 65 5f 74 72 61 63 65 3d 4f 46 46 3c 2f 74  dbe_trace=OFF</t
3490: 74 3e 22 20 74 6f 20 74 75 72 6e 20 74 72 61 63  t>" to turn trac
34a0: 69 6e 67 20 62 61 63 6b 20 6f 66 66 2e 20 20 0a  ing back off.  .
34b0: 4c 69 6b 65 20 74 68 69 73 3a 3c 2f 70 3e 0a 7d  Like this:</p>.}
34c0: 0a 0a 43 6f 64 65 20 7b 0a 73 71 6c 69 74 65 3e  ..Code {.sqlite>
34d0: 20 28 28 28 50 52 41 47 4d 41 20 76 64 62 65 5f   (((PRAGMA vdbe_
34e0: 74 72 61 63 65 3d 4f 4e 3b 29 29 29 0a 20 20 20  trace=ON;))).   
34f0: 30 20 48 61 6c 74 20 20 20 20 20 20 20 20 20 20  0 Halt          
3500: 20 20 30 20 20 20 20 30 0a 73 71 6c 69 74 65 3e    0    0.sqlite>
3510: 20 28 28 28 49 4e 53 45 52 54 20 49 4e 54 4f 20   (((INSERT INTO 
3520: 65 78 61 6d 70 20 56 41 4c 55 45 53 28 27 48 65  examp VALUES('He
3530: 6c 6c 6f 2c 20 57 6f 72 6c 64 21 27 2c 39 39 29  llo, World!',99)
3540: 3b 29 29 29 0a 20 20 20 30 20 54 72 61 6e 73 61  ;))).   0 Transa
3550: 63 74 69 6f 6e 20 20 20 20 20 30 20 20 20 20 30  ction     0    0
3560: 0a 20 20 20 31 20 56 65 72 69 66 79 43 6f 6f 6b  .   1 VerifyCook
3570: 69 65 20 20 20 20 30 20 20 20 38 31 0a 20 20 20  ie    0   81.   
3580: 32 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 20 20  2 Transaction   
3590: 20 20 31 20 20 20 20 30 0a 20 20 20 33 20 49 6e    1    0.   3 In
35a0: 74 65 67 65 72 20 20 20 20 20 20 20 20 20 30 20  teger         0 
35b0: 20 20 20 30 0a 53 74 61 63 6b 3a 20 69 3a 30 0a     0.Stack: i:0.
35c0: 20 20 20 34 20 4f 70 65 6e 57 72 69 74 65 20 20     4 OpenWrite  
35d0: 20 20 20 20 20 30 20 20 20 20 33 20 65 78 61 6d       0    3 exam
35e0: 70 0a 20 20 20 35 20 4e 65 77 52 65 63 6e 6f 20  p.   5 NewRecno 
35f0: 20 20 20 20 20 20 20 30 20 20 20 20 30 0a 53 74         0    0.St
3600: 61 63 6b 3a 20 69 3a 32 0a 20 20 20 36 20 53 74  ack: i:2.   6 St
3610: 72 69 6e 67 20 20 20 20 20 20 20 20 20 20 30 20  ring          0 
3620: 20 20 20 30 20 48 65 6c 6c 6f 2c 20 57 6f 72 6c     0 Hello, Worl
3630: 64 21 0a 53 74 61 63 6b 3a 20 74 5b 48 65 6c 6c  d!.Stack: t[Hell
3640: 6f 2c 2e 57 6f 72 6c 64 21 5d 20 69 3a 32 0a 20  o,.World!] i:2. 
3650: 20 20 37 20 49 6e 74 65 67 65 72 20 20 20 20 20    7 Integer     
3660: 20 20 20 39 39 20 20 20 20 30 20 39 39 0a 53 74     99    0 99.St
3670: 61 63 6b 3a 20 73 69 3a 39 39 20 74 5b 48 65 6c  ack: si:99 t[Hel
3680: 6c 6f 2c 2e 57 6f 72 6c 64 21 5d 20 69 3a 32 0a  lo,.World!] i:2.
3690: 20 20 20 38 20 4d 61 6b 65 52 65 63 6f 72 64 20     8 MakeRecord 
36a0: 20 20 20 20 20 32 20 20 20 20 30 0a 53 74 61 63       2    0.Stac
36b0: 6b 3a 20 73 5b 2e 2e 2e 48 65 6c 6c 6f 2c 2e 57  k: s[...Hello,.W
36c0: 6f 72 6c 64 21 2e 39 39 5d 20 69 3a 32 0a 20 20  orld!.99] i:2.  
36d0: 20 39 20 50 75 74 49 6e 74 4b 65 79 20 20 20 20   9 PutIntKey    
36e0: 20 20 20 30 20 20 20 20 31 0a 20 20 31 30 20 43     0    1.  10 C
36f0: 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 30  lose           0
3700: 20 20 20 20 30 0a 20 20 31 31 20 43 6f 6d 6d 69      0.  11 Commi
3710: 74 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20  t          0    
3720: 30 0a 20 20 31 32 20 48 61 6c 74 20 20 20 20 20  0.  12 Halt     
3730: 20 20 20 20 20 20 20 30 20 20 20 20 30 0a 7d 0a         0    0.}.
3740: 0a 70 75 74 73 20 7b 0a 3c 70 3e 57 69 74 68 20  .puts {.<p>With 
3750: 74 72 61 63 69 6e 67 20 6d 6f 64 65 20 6f 6e 2c  tracing mode on,
3760: 20 74 68 65 20 56 44 42 45 20 70 72 69 6e 74 73   the VDBE prints
3770: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
3780: 6e 20 70 72 69 6f 72 0a 74 6f 20 65 78 65 63 75  n prior.to execu
3790: 74 69 6e 67 20 69 74 2e 20 20 41 66 74 65 72 20  ting it.  After 
37a0: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
37b0: 69 73 20 65 78 65 63 75 74 65 64 2c 20 74 68 65  is executed, the
37c0: 20 74 6f 70 20 66 65 77 0a 65 6e 74 72 69 65 73   top few.entries
37d0: 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 61 72   in the stack ar
37e0: 65 20 64 69 73 70 6c 61 79 65 64 2e 20 20 54 68  e displayed.  Th
37f0: 65 20 73 74 61 63 6b 20 64 69 73 70 6c 61 79 20  e stack display 
3800: 69 73 20 6f 6d 69 74 74 65 64 0a 69 66 20 74 68  is omitted.if th
3810: 65 20 73 74 61 63 6b 20 69 73 20 65 6d 70 74 79  e stack is empty
3820: 2e 3c 2f 70 3e 0a 0a 3c 70 3e 4f 6e 20 74 68 65  .</p>..<p>On the
3830: 20 73 74 61 63 6b 20 64 69 73 70 6c 61 79 2c 20   stack display, 
3840: 6d 6f 73 74 20 65 6e 74 72 69 65 73 20 61 72 65  most entries are
3850: 20 73 68 6f 77 6e 20 77 69 74 68 20 61 20 70 72   shown with a pr
3860: 65 66 69 78 0a 74 68 61 74 20 74 65 6c 6c 73 20  efix.that tells 
3870: 74 68 65 20 64 61 74 61 74 79 70 65 20 6f 66 20  the datatype of 
3880: 74 68 61 74 20 73 74 61 63 6b 20 65 6e 74 72 79  that stack entry
3890: 2e 20 20 49 6e 74 65 67 65 72 73 20 62 65 67 69  .  Integers begi
38a0: 6e 0a 77 69 74 68 20 22 3c 74 74 3e 69 3a 3c 2f  n.with "<tt>i:</
38b0: 74 74 3e 22 2e 20 20 46 6c 6f 61 74 69 6e 67 20  tt>".  Floating 
38c0: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 62 65 67  point values beg
38d0: 69 6e 20 77 69 74 68 20 22 3c 74 74 3e 72 3a 3c  in with "<tt>r:<
38e0: 2f 74 74 3e 22 2e 0a 28 54 68 65 20 22 72 22 20  /tt>"..(The "r" 
38f0: 73 74 61 6e 64 73 20 66 6f 72 20 22 72 65 61 6c  stands for "real
3900: 2d 6e 75 6d 62 65 72 22 2e 29 20 20 53 74 72 69  -number".)  Stri
3910: 6e 67 73 20 62 65 67 69 6e 20 77 69 74 68 20 65  ngs begin with e
3920: 69 74 68 65 72 0a 22 3c 74 74 3e 73 3a 3c 2f 74  ither."<tt>s:</t
3930: 74 3e 22 2c 20 22 3c 74 74 3e 74 3a 3c 2f 74 74  t>", "<tt>t:</tt
3940: 3e 22 2c 20 22 3c 74 74 3e 65 3a 3c 2f 74 74 3e  >", "<tt>e:</tt>
3950: 22 20 6f 72 20 22 3c 74 74 3e 7a 3a 3c 2f 74 74  " or "<tt>z:</tt
3960: 3e 22 2e 20 20 0a 54 68 65 20 64 69 66 66 65 72  >".  .The differ
3970: 65 6e 63 65 20 61 6d 6f 6e 67 20 74 68 65 20 73  ence among the s
3980: 74 72 69 6e 67 20 70 72 65 66 69 78 65 73 20 69  tring prefixes i
3990: 73 20 63 61 75 73 65 64 20 62 79 20 68 6f 77 20  s caused by how 
39a0: 74 68 65 69 72 20 0a 6d 65 6d 6f 72 79 20 69 73  their .memory is
39b0: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 54 68 65 20   allocated. The 
39c0: 7a 3a 20 73 74 72 69 6e 67 73 20 61 72 65 20 73  z: strings are s
39d0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
39e0: 6f 62 74 61 69 6e 65 64 0a 66 72 6f 6d 20 3c 62  obtained.from <b
39f0: 3e 6d 61 6c 6c 6f 63 28 29 3c 2f 62 3e 2e 20 20  >malloc()</b>.  
3a00: 54 68 65 20 74 3a 20 73 74 72 69 6e 67 73 20 61  The t: strings a
3a10: 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 61 6c  re statically al
3a20: 6c 6f 63 61 74 65 64 2e 20 20 0a 54 68 65 20 65  located.  .The e
3a30: 3a 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 70  : strings are ep
3a40: 68 65 6d 65 72 61 6c 2e 20 20 41 6c 6c 20 6f 74  hemeral.  All ot
3a50: 68 65 72 20 73 74 72 69 6e 67 73 20 68 61 76 65  her strings have
3a60: 20 74 68 65 20 73 3a 20 70 72 65 66 69 78 2e 20   the s: prefix. 
3a70: 20 0a 54 68 69 73 20 64 6f 65 73 6e 27 74 20 6d   .This doesn't m
3a80: 61 6b 65 20 61 6e 79 20 64 69 66 66 65 72 65 6e  ake any differen
3a90: 63 65 20 74 6f 20 79 6f 75 2c 0a 74 68 65 20 6f  ce to you,.the o
3aa0: 62 73 65 72 76 65 72 2c 20 62 75 74 20 69 74 20  bserver, but it 
3ab0: 69 73 20 76 69 74 61 6c 6c 79 20 69 6d 70 6f 72  is vitally impor
3ac0: 74 61 6e 74 20 74 6f 20 74 68 65 20 56 44 42 45  tant to the VDBE
3ad0: 20 73 69 6e 63 65 20 74 68 65 0a 7a 3a 20 73 74   since the.z: st
3ae0: 72 69 6e 67 73 20 6e 65 65 64 20 74 6f 20 62 65  rings need to be
3af0: 20 70 61 73 73 65 64 20 74 6f 20 3c 62 3e 66 72   passed to <b>fr
3b00: 65 65 28 29 3c 2f 62 3e 20 77 68 65 6e 20 74 68  ee()</b> when th
3b10: 65 79 20 61 72 65 0a 70 6f 70 70 65 64 20 74 6f  ey are.popped to
3b20: 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
3b30: 6c 65 61 6b 2e 20 20 4e 6f 74 65 20 74 68 61 74  leak.  Note that
3b40: 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
3b50: 31 30 0a 63 68 61 72 61 63 74 65 72 73 20 6f 66  10.characters of
3b60: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 20 61   string values a
3b70: 72 65 20 64 69 73 70 6c 61 79 65 64 20 61 6e 64  re displayed and
3b80: 20 74 68 61 74 20 62 69 6e 61 72 79 0a 76 61 6c   that binary.val
3b90: 75 65 73 20 28 73 75 63 68 20 61 73 20 74 68 65  ues (such as the
3ba0: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4d   result of the M
3bb0: 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75  akeRecord instru
3bc0: 63 74 69 6f 6e 29 20 61 72 65 0a 74 72 65 61 74  ction) are.treat
3bd0: 65 64 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20  ed as strings.  
3be0: 54 68 65 20 6f 6e 6c 79 20 6f 74 68 65 72 20 64  The only other d
3bf0: 61 74 61 74 79 70 65 20 74 68 61 74 20 63 61 6e  atatype that can
3c00: 20 62 65 20 73 74 6f 72 65 64 0a 6f 6e 20 74 68   be stored.on th
3c10: 65 20 56 44 42 45 20 73 74 61 63 6b 20 69 73 20  e VDBE stack is 
3c20: 61 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  a NULL, which is
3c30: 20 64 69 73 70 6c 61 79 20 77 69 74 68 6f 75 74   display without
3c40: 20 70 72 65 66 69 78 0a 61 73 20 73 69 6d 70 6c   prefix.as simpl
3c50: 79 20 22 3c 74 74 3e 4e 55 4c 4c 3c 2f 74 74 3e  y "<tt>NULL</tt>
3c60: 22 2e 20 20 49 66 20 61 6e 20 69 6e 74 65 67 65  ".  If an intege
3c70: 72 20 68 61 73 20 62 65 65 6e 20 70 6c 61 63 65  r has been place
3c80: 64 20 6f 6e 20 74 68 65 20 0a 73 74 61 63 6b 20  d on the .stack 
3c90: 61 73 20 62 6f 74 68 20 61 6e 20 69 6e 74 65 67  as both an integ
3ca0: 65 72 20 61 6e 64 20 61 20 73 74 72 69 6e 67 2c  er and a string,
3cb0: 20 69 74 73 20 70 72 65 66 69 78 20 69 73 20 22   its prefix is "
3cc0: 3c 74 74 3e 73 69 3a 3c 2f 74 74 3e 22 2e 0a 0a  <tt>si:</tt>"...
3cd0: 0a 3c 61 20 6e 61 6d 65 3d 22 71 75 65 72 79 31  .<a name="query1
3ce0: 22 3e 0a 3c 68 32 3e 53 69 6d 70 6c 65 20 51 75  ">.<h2>Simple Qu
3cf0: 65 72 69 65 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 41  eries</h2>..<p>A
3d00: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 79 6f  t this point, yo
3d10: 75 20 73 68 6f 75 6c 64 20 75 6e 64 65 72 73 74  u should underst
3d20: 61 6e 64 20 74 68 65 20 62 61 73 69 63 73 20 6f  and the basics o
3d30: 66 20 68 6f 77 20 74 68 65 20 56 44 42 45 0a 77  f how the VDBE.w
3d40: 72 69 74 65 73 20 74 6f 20 61 20 64 61 74 61 62  rites to a datab
3d50: 61 73 65 2e 20 20 4e 6f 77 20 6c 65 74 27 73 20  ase.  Now let's 
3d60: 6c 6f 6f 6b 20 61 74 20 68 6f 77 20 69 74 20 64  look at how it d
3d70: 6f 65 73 20 71 75 65 72 69 65 73 2e 0a 57 65 20  oes queries..We 
3d80: 77 69 6c 6c 20 75 73 65 20 74 68 65 20 66 6f 6c  will use the fol
3d90: 6c 6f 77 69 6e 67 20 73 69 6d 70 6c 65 20 53 45  lowing simple SE
3da0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
3db0: 73 20 6f 75 72 20 65 78 61 6d 70 6c 65 3a 3c 2f  s our example:</
3dc0: 70 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e  p>..<blockquote>
3dd0: 3c 70 72 65 3e 0a 53 45 4c 45 43 54 20 2a 20 46  <pre>.SELECT * F
3de0: 52 4f 4d 20 65 78 61 6d 70 3b 0a 3c 2f 70 72 65  ROM examp;.</pre
3df0: 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a  ></blockquote>..
3e00: 3c 70 3e 54 68 65 20 56 44 42 45 20 70 72 6f 67  <p>The VDBE prog
3e10: 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ram generated fo
3e20: 72 20 74 68 69 73 20 53 51 4c 20 73 74 61 74 65  r this SQL state
3e30: 6d 65 6e 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ment is as follo
3e40: 77 73 3a 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20  ws:</p>.}..Code 
3e50: 7b 0a 73 71 6c 69 74 65 3e 20 28 28 28 45 58 50  {.sqlite> (((EXP
3e60: 4c 41 49 4e 20 53 45 4c 45 43 54 20 2a 20 46 52  LAIN SELECT * FR
3e70: 4f 4d 20 65 78 61 6d 70 3b 29 29 29 0a 61 64 64  OM examp;))).add
3e80: 72 20 20 6f 70 63 6f 64 65 20 20 20 20 20 20 20  r  opcode       
3e90: 20 70 31 20 20 20 20 20 70 32 20 20 20 20 20 70   p1     p2     p
3ea0: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d    .----  -------
3ed0: 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d  -----  -----  --
3ee0: 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 43  --------.0     C
3f10: 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20 30 20 20  olumnName    0  
3f20: 20 20 20 20 30 20 20 20 20 20 20 6f 6e 65 20 20      0      one  
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
3f50: 20 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20       ColumnName 
3f60: 20 20 20 31 20 20 20 20 20 20 30 20 20 20 20 20     1      0     
3f70: 20 74 77 6f 20 20 20 20 20 20 20 20 20 20 20 20   two            
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 20 20 0a 32 20 20 20 20 20 49 6e 74 65 67      .2     Integ
3fa0: 65 72 20 20 20 20 20 20 20 30 20 20 20 20 20 20  er       0      
3fb0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 20 20 20 20 20 20 20 20 20 0a 33 20 20 20 20            .3    
3fe0: 20 4f 70 65 6e 52 65 61 64 20 20 20 20 20 20 30   OpenRead      0
3ff0: 20 20 20 20 20 20 33 20 20 20 20 20 20 65 78 61        3      exa
4000: 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mp              
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 0a 34 20 20 20 20 20 56 65 72 69 66 79 43 6f 6f  .4     VerifyCoo
4030: 6b 69 65 20 20 30 20 20 20 20 20 20 38 31 20 20  kie  0      81  
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 20 20 20 20 0a 35 20 20 20 20 20 52 65 77        .5     Rew
4070: 69 6e 64 20 20 20 20 20 20 20 20 30 20 20 20 20  ind        0    
4080: 20 20 31 30 20 20 20 20 20 20 20 20 20 20 20 20    10            
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 36 20 20              .6  
40b0: 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20     Column       
40c0: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 20 0a 37 20 20 20 20 20 43 6f 6c 75 6d 6e 20    .7     Column 
4100: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31 20         0      1 
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4130: 20 20 20 20 20 20 20 20 0a 38 20 20 20 20 20 43          .8     C
4140: 61 6c 6c 62 61 63 6b 20 20 20 20 20 20 32 20 20  allback      2  
4150: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 39                .9
4180: 20 20 20 20 20 4e 65 78 74 20 20 20 20 20 20 20       Next       
4190: 20 20 20 30 20 20 20 20 20 20 36 20 20 20 20 20     0      6     
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 20 0a 31 30 20 20 20 20 43 6c 6f 73 65      .10    Close
41d0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
41e0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 20 20 20 20 20 20 20 20 20 0a 31 31 20 20 20            .11   
4210: 20 48 61 6c 74 20 20 20 20 20 20 20 20 20 20 30   Halt          0
4220: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4250: 0a 7d 0a 0a 70 75 74 73 20 7b 0a 3c 70 3e 42 65  .}..puts {.<p>Be
4260: 66 6f 72 65 20 77 65 20 62 65 67 69 6e 20 6c 6f  fore we begin lo
4270: 6f 6b 69 6e 67 20 61 74 20 74 68 69 73 20 70 72  oking at this pr
4280: 6f 62 6c 65 6d 2c 20 6c 65 74 27 73 20 62 72 69  oblem, let's bri
4290: 65 66 6c 79 20 72 65 76 69 65 77 0a 68 6f 77 20  efly review.how 
42a0: 71 75 65 72 69 65 73 20 77 6f 72 6b 20 69 6e 20  queries work in 
42b0: 53 51 4c 69 74 65 20 73 6f 20 74 68 61 74 20 77  SQLite so that w
42c0: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 61 74  e will know what
42d0: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 74   we are trying.t
42e0: 6f 20 61 63 63 6f 6d 70 6c 69 73 68 2e 20 20 46  o accomplish.  F
42f0: 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74  or each row in t
4300: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 71  he result of a q
4310: 75 65 72 79 2c 0a 53 51 4c 69 74 65 20 77 69 6c  uery,.SQLite wil
4320: 6c 20 69 6e 76 6f 6b 65 20 61 20 63 61 6c 6c 62  l invoke a callb
4330: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
4340: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  h the following.
4350: 70 72 6f 74 6f 74 79 70 65 3a 3c 2f 70 3e 0a 0a  prototype:</p>..
4360: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
4370: 3e 0a 69 6e 74 20 43 61 6c 6c 62 61 63 6b 28 76  >.int Callback(v
4380: 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 20  oid *pUserData, 
4390: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 63 68 61  int nColumn, cha
43a0: 72 20 2a 61 7a 44 61 74 61 5b 5d 2c 20 63 68 61  r *azData[], cha
43b0: 72 20 2a 61 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 5b  r *azColumnName[
43c0: 5d 29 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63  ]);.</pre></bloc
43d0: 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e 54 68 65 20  kquote>..<p>The 
43e0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 73  SQLite library s
43f0: 75 70 70 6c 69 65 73 20 74 68 65 20 56 44 42 45  upplies the VDBE
4400: 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20   with a pointer 
4410: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
4420: 66 75 6e 63 74 69 6f 6e 0a 61 6e 64 20 74 68 65  function.and the
4430: 20 3c 62 3e 70 55 73 65 72 44 61 74 61 3c 2f 62   <b>pUserData</b
4440: 3e 20 70 6f 69 6e 74 65 72 2e 20 20 28 42 6f 74  > pointer.  (Bot
4450: 68 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 61  h the callback a
4460: 6e 64 20 74 68 65 20 75 73 65 72 20 64 61 74 61  nd the user data
4470: 20 77 65 72 65 0a 6f 72 69 67 69 6e 61 6c 6c 79   were.originally
4480: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61 72   passed in as ar
4490: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 3c  guments to the <
44a0: 62 3e 73 71 6c 69 74 65 5f 65 78 65 63 28 29 3c  b>sqlite_exec()<
44b0: 2f 62 3e 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  /b> API function
44c0: 2e 29 0a 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .).The job of th
44d0: 65 20 56 44 42 45 20 69 73 20 74 6f 0a 63 6f 6d  e VDBE is to.com
44e0: 65 20 75 70 20 77 69 74 68 20 76 61 6c 75 65 73  e up with values
44f0: 20 66 6f 72 20 3c 62 3e 6e 43 6f 6c 75 6d 6e 3c   for <b>nColumn<
4500: 2f 62 3e 2c 20 3c 62 3e 61 7a 44 61 74 61 5b 5d  /b>, <b>azData[]
4510: 3c 2f 62 3e 2c 20 0a 61 6e 64 20 3c 62 3e 61 7a  </b>, .and <b>az
4520: 43 6f 6c 75 6d 6e 4e 61 6d 65 5b 5d 3c 2f 62 3e  ColumnName[]</b>
4530: 2e 0a 3c 62 3e 6e 43 6f 6c 75 6d 6e 3c 2f 62 3e  ..<b>nColumn</b>
4540: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
4550: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
4560: 20 72 65 73 75 6c 74 73 2c 20 6f 66 20 63 6f 75   results, of cou
4570: 72 73 65 2e 0a 3c 62 3e 61 7a 43 6f 6c 75 6d 6e  rse..<b>azColumn
4580: 4e 61 6d 65 5b 5d 3c 2f 62 3e 20 69 73 20 61 6e  Name[]</b> is an
4590: 20 61 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67   array of string
45a0: 73 20 77 68 65 72 65 20 65 61 63 68 20 73 74 72  s where each str
45b0: 69 6e 67 20 69 73 20 74 68 65 20 6e 61 6d 65 0a  ing is the name.
45c0: 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 65  of one of the re
45d0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 3c  sult columns.  <
45e0: 62 3e 61 7a 44 61 74 61 5b 5d 3c 2f 62 3e 20 69  b>azData[]</b> i
45f0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 74  s an array of st
4600: 72 69 6e 67 73 20 68 6f 6c 64 69 6e 67 0a 74 68  rings holding.th
4610: 65 20 61 63 74 75 61 6c 20 64 61 74 61 2e 3c 2f  e actual data.</
4620: 70 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 30 20 20  p>.}..Code {.0  
4630: 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20     ColumnName   
4640: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 6f   0      0      o
4650: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4670: 20 20 0a 31 20 20 20 20 20 43 6f 6c 75 6d 6e 4e    .1     ColumnN
4680: 61 6d 65 20 20 20 20 31 20 20 20 20 20 20 30 20  ame    1      0 
4690: 20 20 20 20 20 74 77 6f 20 20 20 20 20 20 20 20       two        
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46b0: 20 20 20 20 20 20 20 20 0a 7d 0a 70 75 74 73 20          .}.puts 
46c0: 7b 0a 3c 70 3e 54 68 65 20 66 69 72 73 74 20 74  {.<p>The first t
46d0: 77 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  wo instructions 
46e0: 69 6e 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  in the VDBE prog
46f0: 72 61 6d 20 66 6f 72 20 6f 75 72 20 71 75 65 72  ram for our quer
4700: 79 20 61 72 65 0a 63 6f 6e 63 65 72 6e 65 64 20  y are.concerned 
4710: 77 69 74 68 20 73 65 74 74 69 6e 67 20 75 70 20  with setting up 
4720: 76 61 6c 75 65 73 20 66 6f 72 20 3c 62 3e 61 7a  values for <b>az
4730: 43 6f 6c 75 6d 6e 3c 2f 62 3e 2e 0a 54 68 65 20  Column</b>..The 
4740: 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e  <a href="opcode.
4750: 68 74 6d 6c 23 43 6f 6c 75 6d 6e 4e 61 6d 65 22  html#ColumnName"
4760: 3e 43 6f 6c 75 6d 6e 4e 61 6d 65 3c 2f 61 3e 20  >ColumnName</a> 
4770: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 65 6c  instructions tel
4780: 6c 20 0a 74 68 65 20 56 44 42 45 20 77 68 61 74  l .the VDBE what
4790: 20 76 61 6c 75 65 73 20 74 6f 20 66 69 6c 6c 20   values to fill 
47a0: 69 6e 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d  in for each elem
47b0: 65 6e 74 20 6f 66 20 74 68 65 20 3c 62 3e 61 7a  ent of the <b>az
47c0: 43 6f 6c 75 6d 6e 4e 61 6d 65 5b 5d 3c 2f 62 3e  ColumnName[]</b>
47d0: 20 0a 61 72 72 61 79 2e 20 20 45 76 65 72 79 20   .array.  Every 
47e0: 71 75 65 72 79 20 77 69 6c 6c 20 62 65 67 69 6e  query will begin
47f0: 20 77 69 74 68 20 6f 6e 65 20 43 6f 6c 75 6d 6e   with one Column
4800: 4e 61 6d 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  Name instruction
4810: 20 66 6f 72 20 65 61 63 68 20 0a 63 6f 6c 75 6d   for each .colum
4820: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2c  n in the result,
4830: 20 61 6e 64 20 74 68 65 72 65 20 77 69 6c 6c 20   and there will 
4840: 62 65 20 61 20 6d 61 74 63 68 69 6e 67 20 43 6f  be a matching Co
4850: 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lumn instruction
4860: 20 66 6f 72 20 0a 65 61 63 68 20 6f 6e 65 20 6c   for .each one l
4870: 61 74 65 72 20 69 6e 20 74 68 65 20 71 75 65 72  ater in the quer
4880: 79 2e 0a 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20  y..</p>.}..Code 
4890: 7b 0a 32 20 20 20 20 20 49 6e 74 65 67 65 72 20  {.2     Integer 
48a0: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48d0: 20 20 20 20 20 20 20 0a 33 20 20 20 20 20 4f 70         .3     Op
48e0: 65 6e 52 65 61 64 20 20 20 20 20 20 30 20 20 20  enRead      0   
48f0: 20 20 20 33 20 20 20 20 20 20 65 78 61 6d 70 20     3      examp 
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 34 20               .4 
4920: 20 20 20 20 56 65 72 69 66 79 43 6f 6f 6b 69 65      VerifyCookie
4930: 20 20 30 20 20 20 20 20 20 38 31 20 20 20 20 20    0      81     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4960: 20 20 20 0a 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e     .}.puts {.<p>
4970: 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 32 20 61  Instructions 2 a
4980: 6e 64 20 33 20 6f 70 65 6e 20 61 20 72 65 61 64  nd 3 open a read
4990: 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 64   cursor on the d
49a0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68  atabase table th
49b0: 61 74 20 69 73 20 0a 74 6f 20 62 65 20 71 75 65  at is .to be que
49c0: 72 69 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b  ried.  This work
49d0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
49e0: 65 20 4f 70 65 6e 57 72 69 74 65 20 69 6e 73 74  e OpenWrite inst
49f0: 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a  ruction in the .
4a00: 49 4e 53 45 52 54 20 65 78 61 6d 70 6c 65 20 65  INSERT example e
4a10: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 63  xcept that the c
4a20: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20  ursor is opened 
4a30: 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68 69 73  for reading this
4a40: 20 74 69 6d 65 20 0a 69 6e 73 74 65 61 64 20 6f   time .instead o
4a50: 66 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 20  f for writing.  
4a60: 49 6e 73 74 72 75 63 74 69 6f 6e 20 34 20 76 65  Instruction 4 ve
4a70: 72 69 66 69 65 73 20 74 68 65 20 64 61 74 61 62  rifies the datab
4a80: 61 73 65 20 73 63 68 65 6d 61 20 61 73 20 0a 69  ase schema as .i
4a90: 6e 20 74 68 65 20 49 4e 53 45 52 54 20 65 78 61  n the INSERT exa
4aa0: 6d 70 6c 65 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64  mple.</p>.}..Cod
4ab0: 65 20 7b 0a 35 20 20 20 20 20 52 65 77 69 6e 64  e {.5     Rewind
4ac0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31          0      1
4ad0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75 74 73           .}.puts
4b00: 20 7b 0a 3c 70 3e 20 54 68 65 20 3c 61 20 68 72   {.<p> The <a hr
4b10: 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23  ef="opcode.html#
4b20: 52 65 77 69 6e 64 22 3e 52 65 77 69 6e 64 3c 2f  Rewind">Rewind</
4b30: 61 3e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  a> instruction i
4b40: 6e 69 74 69 61 6c 69 7a 65 73 20 0a 61 20 6c 6f  nitializes .a lo
4b50: 6f 70 20 74 68 61 74 20 69 74 65 72 61 74 65 73  op that iterates
4b60: 20 6f 76 65 72 20 74 68 65 20 22 65 78 61 6d 70   over the "examp
4b70: 22 20 74 61 62 6c 65 2e 20 49 74 20 72 65 77 69  " table. It rewi
4b80: 6e 64 73 20 74 68 65 20 63 75 72 73 6f 72 20 50  nds the cursor P
4b90: 31 20 0a 74 6f 20 74 68 65 20 66 69 72 73 74 20  1 .to the first 
4ba0: 65 6e 74 72 79 20 69 6e 20 69 74 73 20 74 61 62  entry in its tab
4bb0: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 72 65 71  le.  This is req
4bc0: 75 69 72 65 64 20 62 79 20 74 68 65 20 74 68 65  uired by the the
4bd0: 20 43 6f 6c 75 6d 6e 20 61 6e 64 20 0a 4e 65 78   Column and .Nex
4be0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2c 20  t instructions, 
4bf0: 77 68 69 63 68 20 75 73 65 20 74 68 65 20 63 75  which use the cu
4c00: 72 73 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  rsor to iterate 
4c10: 74 68 72 6f 75 67 68 20 74 68 65 20 74 61 62 6c  through the tabl
4c20: 65 2e 20 20 0a 49 66 20 74 68 65 20 74 61 62 6c  e.  .If the tabl
4c30: 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 6e  e is empty, then
4c40: 20 6a 75 6d 70 20 74 6f 20 50 32 20 28 31 30 29   jump to P2 (10)
4c50: 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  , which is the i
4c60: 6e 73 74 72 75 63 74 69 6f 6e 20 6a 75 73 74 20  nstruction just 
4c70: 0a 70 61 73 74 20 74 68 65 20 6c 6f 6f 70 2e 20  .past the loop. 
4c80: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   If the table is
4c90: 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c   not empty, fall
4ca0: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
4cb0: 66 6f 6c 6c 6f 77 69 6e 67 20 0a 69 6e 73 74 72  following .instr
4cc0: 75 63 74 69 6f 6e 20 61 74 20 36 2c 20 77 68 69  uction at 6, whi
4cd0: 63 68 20 69 73 20 74 68 65 20 62 65 67 69 6e 6e  ch is the beginn
4ce0: 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
4cf0: 62 6f 64 79 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64  body.</p>.}..Cod
4d00: 65 20 7b 0a 36 20 20 20 20 20 43 6f 6c 75 6d 6e  e {.6     Column
4d10: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30          0      0
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 20 20 20 20 20 20 20 20 20 0a 37 20 20 20 20 20           .7     
4d50: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20  Column        0 
4d60: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
4d90: 38 20 20 20 20 20 43 61 6c 6c 62 61 63 6b 20 20  8     Callback  
4da0: 20 20 20 20 32 20 20 20 20 20 20 30 20 20 20 20      2      0    
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 0a 7d 0a 70 75 74 73 20 7b 0a 3c       .}.puts {.<
4de0: 70 3e 20 54 68 65 20 69 6e 73 74 72 75 63 74 69  p> The instructi
4df0: 6f 6e 73 20 36 20 74 68 72 6f 75 67 68 20 38 20  ons 6 through 8 
4e00: 66 6f 72 6d 20 74 68 65 20 62 6f 64 79 20 6f 66  form the body of
4e10: 20 74 68 65 20 6c 6f 6f 70 20 74 68 61 74 20 77   the loop that w
4e20: 69 6c 6c 20 0a 65 78 65 63 75 74 65 20 6f 6e 63  ill .execute onc
4e30: 65 20 66 6f 72 20 65 61 63 68 20 72 65 63 6f 72  e for each recor
4e40: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
4e50: 65 20 66 69 6c 65 2e 20 20 0a 0a 54 68 65 20 3c  e file.  ..The <
4e60: 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68  a href="opcode.h
4e70: 74 6d 6c 23 43 6f 6c 75 6d 6e 22 3e 43 6f 6c 75  tml#Column">Colu
4e80: 6d 6e 3c 2f 61 3e 20 69 6e 73 74 72 75 63 74 69  mn</a> instructi
4e90: 6f 6e 73 20 61 74 20 61 64 64 72 65 73 73 65 73  ons at addresses
4ea0: 20 36 20 0a 61 6e 64 20 37 20 65 61 63 68 20 74   6 .and 7 each t
4eb0: 61 6b 65 20 74 68 65 20 50 32 2d 74 68 20 63 6f  ake the P2-th co
4ec0: 6c 75 6d 6e 20 66 72 6f 6d 20 74 68 65 20 50 31  lumn from the P1
4ed0: 2d 74 68 20 63 75 72 73 6f 72 20 61 6e 64 20 70  -th cursor and p
4ee0: 75 73 68 20 69 74 20 6f 6e 74 6f 20 0a 74 68 65  ush it onto .the
4ef0: 20 73 74 61 63 6b 2e 20 20 49 6e 20 74 68 69 73   stack.  In this
4f00: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 69   example, the fi
4f10: 72 73 74 20 43 6f 6c 75 6d 6e 20 69 6e 73 74 72  rst Column instr
4f20: 75 63 74 69 6f 6e 20 69 73 20 70 75 73 68 69 6e  uction is pushin
4f30: 67 20 74 68 65 20 0a 76 61 6c 75 65 20 66 6f 72  g the .value for
4f40: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 22 6f 6e 65   the column "one
4f50: 22 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  " onto the stack
4f60: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
4f70: 43 6f 6c 75 6d 6e 20 0a 69 6e 73 74 72 75 63 74  Column .instruct
4f80: 69 6f 6e 20 69 73 20 70 75 73 68 69 6e 67 20 74  ion is pushing t
4f90: 68 65 20 76 61 6c 75 65 20 66 6f 72 20 63 6f 6c  he value for col
4fa0: 75 6d 6e 20 22 74 77 6f 22 2e 20 20 0a 0a 54 68  umn "two".  ..Th
4fb0: 65 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64  e <a href="opcod
4fc0: 65 2e 68 74 6d 6c 23 43 61 6c 6c 62 61 63 6b 22  e.html#Callback"
4fd0: 3e 43 61 6c 6c 62 61 63 6b 3c 2f 61 3e 20 69 6e  >Callback</a> in
4fe0: 73 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64 64  struction at add
4ff0: 72 65 73 73 20 38 20 0a 69 6e 76 6f 6b 65 73 20  ress 8 .invokes 
5000: 74 68 65 20 63 61 6c 6c 62 61 63 6b 28 29 20 66  the callback() f
5010: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 50 31  unction.  The P1
5020: 20 6f 70 65 72 61 6e 64 20 74 6f 20 43 61 6c 6c   operand to Call
5030: 62 61 63 6b 20 62 65 63 6f 6d 65 73 20 74 68 65  back becomes the
5040: 20 0a 76 61 6c 75 65 20 66 6f 72 20 3c 62 3e 6e   .value for <b>n
5050: 43 6f 6c 75 6d 6e 3c 2f 62 3e 2e 20 20 54 68 65  Column</b>.  The
5060: 20 43 61 6c 6c 62 61 63 6b 20 69 6e 73 74 72 75   Callback instru
5070: 63 74 69 6f 6e 20 70 6f 70 73 20 50 31 20 76 61  ction pops P1 va
5080: 6c 75 65 73 20 66 72 6f 6d 0a 74 68 65 20 73 74  lues from.the st
5090: 61 63 6b 20 61 6e 64 20 75 73 65 73 20 74 68 65  ack and uses the
50a0: 6d 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 3c 62  m to fill the <b
50b0: 3e 61 7a 44 61 74 61 5b 5d 3c 2f 62 3e 20 61 72  >azData[]</b> ar
50c0: 72 61 79 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65  ray.</p>.}..Code
50d0: 20 7b 0a 39 20 20 20 20 20 4e 65 78 74 20 20 20   {.9     Next   
50e0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 36 20         0      6 
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a               .}.
5120: 70 75 74 73 20 7b 0a 3c 70 3e 54 68 65 20 69 6e  puts {.<p>The in
5130: 73 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64 64  struction at add
5140: 72 65 73 73 20 39 20 69 6d 70 6c 65 6d 65 6e 74  ress 9 implement
5150: 73 20 74 68 65 20 62 72 61 6e 63 68 69 6e 67 20  s the branching 
5160: 70 61 72 74 20 6f 66 20 74 68 65 20 0a 6c 6f 6f  part of the .loo
5170: 70 2e 20 20 54 6f 67 65 74 68 65 72 20 77 69 74  p.  Together wit
5180: 68 20 74 68 65 20 52 65 77 69 6e 64 20 61 74 20  h the Rewind at 
5190: 61 64 64 72 65 73 73 20 35 20 69 74 20 66 6f 72  address 5 it for
51a0: 6d 73 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 67 69  ms the loop logi
51b0: 63 2e 20 20 0a 54 68 69 73 20 69 73 20 61 20 6b  c.  .This is a k
51c0: 65 79 20 63 6f 6e 63 65 70 74 20 74 68 61 74 20  ey concept that 
51d0: 79 6f 75 20 73 68 6f 75 6c 64 20 70 61 79 20 63  you should pay c
51e0: 6c 6f 73 65 20 61 74 74 65 6e 74 69 6f 6e 20 74  lose attention t
51f0: 6f 2e 20 20 20 0a 54 68 65 20 3c 61 20 68 72 65  o.   .The <a hre
5200: 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 4e  f="opcode.html#N
5210: 65 78 74 22 3e 4e 65 78 74 3c 2f 61 3e 20 69 6e  ext">Next</a> in
5220: 73 74 72 75 63 74 69 6f 6e 20 61 64 76 61 6e 63  struction advanc
5230: 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 0a 50  es the cursor .P
5240: 31 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 65  1 to the next re
5250: 63 6f 72 64 2e 20 20 49 66 20 74 68 65 20 63 75  cord.  If the cu
5260: 72 73 6f 72 20 61 64 76 61 6e 63 65 20 77 61 73  rsor advance was
5270: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
5280: 6e 20 6a 75 6d 70 20 0a 69 6d 6d 65 64 69 61 74  n jump .immediat
5290: 65 6c 79 20 74 6f 20 50 32 20 28 36 2c 20 74 68  ely to P2 (6, th
52a0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
52b0: 68 65 20 6c 6f 6f 70 20 62 6f 64 79 29 2e 20 20  he loop body).  
52c0: 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 0a 77  If the cursor .w
52d0: 61 73 20 61 74 20 74 68 65 20 65 6e 64 2c 20 74  as at the end, t
52e0: 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
52f0: 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
5300: 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 77  g instruction, w
5310: 68 69 63 68 20 0a 65 6e 64 73 20 74 68 65 20 6c  hich .ends the l
5320: 6f 6f 70 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65  oop.</p>.}..Code
5330: 20 7b 0a 31 30 20 20 20 20 43 6c 6f 73 65 20 20   {.10    Close  
5340: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 20 20 20 20 20 20 0a 31 31 20 20 20 20 48          .11    H
5380: 61 6c 74 20 20 20 20 20 20 20 20 20 20 30 20 20  alt          0  
5390: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d                .}
53c0: 0a 70 75 74 73 20 7b 0a 3c 70 3e 54 68 65 20 43  .puts {.<p>The C
53d0: 6c 6f 73 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  lose instruction
53e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
53f0: 68 65 20 70 72 6f 67 72 61 6d 20 63 6c 6f 73 65  he program close
5400: 73 20 74 68 65 0a 63 75 72 73 6f 72 20 74 68 61  s the.cursor tha
5410: 74 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  t points into th
5420: 65 20 74 61 62 6c 65 20 22 65 78 61 6d 70 22 2e  e table "examp".
5430: 20 20 49 74 20 69 73 20 6e 6f 74 20 72 65 61 6c    It is not real
5440: 6c 79 20 6e 65 63 65 73 73 61 72 79 0a 74 6f 20  ly necessary.to 
5450: 63 61 6c 6c 20 43 6c 6f 73 65 20 68 65 72 65 20  call Close here 
5460: 73 69 6e 63 65 20 61 6c 6c 20 63 75 72 73 6f 72  since all cursor
5470: 73 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  s will be automa
5480: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 0a 62  tically closed.b
5490: 79 20 74 68 65 20 56 44 42 45 20 77 68 65 6e 20  y the VDBE when 
54a0: 74 68 65 20 70 72 6f 67 72 61 6d 20 68 61 6c 74  the program halt
54b0: 73 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 65  s.  But we neede
54c0: 64 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  d an instruction
54d0: 0a 66 6f 72 20 74 68 65 20 52 65 77 69 6e 64 20  .for the Rewind 
54e0: 74 6f 20 6a 75 6d 70 20 74 6f 20 73 6f 20 77 65  to jump to so we
54f0: 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20 67   might as well g
5500: 6f 20 61 68 65 61 64 20 61 6e 64 20 68 61 76 65  o ahead and have
5510: 20 74 68 61 74 0a 69 6e 73 74 72 75 63 74 69 6f   that.instructio
5520: 6e 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75  n do something u
5530: 73 65 66 75 6c 2e 0a 54 68 65 20 48 61 6c 74 20  seful..The Halt 
5540: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 73  instruction ends
5550: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
5560: 6d 2e 3c 2f 70 3e 0a 0a 3c 70 3e 4e 6f 74 65 20  m.</p>..<p>Note 
5570: 74 68 61 74 20 74 68 65 20 70 72 6f 67 72 61 6d  that the program
5580: 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
5590: 20 71 75 65 72 79 20 64 69 64 6e 27 74 20 63 6f   query didn't co
55a0: 6e 74 61 69 6e 20 74 68 65 20 0a 54 72 61 6e 73  ntain the .Trans
55b0: 61 63 74 69 6f 6e 20 61 6e 64 20 43 6f 6d 6d 69  action and Commi
55c0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 75  t instructions u
55d0: 73 65 64 20 69 6e 20 74 68 65 20 49 4e 53 45 52  sed in the INSER
55e0: 54 20 65 78 61 6d 70 6c 65 2e 20 20 42 65 63 61  T example.  Beca
55f0: 75 73 65 20 0a 74 68 65 20 53 45 4c 45 43 54 20  use .the SELECT 
5600: 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
5610: 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 6e 27 74  ion that doesn't
5620: 20 61 6c 74 65 72 20 74 68 65 20 64 61 74 61 62   alter the datab
5630: 61 73 65 2c 20 69 74 20 0a 64 6f 65 73 6e 27 74  ase, it .doesn't
5640: 20 72 65 71 75 69 72 65 20 61 20 74 72 61 6e 73   require a trans
5650: 61 63 74 69 6f 6e 2e 3c 2f 70 3e 0a 7d 0a 0a 0a  action.</p>.}...
5660: 70 75 74 73 20 7b 0a 3c 61 20 6e 61 6d 65 3d 22  puts {.<a name="
5670: 71 75 65 72 79 32 22 3e 0a 3c 68 32 3e 41 20 53  query2">.<h2>A S
5680: 6c 69 67 68 74 6c 79 20 4d 6f 72 65 20 43 6f 6d  lightly More Com
5690: 70 6c 65 78 20 51 75 65 72 79 3c 2f 68 32 3e 0a  plex Query</h2>.
56a0: 0a 3c 70 3e 54 68 65 20 6b 65 79 20 70 6f 69 6e  .<p>The key poin
56b0: 74 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  ts of the previo
56c0: 75 73 20 65 78 61 6d 70 6c 65 20 77 65 72 65 20  us example were 
56d0: 74 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 43  the use of the C
56e0: 61 6c 6c 62 61 63 6b 0a 69 6e 73 74 72 75 63 74  allback.instruct
56f0: 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ion to invoke th
5700: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
5710: 69 6f 6e 2c 20 61 6e 64 20 74 68 65 20 75 73 65  ion, and the use
5720: 20 6f 66 20 74 68 65 20 4e 65 78 74 0a 69 6e 73   of the Next.ins
5730: 74 72 75 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  truction to impl
5740: 65 6d 65 6e 74 20 61 20 6c 6f 6f 70 20 6f 76 65  ement a loop ove
5750: 72 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 6f 66  r all records of
5760: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5770: 6c 65 2e 0a 54 68 69 73 20 65 78 61 6d 70 6c 65  le..This example
5780: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 72 69   attempts to dri
5790: 76 65 20 68 6f 6d 65 20 74 68 6f 73 65 20 69 64  ve home those id
57a0: 65 61 73 20 62 79 20 64 65 6d 6f 6e 73 74 72 61  eas by demonstra
57b0: 74 69 6e 67 20 61 0a 73 6c 69 67 68 74 6c 79 20  ting a.slightly 
57c0: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 71 75 65  more complex que
57d0: 72 79 20 74 68 61 74 20 69 6e 76 6f 6c 76 65 73  ry that involves
57e0: 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66   more columns of
57f0: 0a 6f 75 74 70 75 74 2c 20 73 6f 6d 65 20 6f 66  .output, some of
5800: 20 77 68 69 63 68 20 61 72 65 20 63 6f 6d 70 75   which are compu
5810: 74 65 64 20 76 61 6c 75 65 73 2c 20 61 6e 64 20  ted values, and 
5820: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
5830: 68 61 74 0a 6c 69 6d 69 74 73 20 77 68 69 63 68  hat.limits which
5840: 20 72 65 63 6f 72 64 73 20 61 63 74 75 61 6c 6c   records actuall
5850: 79 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  y make it to the
5860: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
5870: 6f 6e 2e 0a 43 6f 6e 73 69 64 65 72 20 74 68 69  on..Consider thi
5880: 73 20 71 75 65 72 79 3a 3c 2f 70 3e 0a 0a 3c 62  s query:</p>..<b
5890: 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a  lockquote><pre>.
58a0: 53 45 4c 45 43 54 20 6f 6e 65 2c 20 74 77 6f 2c  SELECT one, two,
58b0: 20 6f 6e 65 20 7c 7c 20 74 77 6f 20 41 53 20 27   one || two AS '
58c0: 62 6f 74 68 27 0a 46 52 4f 4d 20 65 78 61 6d 70  both'.FROM examp
58d0: 0a 57 48 45 52 45 20 6f 6e 65 20 4c 49 4b 45 20  .WHERE one LIKE 
58e0: 27 48 25 27 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f  'H%'.</pre></blo
58f0: 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e 54 68 69  ckquote>..<p>Thi
5900: 73 20 71 75 65 72 79 20 69 73 20 70 65 72 68 61  s query is perha
5910: 70 73 20 61 20 62 69 74 20 63 6f 6e 74 72 69 76  ps a bit contriv
5920: 65 64 2c 20 62 75 74 20 69 74 20 64 6f 65 73 20  ed, but it does 
5930: 73 65 72 76 65 20 74 6f 0a 69 6c 6c 75 73 74 72  serve to.illustr
5940: 61 74 65 20 6f 75 72 20 70 6f 69 6e 74 73 2e 20  ate our points. 
5950: 20 54 68 65 20 72 65 73 75 6c 74 20 77 69 6c 6c   The result will
5960: 20 68 61 76 65 20 74 68 72 65 65 20 63 6f 6c 75   have three colu
5970: 6d 6e 20 77 69 74 68 0a 6e 61 6d 65 73 20 22 6f  mn with.names "o
5980: 6e 65 22 2c 20 22 74 77 6f 22 2c 20 61 6e 64 20  ne", "two", and 
5990: 22 62 6f 74 68 22 2e 20 20 54 68 65 20 66 69 72  "both".  The fir
59a0: 73 74 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 61  st two columns a
59b0: 72 65 20 64 69 72 65 63 74 0a 63 6f 70 69 65 73  re direct.copies
59c0: 20 6f 66 20 74 68 65 20 74 77 6f 20 63 6f 6c 75   of the two colu
59d0: 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
59e0: 20 61 6e 64 20 74 68 65 20 74 68 69 72 64 20 72   and the third r
59f0: 65 73 75 6c 74 0a 63 6f 6c 75 6d 6e 20 69 73 20  esult.column is 
5a00: 61 20 73 74 72 69 6e 67 20 66 6f 72 6d 65 64 20  a string formed 
5a10: 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67  by concatenating
5a20: 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 0a 73   the first and.s
5a30: 65 63 6f 6e 64 20 63 6f 6c 75 6d 6e 73 20 6f 66  econd columns of
5a40: 20 74 68 65 20 74 61 62 6c 65 2e 0a 46 69 6e 61   the table..Fina
5a50: 6c 6c 79 2c 20 74 68 65 0a 57 48 45 52 45 20 63  lly, the.WHERE c
5a60: 6c 61 75 73 65 20 73 61 79 73 20 74 68 61 74 20  lause says that 
5a70: 77 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 63 68 6f  we will only cho
5a80: 73 65 20 72 6f 77 73 20 66 6f 72 20 74 68 65 20  se rows for the 
5a90: 0a 72 65 73 75 6c 74 73 20 77 68 65 72 65 20 74  .results where t
5aa0: 68 65 20 22 6f 6e 65 22 20 63 6f 6c 75 6d 6e 20  he "one" column 
5ab0: 62 65 67 69 6e 73 20 77 69 74 68 20 61 6e 20 22  begins with an "
5ac0: 48 22 2e 0a 48 65 72 65 20 69 73 20 77 68 61 74  H"..Here is what
5ad0: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
5ae0: 6d 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 66 6f 72  m looks like for
5af0: 20 74 68 69 73 20 71 75 65 72 79 3a 3c 2f 70 3e   this query:</p>
5b00: 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 61 64 64 72 20  .}..Code {.addr 
5b10: 20 6f 70 63 6f 64 65 20 20 20 20 20 20 20 20 70   opcode        p
5b20: 31 20 20 20 20 20 70 32 20 20 20 20 20 70 33 20  1     p2     p3 
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b50: 20 20 20 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d       .----  ----
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20  --------  ----- 
5b70: 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d   -----  --------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20  -----------.0   
5ba0: 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20    ColumnName    
5bb0: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 6f 6e  0      0      on
5bc0: 65 0a 31 20 20 20 20 20 43 6f 6c 75 6d 6e 4e 61  e.1     ColumnNa
5bd0: 6d 65 20 20 20 20 31 20 20 20 20 20 20 30 20 20  me    1      0  
5be0: 20 20 20 20 74 77 6f 0a 32 20 20 20 20 20 43 6f      two.2     Co
5bf0: 6c 75 6d 6e 4e 61 6d 65 20 20 20 20 32 20 20 20  lumnName    2   
5c00: 20 20 20 30 20 20 20 20 20 20 62 6f 74 68 0a 33     0      both.3
5c10: 20 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20       Integer    
5c20: 20 20 20 30 20 20 20 20 20 20 30 0a 34 20 20 20     0      0.4   
5c30: 20 20 4f 70 65 6e 52 65 61 64 20 20 20 20 20 20    OpenRead      
5c40: 30 20 20 20 20 20 20 33 20 20 20 20 20 20 65 78  0      3      ex
5c50: 61 6d 70 0a 35 20 20 20 20 20 56 65 72 69 66 79  amp.5     Verify
5c60: 43 6f 6f 6b 69 65 20 20 30 20 20 20 20 20 20 38  Cookie  0      8
5c70: 31 0a 36 20 20 20 20 20 52 65 77 69 6e 64 20 20  1.6     Rewind  
5c80: 20 20 20 20 20 20 30 20 20 20 20 20 20 31 38 0a        0      18.
5c90: 37 20 20 20 20 20 53 74 72 69 6e 67 20 20 20 20  7     String    
5ca0: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
5cb0: 20 20 48 25 20 20 20 20 20 20 20 20 20 20 20 20    H%            
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 20 20 20 20 0a 38 20 20 20 20            .8    
5ce0: 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30   Column        0
5cf0: 20 20 20 20 20 20 30 0a 39 20 20 20 20 20 46 75        0.9     Fu
5d00: 6e 63 74 69 6f 6e 20 20 20 20 20 20 32 20 20 20  nction      2   
5d10: 20 20 20 30 20 20 20 20 20 20 70 74 72 28 30 78     0      ptr(0x
5d20: 37 66 31 61 63 30 29 0a 31 30 20 20 20 20 49 66  7f1ac0).10    If
5d30: 4e 6f 74 20 20 20 20 20 20 20 20 20 31 20 20 20  Not         1   
5d40: 20 20 20 31 37 0a 31 31 20 20 20 20 43 6f 6c 75     17.11    Colu
5d50: 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20 20 20  mn        0     
5d60: 20 30 0a 31 32 20 20 20 20 43 6f 6c 75 6d 6e 20   0.12    Column 
5d70: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31 0a         0      1.
5d80: 31 33 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20  13    Column    
5d90: 20 20 20 20 30 20 20 20 20 20 20 30 0a 31 34 20      0      0.14 
5da0: 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20     Column       
5db0: 20 30 20 20 20 20 20 20 31 0a 31 35 20 20 20 20   0      1.15    
5dc0: 43 6f 6e 63 61 74 20 20 20 20 20 20 20 20 32 20  Concat        2 
5dd0: 20 20 20 20 20 30 0a 31 36 20 20 20 20 43 61 6c       0.16    Cal
5de0: 6c 62 61 63 6b 20 20 20 20 20 20 33 20 20 20 20  lback      3    
5df0: 20 20 30 0a 31 37 20 20 20 20 4e 65 78 74 20 20    0.17    Next  
5e00: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 37          0      7
5e10: 0a 31 38 20 20 20 20 43 6c 6f 73 65 20 20 20 20  .18    Close    
5e20: 20 20 20 20 20 30 20 20 20 20 20 20 30 0a 31 39       0      0.19
5e30: 20 20 20 20 48 61 6c 74 20 20 20 20 20 20 20 20      Halt        
5e40: 20 20 30 20 20 20 20 20 20 30 0a 7d 0a 0a 70 75    0      0.}..pu
5e50: 74 73 20 7b 0a 3c 70 3e 45 78 63 65 70 74 20 66  ts {.<p>Except f
5e60: 6f 72 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  or the WHERE cla
5e70: 75 73 65 2c 20 74 68 65 20 73 74 72 75 63 74 75  use, the structu
5e80: 72 65 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  re of the progra
5e90: 6d 20 66 6f 72 0a 74 68 69 73 20 65 78 61 6d 70  m for.this examp
5ea0: 6c 65 20 69 73 20 76 65 72 79 20 6d 75 63 68 20  le is very much 
5eb0: 6c 69 6b 65 20 74 68 65 20 70 72 69 6f 72 20 65  like the prior e
5ec0: 78 61 6d 70 6c 65 2c 20 6a 75 73 74 20 77 69 74  xample, just wit
5ed0: 68 20 61 6e 0a 65 78 74 72 61 20 63 6f 6c 75 6d  h an.extra colum
5ee0: 6e 2e 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f  n.  There are no
5ef0: 77 20 33 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 73  w 3 columns, ins
5f00: 74 65 61 64 20 6f 66 20 32 20 61 73 20 62 65 66  tead of 2 as bef
5f10: 6f 72 65 2c 0a 61 6e 64 20 74 68 65 72 65 20 61  ore,.and there a
5f20: 72 65 20 74 68 72 65 65 20 43 6f 6c 75 6d 6e 4e  re three ColumnN
5f30: 61 6d 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ame instructions
5f40: 2e 0a 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70  ..A cursor is op
5f50: 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ened using the O
5f60: 70 65 6e 52 65 61 64 20 69 6e 73 74 72 75 63 74  penRead instruct
5f70: 69 6f 6e 2c 20 6a 75 73 74 20 6c 69 6b 65 20 69  ion, just like i
5f80: 6e 20 74 68 65 0a 70 72 69 6f 72 20 65 78 61 6d  n the.prior exam
5f90: 70 6c 65 2e 20 20 54 68 65 20 52 65 77 69 6e 64  ple.  The Rewind
5fa0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20   instruction at 
5fb0: 61 64 64 72 65 73 73 20 36 20 61 6e 64 20 74 68  address 6 and th
5fc0: 65 0a 4e 65 78 74 20 61 74 20 61 64 64 72 65 73  e.Next at addres
5fd0: 73 20 31 37 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  s 17 form a loop
5fe0: 20 6f 76 65 72 20 61 6c 6c 20 72 65 63 6f 72 64   over all record
5ff0: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  s of the table. 
6000: 20 0a 54 68 65 20 43 6c 6f 73 65 20 69 6e 73 74   .The Close inst
6010: 72 75 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  ruction at the e
6020: 6e 64 20 69 73 20 74 68 65 72 65 20 74 6f 20 67  nd is there to g
6030: 69 76 65 20 74 68 65 0a 52 65 77 69 6e 64 20 69  ive the.Rewind i
6040: 6e 73 74 72 75 63 74 69 6f 6e 20 73 6f 6d 65 74  nstruction somet
6050: 68 69 6e 67 20 74 6f 20 6a 75 6d 70 20 74 6f 20  hing to jump to 
6060: 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
6070: 20 20 41 6c 6c 20 6f 66 0a 74 68 69 73 20 69 73    All of.this is
6080: 20 6a 75 73 74 20 6c 69 6b 65 20 69 6e 20 74 68   just like in th
6090: 65 20 66 69 72 73 74 20 71 75 65 72 79 20 64 65  e first query de
60a0: 6d 6f 6e 73 74 72 61 74 69 6f 6e 2e 3c 2f 70 3e  monstration.</p>
60b0: 0a 0a 3c 70 3e 54 68 65 20 43 61 6c 6c 62 61 63  ..<p>The Callbac
60c0: 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e  k instruction in
60d0: 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 68 61   this example ha
60e0: 73 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 64 61  s to generate.da
60f0: 74 61 20 66 6f 72 20 74 68 72 65 65 20 72 65 73  ta for three res
6100: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 73 74  ult columns inst
6110: 65 61 64 20 6f 66 20 74 77 6f 2c 20 62 75 74 20  ead of two, but 
6120: 69 73 20 6f 74 68 65 72 77 69 73 65 0a 74 68 65  is otherwise.the
6130: 20 73 61 6d 65 20 61 73 20 69 6e 20 74 68 65 20   same as in the 
6140: 66 69 72 73 74 20 71 75 65 72 79 2e 20 20 57 68  first query.  Wh
6150: 65 6e 20 74 68 65 20 43 61 6c 6c 62 61 63 6b 20  en the Callback 
6160: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 69 73 20 69  instruction.is i
6170: 6e 76 6f 6b 65 64 2c 20 74 68 65 20 6c 65 66 74  nvoked, the left
6180: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
6190: 74 68 65 20 72 65 73 75 6c 74 20 73 68 6f 75 6c  the result shoul
61a0: 64 20 62 65 0a 74 68 65 20 6c 6f 77 65 73 74 20  d be.the lowest 
61b0: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64  in the stack and
61c0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
61d0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 73 68  result column sh
61e0: 6f 75 6c 64 0a 62 65 20 74 68 65 20 74 6f 70 20  ould.be the top 
61f0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  of the stack.  W
6200: 65 20 63 61 6e 20 73 65 65 20 74 68 65 20 73 74  e can see the st
6210: 61 63 6b 20 62 65 69 6e 67 20 73 65 74 20 75 70  ack being set up
6220: 20 0a 74 68 69 73 20 77 61 79 20 61 74 20 61 64   .this way at ad
6230: 64 72 65 73 73 65 73 20 31 31 20 74 68 72 6f 75  dresses 11 throu
6240: 67 68 20 31 35 2e 20 20 54 68 65 20 43 6f 6c 75  gh 15.  The Colu
6250: 6d 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mn instructions 
6260: 61 74 0a 31 31 20 61 6e 64 20 31 32 20 70 75 73  at.11 and 12 pus
6270: 68 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72  h the values for
6280: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 63   the first two c
6290: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
62a0: 73 75 6c 74 2e 0a 54 68 65 20 74 77 6f 20 43 6f  sult..The two Co
62b0: 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lumn instruction
62c0: 73 20 61 74 20 31 33 20 61 6e 64 20 31 34 20 70  s at 13 and 14 p
62d0: 75 6c 6c 20 69 6e 20 74 68 65 20 76 61 6c 75 65  ull in the value
62e0: 73 20 6e 65 65 64 65 64 0a 74 6f 20 63 6f 6d 70  s needed.to comp
62f0: 75 74 65 20 74 68 65 20 74 68 69 72 64 20 72 65  ute the third re
6300: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  sult column and 
6310: 74 68 65 20 43 6f 6e 63 61 74 20 69 6e 73 74 72  the Concat instr
6320: 75 63 74 69 6f 6e 20 61 74 0a 31 35 20 6a 6f 69  uction at.15 joi
6330: 6e 73 20 74 68 65 6d 20 74 6f 67 65 74 68 65 72  ns them together
6340: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 65   into a single e
6350: 6e 74 72 79 20 6f 6e 20 74 68 65 20 73 74 61 63  ntry on the stac
6360: 6b 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65 20 6f  k.</p>..<p>The o
6370: 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 69  nly thing that i
6380: 73 20 72 65 61 6c 6c 79 20 6e 65 77 20 61 62 6f  s really new abo
6390: 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  ut the current e
63a0: 78 61 6d 70 6c 65 0a 69 73 20 74 68 65 20 57 48  xample.is the WH
63b0: 45 52 45 20 63 6c 61 75 73 65 20 77 68 69 63 68  ERE clause which
63c0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
63d0: 62 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  by instructions 
63e0: 61 74 0a 61 64 64 72 65 73 73 65 73 20 37 20 74  at.addresses 7 t
63f0: 68 72 6f 75 67 68 20 31 30 2e 20 20 49 6e 73 74  hrough 10.  Inst
6400: 72 75 63 74 69 6f 6e 73 20 61 74 20 61 64 64 72  ructions at addr
6410: 65 73 73 20 37 20 61 6e 64 20 38 20 70 75 73 68  ess 7 and 8 push
6420: 0a 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20  .onto the stack 
6430: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
6440: 20 22 6f 6e 65 22 20 63 6f 6c 75 6d 6e 20 66 72   "one" column fr
6450: 6f 6d 20 74 68 65 20 74 61 62 6c 65 0a 61 6e 64  om the table.and
6460: 20 74 68 65 20 6c 69 74 65 72 61 6c 20 73 74 72   the literal str
6470: 69 6e 67 20 22 48 25 22 2e 20 20 0a 54 68 65 20  ing "H%".  .The 
6480: 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e  <a href="opcode.
6490: 68 74 6d 6c 23 46 75 6e 63 74 69 6f 6e 22 3e 46  html#Function">F
64a0: 75 6e 63 74 69 6f 6e 3c 2f 61 3e 20 69 6e 73 74  unction</a> inst
64b0: 72 75 63 74 69 6f 6e 20 61 74 20 61 64 64 72 65  ruction at addre
64c0: 73 73 20 39 20 0a 70 6f 70 73 20 74 68 65 73 65  ss 9 .pops these
64d0: 20 74 77 6f 20 76 61 6c 75 65 73 20 66 72 6f 6d   two values from
64e0: 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64 20 70   the stack and p
64f0: 75 73 68 65 73 20 74 68 65 20 72 65 73 75 6c 74  ushes the result
6500: 20 6f 66 20 74 68 65 20 4c 49 4b 45 28 29 20 0a   of the LIKE() .
6510: 66 75 6e 63 74 69 6f 6e 20 62 61 63 6b 20 6f 6e  function back on
6520: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 0a  to the stack.  .
6530: 54 68 65 20 3c 61 20 68 72 65 66 3d 22 6f 70 63  The <a href="opc
6540: 6f 64 65 2e 68 74 6d 6c 23 49 66 4e 6f 74 22 3e  ode.html#IfNot">
6550: 49 66 4e 6f 74 3c 2f 61 3e 20 69 6e 73 74 72 75  IfNot</a> instru
6560: 63 74 69 6f 6e 20 70 6f 70 73 20 74 68 65 20 74  ction pops the t
6570: 6f 70 20 73 74 61 63 6b 20 0a 76 61 6c 75 65 20  op stack .value 
6580: 61 6e 64 20 63 61 75 73 65 73 20 61 6e 20 69 6d  and causes an im
6590: 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 66 6f 72  mediate jump for
65a0: 77 61 72 64 20 74 6f 20 74 68 65 20 4e 65 78 74  ward to the Next
65b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 66 20   instruction if 
65c0: 74 68 65 20 0a 74 6f 70 20 76 61 6c 75 65 20 77  the .top value w
65d0: 61 73 20 66 61 6c 73 65 20 28 3c 65 6d 3e 6e 6f  as false (<em>no
65e0: 74 3c 2f 65 6d 3e 20 6e 6f 74 20 6c 69 6b 65 20  t</em> not like 
65f0: 74 68 65 20 6c 69 74 65 72 61 6c 20 73 74 72 69  the literal stri
6600: 6e 67 20 22 48 25 22 29 2e 20 20 0a 54 61 6b 69  ng "H%").  .Taki
6610: 6e 67 20 74 68 69 73 20 6a 75 6d 70 20 65 66 66  ng this jump eff
6620: 65 63 74 69 76 65 6c 79 20 73 6b 69 70 73 20 74  ectively skips t
6630: 68 65 20 63 61 6c 6c 62 61 63 6b 2c 20 77 68 69  he callback, whi
6640: 63 68 20 69 73 20 74 68 65 20 77 68 6f 6c 65 20  ch is the whole 
6650: 70 6f 69 6e 74 0a 6f 66 20 74 68 65 20 57 48 45  point.of the WHE
6660: 52 45 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  RE clause.  If t
6670: 68 65 20 72 65 73 75 6c 74 0a 6f 66 20 74 68 65  he result.of the
6680: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
6690: 72 75 65 2c 20 74 68 65 20 6a 75 6d 70 20 69 73  rue, the jump is
66a0: 20 6e 6f 74 20 74 61 6b 65 6e 20 61 6e 64 20 63   not taken and c
66b0: 6f 6e 74 72 6f 6c 0a 66 61 6c 6c 73 20 74 68 72  ontrol.falls thr
66c0: 6f 75 67 68 20 74 6f 20 74 68 65 20 43 61 6c 6c  ough to the Call
66d0: 62 61 63 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e  back instruction
66e0: 20 62 65 6c 6f 77 2e 3c 2f 70 3e 0a 0a 3c 70 3e   below.</p>..<p>
66f0: 4e 6f 74 69 63 65 20 68 6f 77 20 74 68 65 20 4c  Notice how the L
6700: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20  IKE operator is 
6710: 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 49 74  implemented.  It
6720: 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e   is a user-defin
6730: 65 64 20 0a 66 75 6e 63 74 69 6f 6e 20 69 6e 20  ed .function in 
6740: 53 51 4c 69 74 65 2c 20 73 6f 20 74 68 65 20 61  SQLite, so the a
6750: 64 64 72 65 73 73 20 6f 66 20 69 74 73 20 66 75  ddress of its fu
6760: 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
6770: 6e 20 69 73 20 0a 73 70 65 63 69 66 69 65 64 20  n is .specified 
6780: 69 6e 20 50 33 2e 20 20 54 68 65 20 6f 70 65 72  in P3.  The oper
6790: 61 6e 64 20 50 31 20 69 73 20 74 68 65 20 6e 75  and P1 is the nu
67a0: 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
67b0: 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 0a   arguments for .
67c0: 69 74 20 74 6f 20 74 61 6b 65 20 66 72 6f 6d 20  it to take from 
67d0: 74 68 65 20 73 74 61 63 6b 2e 20 20 49 6e 20 74  the stack.  In t
67e0: 68 69 73 20 63 61 73 65 20 74 68 65 20 4c 49 4b  his case the LIK
67f0: 45 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  E() function tak
6800: 65 73 20 32 20 0a 61 72 67 75 6d 65 6e 74 73 2e  es 2 .arguments.
6810: 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20    The arguments 
6820: 61 72 65 20 74 61 6b 65 6e 20 6f 66 66 20 74 68  are taken off th
6830: 65 20 73 74 61 63 6b 20 69 6e 20 72 65 76 65 72  e stack in rever
6840: 73 65 20 6f 72 64 65 72 20 0a 28 72 69 67 68 74  se order .(right
6850: 2d 74 6f 2d 6c 65 66 74 29 2c 20 73 6f 20 74 68  -to-left), so th
6860: 65 20 70 61 74 74 65 72 6e 20 74 6f 20 6d 61 74  e pattern to mat
6870: 63 68 20 69 73 20 74 68 65 20 74 6f 70 20 73 74  ch is the top st
6880: 61 63 6b 20 65 6c 65 6d 65 6e 74 2c 20 61 6e 64  ack element, and
6890: 20 0a 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65   .the next eleme
68a0: 6e 74 20 69 73 20 74 68 65 20 64 61 74 61 20 74  nt is the data t
68b0: 6f 20 63 6f 6d 70 61 72 65 2e 20 20 54 68 65 20  o compare.  The 
68c0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
68d0: 70 75 73 68 65 64 20 0a 6f 6e 74 6f 20 74 68 65  pushed .onto the
68e0: 20 73 74 61 63 6b 2e 3c 2f 70 3e 0a 0a 0a 3c 61   stack.</p>...<a
68f0: 20 6e 61 6d 65 3d 22 70 61 74 74 65 72 6e 31 22   name="pattern1"
6900: 3e 0a 3c 68 32 3e 41 20 54 65 6d 70 6c 61 74 65  >.<h2>A Template
6910: 20 46 6f 72 20 53 45 4c 45 43 54 20 50 72 6f 67   For SELECT Prog
6920: 72 61 6d 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 54 68  rams</h2>..<p>Th
6930: 65 20 66 69 72 73 74 20 74 77 6f 20 71 75 65 72  e first two quer
6940: 79 20 65 78 61 6d 70 6c 65 73 20 69 6c 6c 75 73  y examples illus
6950: 74 72 61 74 65 20 61 20 6b 69 6e 64 20 6f 66 20  trate a kind of 
6960: 74 65 6d 70 6c 61 74 65 20 74 68 61 74 0a 65 76  template that.ev
6970: 65 72 79 20 53 45 4c 45 43 54 20 70 72 6f 67 72  ery SELECT progr
6980: 61 6d 20 77 69 6c 6c 20 66 6f 6c 6c 6f 77 2e 20  am will follow. 
6990: 20 42 61 73 69 63 61 6c 6c 79 2c 20 77 65 20 68   Basically, we h
69a0: 61 76 65 3a 3c 2f 70 3e 0a 0a 3c 70 3e 0a 3c 6f  ave:</p>..<p>.<o
69b0: 6c 3e 0a 3c 6c 69 3e 49 6e 69 74 69 61 6c 69 7a  l>.<li>Initializ
69c0: 65 20 74 68 65 20 3c 62 3e 61 7a 43 6f 6c 75 6d  e the <b>azColum
69d0: 6e 4e 61 6d 65 5b 5d 3c 2f 62 3e 20 61 72 72 61  nName[]</b> arra
69e0: 79 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 62 61  y for the callba
69f0: 63 6b 2e 3c 2f 6c 69 3e 0a 3c 6c 69 3e 4f 70 65  ck.</li>.<li>Ope
6a00: 6e 20 61 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  n a cursor into 
6a10: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
6a20: 71 75 65 72 69 65 64 2e 3c 2f 6c 69 3e 0a 3c 6c  queried.</li>.<l
6a30: 69 3e 46 6f 72 20 65 61 63 68 20 72 65 63 6f 72  i>For each recor
6a40: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  d in the table, 
6a50: 64 6f 3a 0a 20 20 20 20 3c 6f 6c 20 74 79 70 65  do:.    <ol type
6a60: 3d 22 61 22 3e 0a 20 20 20 20 3c 6c 69 3e 49 66  ="a">.    <li>If
6a70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
6a80: 65 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 46  e evaluates to F
6a90: 41 4c 53 45 2c 20 74 68 65 6e 20 73 6b 69 70 20  ALSE, then skip 
6aa0: 74 68 65 20 73 74 65 70 73 20 74 68 61 74 0a 20  the steps that. 
6ab0: 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 20 61 6e         follow an
6ac0: 64 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68  d continue to th
6ad0: 65 20 6e 65 78 74 20 72 65 63 6f 72 64 2e 3c 2f  e next record.</
6ae0: 6c 69 3e 0a 20 20 20 20 3c 6c 69 3e 43 6f 6d 70  li>.    <li>Comp
6af0: 75 74 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ute all columns 
6b00: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
6b10: 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
6b20: 74 2e 3c 2f 6c 69 3e 0a 20 20 20 20 3c 6c 69 3e  t.</li>.    <li>
6b30: 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62  Invoke the callb
6b40: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ack function for
6b50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
6b60: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 3c   of the result.<
6b70: 2f 6c 69 3e 0a 20 20 20 20 3c 2f 6f 6c 3e 0a 3c  /li>.    </ol>.<
6b80: 6c 69 3e 43 6c 6f 73 65 20 74 68 65 20 63 75 72  li>Close the cur
6b90: 73 6f 72 2e 3c 2f 6c 69 3e 0a 3c 2f 6f 6c 3e 0a  sor.</li>.</ol>.
6ba0: 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 69 73 20 74 65  </p>..<p>This te
6bb0: 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 65  mplate will be e
6bc0: 78 70 61 6e 64 65 64 20 63 6f 6e 73 69 64 65 72  xpanded consider
6bd0: 61 62 6c 79 20 61 73 20 77 65 20 63 6f 6e 73 69  ably as we consi
6be0: 64 65 72 0a 61 64 64 69 74 69 6f 6e 61 6c 20 63  der.additional c
6bf0: 6f 6d 70 6c 69 63 61 74 69 6f 6e 73 20 73 75 63  omplications suc
6c00: 68 20 61 73 20 6a 6f 69 6e 73 2c 20 63 6f 6d 70  h as joins, comp
6c10: 6f 75 6e 64 20 73 65 6c 65 63 74 73 2c 20 75 73  ound selects, us
6c20: 69 6e 67 0a 69 6e 64 69 63 65 73 20 74 6f 20 73  ing.indices to s
6c30: 70 65 65 64 20 74 68 65 20 73 65 61 72 63 68 2c  peed the search,
6c40: 20 73 6f 72 74 69 6e 67 2c 20 61 6e 64 20 61 67   sorting, and ag
6c50: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
6c60: 73 0a 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f  s.with and witho
6c70: 75 74 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  ut GROUP BY and 
6c80: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a  HAVING clauses..
6c90: 42 75 74 20 74 68 65 20 73 61 6d 65 20 62 61 73  But the same bas
6ca0: 69 63 20 69 64 65 61 73 20 77 69 6c 6c 20 63 6f  ic ideas will co
6cb0: 6e 74 69 6e 75 65 20 74 6f 20 61 70 70 6c 79 2e  ntinue to apply.
6cc0: 3c 2f 70 3e 0a 0a 3c 68 32 3e 55 50 44 41 54 45  </p>..<h2>UPDATE
6cd0: 20 41 6e 64 20 44 45 4c 45 54 45 20 53 74 61 74   And DELETE Stat
6ce0: 65 6d 65 6e 74 73 3c 2f 68 32 3e 0a 0a 3c 70 3e  ements</h2>..<p>
6cf0: 54 68 65 20 55 50 44 41 54 45 20 61 6e 64 20 44  The UPDATE and D
6d00: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73  ELETE statements
6d10: 20 61 72 65 20 63 6f 64 65 64 20 75 73 69 6e 67   are coded using
6d20: 20 61 20 74 65 6d 70 6c 61 74 65 0a 74 68 61 74   a template.that
6d30: 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72   is very similar
6d40: 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73   to the SELECT s
6d50: 74 61 74 65 6d 65 6e 74 20 74 65 6d 70 6c 61 74  tatement templat
6d60: 65 2e 20 20 54 68 65 20 6d 61 69 6e 0a 64 69 66  e.  The main.dif
6d70: 66 65 72 65 6e 63 65 2c 20 6f 66 20 63 6f 75 72  ference, of cour
6d80: 73 65 2c 20 69 73 20 74 68 61 74 20 74 68 65 20  se, is that the 
6d90: 65 6e 64 20 61 63 74 69 6f 6e 20 69 73 20 74 6f  end action is to
6da0: 20 6d 6f 64 69 66 79 20 74 68 65 0a 64 61 74 61   modify the.data
6db0: 62 61 73 65 20 72 61 74 68 65 72 20 74 68 61 6e  base rather than
6dc0: 20 69 6e 76 6f 6b 65 20 61 20 63 61 6c 6c 62 61   invoke a callba
6dd0: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 20 20 42 65  ck function.  Be
6de0: 63 61 75 73 65 20 69 74 20 6d 6f 64 69 66 69 65  cause it modifie
6df0: 73 20 0a 74 68 65 20 64 61 74 61 62 61 73 65 20  s .the database 
6e00: 69 74 20 77 69 6c 6c 20 61 6c 73 6f 20 75 73 65  it will also use
6e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20   transactions.  
6e20: 4c 65 74 27 73 20 62 65 67 69 6e 0a 62 79 20 6c  Let's begin.by l
6e30: 6f 6f 6b 69 6e 67 20 61 74 20 61 20 44 45 4c 45  ooking at a DELE
6e40: 54 45 20 73 74 61 74 65 6d 65 6e 74 3a 3c 2f 70  TE statement:</p
6e50: 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c  >..<blockquote><
6e60: 70 72 65 3e 0a 44 45 4c 45 54 45 20 46 52 4f 4d  pre>.DELETE FROM
6e70: 20 65 78 61 6d 70 20 57 48 45 52 45 20 74 77 6f   examp WHERE two
6e80: 3c 35 30 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f  <50;.</pre></blo
6e90: 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e 54 68 69  ckquote>..<p>Thi
6ea0: 73 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  s DELETE stateme
6eb0: 6e 74 20 77 69 6c 6c 20 72 65 6d 6f 76 65 20 65  nt will remove e
6ec0: 76 65 72 79 20 72 65 63 6f 72 64 20 66 72 6f 6d  very record from
6ed0: 20 74 68 65 20 22 65 78 61 6d 70 22 0a 74 61 62   the "examp".tab
6ee0: 6c 65 20 77 68 65 72 65 20 74 68 65 20 22 74 77  le where the "tw
6ef0: 6f 22 20 63 6f 6c 75 6d 6e 20 69 73 20 6c 65 73  o" column is les
6f00: 73 20 74 68 61 6e 20 35 30 2e 0a 54 68 65 20 63  s than 50..The c
6f10: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 74 6f  ode generated to
6f20: 20 64 6f 20 74 68 69 73 20 69 73 20 61 73 20 66   do this is as f
6f30: 6f 6c 6c 6f 77 73 3a 3c 2f 70 3e 0a 7d 0a 0a 43  ollows:</p>.}..C
6f40: 6f 64 65 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f  ode {.addr  opco
6f50: 64 65 20 20 20 20 20 20 20 20 70 31 20 20 20 20  de        p1    
6f60: 20 70 32 20 20 20 20 20 70 33 20 20 20 20 20 20   p2     p3      
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f90: 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  .----  ---------
6fa0: 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ---  -----  ----
6fb0: 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 54 72 61  ------.0     Tra
6fe0: 6e 73 61 63 74 69 6f 6e 20 20 20 31 20 20 20 20  nsaction   1    
6ff0: 20 20 30 0a 31 20 20 20 20 20 54 72 61 6e 73 61    0.1     Transa
7000: 63 74 69 6f 6e 20 20 20 30 20 20 20 20 20 20 30  ction   0      0
7010: 0a 32 20 20 20 20 20 56 65 72 69 66 79 43 6f 6f  .2     VerifyCoo
7020: 6b 69 65 20 20 30 20 20 20 20 20 20 31 37 38 0a  kie  0      178.
7030: 33 20 20 20 20 20 49 6e 74 65 67 65 72 20 20 20  3     Integer   
7040: 20 20 20 20 30 20 20 20 20 20 20 30 0a 34 20 20      0      0.4  
7050: 20 20 20 4f 70 65 6e 52 65 61 64 20 20 20 20 20     OpenRead     
7060: 20 30 20 20 20 20 20 20 33 20 20 20 20 20 20 65   0      3      e
7070: 78 61 6d 70 0a 35 20 20 20 20 20 52 65 77 69 6e  xamp.5     Rewin
7080: 64 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20  d        0      
7090: 31 32 0a 36 20 20 20 20 20 43 6f 6c 75 6d 6e 20  12.6     Column 
70a0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31 0a         0      1.
70b0: 37 20 20 20 20 20 49 6e 74 65 67 65 72 20 20 20  7     Integer   
70c0: 20 20 20 20 35 30 20 20 20 20 20 30 20 20 20 20      50     0    
70d0: 20 20 35 30 0a 38 20 20 20 20 20 47 65 20 20 20    50.8     Ge   
70e0: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
70f0: 31 31 0a 39 20 20 20 20 20 52 65 63 6e 6f 20 20  11.9     Recno  
7100: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 0a         0      0.
7110: 31 30 20 20 20 20 4c 69 73 74 57 72 69 74 65 20  10    ListWrite 
7120: 20 20 20 20 30 20 20 20 20 20 20 30 0a 31 31 20      0      0.11 
7130: 20 20 20 4e 65 78 74 20 20 20 20 20 20 20 20 20     Next         
7140: 20 30 20 20 20 20 20 20 36 0a 31 32 20 20 20 20   0      6.12    
7150: 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20 30 20  Close         0 
7160: 20 20 20 20 20 30 0a 31 33 20 20 20 20 4c 69 73       0.13    Lis
7170: 74 52 65 77 69 6e 64 20 20 20 20 30 20 20 20 20  tRewind    0    
7180: 20 20 30 0a 31 34 20 20 20 20 49 6e 74 65 67 65    0.14    Intege
7190: 72 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30  r       0      0
71a0: 0a 31 35 20 20 20 20 4f 70 65 6e 57 72 69 74 65  .15    OpenWrite
71b0: 20 20 20 20 20 30 20 20 20 20 20 20 33 0a 31 36       0      3.16
71c0: 20 20 20 20 4c 69 73 74 52 65 61 64 20 20 20 20      ListRead    
71d0: 20 20 30 20 20 20 20 20 20 32 30 0a 31 37 20 20    0      20.17  
71e0: 20 20 4e 6f 74 45 78 69 73 74 73 20 20 20 20 20    NotExists     
71f0: 30 20 20 20 20 20 20 31 39 0a 31 38 20 20 20 20  0      19.18    
7200: 44 65 6c 65 74 65 20 20 20 20 20 20 20 20 30 20  Delete        0 
7210: 20 20 20 20 20 31 0a 31 39 20 20 20 20 47 6f 74       1.19    Got
7220: 6f 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20  o          0    
7230: 20 20 31 36 0a 32 30 20 20 20 20 4c 69 73 74 52    16.20    ListR
7240: 65 73 65 74 20 20 20 20 20 30 20 20 20 20 20 20  eset     0      
7250: 30 0a 32 31 20 20 20 20 43 6c 6f 73 65 20 20 20  0.21    Close   
7260: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 0a 32        0      0.2
7270: 32 20 20 20 20 43 6f 6d 6d 69 74 20 20 20 20 20  2    Commit     
7280: 20 20 20 30 20 20 20 20 20 20 30 0a 32 33 20 20     0      0.23  
7290: 20 20 48 61 6c 74 20 20 20 20 20 20 20 20 20 20    Halt          
72a0: 30 20 20 20 20 20 20 30 0a 7d 0a 0a 70 75 74 73  0      0.}..puts
72b0: 20 7b 0a 3c 70 3e 48 65 72 65 20 69 73 20 77 68   {.<p>Here is wh
72c0: 61 74 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6d  at the program m
72d0: 75 73 74 20 64 6f 2e 20 20 46 69 72 73 74 20 69  ust do.  First i
72e0: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
72f0: 61 6c 6c 20 6f 66 0a 74 68 65 20 72 65 63 6f 72  all of.the recor
7300: 64 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ds in the table 
7310: 22 65 78 61 6d 70 22 20 74 68 61 74 20 61 72 65  "examp" that are
7320: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
7330: 20 54 68 69 73 20 69 73 0a 64 6f 6e 65 20 75 73   This is.done us
7340: 69 6e 67 20 61 20 6c 6f 6f 70 20 76 65 72 79 20  ing a loop very 
7350: 6d 75 63 68 20 6c 69 6b 65 20 74 68 65 20 6c 6f  much like the lo
7360: 6f 70 20 75 73 65 64 20 69 6e 20 74 68 65 20 53  op used in the S
7370: 45 4c 45 43 54 20 65 78 61 6d 70 6c 65 73 0a 61  ELECT examples.a
7380: 62 6f 76 65 2e 20 20 4f 6e 63 65 20 61 6c 6c 20  bove.  Once all 
7390: 72 65 63 6f 72 64 73 20 68 61 76 65 20 62 65 65  records have bee
73a0: 6e 20 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e 20  n located, then 
73b0: 77 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20 74  we can go back t
73c0: 68 72 6f 75 67 68 0a 61 6e 64 20 64 65 6c 65 74  hrough.and delet
73d0: 65 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  e them one by on
73e0: 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 77 65  e.  Note that we
73f0: 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 65   cannot delete e
7400: 61 63 68 20 72 65 63 6f 72 64 0a 61 73 20 73 6f  ach record.as so
7410: 6f 6e 20 61 73 20 77 65 20 66 69 6e 64 20 69 74  on as we find it
7420: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 6c 6f  .  We have to lo
7430: 63 61 74 65 20 61 6c 6c 20 72 65 63 6f 72 64 73  cate all records
7440: 20 66 69 72 73 74 2c 20 74 68 65 6e 0a 67 6f 20   first, then.go 
7450: 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
7460: 74 68 65 6d 2e 20 20 54 68 69 73 20 69 73 20 62  them.  This is b
7470: 65 63 61 75 73 65 20 74 68 65 20 53 51 4c 69 74  ecause the SQLit
7480: 65 20 64 61 74 61 62 61 73 65 0a 62 61 63 6b 65  e database.backe
7490: 6e 64 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  nd might change 
74a0: 74 68 65 20 73 63 61 6e 20 6f 72 64 65 72 20 61  the scan order a
74b0: 66 74 65 72 20 61 20 64 65 6c 65 74 65 20 6f 70  fter a delete op
74c0: 65 72 61 74 69 6f 6e 2e 0a 41 6e 64 20 69 66 20  eration..And if 
74d0: 74 68 65 20 73 63 61 6e 0a 6f 72 64 65 72 20 63  the scan.order c
74e0: 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 69  hanges in the mi
74f0: 64 64 6c 65 20 6f 66 20 74 68 65 20 73 63 61 6e  ddle of the scan
7500: 2c 20 73 6f 6d 65 20 72 65 63 6f 72 64 73 20 6d  , some records m
7510: 69 67 68 74 20 62 65 0a 76 69 73 69 74 65 64 20  ight be.visited 
7520: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 61  more than once a
7530: 6e 64 20 6f 74 68 65 72 20 72 65 63 6f 72 64 73  nd other records
7540: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 76 69   might not be vi
7550: 73 69 74 65 64 20 61 74 20 61 6c 6c 2e 3c 2f 70  sited at all.</p
7560: 3e 0a 0a 3c 70 3e 53 6f 20 74 68 65 20 69 6d 70  >..<p>So the imp
7570: 6c 65 6d 65 6e 74 69 6f 6e 20 6f 66 20 44 45 4c  lemention of DEL
7580: 45 54 45 20 69 73 20 72 65 61 6c 6c 79 20 69 6e  ETE is really in
7590: 20 74 77 6f 20 6c 6f 6f 70 73 2e 20 20 54 68 65   two loops.  The
75a0: 20 66 69 72 73 74 20 6c 6f 6f 70 20 0a 28 69 6e   first loop .(in
75b0: 73 74 72 75 63 74 69 6f 6e 73 20 35 20 74 68 72  structions 5 thr
75c0: 6f 75 67 68 20 31 31 29 20 6c 6f 63 61 74 65 73  ough 11) locates
75d0: 20 74 68 65 20 72 65 63 6f 72 64 73 20 74 68 61   the records tha
75e0: 74 20 61 72 65 20 74 6f 20 62 65 20 64 65 6c 65  t are to be dele
75f0: 74 65 64 20 0a 61 6e 64 20 73 61 76 65 73 20 74  ted .and saves t
7600: 68 65 69 72 20 6b 65 79 73 20 6f 6e 74 6f 20 61  heir keys onto a
7610: 20 74 65 6d 70 6f 72 61 72 79 20 6c 69 73 74 2c   temporary list,
7620: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
7630: 6c 6f 6f 70 20 0a 28 69 6e 73 74 72 75 63 74 69  loop .(instructi
7640: 6f 6e 73 20 31 36 20 74 68 72 6f 75 67 68 20 31  ons 16 through 1
7650: 39 29 20 75 73 65 73 20 74 68 65 20 6b 65 79 20  9) uses the key 
7660: 6c 69 73 74 20 74 6f 20 64 65 6c 65 74 65 20 74  list to delete t
7670: 68 65 20 72 65 63 6f 72 64 73 20 6f 6e 65 20 0a  he records one .
7680: 62 79 20 6f 6e 65 2e 20 20 3c 2f 70 3e 0a 7d 0a  by one.  </p>.}.
7690: 0a 0a 43 6f 64 65 20 7b 0a 30 20 20 20 20 20 54  ..Code {.0     T
76a0: 72 61 6e 73 61 63 74 69 6f 6e 20 20 20 31 20 20  ransaction   1  
76b0: 20 20 20 20 30 0a 31 20 20 20 20 20 54 72 61 6e      0.1     Tran
76c0: 73 61 63 74 69 6f 6e 20 20 20 30 20 20 20 20 20  saction   0     
76d0: 20 30 0a 32 20 20 20 20 20 56 65 72 69 66 79 43   0.2     VerifyC
76e0: 6f 6f 6b 69 65 20 20 30 20 20 20 20 20 20 31 37  ookie  0      17
76f0: 38 0a 33 20 20 20 20 20 49 6e 74 65 67 65 72 20  8.3     Integer 
7700: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 0a 34        0      0.4
7710: 20 20 20 20 20 4f 70 65 6e 52 65 61 64 20 20 20       OpenRead   
7720: 20 20 20 30 20 20 20 20 20 20 33 20 20 20 20 20     0      3     
7730: 20 65 78 61 6d 70 0a 7d 0a 70 75 74 73 20 7b 0a   examp.}.puts {.
7740: 3c 70 3e 49 6e 73 74 72 75 63 74 69 6f 6e 73 20  <p>Instructions 
7750: 30 20 74 68 6f 75 67 68 20 34 20 61 72 65 20 61  0 though 4 are a
7760: 73 20 69 6e 20 74 68 65 20 49 4e 53 45 52 54 20  s in the INSERT 
7770: 65 78 61 6d 70 6c 65 2e 20 20 54 68 65 79 20 73  example.  They s
7780: 74 61 72 74 20 0a 74 72 61 6e 73 61 63 74 69 6f  tart .transactio
7790: 6e 73 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  ns for the main 
77a0: 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 61  and temporary da
77b0: 74 61 62 61 73 65 73 2c 20 76 65 72 69 66 79 20  tabases, verify 
77c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 73 63  the database .sc
77d0: 68 65 6d 61 20 66 6f 72 20 74 68 65 20 6d 61 69  hema for the mai
77e0: 6e 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20  n database, and 
77f0: 6f 70 65 6e 20 61 20 72 65 61 64 20 63 75 72 73  open a read curs
7800: 6f 72 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  or on the table 
7810: 0a 22 65 78 61 6d 70 22 2e 20 20 4e 6f 74 69 63  ."examp".  Notic
7820: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
7830: 72 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20  r is opened for 
7840: 72 65 61 64 69 6e 67 2c 20 6e 6f 74 20 77 72 69  reading, not wri
7850: 74 69 6e 67 2e 20 20 41 74 20 0a 74 68 69 73 20  ting.  At .this 
7860: 73 74 61 67 65 20 6f 66 20 74 68 65 20 70 72 6f  stage of the pro
7870: 67 72 61 6d 20 77 65 20 61 72 65 20 6f 6e 6c 79  gram we are only
7880: 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 73 63 61   going to be sca
7890: 6e 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2c  nning the table,
78a0: 20 0a 6e 6f 74 20 63 68 61 6e 67 69 6e 67 20 69   .not changing i
78b0: 74 2e 20 20 57 65 20 77 69 6c 6c 20 72 65 6f 70  t.  We will reop
78c0: 65 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  en the same tabl
78d0: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6c 61  e for writing la
78e0: 74 65 72 2c 20 61 74 20 0a 69 6e 73 74 72 75 63  ter, at .instruc
78f0: 74 69 6f 6e 20 31 35 2e 3c 2f 70 3e 0a 7d 0a 0a  tion 15.</p>.}..
7900: 43 6f 64 65 20 7b 0a 35 20 20 20 20 20 52 65 77  Code {.5     Rew
7910: 69 6e 64 20 20 20 20 20 20 20 20 30 20 20 20 20  ind        0    
7920: 20 20 31 32 0a 7d 0a 70 75 74 73 20 7b 0a 3c 70    12.}.puts {.<p
7930: 3e 41 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  >As in the SELEC
7940: 54 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 3c  T example, the <
7950: 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68  a href="opcode.h
7960: 74 6d 6c 23 52 65 77 69 6e 64 22 3e 52 65 77 69  tml#Rewind">Rewi
7970: 6e 64 3c 2f 61 3e 20 0a 69 6e 73 74 72 75 63 74  nd</a> .instruct
7980: 69 6f 6e 20 72 65 77 69 6e 64 73 20 74 68 65 20  ion rewinds the 
7990: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 65  cursor to the be
79a0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74  ginning of the t
79b0: 61 62 6c 65 2c 20 72 65 61 64 79 69 6e 67 20 0a  able, readying .
79c0: 69 74 20 66 6f 72 20 75 73 65 20 69 6e 20 74 68  it for use in th
79d0: 65 20 6c 6f 6f 70 20 62 6f 64 79 2e 3c 2f 70 3e  e loop body.</p>
79e0: 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 36 20 20 20 20  .}..Code {.6    
79f0: 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30   Column        0
7a00: 20 20 20 20 20 20 31 0a 37 20 20 20 20 20 49 6e        1.7     In
7a10: 74 65 67 65 72 20 20 20 20 20 20 20 35 30 20 20  teger       50  
7a20: 20 20 20 30 20 20 20 20 20 20 35 30 0a 38 20 20     0      50.8  
7a30: 20 20 20 47 65 20 20 20 20 20 20 20 20 20 20 20     Ge           
7a40: 20 31 20 20 20 20 20 20 31 31 0a 7d 0a 70 75 74   1      11.}.put
7a50: 73 20 7b 0a 3c 70 3e 54 68 65 20 57 48 45 52 45  s {.<p>The WHERE
7a60: 20 63 6c 61 75 73 65 20 69 73 20 69 6d 70 6c 65   clause is imple
7a70: 6d 65 6e 74 65 64 20 62 79 20 69 6e 73 74 72 75  mented by instru
7a80: 63 74 69 6f 6e 73 20 36 20 74 68 72 6f 75 67 68  ctions 6 through
7a90: 20 38 2e 0a 54 68 65 20 6a 6f 62 20 6f 66 20 74   8..The job of t
7aa0: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
7ab0: 69 73 20 74 6f 20 73 6b 69 70 20 74 68 65 20 4c  is to skip the L
7ac0: 69 73 74 57 72 69 74 65 20 69 66 20 74 68 65 20  istWrite if the 
7ad0: 57 48 45 52 45 0a 63 6f 6e 64 69 74 69 6f 6e 20  WHERE.condition 
7ae0: 69 73 20 66 61 6c 73 65 2e 20 20 54 6f 20 74 68  is false.  To th
7af0: 69 73 20 65 6e 64 2c 20 69 74 20 6a 75 6d 70 73  is end, it jumps
7b00: 20 61 68 65 61 64 20 74 6f 20 74 68 65 20 4e 65   ahead to the Ne
7b10: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 69  xt instruction.i
7b20: 66 20 74 68 65 20 22 74 77 6f 22 20 63 6f 6c 75  f the "two" colu
7b30: 6d 6e 20 28 65 78 74 72 61 63 74 65 64 20 62 79  mn (extracted by
7b40: 20 74 68 65 20 43 6f 6c 75 6d 6e 20 69 6e 73 74   the Column inst
7b50: 72 75 63 74 69 6f 6e 29 20 69 73 0a 67 72 65 61  ruction) is.grea
7b60: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
7b70: 6c 20 74 6f 20 35 30 2e 3c 2f 70 3e 0a 0a 3c 70  l to 50.</p>..<p
7b80: 3e 41 73 20 62 65 66 6f 72 65 2c 20 74 68 65 20  >As before, the 
7b90: 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74 69  Column instructi
7ba0: 6f 6e 20 75 73 65 73 20 63 75 72 73 6f 72 20 50  on uses cursor P
7bb0: 31 20 61 6e 64 20 70 75 73 68 65 73 20 74 68 65  1 and pushes the
7bc0: 20 64 61 74 61 20 0a 72 65 63 6f 72 64 20 69 6e   data .record in
7bd0: 20 63 6f 6c 75 6d 6e 20 50 32 20 28 31 2c 20 63   column P2 (1, c
7be0: 6f 6c 75 6d 6e 20 22 74 77 6f 22 29 20 6f 6e 74  olumn "two") ont
7bf0: 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68  o the stack.  Th
7c00: 65 20 49 6e 74 65 67 65 72 20 0a 69 6e 73 74 72  e Integer .instr
7c10: 75 63 74 69 6f 6e 20 70 75 73 68 65 73 20 74 68  uction pushes th
7c20: 65 20 76 61 6c 75 65 20 35 30 20 6f 6e 74 6f 20  e value 50 onto 
7c30: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
7c40: 74 61 63 6b 2e 20 20 41 66 74 65 72 20 74 68 65  tack.  After the
7c50: 73 65 20 0a 74 77 6f 20 69 6e 73 74 72 75 63 74  se .two instruct
7c60: 69 6f 6e 73 20 74 68 65 20 73 74 61 63 6b 20 6c  ions the stack l
7c70: 6f 6f 6b 73 20 6c 69 6b 65 3a 3c 2f 70 3e 0a 7d  ooks like:</p>.}
7c80: 0a 73 74 61 63 6b 20 7b 28 69 6e 74 65 67 65 72  .stack {(integer
7c90: 29 20 35 30 7d 20 5c 0a 20 20 7b 28 72 65 63 6f  ) 50} \.  {(reco
7ca0: 72 64 29 20 63 75 72 72 65 6e 74 20 72 65 63 6f  rd) current reco
7cb0: 72 64 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 22 74  rd for column "t
7cc0: 77 6f 22 20 7d 0a 0a 70 75 74 73 20 7b 0a 3c 70  wo" }..puts {.<p
7cd0: 3e 54 68 65 20 3c 61 20 68 72 65 66 3d 22 6f 70  >The <a href="op
7ce0: 63 6f 64 65 2e 68 74 6d 6c 23 47 65 22 3e 47 65  code.html#Ge">Ge
7cf0: 3c 2f 61 3e 20 6f 70 65 72 61 74 6f 72 20 63 6f  </a> operator co
7d00: 6d 70 61 72 65 73 20 74 68 65 20 74 6f 70 20 74  mpares the top t
7d10: 77 6f 20 0a 65 6c 65 6d 65 6e 74 73 20 6f 6e 20  wo .elements on 
7d20: 74 68 65 20 73 74 61 63 6b 2c 20 70 6f 70 73 20  the stack, pops 
7d30: 74 68 65 6d 2c 20 61 6e 64 20 74 68 65 6e 20 62  them, and then b
7d40: 72 61 6e 63 68 65 73 20 62 61 73 65 64 20 6f 6e  ranches based on
7d50: 20 74 68 65 20 72 65 73 75 6c 74 20 0a 6f 66 20   the result .of 
7d60: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
7d70: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 65   If the second e
7d80: 6c 65 6d 65 6e 74 20 69 73 20 3e 3d 20 74 68 65  lement is >= the
7d90: 20 74 6f 70 20 65 6c 65 6d 65 6e 74 2c 20 74 68   top element, th
7da0: 65 6e 20 0a 6a 75 6d 70 20 74 6f 20 61 64 64 72  en .jump to addr
7db0: 65 73 73 20 50 32 20 28 74 68 65 20 4e 65 78 74  ess P2 (the Next
7dc0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20   instruction at 
7dd0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
7de0: 6f 6f 70 29 2e 20 20 0a 42 65 63 61 75 73 65 20  oop).  .Because 
7df0: 50 31 20 69 73 20 74 72 75 65 2c 20 69 66 20 65  P1 is true, if e
7e00: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
7e10: 20 4e 55 4c 4c 20 28 61 6e 64 20 74 68 75 73 20   NULL (and thus 
7e20: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 0a 4e  the result is .N
7e30: 55 4c 4c 29 20 74 68 65 6e 20 74 61 6b 65 20 74  ULL) then take t
7e40: 68 65 20 6a 75 6d 70 2e 20 20 49 66 20 77 65 20  he jump.  If we 
7e50: 64 6f 6e 27 74 20 6a 75 6d 70 2c 20 6a 75 73 74  don't jump, just
7e60: 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
7e70: 6e 65 78 74 20 0a 69 6e 73 74 72 75 63 74 69 6f  next .instructio
7e80: 6e 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20 7b  n.</p>.}..Code {
7e90: 0a 39 20 20 20 20 20 52 65 63 6e 6f 20 20 20 20  .9     Recno    
7ea0: 20 20 20 20 20 30 20 20 20 20 20 20 30 0a 31 30       0      0.10
7eb0: 20 20 20 20 4c 69 73 74 57 72 69 74 65 20 20 20      ListWrite   
7ec0: 20 20 30 20 20 20 20 20 20 30 0a 7d 0a 70 75 74    0      0.}.put
7ed0: 73 20 7b 0a 3c 70 3e 54 68 65 20 3c 61 20 68 72  s {.<p>The <a hr
7ee0: 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23  ef="opcode.html#
7ef0: 52 65 63 6e 6f 22 3e 52 65 63 6e 6f 3c 2f 61 3e  Recno">Recno</a>
7f00: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 70 75 73   instruction pus
7f10: 68 65 73 20 6f 6e 74 6f 20 74 68 65 20 0a 73 74  hes onto the .st
7f20: 61 63 6b 20 61 6e 20 69 6e 74 65 67 65 72 20 77  ack an integer w
7f30: 68 69 63 68 20 69 73 20 74 68 65 20 66 69 72 73  hich is the firs
7f40: 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
7f50: 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
7f60: 63 75 72 72 65 6e 74 20 0a 65 6e 74 72 79 20 69  current .entry i
7f70: 6e 20 61 20 73 65 71 75 65 6e 74 69 61 6c 20 73  n a sequential s
7f80: 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  can of the table
7f90: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63   pointed to by c
7fa0: 75 72 73 6f 72 20 50 31 2e 0a 54 68 65 20 3c 61  ursor P1..The <a
7fb0: 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74   href="opcode.ht
7fc0: 6d 6c 23 4c 69 73 74 57 72 69 74 65 22 3e 4c 69  ml#ListWrite">Li
7fd0: 73 74 57 72 69 74 65 3c 2f 61 3e 20 69 6e 73 74  stWrite</a> inst
7fe0: 72 75 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  ruction writes t
7ff0: 68 65 20 0a 69 6e 74 65 67 65 72 20 6f 6e 20 74  he .integer on t
8000: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
8010: 61 63 6b 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f  ack into a tempo
8020: 72 61 72 79 20 73 74 6f 72 61 67 65 20 6c 69 73  rary storage lis
8030: 74 20 61 6e 64 20 70 6f 70 73 20 0a 74 68 65 20  t and pops .the 
8040: 74 6f 70 20 65 6c 65 6d 65 6e 74 2e 20 20 54 68  top element.  Th
8050: 69 73 20 69 73 20 74 68 65 20 69 6d 70 6f 72 74  is is the import
8060: 61 6e 74 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  ant work of this
8070: 20 6c 6f 6f 70 2c 20 74 6f 20 73 74 6f 72 65 20   loop, to store 
8080: 74 68 65 20 0a 6b 65 79 73 20 6f 66 20 74 68 65  the .keys of the
8090: 20 72 65 63 6f 72 64 73 20 74 6f 20 62 65 20 64   records to be d
80a0: 65 6c 65 74 65 64 20 73 6f 20 77 65 20 63 61 6e  eleted so we can
80b0: 20 64 65 6c 65 74 65 20 74 68 65 6d 20 69 6e 20   delete them in 
80c0: 74 68 65 20 73 65 63 6f 6e 64 20 0a 6c 6f 6f 70  the second .loop
80d0: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 4c 69  .  After this Li
80e0: 73 74 57 72 69 74 65 20 69 6e 73 74 72 75 63 74  stWrite instruct
80f0: 69 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 69 73  ion the stack is
8100: 20 65 6d 70 74 79 20 61 67 61 69 6e 2e 3c 2f 70   empty again.</p
8110: 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 31 31 20 20  >.}..Code {.11  
8120: 20 20 4e 65 78 74 20 20 20 20 20 20 20 20 20 20    Next          
8130: 30 20 20 20 20 20 20 36 0a 31 32 20 20 20 20 43  0      6.12    C
8140: 6c 6f 73 65 20 20 20 20 20 20 20 20 20 30 20 20  lose         0  
8150: 20 20 20 20 30 0a 7d 0a 70 75 74 73 20 7b 0a 3c      0.}.puts {.<
8160: 70 3e 20 54 68 65 20 4e 65 78 74 20 69 6e 73 74  p> The Next inst
8170: 72 75 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  ruction incremen
8180: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ts the cursor to
8190: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
81a0: 78 74 20 0a 65 6c 65 6d 65 6e 74 20 69 6e 20 74  xt .element in t
81b0: 68 65 20 74 61 62 6c 65 20 70 6f 69 6e 74 65 64  he table pointed
81c0: 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20 50 30   to by cursor P0
81d0: 2c 20 61 6e 64 20 69 66 20 69 74 20 77 61 73 20  , and if it was 
81e0: 73 75 63 63 65 73 73 66 75 6c 20 0a 62 72 61 6e  successful .bran
81f0: 63 68 65 73 20 74 6f 20 50 32 20 28 36 2c 20 74  ches to P2 (6, t
8200: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
8210: 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 29 2e 20  the loop body). 
8220: 20 54 68 65 20 43 6c 6f 73 65 20 0a 69 6e 73 74   The Close .inst
8230: 72 75 63 74 69 6f 6e 20 63 6c 6f 73 65 73 20 63  ruction closes c
8240: 75 72 73 6f 72 20 50 31 2e 20 20 49 74 20 64 6f  ursor P1.  It do
8250: 65 73 6e 27 74 20 61 66 66 65 63 74 20 74 68 65  esn't affect the
8260: 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
8270: 67 65 20 0a 6c 69 73 74 20 62 65 63 61 75 73 65  ge .list because
8280: 20 69 74 20 69 73 6e 27 74 20 61 73 73 6f 63 69   it isn't associ
8290: 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
82a0: 20 50 31 3b 20 69 74 20 69 73 20 69 6e 73 74 65   P1; it is inste
82b0: 61 64 20 61 20 67 6c 6f 62 61 6c 20 0a 77 6f 72  ad a global .wor
82c0: 6b 69 6e 67 20 6c 69 73 74 20 28 77 68 69 63 68  king list (which
82d0: 20 63 61 6e 20 62 65 20 73 61 76 65 64 20 77 69   can be saved wi
82e0: 74 68 20 4c 69 73 74 50 75 73 68 29 2e 3c 2f 70  th ListPush).</p
82f0: 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 31 33 20 20  >.}..Code {.13  
8300: 20 20 4c 69 73 74 52 65 77 69 6e 64 20 20 20 20    ListRewind    
8310: 30 20 20 20 20 20 20 30 0a 7d 0a 70 75 74 73 20  0      0.}.puts 
8320: 7b 0a 3c 70 3e 20 54 68 65 20 3c 61 20 68 72 65  {.<p> The <a hre
8330: 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 4c  f="opcode.html#L
8340: 69 73 74 52 65 77 69 6e 64 22 3e 4c 69 73 74 52  istRewind">ListR
8350: 65 77 69 6e 64 3c 2f 61 3e 20 69 6e 73 74 72 75  ewind</a> instru
8360: 63 74 69 6f 6e 20 0a 72 65 77 69 6e 64 73 20 74  ction .rewinds t
8370: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  he temporary sto
8380: 72 61 67 65 20 6c 69 73 74 20 74 6f 20 74 68 65  rage list to the
8390: 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 54 68 69   beginning.  Thi
83a0: 73 20 70 72 65 70 61 72 65 73 20 69 74 20 0a 66  s prepares it .f
83b0: 6f 72 20 75 73 65 20 69 6e 20 74 68 65 20 73 65  or use in the se
83c0: 63 6f 6e 64 20 6c 6f 6f 70 2e 3c 2f 70 3e 0a 7d  cond loop.</p>.}
83d0: 0a 0a 43 6f 64 65 20 7b 0a 31 34 20 20 20 20 49  ..Code {.14    I
83e0: 6e 74 65 67 65 72 20 20 20 20 20 20 20 30 20 20  nteger       0  
83f0: 20 20 20 20 30 0a 31 35 20 20 20 20 4f 70 65 6e      0.15    Open
8400: 57 72 69 74 65 20 20 20 20 20 30 20 20 20 20 20  Write     0     
8410: 20 33 0a 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e 20   3.}.puts {.<p> 
8420: 41 73 20 69 6e 20 74 68 65 20 49 4e 53 45 52 54  As in the INSERT
8430: 20 65 78 61 6d 70 6c 65 2c 20 77 65 20 70 75 73   example, we pus
8440: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
8450: 75 6d 62 65 72 20 50 31 20 28 30 2c 20 74 68 65  umber P1 (0, the
8460: 20 6d 61 69 6e 20 0a 64 61 74 61 62 61 73 65 29   main .database)
8470: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
8480: 61 6e 64 20 75 73 65 20 4f 70 65 6e 57 72 69 74  and use OpenWrit
8490: 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 63 75  e to open the cu
84a0: 72 73 6f 72 20 50 31 20 6f 6e 20 74 61 62 6c 65  rsor P1 on table
84b0: 20 0a 50 32 20 28 62 61 73 65 20 70 61 67 65 20   .P2 (base page 
84c0: 33 2c 20 22 65 78 61 6d 70 22 29 20 66 6f 72 20  3, "examp") for 
84d0: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 2e 3c 2f 70  modification.</p
84e0: 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 31 36 20 20  >.}..Code {.16  
84f0: 20 20 4c 69 73 74 52 65 61 64 20 20 20 20 20 20    ListRead      
8500: 30 20 20 20 20 20 20 32 30 0a 31 37 20 20 20 20  0      20.17    
8510: 4e 6f 74 45 78 69 73 74 73 20 20 20 20 20 30 20  NotExists     0 
8520: 20 20 20 20 20 31 39 0a 31 38 20 20 20 20 44 65       19.18    De
8530: 6c 65 74 65 20 20 20 20 20 20 20 20 30 20 20 20  lete        0   
8540: 20 20 20 31 0a 31 39 20 20 20 20 47 6f 74 6f 20     1.19    Goto 
8550: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
8560: 31 36 0a 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e 54  16.}.puts {.<p>T
8570: 68 69 73 20 6c 6f 6f 70 20 64 6f 65 73 20 74 68  his loop does th
8580: 65 20 61 63 74 75 61 6c 20 64 65 6c 65 74 69 6e  e actual deletin
8590: 67 2e 20 20 49 74 20 69 73 20 6f 72 67 61 6e 69  g.  It is organi
85a0: 7a 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  zed differently 
85b0: 66 72 6f 6d 20 0a 74 68 65 20 6f 6e 65 20 69 6e  from .the one in
85c0: 20 74 68 65 20 55 50 44 41 54 45 20 65 78 61 6d   the UPDATE exam
85d0: 70 6c 65 2e 20 20 54 68 65 20 4c 69 73 74 52 65  ple.  The ListRe
85e0: 61 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 70  ad instruction p
85f0: 6c 61 79 73 20 74 68 65 20 72 6f 6c 65 20 0a 74  lays the role .t
8600: 68 61 74 20 74 68 65 20 4e 65 78 74 20 64 69 64  hat the Next did
8610: 20 69 6e 20 74 68 65 20 49 4e 53 45 52 54 20 6c   in the INSERT l
8620: 6f 6f 70 2c 20 62 75 74 20 62 65 63 61 75 73 65  oop, but because
8630: 20 69 74 20 6a 75 6d 70 73 20 74 6f 20 50 32 20   it jumps to P2 
8640: 6f 6e 20 0a 66 61 69 6c 75 72 65 2c 20 61 6e 64  on .failure, and
8650: 20 4e 65 78 74 20 6a 75 6d 70 73 20 6f 6e 20 73   Next jumps on s
8660: 75 63 63 65 73 73 2c 20 77 65 20 70 75 74 20 69  uccess, we put i
8670: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
8680: 66 20 74 68 65 20 6c 6f 6f 70 20 0a 69 6e 73 74  f the loop .inst
8690: 65 61 64 20 6f 66 20 74 68 65 20 65 6e 64 2e 20  ead of the end. 
86a0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
86b0: 20 77 65 20 68 61 76 65 20 74 6f 20 70 75 74 20   we have to put 
86c0: 61 20 47 6f 74 6f 20 61 74 20 74 68 65 20 65 6e  a Goto at the en
86d0: 64 20 6f 66 20 0a 74 68 65 20 6c 6f 6f 70 20 74  d of .the loop t
86e0: 6f 20 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74  o jump back to t
86f0: 68 65 20 74 68 65 20 6c 6f 6f 70 20 74 65 73 74  he the loop test
8700: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
8710: 67 2e 20 20 53 6f 20 74 68 69 73 20 0a 6c 6f 6f  g.  So this .loo
8720: 70 20 68 61 73 20 74 68 65 20 66 6f 72 6d 20 6f  p has the form o
8730: 66 20 61 20 43 20 77 68 69 6c 65 28 29 7b 2e 2e  f a C while(){..
8740: 2e 7d 20 6c 6f 6f 70 2c 20 77 68 69 6c 65 20 74  .} loop, while t
8750: 68 65 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 49  he loop in the I
8760: 4e 53 45 52 54 20 0a 65 78 61 6d 70 6c 65 20 68  NSERT .example h
8770: 61 64 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  ad the form of a
8780: 20 64 6f 7b 2e 2e 2e 7d 77 68 69 6c 65 28 29 20   do{...}while() 
8790: 6c 6f 6f 70 2e 20 20 54 68 65 20 44 65 6c 65 74  loop.  The Delet
87a0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 66  e instruction .f
87b0: 69 6c 6c 73 20 74 68 65 20 72 6f 6c 65 20 74 68  ills the role th
87c0: 61 74 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  at the callback 
87d0: 66 75 6e 63 74 69 6f 6e 20 64 69 64 20 69 6e 20  function did in 
87e0: 74 68 65 20 70 72 65 63 65 64 69 6e 67 20 65 78  the preceding ex
87f0: 61 6d 70 6c 65 73 2e 0a 3c 2f 70 3e 0a 3c 70 3e  amples..</p>.<p>
8800: 54 68 65 20 3c 61 20 68 72 65 66 3d 22 6f 70 63  The <a href="opc
8810: 6f 64 65 2e 68 74 6d 6c 23 4c 69 73 74 52 65 61  ode.html#ListRea
8820: 64 22 3e 4c 69 73 74 52 65 61 64 3c 2f 61 3e 20  d">ListRead</a> 
8830: 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 65 61 64  instruction read
8840: 73 20 61 6e 20 0a 65 6c 65 6d 65 6e 74 20 66 72  s an .element fr
8850: 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
8860: 20 73 74 6f 72 61 67 65 20 6c 69 73 74 20 61 6e   storage list an
8870: 64 20 70 75 73 68 65 73 20 69 74 20 6f 6e 74 6f  d pushes it onto
8880: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 0a 49 66   the stack.  .If
8890: 20 74 68 69 73 20 77 61 73 20 73 75 63 63 65 73   this was succes
88a0: 73 66 75 6c 2c 20 69 74 20 63 6f 6e 74 69 6e 75  sful, it continu
88b0: 65 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  es to the next i
88c0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20  nstruction.  If 
88d0: 74 68 69 73 20 0a 66 61 69 6c 73 20 62 65 63 61  this .fails beca
88e0: 75 73 65 20 74 68 65 20 6c 69 73 74 20 69 73 20  use the list is 
88f0: 65 6d 70 74 79 2c 20 69 74 20 62 72 61 6e 63 68  empty, it branch
8900: 65 73 20 74 6f 20 50 32 2c 20 77 68 69 63 68 20  es to P2, which 
8910: 69 73 20 74 68 65 20 0a 69 6e 73 74 72 75 63 74  is the .instruct
8920: 69 6f 6e 20 6a 75 73 74 20 61 66 74 65 72 20 74  ion just after t
8930: 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 77  he loop.  Afterw
8940: 61 72 64 73 20 74 68 65 20 73 74 61 63 6b 20 6c  ards the stack l
8950: 6f 6f 6b 73 20 6c 69 6b 65 3a 3c 2f 70 3e 0a 7d  ooks like:</p>.}
8960: 0a 73 74 61 63 6b 20 7b 28 69 6e 74 65 67 65 72  .stack {(integer
8970: 29 20 6b 65 79 20 66 6f 72 20 63 75 72 72 65 6e  ) key for curren
8980: 74 20 72 65 63 6f 72 64 7d 0a 0a 70 75 74 73 20  t record}..puts 
8990: 7b 0a 3c 70 3e 4e 6f 74 69 63 65 20 74 68 65 20  {.<p>Notice the 
89a0: 73 69 6d 69 6c 61 72 69 74 79 20 62 65 74 77 65  similarity betwe
89b0: 65 6e 20 74 68 65 20 4c 69 73 74 52 65 61 64 20  en the ListRead 
89c0: 61 6e 64 20 4e 65 78 74 20 69 6e 73 74 72 75 63  and Next instruc
89d0: 74 69 6f 6e 73 2e 20 20 0a 42 6f 74 68 20 6f 70  tions.  .Both op
89e0: 65 72 61 74 69 6f 6e 73 20 77 6f 72 6b 20 61 63  erations work ac
89f0: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
8a00: 72 75 6c 65 3a 0a 3c 2f 70 3e 0a 3c 62 6c 6f 63  rule:.</p>.<bloc
8a10: 6b 71 75 6f 74 65 3e 0a 50 75 73 68 20 74 68 65  kquote>.Push the
8a20: 20 6e 65 78 74 20 22 74 68 69 6e 67 22 20 6f 6e   next "thing" on
8a30: 74 6f 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64  to the stack and
8a40: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 4f 52   fall through OR
8a50: 20 6a 75 6d 70 20 74 6f 20 50 32 2c 20 0a 64 65   jump to P2, .de
8a60: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
8a70: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20  er or not there 
8a80: 69 73 20 61 20 6e 65 78 74 20 22 74 68 69 6e 67  is a next "thing
8a90: 22 20 74 6f 20 70 75 73 68 2e 0a 3c 2f 62 6c 6f  " to push..</blo
8aa0: 63 6b 71 75 6f 74 65 3e 0a 3c 70 3e 4f 6e 65 20  ckquote>.<p>One 
8ab0: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
8ac0: 65 6e 20 4e 65 78 74 20 61 6e 64 20 4c 69 73 74  en Next and List
8ad0: 52 65 61 64 20 69 73 20 74 68 65 69 72 20 69 64  Read is their id
8ae0: 65 61 20 6f 66 20 61 20 22 74 68 69 6e 67 22 2e  ea of a "thing".
8af0: 20 20 0a 54 68 65 20 22 74 68 69 6e 67 73 22 20    .The "things" 
8b00: 66 6f 72 20 74 68 65 20 4e 65 78 74 20 69 6e 73  for the Next ins
8b10: 74 72 75 63 74 69 6f 6e 20 61 72 65 20 72 65 63  truction are rec
8b20: 6f 72 64 73 20 69 6e 20 61 20 64 61 74 61 62 61  ords in a databa
8b30: 73 65 20 66 69 6c 65 2e 20 20 0a 22 54 68 69 6e  se file.  ."Thin
8b40: 67 73 22 20 66 6f 72 20 4c 69 73 74 52 65 61 64  gs" for ListRead
8b50: 20 61 72 65 20 69 6e 74 65 67 65 72 20 6b 65 79   are integer key
8b60: 73 20 69 6e 20 61 20 6c 69 73 74 2e 20 20 41 6e  s in a list.  An
8b70: 6f 74 68 65 72 20 64 69 66 66 65 72 65 6e 63 65  other difference
8b80: 20 0a 69 73 20 77 68 65 74 68 65 72 20 74 6f 20   .is whether to 
8b90: 6a 75 6d 70 20 6f 72 20 66 61 6c 6c 20 74 68 72  jump or fall thr
8ba0: 6f 75 67 68 20 69 66 20 74 68 65 72 65 20 69 73  ough if there is
8bb0: 20 6e 6f 20 6e 65 78 74 20 22 74 68 69 6e 67 22   no next "thing"
8bc0: 2e 20 20 49 6e 20 74 68 69 73 20 0a 63 61 73 65  .  In this .case
8bd0: 2c 20 4e 65 78 74 20 66 61 6c 6c 73 20 74 68 72  , Next falls thr
8be0: 6f 75 67 68 2c 20 61 6e 64 20 4c 69 73 74 52 65  ough, and ListRe
8bf0: 61 64 20 6a 75 6d 70 73 2e 20 4c 61 74 65 72 20  ad jumps. Later 
8c00: 6f 6e 2c 20 77 65 20 77 69 6c 6c 20 73 65 65 20  on, we will see 
8c10: 0a 6f 74 68 65 72 20 6c 6f 6f 70 69 6e 67 20 69  .other looping i
8c20: 6e 73 74 72 75 63 74 69 6f 6e 73 20 28 4e 65 78  nstructions (Nex
8c30: 74 49 64 78 20 61 6e 64 20 53 6f 72 74 4e 65 78  tIdx and SortNex
8c40: 74 29 20 74 68 61 74 20 6f 70 65 72 61 74 65 20  t) that operate 
8c50: 75 73 69 6e 67 20 74 68 65 20 0a 73 61 6d 65 20  using the .same 
8c60: 70 72 69 6e 63 69 70 6c 65 2e 3c 2f 70 3e 0a 0a  principle.</p>..
8c70: 3c 70 3e 54 68 65 20 3c 61 20 68 72 65 66 3d 22  <p>The <a href="
8c80: 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 4e 6f 74 45  opcode.html#NotE
8c90: 78 69 73 74 73 22 3e 4e 6f 74 45 78 69 73 74 73  xists">NotExists
8ca0: 3c 2f 61 3e 20 69 6e 73 74 72 75 63 74 69 6f 6e  </a> instruction
8cb0: 20 70 6f 70 73 20 0a 74 68 65 20 74 6f 70 20 73   pops .the top s
8cc0: 74 61 63 6b 20 65 6c 65 6d 65 6e 74 20 61 6e 64  tack element and
8cd0: 20 75 73 65 73 20 69 74 20 61 73 20 61 6e 20 69   uses it as an i
8ce0: 6e 74 65 67 65 72 20 6b 65 79 2e 20 20 49 66 20  nteger key.  If 
8cf0: 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 0a 74  a record with .t
8d00: 68 61 74 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  hat key does not
8d10: 20 65 78 69 73 74 20 69 6e 20 74 61 62 6c 65 20   exist in table 
8d20: 50 31 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  P1, then jump to
8d30: 20 50 32 2e 20 20 49 66 20 61 20 72 65 63 6f 72   P2.  If a recor
8d40: 64 20 64 6f 65 73 20 0a 65 78 69 73 74 2c 20 74  d does .exist, t
8d50: 68 65 6e 20 66 61 6c 6c 20 74 68 72 75 20 74 6f  hen fall thru to
8d60: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
8d70: 63 74 69 6f 6e 2e 20 20 49 6e 20 74 68 69 73 20  ction.  In this 
8d80: 63 61 73 65 20 50 32 20 74 61 6b 65 73 20 0a 75  case P2 takes .u
8d90: 73 20 74 6f 20 74 68 65 20 47 6f 74 6f 20 61 74  s to the Goto at
8da0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
8db0: 6c 6f 6f 70 2c 20 77 68 69 63 68 20 6a 75 6d 70  loop, which jump
8dc0: 73 20 62 61 63 6b 20 74 6f 20 74 68 65 20 4c 69  s back to the Li
8dd0: 73 74 52 65 61 64 20 0a 61 74 20 74 68 65 20 62  stRead .at the b
8de0: 65 67 69 6e 6e 69 6e 67 2e 20 20 54 68 69 73 20  eginning.  This 
8df0: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
8e00: 63 6f 64 65 64 20 74 6f 20 68 61 76 65 20 50 32  coded to have P2
8e10: 20 62 65 20 31 36 2c 20 74 68 65 20 0a 4c 69 73   be 16, the .Lis
8e20: 74 52 65 61 64 20 61 74 20 74 68 65 20 73 74 61  tRead at the sta
8e30: 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2c 20  rt of the loop, 
8e40: 62 75 74 20 74 68 65 20 53 51 4c 69 74 65 20 70  but the SQLite p
8e50: 61 72 73 65 72 20 77 68 69 63 68 20 67 65 6e 65  arser which gene
8e60: 72 61 74 65 64 20 0a 74 68 69 73 20 63 6f 64 65  rated .this code
8e70: 20 64 69 64 6e 27 74 20 6d 61 6b 65 20 74 68 61   didn't make tha
8e80: 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 3c  t optimization.<
8e90: 2f 70 3e 0a 3c 70 3e 54 68 65 20 3c 61 20 68 72  /p>.<p>The <a hr
8ea0: 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23  ef="opcode.html#
8eb0: 44 65 6c 65 74 65 22 3e 44 65 6c 65 74 65 3c 2f  Delete">Delete</
8ec0: 61 3e 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  a> does the work
8ed0: 20 6f 66 20 74 68 69 73 20 0a 6c 6f 6f 70 3b 20   of this .loop; 
8ee0: 69 74 20 70 6f 70 73 20 61 6e 20 69 6e 74 65 67  it pops an integ
8ef0: 65 72 20 6b 65 79 20 6f 66 66 20 74 68 65 20 73  er key off the s
8f00: 74 61 63 6b 20 28 70 6c 61 63 65 64 20 74 68 65  tack (placed the
8f10: 72 65 20 62 79 20 74 68 65 20 0a 70 72 65 63 65  re by the .prece
8f20: 64 69 6e 67 20 4c 69 73 74 52 65 61 64 29 20 61  ding ListRead) a
8f30: 6e 64 20 64 65 6c 65 74 65 73 20 74 68 65 20 72  nd deletes the r
8f40: 65 63 6f 72 64 20 6f 66 20 63 75 72 73 6f 72 20  ecord of cursor 
8f50: 50 31 20 74 68 61 74 20 68 61 73 20 74 68 61 74  P1 that has that
8f60: 20 6b 65 79 2e 20 20 0a 42 65 63 61 75 73 65 20   key.  .Because 
8f70: 50 32 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  P2 is true, the 
8f80: 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  row change count
8f90: 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  er is incremente
8fa0: 64 2e 3c 2f 70 3e 0a 3c 70 3e 54 68 65 20 3c 61  d.</p>.<p>The <a
8fb0: 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74   href="opcode.ht
8fc0: 6d 6c 23 47 6f 74 6f 22 3e 47 6f 74 6f 3c 2f 61  ml#Goto">Goto</a
8fd0: 3e 20 6a 75 6d 70 73 20 62 61 63 6b 20 74 6f 20  > jumps back to 
8fe0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 0a 6f  the beginning .o
8ff0: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 54 68 69  f the loop.  Thi
9000: 73 20 69 73 20 74 68 65 20 65 6e 64 20 6f 66 20  s is the end of 
9010: 74 68 65 20 6c 6f 6f 70 2e 3c 2f 70 3e 0a 7d 0a  the loop.</p>.}.
9020: 0a 43 6f 64 65 20 7b 0a 32 30 20 20 20 20 4c 69  .Code {.20    Li
9030: 73 74 52 65 73 65 74 20 20 20 20 20 30 20 20 20  stReset     0   
9040: 20 20 20 30 0a 32 31 20 20 20 20 43 6c 6f 73 65     0.21    Close
9050: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
9060: 30 0a 32 32 20 20 20 20 43 6f 6d 6d 69 74 20 20  0.22    Commit  
9070: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 0a 32        0      0.2
9080: 33 20 20 20 20 48 61 6c 74 20 20 20 20 20 20 20  3    Halt       
9090: 20 20 20 30 20 20 20 20 20 20 30 0a 7d 0a 70 75     0      0.}.pu
90a0: 74 73 20 7b 0a 3c 70 3e 54 68 69 73 20 62 6c 6f  ts {.<p>This blo
90b0: 63 6b 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  ck of instructio
90c0: 6e 20 63 6c 65 61 6e 73 20 75 70 20 74 68 65 20  n cleans up the 
90d0: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 54 68  VDBE program. Th
90e0: 72 65 65 20 6f 66 20 74 68 65 73 65 20 0a 69 6e  ree of these .in
90f0: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 6e 27  structions aren'
9100: 74 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  t really require
9110: 64 2c 20 62 75 74 20 61 72 65 20 67 65 6e 65 72  d, but are gener
9120: 61 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 69  ated by the SQLi
9130: 74 65 20 0a 70 61 72 73 65 72 20 66 72 6f 6d 20  te .parser from 
9140: 69 74 73 20 63 6f 64 65 20 74 65 6d 70 6c 61 74  its code templat
9150: 65 73 2c 20 77 68 69 63 68 20 61 72 65 20 64 65  es, which are de
9160: 73 69 67 6e 65 64 20 74 6f 20 68 61 6e 64 6c 65  signed to handle
9170: 20 6d 6f 72 65 20 0a 63 6f 6d 70 6c 69 63 61 74   more .complicat
9180: 65 64 20 63 61 73 65 73 2e 3c 2f 70 3e 0a 3c 70  ed cases.</p>.<p
9190: 3e 54 68 65 20 3c 61 20 68 72 65 66 3d 22 6f 70  >The <a href="op
91a0: 63 6f 64 65 2e 68 74 6d 6c 23 4c 69 73 74 52 65  code.html#ListRe
91b0: 73 65 74 22 3e 4c 69 73 74 52 65 73 65 74 3c 2f  set">ListReset</
91c0: 61 3e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  a> instruction e
91d0: 6d 70 74 69 65 73 20 0a 74 68 65 20 74 65 6d 70  mpties .the temp
91e0: 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 6c 69  orary storage li
91f0: 73 74 2e 20 20 54 68 69 73 20 6c 69 73 74 20 69  st.  This list i
9200: 73 20 65 6d 70 74 69 65 64 20 61 75 74 6f 6d 61  s emptied automa
9210: 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
9220: 20 0a 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74   .VDBE program t
9230: 65 72 6d 69 6e 61 74 65 73 2c 20 73 6f 20 69 74  erminates, so it
9240: 20 69 73 6e 27 74 20 6e 65 63 65 73 73 61 72 79   isn't necessary
9250: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
9260: 54 68 65 20 43 6c 6f 73 65 20 0a 69 6e 73 74 72  The Close .instr
9270: 75 63 74 69 6f 6e 20 63 6c 6f 73 65 73 20 74 68  uction closes th
9280: 65 20 63 75 72 73 6f 72 20 50 31 2e 20 20 41 67  e cursor P1.  Ag
9290: 61 69 6e 2c 20 74 68 69 73 20 69 73 20 64 6f 6e  ain, this is don
92a0: 65 20 62 79 20 74 68 65 20 56 44 42 45 20 0a 65  e by the VDBE .e
92b0: 6e 67 69 6e 65 20 77 68 65 6e 20 69 74 20 69 73  ngine when it is
92c0: 20 66 69 6e 69 73 68 65 64 20 72 75 6e 6e 69 6e   finished runnin
92d0: 67 20 74 68 69 73 20 70 72 6f 67 72 61 6d 2e 20  g this program. 
92e0: 20 54 68 65 20 43 6f 6d 6d 69 74 20 65 6e 64 73   The Commit ends
92f0: 20 74 68 65 20 0a 63 75 72 72 65 6e 74 20 74 72   the .current tr
9300: 61 6e 73 61 63 74 69 6f 6e 20 73 75 63 63 65 73  ansaction succes
9310: 73 66 75 6c 6c 79 2c 20 61 6e 64 20 63 61 75 73  sfully, and caus
9320: 65 73 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  es all changes t
9330: 68 61 74 20 6f 63 63 75 72 72 65 64 20 0a 69 6e  hat occurred .in
9340: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
9350: 6e 20 74 6f 20 62 65 20 73 61 76 65 64 20 74 6f  n to be saved to
9360: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
9370: 54 68 65 20 66 69 6e 61 6c 20 48 61 6c 74 20 69  The final Halt i
9380: 73 20 61 6c 73 6f 20 0a 75 6e 6e 65 63 63 65 73  s also .unnecces
9390: 73 61 72 79 2c 20 73 69 6e 63 65 20 69 74 20 69  sary, since it i
93a0: 73 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  s added to every
93b0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 77 68   VDBE program wh
93c0: 65 6e 20 69 74 20 69 73 20 0a 70 72 65 70 61 72  en it is .prepar
93d0: 65 64 20 74 6f 20 72 75 6e 2e 3c 2f 70 3e 0a 0a  ed to run.</p>..
93e0: 0a 3c 70 3e 55 50 44 41 54 45 20 73 74 61 74 65  .<p>UPDATE state
93f0: 6d 65 6e 74 73 20 77 6f 72 6b 20 76 65 72 79 20  ments work very 
9400: 6d 75 63 68 20 6c 69 6b 65 20 44 45 4c 45 54 45  much like DELETE
9410: 20 73 74 61 74 65 6d 65 6e 74 73 20 65 78 63 65   statements exce
9420: 70 74 0a 74 68 61 74 20 69 6e 73 74 65 61 64 20  pt.that instead 
9430: 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  of deleting the 
9440: 72 65 63 6f 72 64 20 74 68 65 79 20 72 65 70 6c  record they repl
9450: 61 63 65 20 69 74 20 77 69 74 68 20 61 20 6e 65  ace it with a ne
9460: 77 20 6f 6e 65 2e 0a 43 6f 6e 73 69 64 65 72 20  w one..Consider 
9470: 74 68 69 73 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f  this example:.</
9480: 70 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e  p>..<blockquote>
9490: 3c 70 72 65 3e 0a 55 50 44 41 54 45 20 65 78 61  <pre>.UPDATE exa
94a0: 6d 70 20 53 45 54 20 6f 6e 65 3d 20 27 28 27 20  mp SET one= '(' 
94b0: 7c 7c 20 6f 6e 65 20 7c 7c 20 27 29 27 20 57 48  || one || ')' WH
94c0: 45 52 45 20 74 77 6f 20 3c 20 35 30 3b 0a 3c 2f  ERE two < 50;.</
94d0: 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65  pre></blockquote
94e0: 3e 0a 0a 3c 70 3e 49 6e 73 74 65 61 64 20 6f 66  >..<p>Instead of
94f0: 20 64 65 6c 65 74 69 6e 67 20 72 65 63 6f 72 64   deleting record
9500: 73 20 77 68 65 72 65 20 74 68 65 20 22 74 77 6f  s where the "two
9510: 22 20 63 6f 6c 75 6d 6e 20 69 73 20 6c 65 73 73  " column is less
9520: 20 74 68 61 6e 0a 35 30 2c 20 74 68 69 73 20 73   than.50, this s
9530: 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 70 75  tatement just pu
9540: 74 73 20 74 68 65 20 22 6f 6e 65 22 20 63 6f 6c  ts the "one" col
9550: 75 6d 6e 20 69 6e 20 70 61 72 65 6e 74 68 65 73  umn in parenthes
9560: 65 73 0a 54 68 65 20 56 44 42 45 20 70 72 6f 67  es.The VDBE prog
9570: 72 61 6d 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ram to implement
9580: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
9590: 66 6f 6c 6c 6f 77 73 3a 3c 2f 70 3e 0a 7d 0a 0a  follows:</p>.}..
95a0: 43 6f 64 65 20 7b 0a 61 64 64 72 20 20 6f 70 63  Code {.addr  opc
95b0: 6f 64 65 20 20 20 20 20 20 20 20 70 31 20 20 20  ode        p1   
95c0: 20 20 70 32 20 20 20 20 20 70 33 20 20 20 20 20    p2     p3     
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d   .----  --------
9600: 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d  ----  -----  ---
9610: 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
9620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9630: 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 54 72  -------.0     Tr
9640: 61 6e 73 61 63 74 69 6f 6e 20 20 20 31 20 20 20  ansaction   1   
9650: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 20               .1 
9680: 20 20 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 20      Transaction 
9690: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 20 0a 32 20 20 20 20 20 56 65 72 69 66 79     .2     Verify
96d0: 43 6f 6f 6b 69 65 20 20 30 20 20 20 20 20 20 31  Cookie  0      1
96e0: 37 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20  78              
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 33                .3
9710: 20 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20       Integer    
9720: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9750: 20 20 20 20 0a 34 20 20 20 20 20 4f 70 65 6e 52      .4     OpenR
9760: 65 61 64 20 20 20 20 20 20 30 20 20 20 20 20 20  ead      0      
9770: 33 20 20 20 20 20 20 65 78 61 6d 70 20 20 20 20  3      examp    
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 20 20 20 20 20 20 20 20 20 0a 35 20 20 20 20            .5    
97a0: 20 52 65 77 69 6e 64 20 20 20 20 20 20 20 20 30   Rewind        0
97b0: 20 20 20 20 20 20 31 32 20 20 20 20 20 20 20 20        12        
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 0a 36 20 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20  .6     Column   
97f0: 20 20 20 20 20 30 20 20 20 20 20 20 31 20 20 20       0      1   
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 20 20 20 20 20 0a 37 20 20 20 20 20 49 6e 74        .7     Int
9830: 65 67 65 72 20 20 20 20 20 20 20 35 30 20 20 20  eger       50   
9840: 20 20 30 20 20 20 20 20 20 35 30 20 20 20 20 20    0      50     
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9860: 20 20 20 20 20 20 20 20 20 20 20 20 0a 38 20 20              .8  
9870: 20 20 20 47 65 20 20 20 20 20 20 20 20 20 20 20     Ge           
9880: 20 31 20 20 20 20 20 20 31 31 20 20 20 20 20 20   1      11      
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 20 20 0a 39 20 20 20 20 20 52 65 63 6e 6f 20 20    .9     Recno  
98c0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98f0: 20 20 20 20 20 20 20 20 0a 31 30 20 20 20 20 4c          .10    L
9900: 69 73 74 57 72 69 74 65 20 20 20 20 20 30 20 20  istWrite     0  
9910: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
9940: 31 20 20 20 20 4e 65 78 74 20 20 20 20 20 20 20  1    Next       
9950: 20 20 20 30 20 20 20 20 20 20 36 20 20 20 20 20     0      6     
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 20 20 20 20 20 20 20 20 20 0a 31 32 20 20 20 20           .12    
9990: 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20 30 20  Close         0 
99a0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
99d0: 31 33 20 20 20 20 49 6e 74 65 67 65 72 20 20 20  13    Integer   
99e0: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a10: 20 20 20 20 20 0a 31 34 20 20 20 20 4f 70 65 6e       .14    Open
9a20: 57 72 69 74 65 20 20 20 20 20 30 20 20 20 20 20  Write     0     
9a30: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 0a 31 35 20 20 20 20 4c 69 73 74 52 65 77 69 6e  .15    ListRewin
9a70: 64 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20  d    0      0   
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 20 20 20 20 0a 31 36 20 20 20 20 4c 69 73        .16    Lis
9ab0: 74 52 65 61 64 20 20 20 20 20 20 30 20 20 20 20  tRead      0    
9ac0: 20 20 32 38 20 20 20 20 20 20 20 20 20 20 20 20    28            
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 0a 31 37 20 20 20 20 44 75 70 20 20 20 20 20   .17    Dup     
9b00: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 20 20 0a 31 38 20 20 20 20 4e 6f         .18    No
9b40: 74 45 78 69 73 74 73 20 20 20 20 20 30 20 20 20  tExists     0   
9b50: 20 20 20 31 36 20 20 20 20 20 20 20 20 20 20 20     16           
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 20 0a 31 39 20 20 20 20 53 74 72 69 6e 67 20    .19    String 
9b90: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
9ba0: 20 20 20 20 20 28 20 20 20 20 20 20 20 20 20 20       (          
9bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bc0: 20 20 20 20 20 20 20 20 0a 32 30 20 20 20 20 43          .20    C
9bd0: 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20  olumn        0  
9be0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32                .2
9c10: 31 20 20 20 20 43 6f 6e 63 61 74 20 20 20 20 20  1    Concat     
9c20: 20 20 20 32 20 20 20 20 20 20 30 20 20 20 20 20     2      0     
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c50: 20 20 20 20 0a 32 32 20 20 20 20 53 74 72 69 6e      .22    Strin
9c60: 67 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20  g        0      
9c70: 30 20 20 20 20 20 20 29 20 20 20 20 20 20 20 20  0      )        
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c90: 20 20 20 20 20 20 20 20 20 20 0a 32 33 20 20 20            .23   
9ca0: 20 43 6f 6e 63 61 74 20 20 20 20 20 20 20 20 32   Concat        2
9cb0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 0a 32 34 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20  .24    Column   
9cf0: 20 20 20 20 20 30 20 20 20 20 20 20 31 20 20 20       0      1   
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 20 20 20 20 20 20 0a 32 35 20 20 20 20 4d 61 6b        .25    Mak
9d30: 65 52 65 63 6f 72 64 20 20 20 20 32 20 20 20 20  eRecord    2    
9d40: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 36 20              .26 
9d70: 20 20 20 50 75 74 49 6e 74 4b 65 79 20 20 20 20     PutIntKey    
9d80: 20 30 20 20 20 20 20 20 31 20 20 20 20 20 20 20   0      1       
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 0a 32 37 20 20 20 20 47 6f 74 6f 20 20 20    .27    Goto   
9dc0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31 36         0      16
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 38               .28
9e00: 20 20 20 20 4c 69 73 74 52 65 73 65 74 20 20 20      ListReset   
9e10: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e40: 20 20 20 0a 32 39 20 20 20 20 43 6c 6f 73 65 20     .29    Close 
9e50: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30          0      0
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 20 20 20 20 20 20 20 20 20 0a 33 30 20 20 20 20           .30    
9e90: 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 30 20  Commit        0 
9ea0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
9ed0: 33 31 20 20 20 20 48 61 6c 74 20 20 20 20 20 20  31    Halt      
9ee0: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f10: 20 20 20 20 20 0a 7d 0a 0a 70 75 74 73 20 7b 0a       .}..puts {.
9f20: 3c 70 3e 54 68 69 73 20 70 72 6f 67 72 61 6d 20  <p>This program 
9f30: 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 74  is essentially t
9f40: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 44  he same as the D
9f50: 45 4c 45 54 45 20 70 72 6f 67 72 61 6d 20 65 78  ELETE program ex
9f60: 63 65 70 74 20 0a 74 68 61 74 20 74 68 65 20 62  cept .that the b
9f70: 6f 64 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  ody of the secon
9f80: 64 20 6c 6f 6f 70 20 68 61 73 20 62 65 65 6e 20  d loop has been 
9f90: 72 65 70 6c 61 63 65 20 62 79 20 61 20 73 65 71  replace by a seq
9fa0: 75 65 6e 63 65 20 6f 66 20 0a 69 6e 73 74 72 75  uence of .instru
9fb0: 63 74 69 6f 6e 73 20 28 61 74 20 61 64 64 72 65  ctions (at addre
9fc0: 73 73 65 73 20 31 37 20 74 68 72 6f 75 67 68 20  sses 17 through 
9fd0: 32 36 29 20 74 68 61 74 20 75 70 64 61 74 65 20  26) that update 
9fe0: 74 68 65 20 72 65 63 6f 72 64 20 72 61 74 68 65  the record rathe
9ff0: 72 20 0a 74 68 61 6e 20 64 65 6c 65 74 65 20 69  r .than delete i
a000: 74 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 69 73  t.  Most of this
a010: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 65 71   instruction seq
a020: 75 65 6e 63 65 20 73 68 6f 75 6c 64 20 61 6c 72  uence should alr
a030: 65 61 64 79 20 62 65 20 0a 66 61 6d 69 6c 69 61  eady be .familia
a040: 72 20 74 6f 20 79 6f 75 2c 20 62 75 74 20 74 68  r to you, but th
a050: 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65  ere are a couple
a060: 20 6f 66 20 6d 69 6e 6f 72 20 74 77 69 73 74 73   of minor twists
a070: 20 73 6f 20 77 65 20 77 69 6c 6c 20 67 6f 20 0a   so we will go .
a080: 6f 76 65 72 20 69 74 20 62 72 69 65 66 6c 79 2e  over it briefly.
a090: 20 20 41 6c 73 6f 20 6e 6f 74 65 20 74 68 61 74    Also note that
a0a0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 73 6f   the order of so
a0b0: 6d 65 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75  me of the instru
a0c0: 63 74 69 6f 6e 73 20 0a 62 65 66 6f 72 65 20 61  ctions .before a
a0d0: 6e 64 20 61 66 74 65 72 20 74 68 65 20 32 6e 64  nd after the 2nd
a0e0: 20 6c 6f 6f 70 20 68 61 73 20 63 68 61 6e 67 65   loop has change
a0f0: 64 2e 20 20 54 68 69 73 20 69 73 20 6a 75 73 74  d.  This is just
a100: 20 74 68 65 20 77 61 79 20 74 68 65 20 0a 53 51   the way the .SQ
a110: 4c 69 74 65 20 70 61 72 73 65 72 20 63 68 6f 73  Lite parser chos
a120: 65 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  e to output the 
a130: 63 6f 64 65 20 75 73 69 6e 67 20 61 20 64 69 66  code using a dif
a140: 66 65 72 65 6e 74 20 74 65 6d 70 6c 61 74 65 2e  ferent template.
a150: 3c 2f 70 3e 0a 0a 3c 70 3e 41 73 20 77 65 20 65  </p>..<p>As we e
a160: 6e 74 65 72 20 74 68 65 20 69 6e 74 65 72 69 6f  nter the interio
a170: 72 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  r of the second 
a180: 6c 6f 6f 70 20 28 61 74 20 69 6e 73 74 72 75 63  loop (at instruc
a190: 74 69 6f 6e 20 31 37 29 0a 74 68 65 20 73 74 61  tion 17).the sta
a1a0: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ck contains a si
a1b0: 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 77 68 69  ngle integer whi
a1c0: 63 68 20 69 73 20 74 68 65 20 6b 65 79 20 6f 66  ch is the key of
a1d0: 20 74 68 65 0a 72 65 63 6f 72 64 20 77 65 20 77   the.record we w
a1e0: 61 6e 74 20 74 6f 20 6d 6f 64 69 66 79 2e 20 20  ant to modify.  
a1f0: 57 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20  We are going to 
a200: 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 69 73  need to use this
a210: 0a 6b 65 79 20 74 77 69 63 65 3a 20 6f 6e 63 65  .key twice: once
a220: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 6f 6c   to fetch the ol
a230: 64 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72  d value of the r
a240: 65 63 6f 72 64 20 61 6e 64 0a 61 20 73 65 63 6f  ecord and.a seco
a250: 6e 64 20 74 69 6d 65 20 74 6f 20 77 72 69 74 65  nd time to write
a260: 20 62 61 63 6b 20 74 68 65 20 72 65 76 69 73 65   back the revise
a270: 64 20 72 65 63 6f 72 64 2e 20 20 53 6f 20 74 68  d record.  So th
a280: 65 20 66 69 72 73 74 20 69 6e 73 74 72 75 63 74  e first instruct
a290: 69 6f 6e 0a 69 73 20 61 20 44 75 70 20 74 6f 20  ion.is a Dup to 
a2a0: 6d 61 6b 65 20 61 20 64 75 70 6c 69 63 61 74 65  make a duplicate
a2b0: 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 6e 20 74   of the key on t
a2c0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
a2d0: 61 63 6b 2e 20 20 54 68 65 0a 44 75 70 20 69 6e  ack.  The.Dup in
a2e0: 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 64  struction will d
a2f0: 75 70 6c 69 63 61 74 65 20 61 6e 79 20 65 6c 65  uplicate any ele
a300: 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 74 61 63  ment of the stac
a310: 6b 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  k, not just the 
a320: 74 6f 70 0a 65 6c 65 6d 65 6e 74 2e 20 20 59 6f  top.element.  Yo
a330: 75 20 73 70 65 63 69 66 79 20 77 68 69 63 68 20  u specify which 
a340: 65 6c 65 6d 65 6e 74 20 74 6f 20 64 75 70 6c 69  element to dupli
a350: 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  cation using the
a360: 0a 50 31 20 6f 70 65 72 61 6e 64 2e 20 20 57 68  .P1 operand.  Wh
a370: 65 6e 20 50 31 20 69 73 20 30 2c 20 74 68 65 20  en P1 is 0, the 
a380: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
a390: 20 69 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a   is duplicated..
a3a0: 57 68 65 6e 20 50 31 20 69 73 20 31 2c 20 74 68  When P1 is 1, th
a3b0: 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 64  e next element d
a3c0: 6f 77 6e 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  own on the stack
a3d0: 20 64 75 70 6c 69 63 61 74 69 6f 6e 2e 0a 41 6e   duplication..An
a3e0: 64 20 73 6f 20 66 6f 72 74 68 2e 3c 2f 70 3e 0a  d so forth.</p>.
a3f0: 0a 3c 70 3e 41 66 74 65 72 20 64 75 70 6c 69 63  .<p>After duplic
a400: 61 74 69 6e 67 20 74 68 65 20 6b 65 79 2c 20 74  ating the key, t
a410: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
a420: 69 6f 6e 2c 20 4e 6f 74 45 78 69 73 74 73 2c 0a  ion, NotExists,.
a430: 70 6f 70 73 20 74 68 65 20 73 74 61 63 6b 20 6f  pops the stack o
a440: 6e 63 65 20 61 6e 64 20 75 73 65 73 20 74 68 65  nce and uses the
a450: 20 76 61 6c 75 65 20 70 6f 70 70 65 64 20 61 73   value popped as
a460: 20 61 20 6b 65 79 20 74 6f 0a 63 68 65 63 6b 20   a key to.check 
a470: 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  the existence of
a480: 20 61 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65   a record in the
a490: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
a4a0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
a4b0: 72 65 63 6f 72 64 20 0a 66 6f 72 20 74 68 69 73  record .for this
a4c0: 20 6b 65 79 2c 20 69 74 20 6a 75 6d 70 73 20 62   key, it jumps b
a4d0: 61 63 6b 20 74 6f 20 74 68 65 20 4c 69 73 74 52  ack to the ListR
a4e0: 65 61 64 20 74 6f 20 67 65 74 20 61 6e 6f 74 68  ead to get anoth
a4f0: 65 72 20 6b 65 79 2e 3c 2f 70 3e 0a 0a 3c 70 3e  er key.</p>..<p>
a500: 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 31 39 20  Instructions 19 
a510: 74 68 72 6f 75 67 68 20 32 35 20 63 6f 6e 73 74  through 25 const
a520: 72 75 63 74 20 61 20 6e 65 77 20 64 61 74 61 62  ruct a new datab
a530: 61 73 65 20 72 65 63 6f 72 64 0a 74 68 61 74 20  ase record.that 
a540: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
a550: 72 65 70 6c 61 63 65 20 74 68 65 20 65 78 69 73  replace the exis
a560: 74 69 6e 67 20 72 65 63 6f 72 64 2e 20 20 54 68  ting record.  Th
a570: 69 73 20 69 73 0a 74 68 65 20 73 61 6d 65 20 6b  is is.the same k
a580: 69 6e 64 20 6f 66 20 63 6f 64 65 20 74 68 61 74  ind of code that
a590: 20 77 65 20 73 61 77 20 0a 69 6e 20 74 68 65 20   we saw .in the 
a5a0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 49  description of I
a5b0: 4e 53 45 52 54 20 61 6e 64 20 77 69 6c 6c 20 6e  NSERT and will n
a5c0: 6f 74 20 62 65 20 64 65 73 63 72 69 62 65 64 20  ot be described 
a5d0: 66 75 72 74 68 65 72 2e 0a 41 66 74 65 72 20 69  further..After i
a5e0: 6e 73 74 72 75 63 74 69 6f 6e 20 32 35 20 65 78  nstruction 25 ex
a5f0: 65 63 75 74 65 73 2c 20 74 68 65 20 73 74 61 63  ecutes, the stac
a600: 6b 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  k looks like thi
a610: 73 3a 3c 2f 70 3e 0a 7d 0a 0a 73 74 61 63 6b 20  s:</p>.}..stack 
a620: 7b 28 72 65 63 6f 72 64 29 20 6e 65 77 20 64 61  {(record) new da
a630: 74 61 20 72 65 63 6f 72 64 7d 20 7b 28 69 6e 74  ta record} {(int
a640: 65 67 65 72 29 20 6b 65 79 7d 0a 0a 70 75 74 73  eger) key}..puts
a650: 20 7b 0a 3c 70 3e 54 68 65 20 50 75 74 49 6e 74   {.<p>The PutInt
a660: 4b 65 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  Key instruction 
a670: 28 61 6c 73 6f 20 64 65 73 63 72 69 62 65 64 0a  (also described.
a680: 64 75 72 69 6e 67 20 74 68 65 20 64 69 73 63 75  during the discu
a690: 73 73 69 6f 6e 20 61 62 6f 75 74 20 49 4e 53 45  ssion about INSE
a6a0: 52 54 29 20 77 72 69 74 65 73 20 61 6e 20 65 6e  RT) writes an en
a6b0: 74 72 79 20 69 6e 74 6f 20 74 68 65 0a 64 61 74  try into the.dat
a6c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 6f 73 65  abase file whose
a6d0: 20 64 61 74 61 20 69 73 20 74 68 65 20 74 6f 70   data is the top
a6e0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 61 6e   of the stack an
a6f0: 64 20 77 68 6f 73 65 20 6b 65 79 0a 69 73 20 74  d whose key.is t
a700: 68 65 20 6e 65 78 74 20 6f 6e 20 74 68 65 20 73  he next on the s
a710: 74 61 63 6b 2c 20 61 6e 64 20 74 68 65 6e 20 70  tack, and then p
a720: 6f 70 73 20 74 68 65 20 73 74 61 63 6b 20 74 77  ops the stack tw
a730: 69 63 65 2e 20 20 54 68 65 0a 50 75 74 49 6e 74  ice.  The.PutInt
a740: 4b 65 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  Key instruction 
a750: 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
a760: 68 65 20 64 61 74 61 20 6f 66 20 61 6e 20 65 78  he data of an ex
a770: 69 73 74 69 6e 67 20 72 65 63 6f 72 64 0a 77 69  isting record.wi
a780: 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 2c  th the same key,
a790: 20 77 68 69 63 68 20 69 73 20 77 68 61 74 20 77   which is what w
a7a0: 65 20 77 61 6e 74 20 68 65 72 65 2e 20 20 4f 76  e want here.  Ov
a7b0: 65 72 77 72 69 74 69 6e 67 20 77 61 73 20 6e 6f  erwriting was no
a7c0: 74 0a 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  t.an issue with 
a7d0: 49 4e 53 45 52 54 20 62 65 63 61 75 73 65 20 77  INSERT because w
a7e0: 69 74 68 20 49 4e 53 45 52 54 20 74 68 65 20 6b  ith INSERT the k
a7f0: 65 79 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  ey was generated
a800: 0a 62 79 20 74 68 65 20 4e 65 77 52 65 63 6e 6f  .by the NewRecno
a810: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 68 69   instruction whi
a820: 63 68 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ch is guaranteed
a830: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 6b 65   to provide a ke
a840: 79 0a 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62  y.that has not b
a850: 65 65 6e 20 75 73 65 64 20 62 65 66 6f 72 65 2e  een used before.
a860: 3c 2f 70 3e 0a 7d 0a 0a 69 66 20 30 20 7b 3c 70  </p>.}..if 0 {<p
a870: 3e 28 42 79 20 74 68 65 20 77 61 79 2c 20 73 69  >(By the way, si
a880: 6e 63 65 20 6b 65 79 73 20 6d 75 73 74 0a 61 6c  nce keys must.al
a890: 6c 20 62 65 20 75 6e 69 71 75 65 20 61 6e 64 20  l be unique and 
a8a0: 65 61 63 68 20 6b 65 79 20 69 73 20 61 20 33 32  each key is a 32
a8b0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 61 20  -bit integer, a 
a8c0: 73 69 6e 67 6c 65 0a 53 51 4c 69 74 65 20 64 61  single.SQLite da
a8d0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 63 61 6e  tabase table can
a8e0: 20 68 61 76 65 20 6e 6f 20 6d 6f 72 65 20 74 68   have no more th
a8f0: 61 6e 20 32 3c 73 75 70 3e 33 32 3c 2f 73 75 70  an 2<sup>32</sup
a900: 3e 0a 72 6f 77 73 2e 20 20 41 63 74 75 61 6c 6c  >.rows.  Actuall
a910: 79 2c 20 74 68 65 20 4b 65 79 20 69 6e 73 74 72  y, the Key instr
a920: 75 63 74 69 6f 6e 20 73 74 61 72 74 73 20 74 6f  uction starts to
a930: 20 62 65 63 6f 6d 65 0a 76 65 72 79 20 69 6e 65   become.very ine
a940: 66 66 69 63 69 65 6e 74 20 61 73 20 79 6f 75 20  fficient as you 
a950: 61 70 70 72 6f 61 63 68 20 74 68 69 73 20 75 70  approach this up
a960: 70 65 72 20 62 6f 75 6e 64 2c 20 73 6f 20 69 74  per bound, so it
a970: 0a 69 73 20 62 65 73 74 20 74 6f 20 6b 65 65 70  .is best to keep
a980: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
a990: 6e 74 72 69 65 73 20 62 65 6c 6f 77 20 32 3c 73  ntries below 2<s
a9a0: 75 70 3e 33 31 3c 2f 73 75 70 3e 0a 6f 72 20 73  up>31</sup>.or s
a9b0: 6f 2e 20 20 53 75 72 65 6c 79 20 61 20 63 6f 75  o.  Surely a cou
a9c0: 70 6c 65 20 62 69 6c 6c 69 6f 6e 20 72 65 63 6f  ple billion reco
a9d0: 72 64 73 20 77 69 6c 6c 20 62 65 20 65 6e 6f 75  rds will be enou
a9e0: 67 68 20 66 6f 72 0a 6d 6f 73 74 20 61 70 70 6c  gh for.most appl
a9f0: 69 63 61 74 69 6f 6e 73 21 29 3c 2f 70 3e 0a 7d  ications!)</p>.}
aa00: 0a 0a 70 75 74 73 20 7b 0a 3c 68 32 3e 43 52 45  ..puts {.<h2>CRE
aa10: 41 54 45 20 61 6e 64 20 44 52 4f 50 3c 2f 68 32  ATE and DROP</h2
aa20: 3e 0a 0a 3c 70 3e 55 73 69 6e 67 20 43 52 45 41  >..<p>Using CREA
aa30: 54 45 20 6f 72 20 44 52 4f 50 20 74 6f 20 63 72  TE or DROP to cr
aa40: 65 61 74 65 20 6f 72 20 64 65 73 74 72 6f 79 20  eate or destroy 
aa50: 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
aa60: 20 69 73 0a 72 65 61 6c 6c 79 20 74 68 65 20 73   is.really the s
aa70: 61 6d 65 20 61 73 20 64 6f 69 6e 67 20 61 6e 20  ame as doing an 
aa80: 49 4e 53 45 52 54 20 6f 72 20 44 45 4c 45 54 45  INSERT or DELETE
aa90: 20 66 72 6f 6d 20 74 68 65 20 73 70 65 63 69 61   from the specia
aaa0: 6c 0a 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  l."sqlite_master
aab0: 22 20 74 61 62 6c 65 2c 20 61 74 20 6c 65 61 73  " table, at leas
aac0: 74 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  t from the point
aad0: 20 6f 66 20 76 69 65 77 20 6f 66 20 74 68 65 20   of view of the 
aae0: 56 44 42 45 2e 0a 54 68 65 20 73 71 6c 69 74 65  VDBE..The sqlite
aaf0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69 73  _master table is
ab00: 20 61 20 73 70 65 63 69 61 6c 20 74 61 62 6c 65   a special table
ab10: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
ab20: 69 63 61 6c 6c 79 0a 63 72 65 61 74 65 64 20 66  ically.created f
ab30: 6f 72 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  or every SQLite 
ab40: 64 61 74 61 62 61 73 65 2e 20 20 49 74 20 6c 6f  database.  It lo
ab50: 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 3c 2f  oks like this:</
ab60: 70 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e  p>..<blockquote>
ab70: 3c 70 72 65 3e 0a 43 52 45 41 54 45 20 54 41 42  <pre>.CREATE TAB
ab80: 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  LE sqlite_master
ab90: 20 28 0a 20 20 74 79 70 65 20 20 20 20 20 20 54   (.  type      T
aba0: 45 58 54 2c 20 20 20 20 2d 2d 20 65 69 74 68 65  EXT,    -- eithe
abb0: 72 20 22 74 61 62 6c 65 22 20 6f 72 20 22 69 6e  r "table" or "in
abc0: 64 65 78 22 0a 20 20 6e 61 6d 65 20 20 20 20 20  dex".  name     
abd0: 20 54 45 58 54 2c 20 20 20 20 2d 2d 20 6e 61 6d   TEXT,    -- nam
abe0: 65 20 6f 66 20 74 68 69 73 20 74 61 62 6c 65 20  e of this table 
abf0: 6f 72 20 69 6e 64 65 78 0a 20 20 74 62 6c 5f 6e  or index.  tbl_n
ac00: 61 6d 65 20 20 54 45 58 54 2c 20 20 20 20 2d 2d  ame  TEXT,    --
ac10: 20 66 6f 72 20 69 6e 64 69 63 65 73 3a 20 6e 61   for indices: na
ac20: 6d 65 20 6f 66 20 61 73 73 6f 63 69 61 74 65 64  me of associated
ac30: 20 74 61 62 6c 65 0a 20 20 73 71 6c 20 20 20 20   table.  sql    
ac40: 20 20 20 54 45 58 54 20 20 20 20 20 2d 2d 20 53     TEXT     -- S
ac50: 51 4c 20 74 65 78 74 20 6f 66 20 74 68 65 20 6f  QL text of the o
ac60: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 73  riginal CREATE s
ac70: 74 61 74 65 6d 65 6e 74 0a 29 0a 3c 2f 70 72 65  tatement.).</pre
ac80: 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a  ></blockquote>..
ac90: 3c 70 3e 45 76 65 72 79 20 74 61 62 6c 65 20 28  <p>Every table (
aca0: 65 78 63 65 70 74 20 74 68 65 20 22 73 71 6c 69  except the "sqli
acb0: 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  te_master" table
acc0: 20 69 74 73 65 6c 66 29 0a 61 6e 64 20 65 76 65   itself).and eve
acd0: 72 79 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 69  ry named index i
ace0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
acf0: 62 61 73 65 20 68 61 73 20 61 6e 20 65 6e 74 72  base has an entr
ad00: 79 0a 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  y.in the sqlite_
ad10: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 59  master table.  Y
ad20: 6f 75 20 63 61 6e 20 71 75 65 72 79 20 74 68 69  ou can query thi
ad30: 73 20 74 61 62 6c 65 20 75 73 69 6e 67 0a 61 20  s table using.a 
ad40: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
ad50: 20 6a 75 73 74 20 6c 69 6b 65 20 61 6e 79 20 6f   just like any o
ad60: 74 68 65 72 20 74 61 62 6c 65 2e 20 20 42 75 74  ther table.  But
ad70: 20 79 6f 75 20 61 72 65 0a 6e 6f 74 20 61 6c 6c   you are.not all
ad80: 6f 77 65 64 20 74 6f 20 64 69 72 65 63 74 6c 79  owed to directly
ad90: 20 63 68 61 6e 67 65 20 74 68 65 20 74 61 62 6c   change the tabl
ada0: 65 20 75 73 69 6e 67 20 55 50 44 41 54 45 2c 20  e using UPDATE, 
adb0: 49 4e 53 45 52 54 2c 0a 6f 72 20 44 45 4c 45 54  INSERT,.or DELET
adc0: 45 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20 73  E.  Changes to s
add0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61 76  qlite_master hav
ade0: 65 20 74 6f 20 6f 63 63 75 72 20 75 73 69 6e 67  e to occur using
adf0: 0a 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20  .the CREATE and 
ae00: 44 52 4f 50 20 63 6f 6d 6d 61 6e 64 73 20 62 65  DROP commands be
ae10: 63 61 75 73 65 20 53 51 4c 69 74 65 20 61 6c 73  cause SQLite als
ae20: 6f 20 68 61 73 20 74 6f 20 75 70 64 61 74 65 0a  o has to update.
ae30: 73 6f 6d 65 20 6f 66 20 69 74 73 20 69 6e 74 65  some of its inte
ae40: 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
ae50: 75 72 65 73 20 77 68 65 6e 20 74 61 62 6c 65 73  ures when tables
ae60: 20 61 6e 64 20 69 6e 64 69 63 65 73 0a 61 72 65   and indices.are
ae70: 20 61 64 64 65 64 20 6f 72 20 64 65 73 74 72 6f   added or destro
ae80: 79 65 64 2e 3c 2f 70 3e 0a 0a 3c 70 3e 42 75 74  yed.</p>..<p>But
ae90: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 20   from the point 
aea0: 6f 66 20 76 69 65 77 20 6f 66 20 74 68 65 20 56  of view of the V
aeb0: 44 42 45 2c 20 61 20 43 52 45 41 54 45 20 77 6f  DBE, a CREATE wo
aec0: 72 6b 73 0a 70 72 65 74 74 79 20 6d 75 63 68 20  rks.pretty much 
aed0: 6c 69 6b 65 20 61 6e 20 49 4e 53 45 52 54 20 61  like an INSERT a
aee0: 6e 64 20 61 20 44 52 4f 50 20 77 6f 72 6b 73 20  nd a DROP works 
aef0: 6c 69 6b 65 20 61 20 44 45 4c 45 54 45 2e 0a 57  like a DELETE..W
af00: 68 65 6e 20 74 68 65 20 53 51 4c 69 74 65 20 6c  hen the SQLite l
af10: 69 62 72 61 72 79 20 6f 70 65 6e 73 20 74 6f 20  ibrary opens to 
af20: 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  an existing data
af30: 62 61 73 65 2c 0a 74 68 65 20 66 69 72 73 74 20  base,.the first 
af40: 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
af50: 20 61 20 53 45 4c 45 43 54 20 74 6f 20 72 65 61   a SELECT to rea
af60: 64 20 74 68 65 20 22 73 71 6c 22 0a 63 6f 6c 75  d the "sql".colu
af70: 6d 6e 73 20 66 72 6f 6d 20 61 6c 6c 20 65 6e 74  mns from all ent
af80: 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
af90: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
afa0: 0a 54 68 65 20 22 73 71 6c 22 20 63 6f 6c 75 6d  .The "sql" colum
afb0: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  n contains the c
afc0: 6f 6d 70 6c 65 74 65 20 53 51 4c 20 74 65 78 74  omplete SQL text
afd0: 20 6f 66 20 74 68 65 0a 43 52 45 41 54 45 20 73   of the.CREATE s
afe0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72  tatement that or
aff0: 69 67 69 6e 61 6c 6c 79 20 67 65 6e 65 72 61 74  iginally generat
b000: 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f 72 0a  ed the index or.
b010: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 74 65 78  table.  This tex
b020: 74 20 69 73 20 66 65 64 20 62 61 63 6b 20 69 6e  t is fed back in
b030: 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 70 61  to the SQLite pa
b040: 72 73 65 72 0a 61 6e 64 20 75 73 65 64 20 74 6f  rser.and used to
b050: 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65   reconstruct the
b060: 0a 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73  .internal data s
b070: 74 72 75 63 74 75 72 65 73 20 64 65 73 63 72 69  tructures descri
b080: 62 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 6f  bing the index o
b090: 72 20 74 61 62 6c 65 2e 3c 2f 70 3e 0a 0a 3c 68  r table.</p>..<h
b0a0: 32 3e 55 73 69 6e 67 20 49 6e 64 65 78 65 73 20  2>Using Indexes 
b0b0: 54 6f 20 53 70 65 65 64 20 53 65 61 72 63 68 69  To Speed Searchi
b0c0: 6e 67 3c 2f 68 32 3e 0a 0a 3c 70 3e 49 6e 20 74  ng</h2>..<p>In t
b0d0: 68 65 20 65 78 61 6d 70 6c 65 20 71 75 65 72 69  he example queri
b0e0: 65 73 20 61 62 6f 76 65 2c 20 65 76 65 72 79 20  es above, every 
b0f0: 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
b100: 20 62 65 69 6e 67 0a 71 75 65 72 69 65 64 20 6d   being.queried m
b110: 75 73 74 20 62 65 20 6c 6f 61 64 65 64 20 6f 66  ust be loaded of
b120: 66 20 6f 66 20 74 68 65 20 64 69 73 6b 20 61 6e  f of the disk an
b130: 64 20 65 78 61 6d 69 6e 65 64 2c 20 65 76 65 6e  d examined, even
b140: 20 69 66 20 6f 6e 6c 79 0a 61 20 73 6d 61 6c 6c   if only.a small
b150: 20 70 65 72 63 65 6e 74 61 67 65 20 6f 66 20 74   percentage of t
b160: 68 65 20 72 6f 77 73 20 65 6e 64 20 75 70 20 69  he rows end up i
b170: 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 54  n the result.  T
b180: 68 69 73 20 63 61 6e 0a 74 61 6b 65 20 61 20 6c  his can.take a l
b190: 6f 6e 67 20 74 69 6d 65 20 6f 6e 20 61 20 62 69  ong time on a bi
b1a0: 67 20 74 61 62 6c 65 2e 20 20 54 6f 20 73 70 65  g table.  To spe
b1b0: 65 64 20 74 68 69 6e 67 73 20 75 70 2c 20 53 51  ed things up, SQ
b1c0: 4c 69 74 65 0a 63 61 6e 20 75 73 65 20 61 6e 20  Lite.can use an 
b1d0: 69 6e 64 65 78 2e 3c 2f 70 3e 0a 0a 3c 70 3e 41  index.</p>..<p>A
b1e0: 6e 20 53 51 4c 69 74 65 20 66 69 6c 65 20 61 73  n SQLite file as
b1f0: 73 6f 63 69 61 74 65 73 20 61 20 6b 65 79 20 77  sociates a key w
b200: 69 74 68 20 73 6f 6d 65 20 64 61 74 61 2e 20 20  ith some data.  
b210: 46 6f 72 20 61 6e 20 53 51 4c 69 74 65 0a 74 61  For an SQLite.ta
b220: 62 6c 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ble, the databas
b230: 65 20 66 69 6c 65 20 69 73 20 73 65 74 20 75 70  e file is set up
b240: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6b 65 79   so that the key
b250: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 0a 61   is an integer.a
b260: 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20 74  nd the data is t
b270: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  he information f
b280: 6f 72 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  or one row of th
b290: 65 20 74 61 62 6c 65 2e 0a 49 6e 64 69 63 65 73  e table..Indices
b2a0: 20 69 6e 20 53 51 4c 69 74 65 20 72 65 76 65 72   in SQLite rever
b2b0: 73 65 20 74 68 69 73 20 61 72 72 61 6e 67 65 6d  se this arrangem
b2c0: 65 6e 74 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ent.  The index 
b2d0: 6b 65 79 0a 69 73 20 28 73 6f 6d 65 20 6f 66 29  key.is (some of)
b2e0: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
b2f0: 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 61 6e   being stored an
b300: 64 20 74 68 65 20 69 6e 64 65 78 20 64 61 74 61  d the index data
b310: 20 0a 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e   .is an integer.
b320: 0a 54 6f 20 61 63 63 65 73 73 20 61 20 74 61 62  .To access a tab
b330: 6c 65 20 72 6f 77 20 74 68 61 74 20 68 61 73 20  le row that has 
b340: 73 6f 6d 65 20 70 61 72 74 69 63 75 6c 61 72 0a  some particular.
b350: 63 6f 6e 74 65 6e 74 2c 20 77 65 20 66 69 72 73  content, we firs
b360: 74 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 63 6f  t look up the co
b370: 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 69 6e 64  ntent in the ind
b380: 65 78 20 74 61 62 6c 65 20 74 6f 20 66 69 6e 64  ex table to find
b390: 0a 69 74 73 20 69 6e 74 65 67 65 72 20 69 6e 64  .its integer ind
b3a0: 65 78 2c 20 74 68 65 6e 20 77 65 20 75 73 65 20  ex, then we use 
b3b0: 74 68 61 74 20 69 6e 74 65 67 65 72 20 74 6f 20  that integer to 
b3c0: 6c 6f 6f 6b 20 75 70 20 74 68 65 0a 63 6f 6d 70  look up the.comp
b3d0: 6c 65 74 65 20 72 65 63 6f 72 64 20 69 6e 20 74  lete record in t
b3e0: 68 65 20 74 61 62 6c 65 2e 3c 2f 70 3e 0a 0a 3c  he table.</p>..<
b3f0: 70 3e 4e 6f 74 65 20 74 68 61 74 20 53 51 4c 69  p>Note that SQLi
b400: 74 65 20 75 73 65 73 20 62 2d 74 72 65 65 73 2c  te uses b-trees,
b410: 20 77 68 69 63 68 20 61 72 65 20 61 20 73 6f 72   which are a sor
b420: 74 65 64 20 64 61 74 61 20 73 74 72 75 63 74 75  ted data structu
b430: 72 65 2c 20 0a 73 6f 20 69 6e 64 69 63 65 73 20  re, .so indices 
b440: 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
b450: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
b460: 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
b470: 73 74 61 74 65 6d 65 6e 74 0a 63 6f 6e 74 61 69  statement.contai
b480: 6e 73 20 74 65 73 74 73 20 66 6f 72 20 65 71 75  ns tests for equ
b490: 61 6c 69 74 79 20 6f 72 20 69 6e 65 71 75 61 6c  ality or inequal
b4a0: 69 74 79 2e 20 20 51 75 65 72 69 65 73 20 6c 69  ity.  Queries li
b4b0: 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
b4c0: 20 0a 63 61 6e 20 75 73 65 20 61 6e 20 69 6e 64   .can use an ind
b4d0: 65 78 20 69 66 20 69 74 20 69 73 20 61 76 61 69  ex if it is avai
b4e0: 6c 61 62 6c 65 3a 3c 2f 70 3e 0a 0a 3c 62 6c 6f  lable:</p>..<blo
b4f0: 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 53 45  ckquote><pre>.SE
b500: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 78 61 6d  LECT * FROM exam
b510: 70 20 57 48 45 52 45 20 74 77 6f 3d 3d 35 30 3b  p WHERE two==50;
b520: 0a 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65  .SELECT * FROM e
b530: 78 61 6d 70 20 57 48 45 52 45 20 74 77 6f 3c 35  xamp WHERE two<5
b540: 30 3b 0a 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  0;.SELECT * FROM
b550: 20 65 78 61 6d 70 20 57 48 45 52 45 20 74 77 6f   examp WHERE two
b560: 20 49 4e 20 28 35 30 2c 20 31 30 30 29 3b 0a 3c   IN (50, 100);.<
b570: 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74  /pre></blockquot
b580: 65 3e 0a 0a 3c 70 3e 49 66 20 74 68 65 72 65 20  e>..<p>If there 
b590: 65 78 69 73 74 73 20 61 6e 20 69 6e 64 65 78 20  exists an index 
b5a0: 74 68 61 74 20 6d 61 70 73 20 74 68 65 20 22 74  that maps the "t
b5b0: 77 6f 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  wo" column of th
b5c0: 65 20 22 65 78 61 6d 70 22 0a 74 61 62 6c 65 20  e "examp".table 
b5d0: 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 2c 20 74  into integers, t
b5e0: 68 65 6e 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  hen SQLite will 
b5f0: 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20 74  use that index t
b600: 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 74 65 67  o find the integ
b610: 65 72 0a 6b 65 79 73 20 6f 66 20 61 6c 6c 20 72  er.keys of all r
b620: 6f 77 73 20 69 6e 20 65 78 61 6d 70 20 74 68 61  ows in examp tha
b630: 74 20 68 61 76 65 20 61 20 76 61 6c 75 65 20 6f  t have a value o
b640: 66 20 35 30 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  f 50 for column 
b650: 74 77 6f 2c 20 6f 72 20 0a 61 6c 6c 20 72 6f 77  two, or .all row
b660: 73 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20  s that are less 
b670: 74 68 61 6e 20 35 30 2c 20 65 74 63 2e 0a 42 75  than 50, etc..Bu
b680: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
b690: 71 75 65 72 69 65 73 20 63 61 6e 6e 6f 74 20 75  queries cannot u
b6a0: 73 65 20 74 68 65 20 69 6e 64 65 78 3a 3c 2f 70  se the index:</p
b6b0: 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c  >..<blockquote><
b6c0: 70 72 65 3e 0a 53 45 4c 45 43 54 20 2a 20 46 52  pre>.SELECT * FR
b6d0: 4f 4d 20 65 78 61 6d 70 20 57 48 45 52 45 20 74  OM examp WHERE t
b6e0: 77 6f 25 35 30 20 3d 3d 20 31 30 3b 0a 53 45 4c  wo%50 == 10;.SEL
b6f0: 45 43 54 20 2a 20 46 52 4f 4d 20 65 78 61 6d 70  ECT * FROM examp
b700: 20 57 48 45 52 45 20 74 77 6f 26 31 32 37 20 3d   WHERE two&127 =
b710: 3d 20 33 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f  = 3;.</pre></blo
b720: 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e 4e 6f 74  ckquote>..<p>Not
b730: 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  e that the SQLit
b740: 65 20 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f  e parser will no
b750: 74 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74  t always generat
b760: 65 20 63 6f 64 65 20 74 6f 20 75 73 65 20 61 6e  e code to use an
b770: 20 0a 69 6e 64 65 78 2c 20 65 76 65 6e 20 69 66   .index, even if
b780: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
b790: 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 66  to do so.  The f
b7a0: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73  ollowing queries
b7b0: 20 77 69 6c 6c 20 6e 6f 74 20 0a 63 75 72 72 65   will not .curre
b7c0: 6e 74 6c 79 20 75 73 65 20 74 68 65 20 69 6e 64  ntly use the ind
b7d0: 65 78 3a 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63 6b 71  ex:</p>..<blockq
b7e0: 75 6f 74 65 3e 3c 70 72 65 3e 0a 53 45 4c 45 43  uote><pre>.SELEC
b7f0: 54 20 2a 20 46 52 4f 4d 20 65 78 61 6d 70 20 57  T * FROM examp W
b800: 48 45 52 45 20 74 77 6f 2b 31 30 20 3d 3d 20 35  HERE two+10 == 5
b810: 30 3b 0a 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  0;.SELECT * FROM
b820: 20 65 78 61 6d 70 20 57 48 45 52 45 20 74 77 6f   examp WHERE two
b830: 3d 3d 35 30 20 4f 52 20 74 77 6f 3d 3d 31 30 30  ==50 OR two==100
b840: 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71  ;.</pre></blockq
b850: 75 6f 74 65 3e 0a 0a 3c 70 3e 54 6f 20 75 6e 64  uote>..<p>To und
b860: 65 72 73 74 61 6e 64 20 62 65 74 74 65 72 20 68  erstand better h
b870: 6f 77 20 69 6e 64 69 63 65 73 20 77 6f 72 6b 2c  ow indices work,
b880: 20 6c 65 74 73 20 66 69 72 73 74 20 6c 6f 6f 6b   lets first look
b890: 20 61 74 20 68 6f 77 0a 74 68 65 79 20 61 72 65   at how.they are
b8a0: 20 63 72 65 61 74 65 64 2e 20 20 4c 65 74 27 73   created.  Let's
b8b0: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 70 75   go ahead and pu
b8c0: 74 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74 68  t an index on th
b8d0: 65 20 74 77 6f 0a 63 6f 6c 75 6d 6e 20 6f 66 20  e two.column of 
b8e0: 74 68 65 20 65 78 61 6d 70 20 74 61 62 6c 65 2e  the examp table.
b8f0: 20 20 57 65 20 68 61 76 65 3a 3c 2f 70 3e 0a 0a    We have:</p>..
b900: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
b910: 3e 0a 43 52 45 41 54 45 20 49 4e 44 45 58 20 65  >.CREATE INDEX e
b920: 78 61 6d 70 5f 69 64 78 31 20 4f 4e 20 65 78 61  xamp_idx1 ON exa
b930: 6d 70 28 74 77 6f 29 3b 0a 3c 2f 70 72 65 3e 3c  mp(two);.</pre><
b940: 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70  /blockquote>..<p
b950: 3e 54 68 65 20 56 44 42 45 20 63 6f 64 65 20 67  >The VDBE code g
b960: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
b970: 61 62 6f 76 65 20 73 74 61 74 65 6d 65 6e 74 20  above statement 
b980: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 65 0a 66  looks like the.f
b990: 6f 6c 6c 6f 77 69 6e 67 3a 3c 2f 70 3e 0a 7d 0a  ollowing:</p>.}.
b9a0: 0a 43 6f 64 65 20 7b 0a 61 64 64 72 20 20 6f 70  .Code {.addr  op
b9b0: 63 6f 64 65 20 20 20 20 20 20 20 20 70 31 20 20  code        p1  
b9c0: 20 20 20 70 32 20 20 20 20 20 70 33 20 20 20 20     p2     p3    
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d    .----  -------
ba00: 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d  -----  -----  --
ba10: 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
ba20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba30: 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 54  --------.0     T
ba40: 72 61 6e 73 61 63 74 69 6f 6e 20 20 20 31 20 20  ransaction   1  
ba50: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
ba80: 20 20 20 20 20 54 72 61 6e 73 61 63 74 69 6f 6e       Transaction
ba90: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 20 20 20 0a 32 20 20 20 20 20 56 65 72 69 66      .2     Verif
bad0: 79 43 6f 6f 6b 69 65 20 20 30 20 20 20 20 20 20  yCookie  0      
bae0: 31 37 38 20 20 20 20 20 20 20 20 20 20 20 20 20  178             
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
bb10: 33 20 20 20 20 20 49 6e 74 65 67 65 72 20 20 20  3     Integer   
bb20: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 20 20 20 20 20 0a 34 20 20 20 20 20 4f 70 65 6e       .4     Open
bb60: 57 72 69 74 65 20 20 20 20 20 30 20 20 20 20 20  Write     0     
bb70: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 20 20 0a 35 20 20 20             .5   
bba0: 20 20 4e 65 77 52 65 63 6e 6f 20 20 20 20 20 20    NewRecno      
bbb0: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbe0: 20 0a 36 20 20 20 20 20 53 74 72 69 6e 67 20 20   .6     String  
bbf0: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
bc00: 20 20 20 20 69 6e 64 65 78 20 20 20 20 20 20 20      index       
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc20: 20 20 20 20 20 20 20 0a 37 20 20 20 20 20 53 74         .7     St
bc30: 72 69 6e 67 20 20 20 20 20 20 20 20 30 20 20 20  ring        0   
bc40: 20 20 20 30 20 20 20 20 20 20 65 78 61 6d 70 5f     0      examp_
bc50: 69 64 78 31 20 20 20 20 20 20 20 20 20 20 20 20  idx1            
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 38 20               .8 
bc70: 20 20 20 20 53 74 72 69 6e 67 20 20 20 20 20 20      String      
bc80: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
bc90: 65 78 61 6d 70 20 20 20 20 20 20 20 20 20 20 20  examp           
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 0a 39 20 20 20 20 20 43 72 65 61 74 65     .9     Create
bcc0: 49 6e 64 65 78 20 20 20 30 20 20 20 20 20 20 30  Index   0      0
bcd0: 20 20 20 20 20 20 70 74 72 28 30 78 37 39 31 33        ptr(0x7913
bce0: 38 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20  80)             
bcf0: 20 20 20 20 20 20 20 20 20 0a 31 30 20 20 20 20           .10    
bd00: 44 75 70 20 20 20 20 20 20 20 20 20 20 20 30 20  Dup           0 
bd10: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
bd40: 31 31 20 20 20 20 49 6e 74 65 67 65 72 20 20 20  11    Integer   
bd50: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 20 20 0a 31 32 20 20 20 20 4f 70 65 6e       .12    Open
bd90: 57 72 69 74 65 20 20 20 20 20 31 20 20 20 20 20  Write     1     
bda0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdc0: 20 20 20 20 20 20 20 20 20 20 20 0a 31 33 20 20             .13  
bdd0: 20 20 53 74 72 69 6e 67 20 20 20 20 20 20 20 20    String        
bde0: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 43 52  0      0      CR
bdf0: 45 41 54 45 20 49 4e 44 45 58 20 65 78 61 6d 70  EATE INDEX examp
be00: 5f 69 64 78 31 20 4f 4e 20 65 78 61 6d 70 28 74  _idx1 ON examp(t
be10: 77 0a 31 34 20 20 20 20 4d 61 6b 65 52 65 63 6f  w.14    MakeReco
be20: 72 64 20 20 20 20 35 20 20 20 20 20 20 30 20 20  rd    5      0  
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 20 20 20 20 0a 31 35 20 20 20 20 50 75         .15    Pu
be60: 74 49 6e 74 4b 65 79 20 20 20 20 20 30 20 20 20  tIntKey     0   
be70: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 36               .16
bea0: 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20      Integer     
beb0: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bee0: 20 20 20 0a 31 37 20 20 20 20 4f 70 65 6e 52 65     .17    OpenRe
bef0: 61 64 20 20 20 20 20 20 32 20 20 20 20 20 20 33  ad      2      3
bf00: 20 20 20 20 20 20 65 78 61 6d 70 20 20 20 20 20        examp     
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 20 20 20 20 20 0a 31 38 20 20 20 20           .18    
bf30: 52 65 77 69 6e 64 20 20 20 20 20 20 20 20 32 20  Rewind        2 
bf40: 20 20 20 20 20 32 34 20 20 20 20 20 20 20 20 20       24         
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 20 20 20 20 0a 31 39 20 20 20 20 52 65 63 6e 6f      .19    Recno
bf80: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
bf90: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 20 20 0a 32 30 20 20 20            .20   
bfc0: 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 32   Column        2
bfd0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 0a 32 31 20 20 20 20 4d 61 6b 65 49 64 78 4b 65  .21    MakeIdxKe
c010: 79 20 20 20 20 31 20 20 20 20 20 20 30 20 20 20  y    1      0   
c020: 20 20 20 6e 20 20 20 20 20 20 20 20 20 20 20 20     n            
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 20 20 20 20 0a 32 32 20 20 20 20 49 64 78        .22    Idx
c050: 50 75 74 20 20 20 20 20 20 20 20 31 20 20 20 20  Put        1    
c060: 20 20 30 20 20 20 20 20 20 69 6e 64 65 78 65 64    0      indexed
c070: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74   columns are not
c080: 20 75 6e 69 71 75 65 20 20 20 20 20 0a 32 33 20   unique     .23 
c090: 20 20 20 4e 65 78 74 20 20 20 20 20 20 20 20 20     Next         
c0a0: 20 32 20 20 20 20 20 20 31 39 20 20 20 20 20 20   2      19      
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 20 20 20 20 0a 32 34 20 20 20 20 43 6c         .24    Cl
c0e0: 6f 73 65 20 20 20 20 20 20 20 20 20 32 20 20 20  ose         2   
c0f0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 35               .25
c120: 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20 20 20      Close       
c130: 20 20 31 20 20 20 20 20 20 30 20 20 20 20 20 20    1      0      
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 20 20 0a 32 36 20 20 20 20 49 6e 74 65 67 65     .26    Intege
c170: 72 20 20 20 20 20 20 20 33 33 33 20 20 20 20 30  r       333    0
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 20 20 20 20 20 20 20 0a 32 37 20 20 20 20           .27    
c1b0: 53 65 74 43 6f 6f 6b 69 65 20 20 20 20 20 30 20  SetCookie     0 
c1c0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
c1f0: 32 38 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20  28    Close     
c200: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 20 20 20 20 20 0a 32 39 20 20 20 20 43 6f 6d 6d       .29    Comm
c240: 69 74 20 20 20 20 20 20 20 20 30 20 20 20 20 20  it        0     
c250: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 20 20 20 20 20 20 20 0a 33 30 20 20             .30  
c280: 20 20 48 61 6c 74 20 20 20 20 20 20 20 20 20 20    Halt          
c290: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 0a 7d 0a 0a 70 75 74 73 20 7b 0a 3c 70 3e 52   .}..puts {.<p>R
c2d0: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 65 76 65  emember that eve
c2e0: 72 79 20 74 61 62 6c 65 20 28 65 78 63 65 70 74  ry table (except
c2f0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 29 20   sqlite_master) 
c300: 61 6e 64 20 65 76 65 72 79 20 6e 61 6d 65 64 0a  and every named.
c310: 69 6e 64 65 78 20 68 61 73 20 61 6e 20 65 6e 74  index has an ent
c320: 72 79 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ry in the sqlite
c330: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
c340: 53 69 6e 63 65 20 77 65 20 61 72 65 20 63 72 65  Since we are cre
c350: 61 74 69 6e 67 0a 61 20 6e 65 77 20 69 6e 64 65  ating.a new inde
c360: 78 2c 20 77 65 20 68 61 76 65 20 74 6f 20 61 64  x, we have to ad
c370: 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f  d a new entry to
c380: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e 20   sqlite_master. 
c390: 20 54 68 69 73 20 69 73 0a 68 61 6e 64 6c 65 64   This is.handled
c3a0: 20 62 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   by instructions
c3b0: 20 33 20 74 68 72 6f 75 67 68 20 31 35 2e 20 20   3 through 15.  
c3c0: 41 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79 20  Adding an entry 
c3d0: 74 6f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  to sqlite_master
c3e0: 0a 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65  .works just like
c3f0: 20 61 6e 79 20 6f 74 68 65 72 20 49 4e 53 45 52   any other INSER
c400: 54 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 77  T statement so w
c410: 65 20 77 69 6c 6c 20 6e 6f 74 20 73 61 79 20 61  e will not say a
c420: 6e 79 6d 6f 72 65 0a 61 62 6f 75 74 20 69 74 20  nymore.about it 
c430: 68 65 72 65 2e 20 20 49 6e 20 74 68 69 73 20 65  here.  In this e
c440: 78 61 6d 70 6c 65 2c 20 77 65 20 77 61 6e 74 20  xample, we want 
c450: 74 6f 20 66 6f 63 75 73 20 6f 6e 20 70 6f 70 75  to focus on popu
c460: 6c 61 74 69 6e 67 20 74 68 65 0a 6e 65 77 20 69  lating the.new i
c470: 6e 64 65 78 20 77 69 74 68 20 76 61 6c 69 64 20  ndex with valid 
c480: 64 61 74 61 2c 20 77 68 69 63 68 20 68 61 70 70  data, which happ
c490: 65 6e 73 20 6f 6e 20 69 6e 73 74 72 75 63 74 69  ens on instructi
c4a0: 6f 6e 73 20 31 36 20 74 68 72 6f 75 67 68 20 0a  ons 16 through .
c4b0: 32 33 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20  23.</p>.}..Code 
c4c0: 7b 0a 31 36 20 20 20 20 49 6e 74 65 67 65 72 20  {.16    Integer 
c4d0: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 20 20 20 20 20 0a 31 37 20 20 20 20 4f 70         .17    Op
c510: 65 6e 52 65 61 64 20 20 20 20 20 20 32 20 20 20  enRead      2   
c520: 20 20 20 33 20 20 20 20 20 20 65 78 61 6d 70 20     3      examp 
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a               .}.
c550: 70 75 74 73 20 7b 0a 3c 70 3e 54 68 65 20 66 69  puts {.<p>The fi
c560: 72 73 74 20 74 68 69 6e 67 20 74 68 61 74 20 68  rst thing that h
c570: 61 70 70 65 6e 73 20 69 73 20 74 68 61 74 20 77  appens is that w
c580: 65 20 6f 70 65 6e 20 74 68 65 20 74 61 62 6c 65  e open the table
c590: 20 62 65 69 6e 67 0a 69 6e 64 65 78 65 64 20 66   being.indexed f
c5a0: 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 6e 20  or reading.  In 
c5b0: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 73 74 72 75  order to constru
c5c0: 63 74 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ct an index for 
c5d0: 61 20 74 61 62 6c 65 2c 0a 77 65 20 68 61 76 65  a table,.we have
c5e0: 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 69 73   to know what is
c5f0: 20 69 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20   in that table. 
c600: 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61   The index has a
c610: 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 6f 70 65  lready been .ope
c620: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ned for writing 
c630: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 20 62  using cursor 0 b
c640: 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 33  y instructions 3
c650: 20 61 6e 64 20 34 2e 3c 2f 70 3e 0a 7d 0a 0a 43   and 4.</p>.}..C
c660: 6f 64 65 20 7b 0a 31 38 20 20 20 20 52 65 77 69  ode {.18    Rewi
c670: 6e 64 20 20 20 20 20 20 20 20 32 20 20 20 20 20  nd        2     
c680: 20 32 34 20 20 20 20 20 20 20 20 20 20 20 20 20   24             
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 0a 31 39 20 20 20 20 52 65 63 6e 6f 20 20 20 20  .19    Recno    
c6c0: 20 20 20 20 20 32 20 20 20 20 20 20 30 20 20 20       2      0   
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 20 20 0a 32 30 20 20 20 20 43 6f 6c        .20    Col
c700: 75 6d 6e 20 20 20 20 20 20 20 20 32 20 20 20 20  umn        2    
c710: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c730: 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 31 20              .21 
c740: 20 20 20 4d 61 6b 65 49 64 78 4b 65 79 20 20 20     MakeIdxKey   
c750: 20 31 20 20 20 20 20 20 30 20 20 20 20 20 20 6e   1      0      n
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c780: 20 20 0a 32 32 20 20 20 20 49 64 78 50 75 74 20    .22    IdxPut 
c790: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 30 20         1      0 
c7a0: 20 20 20 20 20 69 6e 64 65 78 65 64 20 63 6f 6c       indexed col
c7b0: 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
c7c0: 71 75 65 20 20 20 20 20 0a 32 33 20 20 20 20 4e  que     .23    N
c7d0: 65 78 74 20 20 20 20 20 20 20 20 20 20 32 20 20  ext          2  
c7e0: 20 20 20 20 31 39 20 20 20 20 20 20 20 20 20 20      19          
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 20 0a 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e     .}.puts {.<p>
c820: 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 31 38 20  Instructions 18 
c830: 74 68 72 6f 75 67 68 20 32 33 20 69 6d 70 6c 65  through 23 imple
c840: 6d 65 6e 74 20 61 20 6c 6f 6f 70 20 6f 76 65 72  ment a loop over
c850: 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74 68   every row of th
c860: 65 20 0a 74 61 62 6c 65 20 62 65 69 6e 67 20 69  e .table being i
c870: 6e 64 65 78 65 64 2e 20 20 46 6f 72 20 65 61 63  ndexed.  For eac
c880: 68 20 74 61 62 6c 65 20 72 6f 77 2c 20 77 65 20  h table row, we 
c890: 66 69 72 73 74 20 65 78 74 72 61 63 74 20 74 68  first extract th
c8a0: 65 20 69 6e 74 65 67 65 72 20 0a 6b 65 79 20 66  e integer .key f
c8b0: 6f 72 20 74 68 61 74 20 72 6f 77 20 75 73 69 6e  or that row usin
c8c0: 67 20 52 65 63 6e 6f 20 69 6e 20 69 6e 73 74 72  g Recno in instr
c8d0: 75 63 74 69 6f 6e 20 31 39 2c 20 74 68 65 6e 20  uction 19, then 
c8e0: 67 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  get the value of
c8f0: 20 0a 74 68 65 20 22 74 77 6f 22 20 63 6f 6c 75   .the "two" colu
c900: 6d 6e 20 75 73 69 6e 67 20 43 6f 6c 75 6d 6e 20  mn using Column 
c910: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 32  in instruction 2
c920: 30 2e 20 20 0a 54 68 65 20 3c 61 20 68 72 65 66  0.  .The <a href
c930: 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 4d 61  ="opcode.html#Ma
c940: 6b 65 49 64 78 4b 65 79 22 3e 4d 61 6b 65 49 64  keIdxKey">MakeId
c950: 78 4b 65 79 3c 2f 61 3e 20 69 6e 73 74 72 75 63  xKey</a> instruc
c960: 74 69 6f 6e 20 61 74 20 32 31 20 0a 63 6f 6e 76  tion at 21 .conv
c970: 65 72 74 73 20 64 61 74 61 20 66 72 6f 6d 20 74  erts data from t
c980: 68 65 20 22 74 77 6f 22 20 63 6f 6c 75 6d 6e 20  he "two" column 
c990: 28 77 68 69 63 68 20 69 73 20 6f 6e 20 74 68 65  (which is on the
c9a0: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
c9b0: 6b 29 20 0a 69 6e 74 6f 20 61 20 76 61 6c 69 64  k) .into a valid
c9c0: 20 69 6e 64 65 78 20 6b 65 79 2e 20 20 46 6f 72   index key.  For
c9d0: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 61 20 73   an index on a s
c9e0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  ingle column, th
c9f0: 69 73 20 69 73 20 0a 62 61 73 69 63 61 6c 6c 79  is is .basically
ca00: 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 69   a no-op.  But i
ca10: 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64  f the P1 operand
ca20: 20 74 6f 20 4d 61 6b 65 49 64 78 4b 65 79 20 68   to MakeIdxKey h
ca30: 61 64 20 62 65 65 6e 20 0a 67 72 65 61 74 65 72  ad been .greater
ca40: 20 74 68 61 6e 20 6f 6e 65 20 6d 75 6c 74 69 70   than one multip
ca50: 6c 65 20 65 6e 74 72 69 65 73 20 77 6f 75 6c 64  le entries would
ca60: 20 68 61 76 65 20 62 65 65 6e 20 70 6f 70 70 65   have been poppe
ca70: 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
ca80: 20 0a 61 6e 64 20 63 6f 6e 76 65 72 74 65 64 20   .and converted 
ca90: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  into a single in
caa0: 64 65 78 20 6b 65 79 2e 20 20 0a 54 68 65 20 3c  dex key.  .The <
cab0: 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68  a href="opcode.h
cac0: 74 6d 6c 23 49 64 78 50 75 74 22 3e 49 64 78 50  tml#IdxPut">IdxP
cad0: 75 74 3c 2f 61 3e 20 69 6e 73 74 72 75 63 74 69  ut</a> instructi
cae0: 6f 6e 20 61 74 20 32 32 20 69 73 20 77 68 61 74  on at 22 is what
caf0: 20 0a 61 63 74 75 61 6c 6c 79 20 63 72 65 61 74   .actually creat
cb00: 65 73 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  es the index ent
cb10: 72 79 2e 20 20 49 64 78 50 75 74 20 70 6f 70 73  ry.  IdxPut pops
cb20: 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72   two elements fr
cb30: 6f 6d 20 74 68 65 20 0a 73 74 61 63 6b 2e 20 20  om the .stack.  
cb40: 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  The top of the s
cb50: 74 61 63 6b 20 69 73 20 75 73 65 64 20 61 73 20  tack is used as 
cb60: 61 20 6b 65 79 20 74 6f 20 66 65 74 63 68 20 61  a key to fetch a
cb70: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
cb80: 20 0a 69 6e 64 65 78 20 74 61 62 6c 65 2e 20 20   .index table.  
cb90: 54 68 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72  Then the integer
cba0: 20 77 68 69 63 68 20 77 61 73 20 73 65 63 6f 6e   which was secon
cbb0: 64 20 6f 6e 20 73 74 61 63 6b 20 69 73 20 61 64  d on stack is ad
cbc0: 64 65 64 20 74 6f 20 74 68 65 20 0a 73 65 74 20  ded to the .set 
cbd0: 6f 66 20 69 6e 74 65 67 65 72 73 20 66 6f 72 20  of integers for 
cbe0: 74 68 61 74 20 69 6e 64 65 78 20 61 6e 64 20 74  that index and t
cbf0: 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69 73  he new record is
cc00: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
cc10: 20 74 68 65 20 0a 64 61 74 61 62 61 73 65 20 66   the .database f
cc20: 69 6c 65 2e 20 20 4e 6f 74 65 0a 74 68 61 74 20  ile.  Note.that 
cc30: 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 65  the same index e
cc40: 6e 74 72 79 20 63 61 6e 20 73 74 6f 72 65 20 6d  ntry can store m
cc50: 75 6c 74 69 70 6c 65 20 69 6e 74 65 67 65 72 73  ultiple integers
cc60: 20 69 66 20 74 68 65 72 65 0a 61 72 65 20 74 77   if there.are tw
cc70: 6f 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 20  o or more table 
cc80: 65 6e 74 72 69 65 73 20 77 69 74 68 20 74 68 65  entries with the
cc90: 20 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20   same value for 
cca0: 74 68 65 20 74 77 6f 0a 63 6f 6c 75 6d 6e 2e 0a  the two.column..
ccb0: 3c 2f 70 3e 0a 0a 3c 70 3e 4e 6f 77 20 6c 65 74  </p>..<p>Now let
ccc0: 27 73 20 6c 6f 6f 6b 20 61 74 20 68 6f 77 20 74  's look at how t
ccd0: 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20 62  his index will b
cce0: 65 20 75 73 65 64 2e 20 20 43 6f 6e 73 69 64 65  e used.  Conside
ccf0: 72 20 74 68 65 0a 66 6f 6c 6c 6f 77 69 6e 67 20  r the.following 
cd00: 71 75 65 72 79 3a 3c 2f 70 3e 0a 0a 3c 62 6c 6f  query:</p>..<blo
cd10: 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 53 45  ckquote><pre>.SE
cd20: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 78 61 6d  LECT * FROM exam
cd30: 70 20 57 48 45 52 45 20 74 77 6f 3d 3d 35 30 3b  p WHERE two==50;
cd40: 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75  .</pre></blockqu
cd50: 6f 74 65 3e 0a 0a 3c 70 3e 53 51 4c 69 74 65 20  ote>..<p>SQLite 
cd60: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 66 6f  generates the fo
cd70: 6c 6c 6f 77 69 6e 67 20 56 44 42 45 20 63 6f 64  llowing VDBE cod
cd80: 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 69 73  e to handle this
cd90: 20 71 75 65 72 79 3a 3c 2f 70 3e 0a 7d 0a 0a 43   query:</p>.}..C
cda0: 6f 64 65 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f  ode {.addr  opco
cdb0: 64 65 20 20 20 20 20 20 20 20 70 31 20 20 20 20  de        p1    
cdc0: 20 70 32 20 20 20 20 20 70 33 20 20 20 20 20 20   p2     p3      
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdf0: 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  .----  ---------
ce00: 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ---  -----  ----
ce10: 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
ce20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce30: 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 43 6f 6c  ------.0     Col
ce40: 75 6d 6e 4e 61 6d 65 20 20 20 20 30 20 20 20 20  umnName    0    
ce50: 20 20 30 20 20 20 20 20 20 6f 6e 65 20 20 20 20    0      one    
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 20 20              .1  
ce80: 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20     ColumnName   
ce90: 20 31 20 20 20 20 20 20 30 20 20 20 20 20 20 74   1      0      t
cea0: 77 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  wo              
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 0a 32 20 20 20 20 20 49 6e 74 65 67 65 72    .2     Integer
ced0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 20 20 20 0a 33 20 20 20 20 20 4f          .3     O
cf10: 70 65 6e 52 65 61 64 20 20 20 20 20 20 30 20 20  penRead      0  
cf20: 20 20 20 20 33 20 20 20 20 20 20 65 78 61 6d 70      3      examp
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 34                .4
cf50: 20 20 20 20 20 56 65 72 69 66 79 43 6f 6f 6b 69       VerifyCooki
cf60: 65 20 20 30 20 20 20 20 20 20 32 35 36 20 20 20  e  0      256   
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 20 20 20 20 20 0a 35 20 20 20 20 20           .5     
cfa0: 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 30 20  Integer       0 
cfb0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
cfe0: 36 20 20 20 20 20 4f 70 65 6e 52 65 61 64 20 20  6     OpenRead  
cff0: 20 20 20 20 31 20 20 20 20 20 20 34 20 20 20 20      1      4    
d000: 20 20 65 78 61 6d 70 5f 69 64 78 31 20 20 20 20    examp_idx1    
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 20 20 20 20 0a 37 20 20 20 20 20 49 6e 74 65       .7     Inte
d030: 67 65 72 20 20 20 20 20 20 20 35 30 20 20 20 20  ger       50    
d040: 20 30 20 20 20 20 20 20 35 30 20 20 20 20 20 20   0      50      
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d060: 20 20 20 20 20 20 0a 38 20 20 20 20 20 4d 61 6b        .8     Mak
d070: 65 4b 65 79 20 20 20 20 20 20 20 31 20 20 20 20  eKey       1    
d080: 20 20 30 20 20 20 20 20 20 6e 20 20 20 20 20 20    0      n      
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 39 20 20              .9  
d0b0: 20 20 20 4d 65 6d 53 74 6f 72 65 20 20 20 20 20     MemStore     
d0c0: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0f0: 20 20 0a 31 30 20 20 20 20 4d 6f 76 65 54 6f 20    .10    MoveTo 
d100: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 31 39         1      19
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 31               .11
d140: 20 20 20 20 4d 65 6d 4c 6f 61 64 20 20 20 20 20      MemLoad     
d150: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 20 20 0a 31 32 20 20 20 20 49 64 78 47 54 20     .12    IdxGT 
d190: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 31          1      1
d1a0: 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
d1d0: 33 20 20 20 20 49 64 78 52 65 63 6e 6f 20 20 20  3    IdxRecno   
d1e0: 20 20 20 31 20 20 20 20 20 20 30 20 20 20 20 20     1      0     
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 20 20 0a 31 34 20 20 20 20 4d 6f 76 65 54      .14    MoveT
d220: 6f 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20  o        0      
d230: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 20 20 20 20 20 20 20 20 20 20 0a 31 35 20 20 20            .15   
d260: 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30   Column        0
d270: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2a0: 0a 31 36 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20  .16    Column   
d2b0: 20 20 20 20 20 30 20 20 20 20 20 20 31 20 20 20       0      1   
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2e0: 20 20 20 20 20 20 0a 31 37 20 20 20 20 43 61 6c        .17    Cal
d2f0: 6c 62 61 63 6b 20 20 20 20 20 20 32 20 20 20 20  lback      2    
d300: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 38 20              .18 
d330: 20 20 20 4e 65 78 74 20 20 20 20 20 20 20 20 20     Next         
d340: 20 31 20 20 20 20 20 20 31 31 20 20 20 20 20 20   1      11      
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 0a 31 39 20 20 20 20 43 6c 6f 73 65 20 20    .19    Close  
d380: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 20 20 20 20 20 20 20 20 0a 32 30 20 20 20 20 43          .20    C
d3c0: 6c 6f 73 65 20 20 20 20 20 20 20 20 20 31 20 20  lose         1  
d3d0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32                .2
d400: 31 20 20 20 20 48 61 6c 74 20 20 20 20 20 20 20  1    Halt       
d410: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d440: 20 20 20 20 0a 7d 0a 0a 70 75 74 73 20 7b 0a 3c      .}..puts {.<
d450: 70 3e 54 68 65 20 53 45 4c 45 43 54 20 62 65 67  p>The SELECT beg
d460: 69 6e 73 20 69 6e 20 61 20 66 61 6d 69 6c 69 61  ins in a familia
d470: 72 20 66 61 73 68 69 6f 6e 2e 20 20 46 69 72 73  r fashion.  Firs
d480: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 6e 61 6d  t the column.nam
d490: 65 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  es are initializ
d4a0: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
d4b0: 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 69   being queried i
d4c0: 73 20 6f 70 65 6e 65 64 2e 0a 54 68 69 6e 67 73  s opened..Things
d4d0: 20 62 65 63 6f 6d 65 20 64 69 66 66 65 72 65 6e   become differen
d4e0: 74 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  t beginning with
d4f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 35 20   instructions 5 
d500: 61 6e 64 20 36 20 77 68 65 72 65 0a 74 68 65 20  and 6 where.the 
d510: 69 6e 64 65 78 20 66 69 6c 65 20 69 73 20 61 6c  index file is al
d520: 73 6f 20 6f 70 65 6e 65 64 2e 20 20 49 6e 73 74  so opened.  Inst
d530: 72 75 63 74 69 6f 6e 73 20 37 20 61 6e 64 20 38  ructions 7 and 8
d540: 20 6d 61 6b 65 0a 61 20 6b 65 79 20 77 69 74 68   make.a key with
d550: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 35 30   the value of 50
d560: 2e 20 20 0a 54 68 65 20 3c 61 20 68 72 65 66 3d  .  .The <a href=
d570: 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 4d 65 6d  "opcode.html#Mem
d580: 53 74 6f 72 65 22 3e 4d 65 6d 53 74 6f 72 65 3c  Store">MemStore<
d590: 2f 61 3e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  /a> instruction 
d5a0: 61 74 20 39 20 73 74 6f 72 65 73 20 0a 74 68 65  at 9 stores .the
d5b0: 20 69 6e 64 65 78 20 6b 65 79 20 69 6e 20 56 44   index key in VD
d5c0: 42 45 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  BE memory locati
d5d0: 6f 6e 20 30 2e 20 20 54 68 65 20 56 44 42 45 20  on 0.  The VDBE 
d5e0: 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20 74  memory is used t
d5f0: 6f 20 0a 61 76 6f 69 64 20 68 61 76 69 6e 67 20  o .avoid having 
d600: 74 6f 20 66 65 74 63 68 20 61 20 76 61 6c 75 65  to fetch a value
d610: 20 66 72 6f 6d 20 64 65 65 70 20 69 6e 20 74 68   from deep in th
d620: 65 20 73 74 61 63 6b 2c 20 77 68 69 63 68 20 63  e stack, which c
d630: 61 6e 20 62 65 20 64 6f 6e 65 2c 0a 62 75 74 20  an be done,.but 
d640: 6d 61 6b 65 73 20 74 68 65 20 70 72 6f 67 72 61  makes the progra
d650: 6d 20 68 61 72 64 65 72 20 74 6f 20 67 65 6e 65  m harder to gene
d660: 72 61 74 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  rate.  The follo
d670: 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e  wing instruction
d680: 20 0a 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64   .<a href="opcod
d690: 65 2e 68 74 6d 6c 23 4d 6f 76 65 54 6f 22 3e 4d  e.html#MoveTo">M
d6a0: 6f 76 65 54 6f 3c 2f 61 3e 20 61 74 20 61 64 64  oveTo</a> at add
d6b0: 72 65 73 73 20 31 30 20 70 6f 70 73 20 74 68 65  ress 10 pops the
d6c0: 20 6b 65 79 20 6f 66 66 20 0a 74 68 65 20 73 74   key off .the st
d6d0: 61 63 6b 20 61 6e 64 20 6d 6f 76 65 73 20 74 68  ack and moves th
d6e0: 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
d6f0: 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  o the first row 
d700: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  of the index wit
d710: 68 20 0a 74 68 61 74 20 6b 65 79 2e 20 20 54 68  h .that key.  Th
d720: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  is initializes t
d730: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 75 73  he cursor for us
d740: 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e in the followi
d750: 6e 67 20 6c 6f 6f 70 2e 3c 2f 70 3e 0a 0a 3c 70  ng loop.</p>..<p
d760: 3e 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 31 31  >Instructions 11
d770: 20 74 68 72 6f 75 67 68 20 31 38 20 69 6d 70 6c   through 18 impl
d780: 65 6d 65 6e 74 20 61 20 6c 6f 6f 70 20 6f 76 65  ement a loop ove
d790: 72 20 61 6c 6c 20 69 6e 64 65 78 20 72 65 63 6f  r all index reco
d7a0: 72 64 73 20 0a 77 69 74 68 20 74 68 65 20 6b 65  rds .with the ke
d7b0: 79 20 74 68 61 74 20 77 61 73 20 66 65 74 63 68  y that was fetch
d7c0: 65 64 20 62 79 20 69 6e 73 74 72 75 63 74 69 6f  ed by instructio
d7d0: 6e 20 38 2e 20 20 41 6c 6c 20 6f 66 20 74 68 65  n 8.  All of the
d7e0: 20 69 6e 64 65 78 20 0a 72 65 63 6f 72 64 73 20   index .records 
d7f0: 77 69 74 68 20 74 68 69 73 20 6b 65 79 20 77 69  with this key wi
d800: 6c 6c 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73  ll be contiguous
d810: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 61   in the index ta
d820: 62 6c 65 2c 20 73 6f 20 77 65 20 77 61 6c 6b 20  ble, so we walk 
d830: 0a 74 68 72 6f 75 67 68 20 74 68 65 6d 20 61 6e  .through them an
d840: 64 20 66 65 74 63 68 20 74 68 65 20 63 6f 72 72  d fetch the corr
d850: 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
d860: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  key from the ind
d870: 65 78 2e 20 20 0a 54 68 69 73 20 74 61 62 6c 65  ex.  .This table
d880: 20 6b 65 79 20 69 73 20 74 68 65 6e 20 75 73 65   key is then use
d890: 64 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 75  d to move the cu
d8a0: 72 73 6f 72 20 74 6f 20 74 68 61 74 20 72 6f 77  rsor to that row
d8b0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
d8c0: 0a 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 65  .The rest of the
d8d0: 20 6c 6f 6f 70 20 69 73 20 74 68 65 20 73 61 6d   loop is the sam
d8e0: 65 20 61 73 20 74 68 65 20 6c 6f 6f 70 20 66 6f  e as the loop fo
d8f0: 72 20 74 68 65 20 6e 6f 6e 2d 69 6e 64 65 78 65  r the non-indexe
d900: 64 20 53 45 4c 45 43 54 20 0a 71 75 65 72 79 2e  d SELECT .query.
d910: 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65 20 6c 6f 6f  </p>..<p>The loo
d920: 70 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  p begins with th
d930: 65 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64  e <a href="opcod
d940: 65 2e 68 74 6d 6c 23 4d 65 6d 4c 6f 61 64 22 3e  e.html#MemLoad">
d950: 4d 65 6d 4c 6f 61 64 3c 2f 61 3e 20 0a 69 6e 73  MemLoad</a> .ins
d960: 74 72 75 63 74 69 6f 6e 20 61 74 20 31 31 20 77  truction at 11 w
d970: 68 69 63 68 20 70 75 73 68 65 73 20 61 20 63 6f  hich pushes a co
d980: 70 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  py of the index 
d990: 6b 65 79 20 62 61 63 6b 20 6f 6e 74 6f 20 74 68  key back onto th
d9a0: 65 20 0a 73 74 61 63 6b 2e 20 20 54 68 65 20 69  e .stack.  The i
d9b0: 6e 73 74 72 75 63 74 69 6f 6e 20 3c 61 20 68 72  nstruction <a hr
d9c0: 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23  ef="opcode.html#
d9d0: 49 64 78 47 54 22 3e 49 64 78 47 54 3c 2f 61 3e  IdxGT">IdxGT</a>
d9e0: 20 61 74 20 31 32 20 0a 63 6f 6d 70 61 72 65 73   at 12 .compares
d9f0: 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
da00: 6b 65 79 20 69 6e 20 74 68 65 20 63 75 72 72 65  key in the curre
da10: 6e 74 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  nt index record 
da20: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 0a 63  pointed to by .c
da30: 75 72 73 6f 72 20 50 31 2e 20 20 49 66 20 74 68  ursor P1.  If th
da40: 65 20 69 6e 64 65 78 20 6b 65 79 20 61 74 20 74  e index key at t
da50: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
da60: 72 20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 67 72  r location is gr
da70: 65 61 74 65 72 20 0a 74 68 61 6e 20 74 68 65 20  eater .than the 
da80: 74 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65  the index we are
da90: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 2c 20 74 68   looking for, th
daa0: 65 6e 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  en jump out of t
dab0: 68 65 20 6c 6f 6f 70 2e 3c 2f 70 3e 0a 0a 3c 70  he loop.</p>..<p
dac0: 3e 54 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  >The instruction
dad0: 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65   <a href="opcode
dae0: 2e 68 74 6d 6c 23 49 64 78 52 65 63 6e 6f 22 3e  .html#IdxRecno">
daf0: 49 64 78 52 65 63 6e 6f 3c 2f 61 3e 20 61 74 20  IdxRecno</a> at 
db00: 31 33 20 0a 70 75 73 68 65 73 20 6f 6e 74 6f 20  13 .pushes onto 
db10: 74 68 65 20 73 74 61 63 6b 20 74 68 65 20 74 61  the stack the ta
db20: 62 6c 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  ble record numbe
db30: 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  r from the index
db40: 2e 20 20 54 68 65 20 0a 66 6f 6c 6c 6f 77 69 6e  .  The .followin
db50: 67 20 4d 6f 76 65 54 6f 20 70 6f 70 73 20 69 74  g MoveTo pops it
db60: 20 61 6e 64 20 6d 6f 76 65 73 20 74 68 65 20 74   and moves the t
db70: 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74  able cursor to t
db80: 68 61 74 20 72 6f 77 2e 20 20 54 68 65 20 0a 6e  hat row.  The .n
db90: 65 78 74 20 33 20 69 6e 73 74 72 75 63 74 69 6f  ext 3 instructio
dba0: 6e 73 20 73 65 6c 65 63 74 20 74 68 65 20 63 6f  ns select the co
dbb0: 6c 75 6d 6e 20 64 61 74 61 20 74 68 65 20 73 61  lumn data the sa
dbc0: 6d 65 20 77 61 79 20 61 73 20 69 6e 20 74 68 65  me way as in the
dbd0: 20 6e 6f 6e 2d 0a 69 6e 64 65 78 65 64 20 63 61   non-.indexed ca
dbe0: 73 65 2e 20 54 68 65 20 43 6f 6c 75 6d 6e 20 69  se. The Column i
dbf0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 66 65 74 63  nstructions fetc
dc00: 68 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 61 74  h the column dat
dc10: 61 20 61 6e 64 20 74 68 65 20 0a 63 61 6c 6c 62  a and the .callb
dc20: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ack function is 
dc30: 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65 20 66 69  invoked.  The fi
dc40: 6e 61 6c 20 4e 65 78 74 20 69 6e 73 74 72 75 63  nal Next instruc
dc50: 74 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68  tion advances th
dc60: 65 20 0a 69 6e 64 65 78 20 63 75 72 73 6f 72 2c  e .index cursor,
dc70: 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 20 63   not the table c
dc80: 75 72 73 6f 72 2c 20 74 6f 20 74 68 65 20 6e 65  ursor, to the ne
dc90: 78 74 20 72 6f 77 2c 20 61 6e 64 20 74 68 65 6e  xt row, and then
dca0: 20 62 72 61 6e 63 68 65 73 20 0a 62 61 63 6b 20   branches .back 
dcb0: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
dcc0: 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 72  the loop if ther
dcd0: 65 20 61 72 65 20 61 6e 79 20 69 6e 64 65 78 20  e are any index 
dce0: 72 65 63 6f 72 64 73 20 6c 65 66 74 2e 3c 2f 70  records left.</p
dcf0: 3e 0a 0a 3c 70 3e 53 69 6e 63 65 20 74 68 65 20  >..<p>Since the 
dd00: 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 74 6f  index is used to
dd10: 20 6c 6f 6f 6b 20 75 70 20 76 61 6c 75 65 73 20   look up values 
dd20: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 0a 69 74  in the table,.it
dd30: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
dd40: 61 74 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  at the index and
dd50: 20 74 61 62 6c 65 20 62 65 20 6b 65 70 74 20 63   table be kept c
dd60: 6f 6e 73 69 73 74 65 6e 74 2e 0a 4e 6f 77 20 74  onsistent..Now t
dd70: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20  hat there is an 
dd80: 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 65 78 61  index on the exa
dd90: 6d 70 20 74 61 62 6c 65 2c 20 77 65 20 77 69 6c  mp table, we wil
dda0: 6c 20 68 61 76 65 0a 74 6f 20 75 70 64 61 74 65  l have.to update
ddb0: 20 74 68 61 74 20 69 6e 64 65 78 20 77 68 65 6e   that index when
ddc0: 65 76 65 72 20 64 61 74 61 20 69 73 20 69 6e 73  ever data is ins
ddd0: 65 72 74 65 64 2c 20 64 65 6c 65 74 65 64 2c 20  erted, deleted, 
dde0: 6f 72 0a 63 68 61 6e 67 65 64 20 69 6e 20 74 68  or.changed in th
ddf0: 65 20 65 78 61 6d 70 20 74 61 62 6c 65 2e 20 20  e examp table.  
de00: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 66 69 72  Remember the fir
de10: 73 74 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  st example above
de20: 0a 77 68 65 72 65 20 77 65 20 77 65 72 65 20 61  .where we were a
de30: 62 6c 65 20 74 6f 20 69 6e 73 65 72 74 20 61 20  ble to insert a 
de40: 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 74 68 65  new row into the
de50: 20 22 65 78 61 6d 70 22 20 74 61 62 6c 65 20 75   "examp" table u
de60: 73 69 6e 67 0a 31 32 20 56 44 42 45 20 69 6e 73  sing.12 VDBE ins
de70: 74 72 75 63 74 69 6f 6e 73 2e 20 20 4e 6f 77 20  tructions.  Now 
de80: 74 68 61 74 20 74 68 69 73 20 74 61 62 6c 65 20  that this table 
de90: 69 73 20 69 6e 64 65 78 65 64 2c 20 31 39 0a 69  is indexed, 19.i
dea0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
deb0: 72 65 71 75 69 72 65 64 2e 20 20 54 68 65 20 53  required.  The S
dec0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
ded0: 74 68 69 73 3a 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63  this:</p>..<bloc
dee0: 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 49 4e 53  kquote><pre>.INS
def0: 45 52 54 20 49 4e 54 4f 20 65 78 61 6d 70 20 56  ERT INTO examp V
df00: 41 4c 55 45 53 28 27 48 65 6c 6c 6f 2c 20 57 6f  ALUES('Hello, Wo
df10: 72 6c 64 21 27 2c 39 39 29 3b 0a 3c 2f 70 72 65  rld!',99);.</pre
df20: 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a  ></blockquote>..
df30: 3c 70 3e 41 6e 64 20 74 68 65 20 67 65 6e 65 72  <p>And the gener
df40: 61 74 65 64 20 63 6f 64 65 20 6c 6f 6f 6b 73 20  ated code looks 
df50: 6c 69 6b 65 20 74 68 69 73 3a 3c 2f 70 3e 0a 7d  like this:</p>.}
df60: 0a 0a 43 6f 64 65 20 7b 0a 61 64 64 72 20 20 6f  ..Code {.addr  o
df70: 70 63 6f 64 65 20 20 20 20 20 20 20 20 70 31 20  pcode        p1 
df80: 20 20 20 20 70 32 20 20 20 20 20 70 33 20 20 20      p2     p3   
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d     .----  ------
dfc0: 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d  ------  -----  -
dfd0: 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
dfe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20  ---------.0     
e000: 54 72 61 6e 73 61 63 74 69 6f 6e 20 20 20 31 20  Transaction   1 
e010: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
e040: 31 20 20 20 20 20 54 72 61 6e 73 61 63 74 69 6f  1     Transactio
e050: 6e 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20  n   0      0    
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 20 20 20 0a 32 20 20 20 20 20 56 65 72 69       .2     Veri
e090: 66 79 43 6f 6f 6b 69 65 20 20 30 20 20 20 20 20  fyCookie  0     
e0a0: 20 32 35 36 20 20 20 20 20 20 20 20 20 20 20 20   256            
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 0a 33 20 20 20 20 20 49 6e 74 65 67 65 72 20 20  .3     Integer  
e0e0: 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20       0      0   
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 20 20 0a 34 20 20 20 20 20 4f 70 65        .4     Ope
e120: 6e 57 72 69 74 65 20 20 20 20 20 30 20 20 20 20  nWrite     0    
e130: 20 20 33 20 20 20 20 20 20 65 78 61 6d 70 20 20    3      examp  
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 20 20 20 20 20 20 20 20 0a 35 20 20              .5  
e160: 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20     Integer      
e170: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 20 20 0a 36 20 20 20 20 20 4f 70 65 6e 57 72 69    .6     OpenWri
e1b0: 74 65 20 20 20 20 20 31 20 20 20 20 20 20 34 20  te     1      4 
e1c0: 20 20 20 20 20 65 78 61 6d 70 5f 69 64 78 31 20       examp_idx1 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 20 20 20 20 0a 37 20 20 20 20 20 4e          .7     N
e1f0: 65 77 52 65 63 6e 6f 20 20 20 20 20 20 30 20 20  ewRecno      0  
e200: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 38                .8
e230: 20 20 20 20 20 53 74 72 69 6e 67 20 20 20 20 20       String     
e240: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
e250: 20 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 20 20   Hello, World!  
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 0a 39 20 20 20 20 20 49 6e 74 65 67      .9     Integ
e280: 65 72 20 20 20 20 20 20 20 39 39 20 20 20 20 20  er       99     
e290: 30 20 20 20 20 20 20 39 39 20 20 20 20 20 20 20  0      99       
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 20 20 20 20 20 20 20 20 20 0a 31 30 20 20 20            .10   
e2c0: 20 44 75 70 20 20 20 20 20 20 20 20 20 20 20 32   Dup           2
e2d0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 0a 31 31 20 20 20 20 44 75 70 20 20 20 20 20 20  .11    Dup      
e310: 20 20 20 20 20 31 20 20 20 20 20 20 31 20 20 20       1      1   
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 20 20 20 20 0a 31 32 20 20 20 20 4d 61 6b        .12    Mak
e350: 65 49 64 78 4b 65 79 20 20 20 20 31 20 20 20 20  eIdxKey    1    
e360: 20 20 30 20 20 20 20 20 20 6e 20 20 20 20 20 20    0      n      
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 33 20              .13 
e390: 20 20 20 49 64 78 50 75 74 20 20 20 20 20 20 20     IdxPut       
e3a0: 20 31 20 20 20 20 20 20 30 20 20 20 20 20 20 20   1      0       
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 0a 31 34 20 20 20 20 4d 61 6b 65 52 65 63    .14    MakeRec
e3e0: 6f 72 64 20 20 20 20 32 20 20 20 20 20 20 30 20  ord    2      0 
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 20 20 20 20 0a 31 35 20 20 20 20 50          .15    P
e420: 75 74 49 6e 74 4b 65 79 20 20 20 20 20 30 20 20  utIntKey     0  
e430: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
e460: 36 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20 20  6    Close      
e470: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 0a 31 37 20 20 20 20 43 6c 6f 73 65      .17    Close
e4b0: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
e4c0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 20 20 20 20 20 20 20 0a 31 38 20 20 20            .18   
e4f0: 20 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 30   Commit        0
e500: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 0a 31 39 20 20 20 20 48 61 6c 74 20 20 20 20 20  .19    Halt     
e540: 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20       0      0   
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 20 20 20 20 0a 7d 0a 0a 70 75 74 73 20 7b        .}..puts {
e580: 0a 3c 70 3e 41 74 20 74 68 69 73 20 70 6f 69 6e  .<p>At this poin
e590: 74 2c 20 79 6f 75 20 73 68 6f 75 6c 64 20 75 6e  t, you should un
e5a0: 64 65 72 73 74 61 6e 64 20 74 68 65 20 56 44 42  derstand the VDB
e5b0: 45 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20 74 6f  E well enough to
e5c0: 0a 66 69 67 75 72 65 20 6f 75 74 20 6f 6e 20 79  .figure out on y
e5d0: 6f 75 72 20 6f 77 6e 20 68 6f 77 20 74 68 65 20  our own how the 
e5e0: 61 62 6f 76 65 20 70 72 6f 67 72 61 6d 20 77 6f  above program wo
e5f0: 72 6b 73 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c  rks.  So we will
e600: 0a 6e 6f 74 20 64 69 73 63 75 73 73 20 69 74 20  .not discuss it 
e610: 66 75 72 74 68 65 72 20 69 6e 20 74 68 69 73 20  further in this 
e620: 74 65 78 74 2e 3c 2f 70 3e 0a 0a 3c 68 32 3e 4a  text.</p>..<h2>J
e630: 6f 69 6e 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 49 6e  oins</h2>..<p>In
e640: 20 61 20 6a 6f 69 6e 2c 20 74 77 6f 20 6f 72 20   a join, two or 
e650: 6d 6f 72 65 20 74 61 62 6c 65 73 20 61 72 65 20  more tables are 
e660: 63 6f 6d 62 69 6e 65 64 20 74 6f 20 67 65 6e 65  combined to gene
e670: 72 61 74 65 20 61 20 73 69 6e 67 6c 65 0a 72 65  rate a single.re
e680: 73 75 6c 74 2e 20 20 54 68 65 20 72 65 73 75 6c  sult.  The resul
e690: 74 20 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73  t table consists
e6a0: 20 6f 66 20 65 76 65 72 79 20 70 6f 73 73 69 62   of every possib
e6b0: 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 6f  le combination.o
e6c0: 66 20 72 6f 77 73 20 66 72 6f 6d 20 74 68 65 20  f rows from the 
e6d0: 74 61 62 6c 65 73 20 62 65 69 6e 67 20 6a 6f 69  tables being joi
e6e0: 6e 65 64 2e 20 20 54 68 65 20 65 61 73 69 65 73  ned.  The easies
e6f0: 74 20 61 6e 64 20 6d 6f 73 74 20 6e 61 74 75 72  t and most natur
e700: 61 6c 0a 77 61 79 20 74 6f 20 69 6d 70 6c 65 6d  al.way to implem
e710: 65 6e 74 20 74 68 69 73 20 69 73 20 77 69 74 68  ent this is with
e720: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 2e 3c 2f   nested loops.</
e730: 70 3e 0a 0a 3c 70 3e 52 65 63 61 6c 6c 20 74 68  p>..<p>Recall th
e740: 65 20 71 75 65 72 79 20 74 65 6d 70 6c 61 74 65  e query template
e750: 20 64 69 73 63 75 73 73 65 64 20 61 62 6f 76 65   discussed above
e760: 20 77 68 65 72 65 20 74 68 65 72 65 20 77 61 73   where there was
e770: 20 61 0a 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a.single loop t
e780: 68 61 74 20 73 65 61 72 63 68 65 64 20 74 68 72  hat searched thr
e790: 6f 75 67 68 20 65 76 65 72 79 20 72 65 63 6f 72  ough every recor
e7a0: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  d of the table..
e7b0: 49 6e 20 61 20 6a 6f 69 6e 20 77 65 20 68 61 76  In a join we hav
e7c0: 65 20 62 61 73 69 63 61 6c 6c 79 20 74 68 65 20  e basically the 
e7d0: 73 61 6d 65 20 74 68 69 6e 67 20 65 78 63 65 70  same thing excep
e7e0: 74 20 74 68 61 74 20 74 68 65 72 65 0a 61 72 65  t that there.are
e7f0: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 2e 20 20   nested loops.  
e800: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  For example, to 
e810: 6a 6f 69 6e 20 74 77 6f 20 74 61 62 6c 65 73 2c  join two tables,
e820: 20 74 68 65 20 71 75 65 72 79 0a 74 65 6d 70 6c   the query.templ
e830: 61 74 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73  ate might look s
e840: 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68  omething like th
e850: 69 73 3a 3c 2f 70 3e 0a 0a 3c 70 3e 0a 3c 6f 6c  is:</p>..<p>.<ol
e860: 3e 0a 3c 6c 69 3e 49 6e 69 74 69 61 6c 69 7a 65  >.<li>Initialize
e870: 20 74 68 65 20 3c 62 3e 61 7a 43 6f 6c 75 6d 6e   the <b>azColumn
e880: 4e 61 6d 65 5b 5d 3c 2f 62 3e 20 61 72 72 61 79  Name[]</b> array
e890: 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 62 61 63   for the callbac
e8a0: 6b 2e 3c 2f 6c 69 3e 0a 3c 6c 69 3e 4f 70 65 6e  k.</li>.<li>Open
e8b0: 20 74 77 6f 20 63 75 72 73 6f 72 73 2c 20 6f 6e   two cursors, on
e8c0: 65 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  e to each of the
e8d0: 20 74 77 6f 20 74 61 62 6c 65 73 20 62 65 69 6e   two tables bein
e8e0: 67 20 71 75 65 72 69 65 64 2e 3c 2f 6c 69 3e 0a  g queried.</li>.
e8f0: 3c 6c 69 3e 46 6f 72 20 65 61 63 68 20 72 65 63  <li>For each rec
e900: 6f 72 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  ord in the first
e910: 20 74 61 62 6c 65 2c 20 64 6f 3a 0a 20 20 20 20   table, do:.    
e920: 3c 6f 6c 20 74 79 70 65 3d 22 61 22 3e 0a 20 20  <ol type="a">.  
e930: 20 20 3c 6c 69 3e 46 6f 72 20 65 61 63 68 20 72    <li>For each r
e940: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 65 63  ecord in the sec
e950: 6f 6e 64 20 74 61 62 6c 65 20 64 6f 3a 0a 20 20  ond table do:.  
e960: 20 20 20 20 3c 6f 6c 20 74 79 70 65 3d 22 69 22      <ol type="i"
e970: 3e 0a 20 20 20 20 20 20 3c 6c 69 3e 49 66 20 74  >.      <li>If t
e980: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
e990: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 46 41 4c  evaluates to FAL
e9a0: 53 45 2c 20 74 68 65 6e 20 73 6b 69 70 20 74 68  SE, then skip th
e9b0: 65 20 73 74 65 70 73 20 74 68 61 74 0a 20 20 20  e steps that.   
e9c0: 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 20 61 6e         follow an
e9d0: 64 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68  d continue to th
e9e0: 65 20 6e 65 78 74 20 72 65 63 6f 72 64 2e 3c 2f  e next record.</
e9f0: 6c 69 3e 0a 20 20 20 20 20 20 3c 6c 69 3e 43 6f  li>.      <li>Co
ea00: 6d 70 75 74 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e  mpute all column
ea10: 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
ea20: 74 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  t row of the res
ea30: 75 6c 74 2e 3c 2f 6c 69 3e 0a 20 20 20 20 20 20  ult.</li>.      
ea40: 3c 6c 69 3e 49 6e 76 6f 6b 65 20 74 68 65 20 63  <li>Invoke the c
ea50: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
ea60: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
ea70: 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
ea80: 6c 74 2e 3c 2f 6c 69 3e 0a 20 20 20 20 20 20 3c  lt.</li>.      <
ea90: 2f 6f 6c 3e 3c 2f 6c 69 3e 0a 20 20 20 20 3c 2f  /ol></li>.    </
eaa0: 6f 6c 3e 0a 3c 6c 69 3e 43 6c 6f 73 65 20 62 6f  ol>.<li>Close bo
eab0: 74 68 20 63 75 72 73 6f 72 73 2e 3c 2f 6c 69 3e  th cursors.</li>
eac0: 0a 3c 2f 6f 6c 3e 0a 3c 2f 70 3e 0a 0a 3c 70 3e  .</ol>.</p>..<p>
ead0: 54 68 69 73 20 74 65 6d 70 6c 61 74 65 20 77 69  This template wi
eae0: 6c 6c 20 77 6f 72 6b 2c 20 62 75 74 20 69 74 20  ll work, but it 
eaf0: 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20  is likely to be 
eb00: 73 6c 6f 77 20 73 69 6e 63 65 20 77 65 0a 61 72  slow since we.ar
eb10: 65 20 6e 6f 77 20 64 65 61 6c 69 6e 67 20 77 69  e now dealing wi
eb20: 74 68 20 61 6e 20 4f 28 4e 3c 73 75 70 3e 32 3c  th an O(N<sup>2<
eb30: 2f 73 75 70 3e 29 20 6c 6f 6f 70 2e 20 20 42 75  /sup>) loop.  Bu
eb40: 74 20 69 74 20 6f 66 74 65 6e 20 77 6f 72 6b 73  t it often works
eb50: 0a 6f 75 74 20 74 68 61 74 20 74 68 65 20 57 48  .out that the WH
eb60: 45 52 45 20 63 6c 61 75 73 65 20 63 61 6e 20 62  ERE clause can b
eb70: 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20  e factored into 
eb80: 74 65 72 6d 73 20 61 6e 64 20 74 68 61 74 20 6f  terms and that o
eb90: 6e 65 20 6f 72 0a 6d 6f 72 65 20 6f 66 20 74 68  ne or.more of th
eba0: 6f 73 65 20 74 65 72 6d 73 20 77 69 6c 6c 20 69  ose terms will i
ebb0: 6e 76 6f 6c 76 65 20 6f 6e 6c 79 20 63 6f 6c 75  nvolve only colu
ebc0: 6d 6e 73 20 69 6e 20 74 68 65 20 66 69 72 73 74  mns in the first
ebd0: 20 74 61 62 6c 65 2e 0a 57 68 65 6e 20 74 68 69   table..When thi
ebe0: 73 20 68 61 70 70 65 6e 73 2c 20 77 65 20 63 61  s happens, we ca
ebf0: 6e 20 66 61 63 74 6f 72 20 70 61 72 74 20 6f 66  n factor part of
ec00: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ec10: 65 20 74 65 73 74 20 6f 75 74 20 6f 66 0a 74 68  e test out of.th
ec20: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e 64  e inner loop and
ec30: 20 67 61 69 6e 20 61 20 6c 6f 74 20 6f 66 20 65   gain a lot of e
ec40: 66 66 69 63 69 65 6e 63 79 2e 20 20 53 6f 20 61  fficiency.  So a
ec50: 20 62 65 74 74 65 72 20 74 65 6d 70 6c 61 74 65   better template
ec60: 0a 77 6f 75 6c 64 20 62 65 20 73 6f 6d 65 74 68  .would be someth
ec70: 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 3c 2f  ing like this:</
ec80: 70 3e 0a 0a 3c 70 3e 0a 3c 6f 6c 3e 0a 3c 6c 69  p>..<p>.<ol>.<li
ec90: 3e 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  >Initialize the 
eca0: 3c 62 3e 61 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 5b  <b>azColumnName[
ecb0: 5d 3c 2f 62 3e 20 61 72 72 61 79 20 66 6f 72 20  ]</b> array for 
ecc0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 3c 2f 6c  the callback.</l
ecd0: 69 3e 0a 3c 6c 69 3e 4f 70 65 6e 20 74 77 6f 20  i>.<li>Open two 
ece0: 63 75 72 73 6f 72 73 2c 20 6f 6e 65 20 74 6f 20  cursors, one to 
ecf0: 65 61 63 68 20 6f 66 20 74 68 65 20 74 77 6f 20  each of the two 
ed00: 74 61 62 6c 65 73 20 62 65 69 6e 67 20 71 75 65  tables being que
ed10: 72 69 65 64 2e 3c 2f 6c 69 3e 0a 3c 6c 69 3e 46  ried.</li>.<li>F
ed20: 6f 72 20 65 61 63 68 20 72 65 63 6f 72 64 20 69  or each record i
ed30: 6e 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  n the first tabl
ed40: 65 2c 20 64 6f 3a 0a 20 20 20 20 3c 6f 6c 20 74  e, do:.    <ol t
ed50: 79 70 65 3d 22 61 22 3e 0a 20 20 20 20 3c 6c 69  ype="a">.    <li
ed60: 3e 45 76 61 6c 75 61 74 65 20 74 65 72 6d 73 20  >Evaluate terms 
ed70: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
ed80: 75 73 65 20 74 68 61 74 20 6f 6e 6c 79 20 69 6e  use that only in
ed90: 76 6f 6c 76 65 20 63 6f 6c 75 6d 6e 73 20 66 72  volve columns fr
eda0: 6f 6d 0a 20 20 20 20 20 20 20 20 74 68 65 20 66  om.        the f
edb0: 69 72 73 74 20 74 61 62 6c 65 2e 20 20 49 66 20  irst table.  If 
edc0: 61 6e 79 20 74 65 72 6d 20 69 73 20 66 61 6c 73  any term is fals
edd0: 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  e (meaning that 
ede0: 74 68 65 20 77 68 6f 6c 65 0a 20 20 20 20 20 20  the whole.      
edf0: 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d    WHERE clause m
ee00: 75 73 74 20 62 65 20 66 61 6c 73 65 29 20 74 68  ust be false) th
ee10: 65 6e 20 73 6b 69 70 20 74 68 65 20 72 65 73 74  en skip the rest
ee20: 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 61 6e   of this loop an
ee30: 64 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  d.        contin
ee40: 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  ue to the next r
ee50: 65 63 6f 72 64 2e 3c 2f 6c 69 3e 0a 20 20 20 20  ecord.</li>.    
ee60: 3c 6c 69 3e 46 6f 72 20 65 61 63 68 20 72 65 63  <li>For each rec
ee70: 6f 72 64 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ord in the secon
ee80: 64 20 74 61 62 6c 65 20 64 6f 3a 0a 20 20 20 20  d table do:.    
ee90: 20 20 3c 6f 6c 20 74 79 70 65 3d 22 69 22 3e 0a    <ol type="i">.
eea0: 20 20 20 20 20 20 3c 6c 69 3e 49 66 20 74 68 65        <li>If the
eeb0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 76   WHERE clause ev
eec0: 61 6c 75 61 74 65 73 20 74 6f 20 46 41 4c 53 45  aluates to FALSE
eed0: 2c 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  , then skip the 
eee0: 73 74 65 70 73 20 74 68 61 74 0a 20 20 20 20 20  steps that.     
eef0: 20 20 20 20 20 66 6f 6c 6c 6f 77 20 61 6e 64 20       follow and 
ef00: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20  continue to the 
ef10: 6e 65 78 74 20 72 65 63 6f 72 64 2e 3c 2f 6c 69  next record.</li
ef20: 3e 0a 20 20 20 20 20 20 3c 6c 69 3e 43 6f 6d 70  >.      <li>Comp
ef30: 75 74 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ute all columns 
ef40: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
ef50: 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
ef60: 74 2e 3c 2f 6c 69 3e 0a 20 20 20 20 20 20 3c 6c  t.</li>.      <l
ef70: 69 3e 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c  i>Invoke the cal
ef80: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 66  lback function f
ef90: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
efa0: 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
efb0: 2e 3c 2f 6c 69 3e 0a 20 20 20 20 20 20 3c 2f 6f  .</li>.      </o
efc0: 6c 3e 3c 2f 6c 69 3e 0a 20 20 20 20 3c 2f 6f 6c  l></li>.    </ol
efd0: 3e 0a 3c 6c 69 3e 43 6c 6f 73 65 20 62 6f 74 68  >.<li>Close both
efe0: 20 63 75 72 73 6f 72 73 2e 3c 2f 6c 69 3e 0a 3c   cursors.</li>.<
eff0: 2f 6f 6c 3e 0a 3c 2f 70 3e 0a 0a 3c 70 3e 41 64  /ol>.</p>..<p>Ad
f000: 64 69 74 69 6f 6e 61 6c 20 73 70 65 65 64 2d 75  ditional speed-u
f010: 70 20 63 61 6e 20 6f 63 63 75 72 20 69 66 20 61  p can occur if a
f020: 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  n index can be u
f030: 73 65 64 20 74 6f 20 73 70 65 65 64 0a 74 68 65  sed to speed.the
f040: 20 73 65 61 72 63 68 20 6f 66 20 65 69 74 68 65   search of eithe
f050: 72 20 6f 72 20 74 68 65 20 74 77 6f 20 6c 6f 6f  r or the two loo
f060: 70 73 2e 3c 2f 70 3e 0a 0a 3c 70 3e 53 51 4c 69  ps.</p>..<p>SQLi
f070: 74 65 20 61 6c 77 61 79 73 20 63 6f 6e 73 74 72  te always constr
f080: 75 63 74 73 20 74 68 65 20 6c 6f 6f 70 73 20 69  ucts the loops i
f090: 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
f0a0: 20 61 73 20 74 68 65 0a 74 61 62 6c 65 73 20 61   as the.tables a
f0b0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
f0c0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
f0d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f0e0: 2e 20 20 54 68 65 0a 6c 65 66 74 2d 6d 6f 73 74  .  The.left-most
f0f0: 20 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20 74   table becomes t
f100: 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e  he outer loop an
f110: 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  d the right-most
f120: 20 74 61 62 6c 65 0a 62 65 63 6f 6d 65 73 20 74   table.becomes t
f130: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 20  he inner loop.  
f140: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20  It is possible, 
f150: 69 6e 20 74 68 65 6f 72 79 2c 20 74 6f 20 72 65  in theory, to re
f160: 6f 72 64 65 72 0a 74 68 65 20 6c 6f 6f 70 73 20  order.the loops 
f170: 69 6e 20 73 6f 6d 65 20 63 69 72 63 75 6d 73 74  in some circumst
f180: 61 6e 63 65 73 20 74 6f 20 73 70 65 65 64 20 74  ances to speed t
f190: 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66  he evaluation of
f1a0: 20 74 68 65 0a 6a 6f 69 6e 2e 20 20 42 75 74 20   the.join.  But 
f1b0: 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
f1c0: 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74  attempt this opt
f1d0: 69 6d 69 7a 61 74 69 6f 6e 2e 3c 2f 70 3e 0a 0a  imization.</p>..
f1e0: 3c 70 3e 59 6f 75 20 63 61 6e 20 73 65 65 20 68  <p>You can see h
f1f0: 6f 77 20 53 51 4c 69 74 65 20 63 6f 6e 73 74 72  ow SQLite constr
f200: 75 63 74 73 20 6e 65 73 74 65 64 20 6c 6f 6f 70  ucts nested loop
f210: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
f220: 6e 67 0a 65 78 61 6d 70 6c 65 3a 3c 2f 70 3e 0a  ng.example:</p>.
f230: 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72  .<blockquote><pr
f240: 65 3e 0a 43 52 45 41 54 45 20 54 41 42 4c 45 20  e>.CREATE TABLE 
f250: 65 78 61 6d 70 32 28 74 68 72 65 65 20 69 6e 74  examp2(three int
f260: 2c 20 66 6f 75 72 20 69 6e 74 29 3b 0a 53 45 4c  , four int);.SEL
f270: 45 43 54 20 2a 20 46 52 4f 4d 20 65 78 61 6d 70  ECT * FROM examp
f280: 2c 20 65 78 61 6d 70 32 20 57 48 45 52 45 20 74  , examp2 WHERE t
f290: 77 6f 3c 35 30 20 41 4e 44 20 66 6f 75 72 3d 3d  wo<50 AND four==
f2a0: 74 77 6f 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f  two;.</pre></blo
f2b0: 63 6b 71 75 6f 74 65 3e 0a 7d 0a 0a 43 6f 64 65  ckquote>.}..Code
f2c0: 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f 64 65 20   {.addr  opcode 
f2d0: 20 20 20 20 20 20 20 70 31 20 20 20 20 20 70 32         p1     p2
f2e0: 20 20 20 20 20 70 33 20 20 20 20 20 20 20 20 20       p3         
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 2d 2d               .--
f310: 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
f320: 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20    -----  -----  
f330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f350: 2d 2d 2d 0a 30 20 20 20 20 20 43 6f 6c 75 6d 6e  ---.0     Column
f360: 4e 61 6d 65 20 20 20 20 30 20 20 20 20 20 20 30  Name    0      0
f370: 20 20 20 20 20 20 65 78 61 6d 70 2e 6f 6e 65 20        examp.one 
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f390: 20 20 20 20 20 20 20 20 20 0a 31 20 20 20 20 20           .1     
f3a0: 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20 31 20  ColumnName    1 
f3b0: 20 20 20 20 20 30 20 20 20 20 20 20 65 78 61 6d       0      exam
f3c0: 70 2e 74 77 6f 20 20 20 20 20 20 20 20 20 20 20  p.two           
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
f3e0: 32 20 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65  2     ColumnName
f3f0: 20 20 20 20 32 20 20 20 20 20 20 30 20 20 20 20      2      0    
f400: 20 20 65 78 61 6d 70 32 2e 74 68 72 65 65 20 20    examp2.three  
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f420: 20 20 20 20 20 0a 33 20 20 20 20 20 43 6f 6c 75       .3     Colu
f430: 6d 6e 4e 61 6d 65 20 20 20 20 33 20 20 20 20 20  mnName    3     
f440: 20 30 20 20 20 20 20 20 65 78 61 6d 70 32 2e 66   0      examp2.f
f450: 6f 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  our             
f460: 20 20 20 20 20 20 20 20 20 20 20 0a 34 20 20 20             .4   
f470: 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20    Integer       
f480: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 0a 35 20 20 20 20 20 4f 70 65 6e 52 65 61 64   .5     OpenRead
f4c0: 20 20 20 20 20 20 30 20 20 20 20 20 20 33 20 20        0      3  
f4d0: 20 20 20 20 65 78 61 6d 70 20 20 20 20 20 20 20      examp       
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 20 20 20 20 0a 36 20 20 20 20 20 56 65         .6     Ve
f500: 72 69 66 79 43 6f 6f 6b 69 65 20 20 30 20 20 20  rifyCookie  0   
f510: 20 20 20 39 30 39 20 20 20 20 20 20 20 20 20 20     909          
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 0a 37 20 20 20 20 20 49 6e 74 65 67 65 72    .7     Integer
f550: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 20 20 20 20 20 20 20 0a 38 20 20 20 20 20 4f          .8     O
f590: 70 65 6e 52 65 61 64 20 20 20 20 20 20 31 20 20  penRead      1  
f5a0: 20 20 20 20 35 20 20 20 20 20 20 65 78 61 6d 70      5      examp
f5b0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 39                .9
f5d0: 20 20 20 20 20 52 65 77 69 6e 64 20 20 20 20 20       Rewind     
f5e0: 20 20 20 30 20 20 20 20 20 20 32 34 20 20 20 20     0      24    
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 20 20 20 20 20 20 20 0a 31 30 20 20 20 20           .10    
f620: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20  Column        0 
f630: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
f660: 31 31 20 20 20 20 49 6e 74 65 67 65 72 20 20 20  11    Integer   
f670: 20 20 20 20 35 30 20 20 20 20 20 30 20 20 20 20      50     0    
f680: 20 20 35 30 20 20 20 20 20 20 20 20 20 20 20 20    50            
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 20 0a 31 32 20 20 20 20 47 65 20 20       .12    Ge  
f6b0: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
f6c0: 20 32 33 20 20 20 20 20 20 20 20 20 20 20 20 20   23             
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 0a 31 33 20 20 20 20 52 65 77 69 6e 64 20 20 20  .13    Rewind   
f700: 20 20 20 20 20 31 20 20 20 20 20 20 32 33 20 20       1      23  
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 20 20 20 20 0a 31 34 20 20             .14  
f740: 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20    Column        
f750: 31 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  1      1        
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 0a 31 35 20 20 20 20 43 6f 6c 75 6d 6e 20 20   .15    Column  
f790: 20 20 20 20 20 20 30 20 20 20 20 20 20 31 20 20        0      1  
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 20 20 20 20 0a 31 36 20 20 20 20 4e 65         .16    Ne
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
f7e0: 20 20 20 32 32 20 20 20 20 20 20 20 20 20 20 20     22           
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 37               .17
f810: 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20      Column      
f820: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 0a 31 38 20 20 20 20 43 6f 6c 75 6d 6e     .18    Column
f860: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31          0      1
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 20 20 20 20 0a 31 39 20 20 20 20           .19    
f8a0: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 31 20  Column        1 
f8b0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
f8e0: 32 30 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20  20    Column    
f8f0: 20 20 20 20 31 20 20 20 20 20 20 31 20 20 20 20      1      1    
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 20 20 20 20 0a 32 31 20 20 20 20 43 61 6c 6c       .21    Call
f930: 62 61 63 6b 20 20 20 20 20 20 34 20 20 20 20 20  back      4     
f940: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 20 20 20 20 20 20 20 20 20 20 20 0a 32 32 20 20             .22  
f970: 20 20 4e 65 78 74 20 20 20 20 20 20 20 20 20 20    Next          
f980: 31 20 20 20 20 20 20 31 34 20 20 20 20 20 20 20  1      14       
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 20 20 20 20 20 0a 32 33 20 20 20 20 4e 65 78        .23    Nex
f9c0: 74 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20  t          0    
f9d0: 20 20 31 30 20 20 20 20 20 20 20 20 20 20 20 20    10            
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 34 20              .24 
fa00: 20 20 20 43 6c 6f 73 65 20 20 20 20 20 20 20 20     Close        
fa10: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 0a 32 35 20 20 20 20 43 6c 6f 73 65 20 20    .25    Close  
fa50: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 30 20         1      0 
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa80: 20 20 20 20 20 20 20 20 0a 32 36 20 20 20 20 48          .26    H
fa90: 61 6c 74 20 20 20 20 20 20 20 20 20 20 30 20 20  alt          0  
faa0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d                .}
fad0: 0a 0a 70 75 74 73 20 7b 0a 3c 70 3e 54 68 65 20  ..puts {.<p>The 
fae0: 6f 75 74 65 72 20 6c 6f 6f 70 20 6f 76 65 72 20  outer loop over 
faf0: 74 61 62 6c 65 20 65 78 61 6d 70 20 69 73 20 69  table examp is i
fb00: 6d 70 6c 65 6d 65 6e 74 20 62 79 20 69 6e 73 74  mplement by inst
fb10: 72 75 63 74 69 6f 6e 73 0a 37 20 74 68 72 6f 75  ructions.7 throu
fb20: 67 68 20 32 33 2e 20 20 54 68 65 20 69 6e 6e 65  gh 23.  The inne
fb30: 72 20 6c 6f 6f 70 20 69 73 20 69 6e 73 74 72 75  r loop is instru
fb40: 63 74 69 6f 6e 73 20 31 33 20 74 68 72 6f 75 67  ctions 13 throug
fb50: 68 20 32 32 2e 0a 4e 6f 74 69 63 65 20 74 68 61  h 22..Notice tha
fb60: 74 20 74 68 65 20 22 74 77 6f 3c 35 30 22 20 74  t the "two<50" t
fb70: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
fb80: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 76 6f   expression invo
fb90: 6c 76 65 73 0a 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  lves.only column
fba0: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  s from the first
fbb0: 20 74 61 62 6c 65 20 61 6e 64 20 63 61 6e 20 62   table and can b
fbc0: 65 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 6f  e factored out o
fbd0: 66 0a 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f.the inner loop
fbe0: 2e 20 20 53 51 4c 69 74 65 20 64 6f 65 73 20 74  .  SQLite does t
fbf0: 68 69 73 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  his and implemen
fc00: 74 73 20 74 68 65 20 22 74 77 6f 3c 35 30 22 0a  ts the "two<50".
fc10: 74 65 73 74 20 69 6e 20 69 6e 73 74 72 75 63 74  test in instruct
fc20: 69 6f 6e 73 20 31 30 20 74 68 72 6f 75 67 68 20  ions 10 through 
fc30: 31 32 2e 20 20 54 68 65 20 22 66 6f 75 72 3d 3d  12.  The "four==
fc40: 74 77 6f 22 20 74 65 73 74 20 69 73 0a 69 6d 70  two" test is.imp
fc50: 6c 65 6d 65 6e 74 20 62 79 20 69 6e 73 74 72 75  lement by instru
fc60: 63 74 69 6f 6e 73 20 31 34 20 74 68 72 6f 75 67  ctions 14 throug
fc70: 68 20 31 36 20 69 6e 20 74 68 65 20 69 6e 6e 65  h 16 in the inne
fc80: 72 20 6c 6f 6f 70 2e 3c 2f 70 3e 0a 0a 3c 70 3e  r loop.</p>..<p>
fc90: 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
fca0: 69 6d 70 6f 73 65 20 61 6e 79 20 61 72 62 69 74  impose any arbit
fcb0: 72 61 72 79 20 6c 69 6d 69 74 73 20 6f 6e 20 74  rary limits on t
fcc0: 68 65 20 74 61 62 6c 65 73 20 69 6e 0a 61 20 6a  he tables in.a j
fcd0: 6f 69 6e 2e 20 20 49 74 20 61 6c 73 6f 20 61 6c  oin.  It also al
fce0: 6c 6f 77 73 20 61 20 74 61 62 6c 65 20 74 6f 20  lows a table to 
fcf0: 62 65 20 6a 6f 69 6e 65 64 20 77 69 74 68 20 69  be joined with i
fd00: 74 73 65 6c 66 2e 3c 2f 70 3e 0a 0a 3c 68 32 3e  tself.</p>..<h2>
fd10: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
fd20: 75 73 65 3c 2f 68 32 3e 0a 0a 3c 70 3e 46 6f 72  use</h2>..<p>For
fd30: 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73   historical reas
fd40: 6f 6e 73 2c 20 61 6e 64 20 66 6f 72 20 65 66 66  ons, and for eff
fd50: 69 63 69 65 6e 63 79 2c 20 61 6c 6c 20 73 6f 72  iciency, all sor
fd60: 74 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c  ting is currentl
fd70: 79 20 0a 64 6f 6e 65 20 69 6e 20 6d 65 6d 6f 72  y .done in memor
fd80: 79 2e 3c 2f 70 3e 0a 0a 3c 70 3e 53 51 4c 69 74  y.</p>..<p>SQLit
fd90: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
fda0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
fdb0: 20 75 73 69 6e 67 20 61 20 73 70 65 63 69 61 6c   using a special
fdc0: 0a 73 65 74 20 6f 66 20 69 6e 73 74 72 75 63 74  .set of instruct
fdd0: 69 6f 6e 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  ions to control 
fde0: 61 6e 20 6f 62 6a 65 63 74 20 63 61 6c 6c 65 64  an object called
fdf0: 20 61 20 73 6f 72 74 65 72 2e 20 20 49 6e 20 74   a sorter.  In t
fe00: 68 65 0a 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f  he.inner-most lo
fe10: 6f 70 20 6f 66 20 74 68 65 20 71 75 65 72 79 2c  op of the query,
fe20: 20 77 68 65 72 65 20 74 68 65 72 65 20 77 6f 75   where there wou
fe30: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 61  ld normally be.a
fe40: 20 43 61 6c 6c 62 61 63 6b 20 69 6e 73 74 72 75   Callback instru
fe50: 63 74 69 6f 6e 2c 20 69 6e 73 74 65 61 64 20 61  ction, instead a
fe60: 20 72 65 63 6f 72 64 20 69 73 20 63 6f 6e 73 74   record is const
fe70: 72 75 63 74 65 64 20 74 68 61 74 0a 63 6f 6e 74  ructed that.cont
fe80: 61 69 6e 73 20 62 6f 74 68 20 63 61 6c 6c 62 61  ains both callba
fe90: 63 6b 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e  ck parameters an
fea0: 64 20 61 20 6b 65 79 2e 20 20 54 68 69 73 20 72  d a key.  This r
feb0: 65 63 6f 72 64 0a 69 73 20 61 64 64 65 64 20 74  ecord.is added t
fec0: 6f 20 74 68 65 20 73 6f 72 74 65 72 20 28 69 6e  o the sorter (in
fed0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 29 2e   a linked list).
fee0: 20 20 41 66 74 65 72 20 74 68 65 20 71 75 65 72    After the quer
fef0: 79 20 6c 6f 6f 70 20 0a 66 69 6e 69 73 68 65 73  y loop .finishes
ff00: 2c 20 74 68 65 20 6c 69 73 74 20 6f 66 20 72 65  , the list of re
ff10: 63 6f 72 64 73 20 69 73 20 73 6f 72 74 65 64 20  cords is sorted 
ff20: 61 6e 64 20 74 68 69 73 20 6c 69 73 74 20 69 73  and this list is
ff30: 20 77 61 6c 6b 65 64 2e 20 20 46 6f 72 20 0a 65   walked.  For .e
ff40: 61 63 68 20 72 65 63 6f 72 64 20 6f 6e 20 74 68  ach record on th
ff50: 65 20 6c 69 73 74 2c 20 74 68 65 20 63 61 6c 6c  e list, the call
ff60: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2e  back is invoked.
ff70: 20 20 46 69 6e 61 6c 6c 79 2c 20 74 68 65 20 73    Finally, the s
ff80: 6f 72 74 65 72 0a 69 73 20 63 6c 6f 73 65 64 20  orter.is closed 
ff90: 61 6e 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 65  and memory is de
ffa0: 61 6c 6c 6f 63 61 74 65 64 2e 3c 2f 70 3e 0a 0a  allocated.</p>..
ffb0: 3c 70 3e 57 65 20 63 61 6e 20 73 65 65 20 74 68  <p>We can see th
ffc0: 65 20 70 72 6f 63 65 73 73 20 69 6e 20 61 63 74  e process in act
ffd0: 69 6f 6e 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ion in the follo
ffe0: 77 69 6e 67 20 71 75 65 72 79 3a 3c 2f 70 3e 0a  wing query:</p>.
fff0: 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72  .<blockquote><pr
10000 65 3e 0a 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  e>.SELECT * FROM
10010 20 65 78 61 6d 70 20 4f 52 44 45 52 20 42 59 20   examp ORDER BY 
10020 6f 6e 65 20 44 45 53 43 2c 20 74 77 6f 3b 0a 3c  one DESC, two;.<
10030 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74  /pre></blockquot
10040 65 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 61 64 64  e>.}..Code {.add
10050 72 20 20 6f 70 63 6f 64 65 20 20 20 20 20 20 20  r  opcode       
10060 20 70 31 20 20 20 20 20 70 32 20 20 20 20 20 70   p1     p2     p
10070 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 0a 2d 2d 2d 2d 20 20 2d 2d         .----  --
100a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
100b0 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  -  -----  ------
100c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20  -------------.0 
100e0 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20      ColumnName  
100f0 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
10100 6f 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  one             
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 20 20 0a 31 20 20 20 20 20 43 6f 6c 75 6d 6e     .1     Column
10130 4e 61 6d 65 20 20 20 20 31 20 20 20 20 20 20 30  Name    1      0
10140 20 20 20 20 20 20 74 77 6f 20 20 20 20 20 20 20        two       
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 20 20 20 0a 32 20 20 20 20 20           .2     
10170 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 30 20  Integer       0 
10180 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
101b0 33 20 20 20 20 20 4f 70 65 6e 52 65 61 64 20 20  3     OpenRead  
101c0 20 20 20 20 30 20 20 20 20 20 20 33 20 20 20 20      0      3    
101d0 20 20 65 78 61 6d 70 20 20 20 20 20 20 20 20 20    examp         
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101f0 20 20 20 20 20 0a 34 20 20 20 20 20 56 65 72 69       .4     Veri
10200 66 79 43 6f 6f 6b 69 65 20 20 30 20 20 20 20 20  fyCookie  0     
10210 20 39 30 39 20 20 20 20 20 20 20 20 20 20 20 20   909            
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10240 0a 35 20 20 20 20 20 52 65 77 69 6e 64 20 20 20  .5     Rewind   
10250 20 20 20 20 20 30 20 20 20 20 20 20 31 34 20 20       0      14  
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10280 20 20 20 20 20 20 20 20 20 20 20 0a 36 20 20 20             .6   
10290 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20    Column        
102a0 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102d0 20 0a 37 20 20 20 20 20 43 6f 6c 75 6d 6e 20 20   .7     Column  
102e0 20 20 20 20 20 20 30 20 20 20 20 20 20 31 20 20        0      1  
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 20 20 20 20 20 20 0a 38 20 20 20 20 20 53 6f         .8     So
10320 72 74 4d 61 6b 65 52 65 63 20 20 20 32 20 20 20  rtMakeRec   2   
10330 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 20 0a 39 20 20 20 20 20 43 6f 6c 75 6d 6e 20    .9     Column 
10370 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103a0 20 20 20 20 20 20 20 20 0a 31 30 20 20 20 20 43          .10    C
103b0 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20  olumn        0  
103c0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
103f0 31 20 20 20 20 53 6f 72 74 4d 61 6b 65 4b 65 79  1    SortMakeKey
10400 20 20 20 32 20 20 20 20 20 20 30 20 20 20 20 20     2      0     
10410 20 44 2b 20 20 20 20 20 20 20 20 20 20 20 20 20   D+             
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 20 0a 31 32 20 20 20 20 53 6f 72 74 50      .12    SortP
10440 75 74 20 20 20 20 20 20 20 30 20 20 20 20 20 20  ut       0      
10450 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
10480 31 33 20 20 20 20 4e 65 78 74 20 20 20 20 20 20  13    Next      
10490 20 20 20 20 30 20 20 20 20 20 20 36 20 20 20 20      0      6    
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104c0 20 20 20 20 20 20 20 20 20 20 0a 31 34 20 20 20            .14   
104d0 20 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20 30   Close         0
104e0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 20 20 20 20 0a 31 35 20 20 20 20 53 6f 72 74       .15    Sort
10520 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
10530 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10560 0a 31 36 20 20 20 20 53 6f 72 74 4e 65 78 74 20  .16    SortNext 
10570 20 20 20 20 20 30 20 20 20 20 20 20 31 39 20 20       0      19  
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 20 20 20 20 20 20 20 20 20 20 20 0a 31 37 20 20             .17  
105b0 20 20 53 6f 72 74 43 61 6c 6c 62 61 63 6b 20 20    SortCallback  
105c0 32 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  2      0        
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105f0 20 20 20 20 20 20 0a 31 38 20 20 20 20 47 6f 74        .18    Got
10600 6f 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20  o          0    
10610 20 20 31 36 20 20 20 20 20 20 20 20 20 20 20 20    16            
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10640 20 0a 31 39 20 20 20 20 53 6f 72 74 52 65 73 65   .19    SortRese
10650 74 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20  t     0      0  
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 20 20 0a 32 30 20 20 20 20 48 61         .20    Ha
10690 6c 74 20 20 20 20 20 20 20 20 20 20 30 20 20 20  lt          0   
106a0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a               .}.
106d0 0a 70 75 74 73 20 7b 0a 3c 70 3e 54 68 65 72 65  .puts {.<p>There
106e0 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 73 6f 72   is only one sor
106f0 74 65 72 20 6f 62 6a 65 63 74 2c 20 73 6f 20 74  ter object, so t
10700 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 73 74  here are no inst
10710 72 75 63 74 69 6f 6e 73 20 74 6f 20 6f 70 65 6e  ructions to open
10720 20 0a 6f 72 20 63 6c 6f 73 65 20 69 74 2e 20 20   .or close it.  
10730 49 74 20 69 73 20 6f 70 65 6e 65 64 20 61 75 74  It is opened aut
10740 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
10750 6e 65 65 64 65 64 2c 20 61 6e 64 20 69 74 20 69  needed, and it i
10760 73 20 63 6c 6f 73 65 64 20 0a 77 68 65 6e 20 74  s closed .when t
10770 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
10780 68 61 6c 74 73 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54  halts.</p>..<p>T
10790 68 65 20 71 75 65 72 79 20 6c 6f 6f 70 20 69 73  he query loop is
107a0 20 62 75 69 6c 74 20 66 72 6f 6d 20 69 6e 73 74   built from inst
107b0 72 75 63 74 69 6f 6e 73 20 35 20 74 68 72 6f 75  ructions 5 throu
107c0 67 68 20 31 33 2e 20 20 49 6e 73 74 72 75 63 74  gh 13.  Instruct
107d0 69 6f 6e 73 0a 36 20 74 68 72 6f 75 67 68 20 38  ions.6 through 8
107e0 20 62 75 69 6c 64 20 61 20 72 65 63 6f 72 64 20   build a record 
107f0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
10800 65 20 61 7a 44 61 74 61 5b 5d 20 76 61 6c 75 65  e azData[] value
10810 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 0a 69  s for a single.i
10820 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65  nvocation of the
10830 20 63 61 6c 6c 62 61 63 6b 2e 20 20 41 20 73 6f   callback.  A so
10840 72 74 20 6b 65 79 20 69 73 20 67 65 6e 65 72 61  rt key is genera
10850 74 65 64 20 62 79 20 69 6e 73 74 72 75 63 74 69  ted by instructi
10860 6f 6e 73 0a 39 20 74 68 72 6f 75 67 68 20 31 31  ons.9 through 11
10870 2e 20 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 31  .  Instruction 1
10880 32 20 63 6f 6d 62 69 6e 65 73 20 74 68 65 20 69  2 combines the i
10890 6e 76 6f 63 61 74 69 6f 6e 20 72 65 63 6f 72 64  nvocation record
108a0 20 61 6e 64 20 74 68 65 0a 73 6f 72 74 20 6b 65   and the.sort ke
108b0 79 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  y into a single 
108c0 65 6e 74 72 79 20 61 6e 64 20 70 75 74 73 20 74  entry and puts t
108d0 68 61 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  hat entry on the
108e0 20 73 6f 72 74 20 6c 69 73 74 2e 3c 70 3e 0a 0a   sort list.<p>..
108f0 3c 70 3e 54 68 65 20 50 33 20 61 72 67 75 6d 65  <p>The P3 argume
10900 6e 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nt of instructio
10910 6e 20 31 31 20 69 73 20 6f 66 20 70 61 72 74 69  n 11 is of parti
10920 63 75 6c 61 72 20 69 6e 74 65 72 65 73 74 2e 20  cular interest. 
10930 20 54 68 65 0a 73 6f 72 74 20 6b 65 79 20 69 73   The.sort key is
10940 20 66 6f 72 6d 65 64 20 62 79 20 70 72 65 70 65   formed by prepe
10950 6e 64 69 6e 67 20 6f 6e 65 20 63 68 61 72 61 63  nding one charac
10960 74 65 72 20 66 72 6f 6d 20 50 33 20 74 6f 20 65  ter from P3 to e
10970 61 63 68 20 73 74 72 69 6e 67 0a 61 6e 64 20 63  ach string.and c
10980 6f 6e 63 61 74 65 6e 61 74 69 6e 67 20 61 6c 6c  oncatenating all
10990 20 74 68 65 20 73 74 72 69 6e 67 73 2e 20 20 54   the strings.  T
109a0 68 65 20 73 6f 72 74 20 63 6f 6d 70 61 72 69 73  he sort comparis
109b0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  on function will
109c0 0a 6c 6f 6f 6b 20 61 74 20 74 68 69 73 20 63 68  .look at this ch
109d0 61 72 61 63 74 65 72 20 74 6f 20 64 65 74 65 72  aracter to deter
109e0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 74 68 65  mine whether the
109f0 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 0a 61   sort order is.a
10a00 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63  scending or desc
10a10 65 6e 64 69 6e 67 2c 20 61 6e 64 20 77 68 65 74  ending, and whet
10a20 68 65 72 20 74 6f 20 73 6f 72 74 20 61 73 20 61  her to sort as a
10a30 20 73 74 72 69 6e 67 20 6f 72 20 6e 75 6d 62 65   string or numbe
10a40 72 2e 20 20 0a 49 6e 20 74 68 69 73 20 65 78 61  r.  .In this exa
10a50 6d 70 6c 65 2c 20 74 68 65 20 66 69 72 73 74 20  mple, the first 
10a60 63 6f 6c 75 6d 6e 20 73 68 6f 75 6c 64 20 62 65  column should be
10a70 20 73 6f 72 74 65 64 20 61 73 20 61 20 73 74 72   sorted as a str
10a80 69 6e 67 20 0a 69 6e 20 64 65 73 63 65 6e 64 69  ing .in descendi
10a90 6e 67 20 6f 72 64 65 72 20 73 6f 20 69 74 73 20  ng order so its 
10aa0 70 72 65 66 69 78 20 69 73 20 22 44 22 20 61 6e  prefix is "D" an
10ab0 64 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6c  d the second col
10ac0 75 6d 6e 20 73 68 6f 75 6c 64 20 0a 73 6f 72 74  umn should .sort
10ad0 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 69  ed numerically i
10ae0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
10af0 72 20 73 6f 20 69 74 73 20 70 72 65 66 69 78 20  r so its prefix 
10b00 69 73 20 22 2b 22 2e 20 20 41 73 63 65 6e 64 69  is "+".  Ascendi
10b10 6e 67 20 0a 73 74 72 69 6e 67 20 73 6f 72 74 69  ng .string sorti
10b20 6e 67 20 75 73 65 73 20 22 41 22 2c 20 61 6e 64  ng uses "A", and
10b30 20 64 65 73 63 65 6e 64 69 6e 67 20 6e 75 6d 65   descending nume
10b40 72 69 63 20 73 6f 72 74 69 6e 67 20 75 73 65 73  ric sorting uses
10b50 20 22 2d 22 2e 3c 2f 70 3e 0a 0a 3c 70 3e 41 66   "-".</p>..<p>Af
10b60 74 65 72 20 74 68 65 20 71 75 65 72 79 20 6c 6f  ter the query lo
10b70 6f 70 20 65 6e 64 73 2c 20 74 68 65 20 74 61 62  op ends, the tab
10b80 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
10b90 20 69 73 20 63 6c 6f 73 65 64 20 61 74 0a 69 6e   is closed at.in
10ba0 73 74 72 75 63 74 69 6f 6e 20 31 34 2e 20 20 54  struction 14.  T
10bb0 68 69 73 20 69 73 20 64 6f 6e 65 20 65 61 72 6c  his is done earl
10bc0 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c  y in order to al
10bd0 6c 6f 77 20 6f 74 68 65 72 20 70 72 6f 63 65 73  low other proces
10be0 73 65 73 0a 6f 72 20 74 68 72 65 61 64 73 20 74  ses.or threads t
10bf0 6f 20 61 63 63 65 73 73 20 74 68 61 74 20 74 61  o access that ta
10c00 62 6c 65 2c 20 69 66 20 64 65 73 69 72 65 64 2e  ble, if desired.
10c10 20 20 54 68 65 20 6c 69 73 74 20 6f 66 20 72 65    The list of re
10c20 63 6f 72 64 73 0a 74 68 61 74 20 77 61 73 20 62  cords.that was b
10c30 75 69 6c 74 20 75 70 20 69 6e 73 69 64 65 20 74  uilt up inside t
10c40 68 65 20 71 75 65 72 79 20 6c 6f 6f 70 20 69 73  he query loop is
10c50 20 73 6f 72 74 65 64 20 62 79 20 74 68 65 20 69   sorted by the i
10c60 6e 73 74 72 75 63 74 69 6f 6e 0a 61 74 20 31 35  nstruction.at 15
10c70 2e 20 20 49 6e 73 74 72 75 63 74 69 6f 6e 73 20  .  Instructions 
10c80 31 36 20 74 68 72 6f 75 67 68 20 31 38 20 77 61  16 through 18 wa
10c90 6c 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  lk through the r
10ca0 65 63 6f 72 64 20 6c 69 73 74 0a 28 77 68 69 63  ecord list.(whic
10cb0 68 20 69 73 20 6e 6f 77 20 69 6e 20 73 6f 72 74  h is now in sort
10cc0 65 64 20 6f 72 64 65 72 29 20 61 6e 64 20 69 6e  ed order) and in
10cd0 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
10ce0 6b 20 6f 6e 63 65 20 66 6f 72 0a 65 61 63 68 20  k once for.each 
10cf0 72 65 63 6f 72 64 2e 20 20 46 69 6e 61 6c 6c 79  record.  Finally
10d00 2c 20 74 68 65 20 73 6f 72 74 65 72 20 69 73 20  , the sorter is 
10d10 63 6c 6f 73 65 64 20 61 74 20 69 6e 73 74 72 75  closed at instru
10d20 63 74 69 6f 6e 20 31 39 2e 3c 2f 70 3e 0a 0a 3c  ction 19.</p>..<
10d30 68 32 3e 41 67 67 72 65 67 61 74 65 20 46 75 6e  h2>Aggregate Fun
10d40 63 74 69 6f 6e 73 20 41 6e 64 20 54 68 65 20 47  ctions And The G
10d50 52 4f 55 50 20 42 59 20 61 6e 64 20 48 41 56 49  ROUP BY and HAVI
10d60 4e 47 20 43 6c 61 75 73 65 73 3c 2f 68 32 3e 0a  NG Clauses</h2>.
10d70 0a 3c 70 3e 54 6f 20 63 6f 6d 70 75 74 65 20 61  .<p>To compute a
10d80 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
10d90 6e 73 2c 20 74 68 65 20 56 44 42 45 20 69 6d 70  ns, the VDBE imp
10da0 6c 65 6d 65 6e 74 73 20 61 20 73 70 65 63 69 61  lements a specia
10db0 6c 20 0a 64 61 74 61 20 73 74 72 75 63 74 75 72  l .data structur
10dc0 65 20 61 6e 64 20 69 6e 73 74 72 75 63 74 69 6f  e and instructio
10dd0 6e 73 20 66 6f 72 20 63 6f 6e 74 72 6f 6c 6c 69  ns for controlli
10de0 6e 67 20 74 68 61 74 20 64 61 74 61 20 73 74 72  ng that data str
10df0 75 63 74 75 72 65 2e 0a 54 68 65 20 64 61 74 61  ucture..The data
10e00 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6e   structure is an
10e10 20 75 6e 6f 72 64 65 72 65 64 20 73 65 74 20 6f   unordered set o
10e20 66 20 62 75 63 6b 65 74 73 2c 20 77 68 65 72 65  f buckets, where
10e30 20 65 61 63 68 20 62 75 63 6b 65 74 0a 68 61 73   each bucket.has
10e40 20 61 20 6b 65 79 20 61 6e 64 20 6f 6e 65 20 6f   a key and one o
10e50 72 20 6d 6f 72 65 20 6d 65 6d 6f 72 79 20 6c 6f  r more memory lo
10e60 63 61 74 69 6f 6e 73 2e 20 20 57 69 74 68 69 6e  cations.  Within
10e70 20 74 68 65 20 71 75 65 72 79 0a 6c 6f 6f 70 2c   the query.loop,
10e80 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
10e90 61 75 73 65 20 69 73 20 75 73 65 64 20 74 6f 20  ause is used to 
10ea0 63 6f 6e 73 74 72 75 63 74 20 61 20 6b 65 79 20  construct a key 
10eb0 61 6e 64 20 74 68 65 20 62 75 63 6b 65 74 0a 77  and the bucket.w
10ec0 69 74 68 20 74 68 61 74 20 6b 65 79 20 69 73 20  ith that key is 
10ed0 62 72 6f 75 67 68 74 20 69 6e 74 6f 20 66 6f 63  brought into foc
10ee0 75 73 2e 20 20 41 20 6e 65 77 20 62 75 63 6b 65  us.  A new bucke
10ef0 74 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74  t is created wit
10f00 68 0a 74 68 65 20 6b 65 79 20 69 66 20 6f 6e 65  h.the key if one
10f10 20 64 69 64 20 6e 6f 74 20 70 72 65 76 69 6f 75   did not previou
10f20 73 6c 79 20 65 78 69 73 74 2e 20 20 4f 6e 63 65  sly exist.  Once
10f30 20 74 68 65 20 62 75 63 6b 65 74 20 69 73 20 69   the bucket is i
10f40 6e 0a 66 6f 63 75 73 2c 20 74 68 65 20 6d 65 6d  n.focus, the mem
10f50 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 6f 66  ory locations of
10f60 20 74 68 65 20 62 75 63 6b 65 74 20 61 72 65 20   the bucket are 
10f70 75 73 65 64 20 74 6f 20 61 63 63 75 6d 75 6c 61  used to accumula
10f80 74 65 0a 74 68 65 20 76 61 6c 75 65 73 20 6f 66  te.the values of
10f90 20 74 68 65 20 76 61 72 69 6f 75 73 20 61 67 67   the various agg
10fa0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
10fb0 2e 20 20 41 66 74 65 72 20 74 68 65 20 71 75 65  .  After the que
10fc0 72 79 0a 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  ry.loop terminat
10fd0 65 73 2c 20 65 61 63 68 20 62 75 63 6b 65 74 20  es, each bucket 
10fe0 69 73 20 76 69 73 69 74 65 64 20 6f 6e 63 65 20  is visited once 
10ff0 74 6f 20 67 65 6e 65 72 61 74 65 20 61 0a 73 69  to generate a.si
11000 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
11010 72 65 73 75 6c 74 73 2e 3c 2f 70 3e 0a 0a 3c 70  results.</p>..<p
11020 3e 41 6e 20 65 78 61 6d 70 6c 65 20 77 69 6c 6c  >An example will
11030 20 68 65 6c 70 20 74 6f 20 63 6c 61 72 69 66 79   help to clarify
11040 20 74 68 69 73 20 63 6f 6e 63 65 70 74 2e 20 20   this concept.  
11050 43 6f 6e 73 69 64 65 72 20 74 68 65 0a 66 6f 6c  Consider the.fol
11060 6c 6f 77 69 6e 67 20 71 75 65 72 79 3a 3c 2f 70  lowing query:</p
11070 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c  >..<blockquote><
11080 70 72 65 3e 0a 53 45 4c 45 43 54 20 74 68 72 65  pre>.SELECT thre
11090 65 2c 20 6d 69 6e 28 74 68 72 65 65 2b 66 6f 75  e, min(three+fou
110a0 72 29 2b 61 76 67 28 66 6f 75 72 29 20 0a 46 52  r)+avg(four) .FR
110b0 4f 4d 20 65 78 61 6d 70 32 0a 47 52 4f 55 50 20  OM examp2.GROUP 
110c0 42 59 20 74 68 72 65 65 3b 0a 3c 2f 70 72 65 3e  BY three;.</pre>
110d0 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a 0a  </blockquote>...
110e0 3c 70 3e 54 68 65 20 56 44 42 45 20 63 6f 64 65  <p>The VDBE code
110f0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
11100 68 69 73 20 71 75 65 72 79 20 69 73 20 61 73 20  his query is as 
11110 66 6f 6c 6c 6f 77 73 3a 3c 2f 70 3e 0a 7d 0a 0a  follows:</p>.}..
11120 43 6f 64 65 20 7b 0a 61 64 64 72 20 20 6f 70 63  Code {.addr  opc
11130 6f 64 65 20 20 20 20 20 20 20 20 70 31 20 20 20  ode        p1   
11140 20 20 70 32 20 20 20 20 20 70 33 20 20 20 20 20    p2     p3     
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d   .----  --------
11180 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d  ----  -----  ---
11190 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
111a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
111b0 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 43 6f  -------.0     Co
111c0 6c 75 6d 6e 4e 61 6d 65 20 20 20 20 30 20 20 20  lumnName    0   
111d0 20 20 20 30 20 20 20 20 20 20 74 68 72 65 65 20     0      three 
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 20               .1 
11200 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20      ColumnName  
11210 20 20 31 20 20 20 20 20 20 30 20 20 20 20 20 20    1      0      
11220 6d 69 6e 28 74 68 72 65 65 2b 66 6f 75 72 29 2b  min(three+four)+
11230 61 76 67 28 66 6f 75 72 29 20 20 20 20 20 20 20  avg(four)       
11240 20 20 20 0a 32 20 20 20 20 20 41 67 67 52 65 73     .2     AggRes
11250 65 74 20 20 20 20 20 20 30 20 20 20 20 20 20 33  et      0      3
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 33                .3
11290 20 20 20 20 20 41 67 67 49 6e 69 74 20 20 20 20       AggInit    
112a0 20 20 20 30 20 20 20 20 20 20 31 20 20 20 20 20     0      1     
112b0 20 70 74 72 28 30 78 37 39 30 33 61 30 29 20 20   ptr(0x7903a0)  
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 20 20 0a 34 20 20 20 20 20 41 67 67 49 6e      .4     AggIn
112e0 69 74 20 20 20 20 20 20 20 30 20 20 20 20 20 20  it       0      
112f0 32 20 20 20 20 20 20 70 74 72 28 30 78 37 39 30  2      ptr(0x790
11300 37 30 30 29 20 20 20 20 20 20 20 20 20 20 20 20  700)            
11310 20 20 20 20 20 20 20 20 20 20 0a 35 20 20 20 20            .5    
11320 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 30   Integer       0
11330 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11360 0a 36 20 20 20 20 20 4f 70 65 6e 52 65 61 64 20  .6     OpenRead 
11370 20 20 20 20 20 30 20 20 20 20 20 20 35 20 20 20       0      5   
11380 20 20 20 65 78 61 6d 70 32 20 20 20 20 20 20 20     examp2       
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 20 20 20 20 20 0a 37 20 20 20 20 20 56 65 72        .7     Ver
113b0 69 66 79 43 6f 6f 6b 69 65 20 20 30 20 20 20 20  ifyCookie  0    
113c0 20 20 39 30 39 20 20 20 20 20 20 20 20 20 20 20    909           
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 0a 38 20 20 20 20 20 52 65 77 69 6e 64 20 20   .8     Rewind  
11400 20 20 20 20 20 20 30 20 20 20 20 20 20 32 33 20        0      23 
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 20 20 20 20 20 20 20 20 20 20 0a 39 20 20              .9  
11440 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20     Column       
11450 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 0a 31 30 20 20 20 20 4d 61 6b 65 4b 65 79    .10    MakeKey
11490 20 20 20 20 20 20 20 31 20 20 20 20 20 20 30 20         1      0 
114a0 20 20 20 20 20 6e 20 20 20 20 20 20 20 20 20 20       n          
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 20 20 20 20 20 20 20 20 0a 31 31 20 20 20 20 41          .11    A
114d0 67 67 46 6f 63 75 73 20 20 20 20 20 20 30 20 20  ggFocus      0  
114e0 20 20 20 20 31 34 20 20 20 20 20 20 20 20 20 20      14          
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 20 20 20 0a 31 32 20 20 20 20 43 6f 6c 75 6d 6e     .12    Column
11520 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30          0      0
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 20 20 20 20 20 20 20 20 20 0a 31 33 20 20 20 20           .13    
11560 41 67 67 53 65 74 20 20 20 20 20 20 20 20 30 20  AggSet        0 
11570 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
115a0 31 34 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20  14    Column    
115b0 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115e0 20 20 20 20 20 0a 31 35 20 20 20 20 43 6f 6c 75       .15    Colu
115f0 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20 20 20  mn        0     
11600 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11620 20 20 20 20 20 20 20 20 20 20 20 0a 31 36 20 20             .16  
11630 20 20 41 64 64 20 20 20 20 20 20 20 20 20 20 20    Add           
11640 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
11650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11670 20 0a 31 37 20 20 20 20 49 6e 74 65 67 65 72 20   .17    Integer 
11680 20 20 20 20 20 20 31 20 20 20 20 20 20 30 20 20        1      0  
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 20 20 20 20 20 20 20 0a 31 38 20 20 20 20 41 67         .18    Ag
116c0 67 46 75 6e 63 20 20 20 20 20 20 20 30 20 20 20  gFunc       0   
116d0 20 20 20 31 20 20 20 20 20 20 70 74 72 28 30 78     1      ptr(0x
116e0 37 39 30 33 61 30 29 20 20 20 20 20 20 20 20 20  7903a0)         
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 39               .19
11700 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20      Column      
11710 20 20 30 20 20 20 20 20 20 31 20 20 20 20 20 20    0      1      
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11740 20 20 20 0a 32 30 20 20 20 20 49 6e 74 65 67 65     .20    Intege
11750 72 20 20 20 20 20 20 20 32 20 20 20 20 20 20 30  r       2      0
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 20 20 20 0a 32 31 20 20 20 20           .21    
11790 41 67 67 46 75 6e 63 20 20 20 20 20 20 20 30 20  AggFunc       0 
117a0 20 20 20 20 20 31 20 20 20 20 20 20 70 74 72 28       1      ptr(
117b0 30 78 37 39 30 37 30 30 29 20 20 20 20 20 20 20  0x790700)       
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
117d0 32 32 20 20 20 20 4e 65 78 74 20 20 20 20 20 20  22    Next      
117e0 20 20 20 20 30 20 20 20 20 20 20 39 20 20 20 20      0      9    
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 20 20 20 20 20 20 20 20 20 0a 32 33 20 20 20            .23   
11820 20 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20 30   Close         0
11830 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 20 20 20 20 20 0a 32 34 20 20 20 20 41 67 67 4e       .24    AggN
11870 65 78 74 20 20 20 20 20 20 20 30 20 20 20 20 20  ext       0     
11880 20 33 31 20 20 20 20 20 20 20 20 20 20 20 20 20   31             
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 20 20 20 20 20 20 20 20 20 20 0a 32 35 20 20             .25  
118b0 20 20 41 67 67 47 65 74 20 20 20 20 20 20 20 20    AggGet        
118c0 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 20 20 20 20 20 20 0a 32 36 20 20 20 20 41 67 67        .26    Agg
11900 47 65 74 20 20 20 20 20 20 20 20 30 20 20 20 20  Get        0    
11910 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 0a 32 37 20 20 20 20 41 67 67 47 65 74 20 20   .27    AggGet  
11950 20 20 20 20 20 20 30 20 20 20 20 20 20 32 20 20        0      2  
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 20 20 20 20 0a 32 38 20 20 20 20 41 64         .28    Ad
11990 64 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20  d           0   
119a0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 39               .29
119d0 20 20 20 20 43 61 6c 6c 62 61 63 6b 20 20 20 20      Callback    
119e0 20 20 32 20 20 20 20 20 20 30 20 20 20 20 20 20    2      0      
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 0a 33 30 20 20 20 20 47 6f 74 6f 20 20     .30    Goto  
11a20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 32          0      2
11a30 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 33                .3
11a60 31 20 20 20 20 4e 6f 6f 70 20 20 20 20 20 20 20  1    Noop       
11a70 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11aa0 20 20 20 20 0a 33 32 20 20 20 20 48 61 6c 74 20      .32    Halt 
11ab0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
11ac0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ae0 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 0a 70 75            .}..pu
11af0 74 73 20 7b 0a 3c 70 3e 54 68 65 20 66 69 72 73  ts {.<p>The firs
11b00 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66  t instruction of
11b10 20 69 6e 74 65 72 65 73 74 20 69 73 20 74 68 65   interest is the
11b20 20 0a 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64   .<a href="opcod
11b30 65 2e 68 74 6d 6c 23 41 67 67 52 65 73 65 74 22  e.html#AggReset"
11b40 3e 41 67 67 52 65 73 65 74 3c 2f 61 3e 20 61 74  >AggReset</a> at
11b50 20 32 2e 0a 54 68 65 20 41 67 67 52 65 73 65 74   2..The AggReset
11b60 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 69   instruction ini
11b70 74 69 61 6c 69 7a 65 73 20 74 68 65 20 73 65 74  tializes the set
11b80 20 6f 66 20 62 75 63 6b 65 74 73 20 74 6f 20 62   of buckets to b
11b90 65 20 74 68 65 0a 65 6d 70 74 79 20 73 65 74 20  e the.empty set 
11ba0 61 6e 64 20 73 70 65 63 69 66 69 65 73 20 74 68  and specifies th
11bb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f  e number of memo
11bc0 72 79 20 73 6c 6f 74 73 20 61 76 61 69 6c 61 62  ry slots availab
11bd0 6c 65 20 69 6e 20 65 61 63 68 0a 62 75 63 6b 65  le in each.bucke
11be0 74 20 61 73 20 50 32 2e 20 20 49 6e 20 74 68 69  t as P2.  In thi
11bf0 73 20 65 78 61 6d 70 6c 65 2c 20 65 61 63 68 20  s example, each 
11c00 62 75 63 6b 65 74 20 77 69 6c 6c 20 68 6f 6c 64  bucket will hold
11c10 20 33 20 6d 65 6d 6f 72 79 20 73 6c 6f 74 73 2e   3 memory slots.
11c20 0a 49 74 20 69 73 20 6e 6f 74 20 6f 62 76 69 6f  .It is not obvio
11c30 75 73 2c 20 62 75 74 20 69 66 20 79 6f 75 20 6c  us, but if you l
11c40 6f 6f 6b 20 63 6c 6f 73 65 6c 79 20 61 74 20 74  ook closely at t
11c50 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 70  he rest of the p
11c60 72 6f 67 72 61 6d 0a 79 6f 75 20 63 61 6e 20 66  rogram.you can f
11c70 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 65  igure out what e
11c80 61 63 68 20 6f 66 20 74 68 65 73 65 20 73 6c 6f  ach of these slo
11c90 74 73 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66  ts is intended f
11ca0 6f 72 2e 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63 6b 71  or.</p>..<blockq
11cb0 75 6f 74 65 3e 3c 74 61 62 6c 65 20 62 6f 72 64  uote><table bord
11cc0 65 72 3d 22 32 22 20 63 65 6c 6c 70 61 64 64 69  er="2" cellpaddi
11cd0 6e 67 3d 22 35 22 3e 0a 3c 74 72 3e 3c 74 68 3e  ng="5">.<tr><th>
11ce0 4d 65 6d 6f 72 79 20 53 6c 6f 74 3c 2f 74 68 3e  Memory Slot</th>
11cf0 3c 74 68 3e 49 6e 74 65 6e 64 65 64 20 55 73 65  <th>Intended Use
11d00 20 4f 66 20 54 68 69 73 20 4d 65 6d 6f 72 79 20   Of This Memory 
11d10 53 6c 6f 74 3c 2f 74 68 3e 3c 2f 74 72 3e 0a 3c  Slot</th></tr>.<
11d20 74 72 3e 3c 74 64 3e 30 3c 2f 74 64 3e 3c 74 64  tr><td>0</td><td
11d30 3e 54 68 65 20 22 74 68 72 65 65 22 20 63 6f 6c  >The "three" col
11d40 75 6d 6e 20 2d 2d 20 74 68 65 20 6b 65 79 20 74  umn -- the key t
11d50 6f 20 74 68 65 20 62 75 63 6b 65 74 3c 2f 74 64  o the bucket</td
11d60 3e 3c 2f 74 72 3e 0a 3c 74 72 3e 3c 74 64 3e 31  ></tr>.<tr><td>1
11d70 3c 2f 74 64 3e 3c 74 64 3e 54 68 65 20 6d 69 6e  </td><td>The min
11d80 69 6d 75 6d 20 22 74 68 72 65 65 2b 66 6f 75 72  imum "three+four
11d90 22 20 76 61 6c 75 65 3c 2f 74 64 3e 3c 2f 74 72  " value</td></tr
11da0 3e 0a 3c 74 72 3e 3c 74 64 3e 32 3c 2f 74 64 3e  >.<tr><td>2</td>
11db0 3c 74 64 3e 54 68 65 20 73 75 6d 20 6f 66 20 61  <td>The sum of a
11dc0 6c 6c 20 22 66 6f 75 72 22 20 76 61 6c 75 65 73  ll "four" values
11dd0 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
11de0 6f 20 63 6f 6d 70 75 74 65 20 0a 20 20 20 22 61  o compute .   "a
11df0 76 67 28 66 6f 75 72 29 22 2e 3c 2f 74 64 3e 3c  vg(four)".</td><
11e00 2f 74 72 3e 0a 3c 2f 74 61 62 6c 65 3e 3c 2f 62  /tr>.</table></b
11e10 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e 54  lockquote>..<p>T
11e20 68 65 20 71 75 65 72 79 20 6c 6f 6f 70 20 69 73  he query loop is
11e30 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
11e40 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 38 20 74  instructions 8 t
11e50 68 72 6f 75 67 68 20 32 32 2e 0a 54 68 65 20 61  hrough 22..The a
11e60 67 67 72 65 67 61 74 65 20 6b 65 79 20 73 70 65  ggregate key spe
11e70 63 69 66 69 65 64 20 62 79 20 74 68 65 20 47 52  cified by the GR
11e80 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
11e90 20 63 6f 6d 70 75 74 65 64 0a 62 79 20 69 6e 73   computed.by ins
11ea0 74 72 75 63 74 69 6f 6e 73 20 39 20 61 6e 64 20  tructions 9 and 
11eb0 31 30 2e 20 20 49 6e 73 74 72 75 63 74 69 6f 6e  10.  Instruction
11ec0 20 31 31 20 63 61 75 73 65 73 20 74 68 65 20 61   11 causes the a
11ed0 70 70 72 6f 70 72 69 61 74 65 0a 62 75 63 6b 65  ppropriate.bucke
11ee0 74 20 74 6f 20 63 6f 6d 65 20 69 6e 74 6f 20 66  t to come into f
11ef0 6f 63 75 73 2e 20 20 49 66 20 61 20 62 75 63 6b  ocus.  If a buck
11f00 65 74 20 77 69 74 68 20 74 68 65 20 67 69 76 65  et with the give
11f10 6e 20 6b 65 79 20 64 6f 65 73 0a 6e 6f 74 20 61  n key does.not a
11f20 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 61  lready exists, a
11f30 20 6e 65 77 20 62 75 63 6b 65 74 20 69 73 20 63   new bucket is c
11f40 72 65 61 74 65 64 20 61 6e 64 20 63 6f 6e 74 72  reated and contr
11f50 6f 6c 20 66 61 6c 6c 73 0a 74 68 72 6f 75 67 68  ol falls.through
11f60 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   to instructions
11f70 20 31 32 20 61 6e 64 20 31 33 20 77 68 69 63 68   12 and 13 which
11f80 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
11f90 62 75 63 6b 65 74 2e 0a 49 66 20 74 68 65 20 62  bucket..If the b
11fa0 75 63 6b 65 74 20 64 6f 65 73 20 61 6c 72 65 61  ucket does alrea
11fb0 64 79 20 65 78 69 73 74 2c 20 74 68 65 6e 20 61  dy exist, then a
11fc0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f   jump is made to
11fd0 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 31 34 2e   instruction.14.
11fe0 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20    The values of 
11ff0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
12000 6f 6e 73 20 61 72 65 20 75 70 64 61 74 65 64 20  ons are updated 
12010 62 79 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  by the instructi
12020 6f 6e 73 0a 62 65 74 77 65 65 6e 20 31 31 20 61  ons.between 11 a
12030 6e 64 20 32 31 2e 20 20 49 6e 73 74 72 75 63 74  nd 21.  Instruct
12040 69 6f 6e 73 20 31 34 20 74 68 72 6f 75 67 68 20  ions 14 through 
12050 31 38 20 75 70 64 61 74 65 20 6d 65 6d 6f 72 79  18 update memory
12060 0a 73 6c 6f 74 20 31 20 74 6f 20 68 6f 6c 64 20  .slot 1 to hold 
12070 74 68 65 20 6e 65 78 74 20 76 61 6c 75 65 20 22  the next value "
12080 6d 69 6e 28 74 68 72 65 65 2b 66 6f 75 72 29 22  min(three+four)"
12090 2e 20 20 54 68 65 6e 20 74 68 65 20 73 75 6d 20  .  Then the sum 
120a0 6f 66 20 74 68 65 20 0a 22 66 6f 75 72 22 20 63  of the ."four" c
120b0 6f 6c 75 6d 6e 20 69 73 20 75 70 64 61 74 65 64  olumn is updated
120c0 20 62 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   by instructions
120d0 20 31 39 20 74 68 72 6f 75 67 68 20 32 31 2e 3c   19 through 21.<
120e0 2f 70 3e 0a 0a 3c 70 3e 41 66 74 65 72 20 74 68  /p>..<p>After th
120f0 65 20 71 75 65 72 79 20 6c 6f 6f 70 20 69 73 20  e query loop is 
12100 66 69 6e 69 73 68 65 64 2c 20 74 68 65 20 74 61  finished, the ta
12110 62 6c 65 20 22 65 78 61 6d 70 32 22 20 69 73 20  ble "examp2" is 
12120 63 6c 6f 73 65 64 20 61 74 0a 69 6e 73 74 72 75  closed at.instru
12130 63 74 69 6f 6e 20 32 33 20 73 6f 20 74 68 61 74  ction 23 so that
12140 20 69 74 73 20 6c 6f 63 6b 20 77 69 6c 6c 20 62   its lock will b
12150 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 69  e released and i
12160 74 20 63 61 6e 20 62 65 0a 75 73 65 64 20 62 79  t can be.used by
12170 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 6f   other threads o
12180 72 20 70 72 6f 63 65 73 73 65 73 2e 20 20 54 68  r processes.  Th
12190 65 20 6e 65 78 74 20 73 74 65 70 20 69 73 20 74  e next step is t
121a0 6f 20 6c 6f 6f 70 0a 6f 76 65 72 20 61 6c 6c 20  o loop.over all 
121b0 61 67 67 72 65 67 61 74 65 20 62 75 63 6b 65 74  aggregate bucket
121c0 73 20 61 6e 64 20 6f 75 74 70 75 74 20 6f 6e 65  s and output one
121d0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
121e0 6c 74 20 66 6f 72 0a 65 61 63 68 20 62 75 63 6b  lt for.each buck
121f0 65 74 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e  et.  This is don
12200 65 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 74  e by the loop at
12210 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 32 34   instructions 24
12220 0a 74 68 72 6f 75 67 68 20 33 30 2e 20 20 54 68  .through 30.  Th
12230 65 20 41 67 67 4e 65 78 74 20 69 6e 73 74 72 75  e AggNext instru
12240 63 74 69 6f 6e 20 61 74 20 32 34 20 62 72 69 6e  ction at 24 brin
12250 67 73 20 74 68 65 20 6e 65 78 74 20 62 75 63 6b  gs the next buck
12260 65 74 0a 69 6e 74 6f 20 66 6f 63 75 73 2c 20 6f  et.into focus, o
12270 72 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 65  r jumps to the e
12280 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
12290 66 20 61 6c 6c 20 62 75 63 6b 65 74 73 20 68 61  f all buckets ha
122a0 76 65 0a 62 65 65 6e 20 65 78 61 6d 69 6e 65 64  ve.been examined
122b0 20 61 6c 72 65 61 64 79 2e 20 20 54 68 65 20 33   already.  The 3
122c0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
122d0 72 65 73 75 6c 74 20 61 72 65 20 66 65 74 63 68  result are fetch
122e0 65 64 20 66 72 6f 6d 20 0a 74 68 65 20 61 67 67  ed from .the agg
122f0 72 65 67 61 74 6f 72 20 62 75 63 6b 65 74 20 69  regator bucket i
12300 6e 20 6f 72 64 65 72 20 61 74 20 69 6e 73 74 72  n order at instr
12310 75 63 74 69 6f 6e 73 20 32 35 20 74 68 72 6f 75  uctions 25 throu
12320 67 68 20 32 37 2e 0a 46 69 6e 61 6c 6c 79 2c 20  gh 27..Finally, 
12330 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  the callback is 
12340 69 6e 76 6f 6b 65 64 20 61 74 20 69 6e 73 74 72  invoked at instr
12350 75 63 74 69 6f 6e 20 32 39 2e 3c 2f 70 3e 0a 0a  uction 29.</p>..
12360 3c 70 3e 49 6e 20 73 75 6d 6d 61 72 79 20 74 68  <p>In summary th
12370 65 6e 2c 20 61 6e 79 20 71 75 65 72 79 20 77 69  en, any query wi
12380 74 68 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  th aggregate fun
12390 63 74 69 6f 6e 73 20 69 73 20 69 6d 70 6c 65 6d  ctions is implem
123a0 65 6e 74 65 64 0a 62 79 20 74 77 6f 20 6c 6f 6f  ented.by two loo
123b0 70 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 6c  ps.  The first l
123c0 6f 6f 70 20 73 63 61 6e 73 20 74 68 65 20 69 6e  oop scans the in
123d0 70 75 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  put table and co
123e0 6d 70 75 74 65 73 0a 61 67 67 72 65 67 61 74 65  mputes.aggregate
123f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
12400 6f 20 62 75 63 6b 65 74 73 20 61 6e 64 20 74 68  o buckets and th
12410 65 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 73 63  e second loop sc
12420 61 6e 73 20 74 68 72 6f 75 67 68 0a 61 6c 6c 20  ans through.all 
12430 74 68 65 20 62 75 63 6b 65 74 73 20 74 6f 20 63  the buckets to c
12440 6f 6d 70 75 74 65 20 74 68 65 20 66 69 6e 61 6c  ompute the final
12450 20 72 65 73 75 6c 74 2e 3c 2f 70 3e 0a 0a 3c 70   result.</p>..<p
12460 3e 54 68 65 20 72 65 61 6c 69 7a 61 74 69 6f 6e  >The realization
12470 20 74 68 61 74 20 61 6e 20 61 67 67 72 65 67 61   that an aggrega
12480 74 65 20 71 75 65 72 79 20 69 73 20 72 65 61 6c  te query is real
12490 6c 79 20 74 77 6f 20 63 6f 6e 73 65 71 75 74 69  ly two consequti
124a0 76 65 0a 6c 6f 6f 70 73 20 6d 61 6b 65 73 20 69  ve.loops makes i
124b0 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 6f  t much easier to
124c0 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
124d0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
124e0 65 6e 0a 61 20 57 48 45 52 45 20 63 6c 61 75 73  en.a WHERE claus
124f0 65 20 61 6e 64 20 61 20 48 41 56 49 4e 47 20 63  e and a HAVING c
12500 6c 61 75 73 65 20 69 6e 20 53 51 4c 20 71 75 65  lause in SQL que
12510 72 79 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ry statement.  T
12520 68 65 0a 57 48 45 52 45 20 63 6c 61 75 73 65 20  he.WHERE clause 
12530 69 73 20 61 20 72 65 73 74 72 69 63 74 69 6f 6e  is a restriction
12540 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 6c 6f   on the first lo
12550 6f 70 20 61 6e 64 20 74 68 65 20 48 41 56 49 4e  op and the HAVIN
12560 47 0a 63 6c 61 75 73 65 20 69 73 20 61 20 72 65  G.clause is a re
12570 73 74 72 69 63 74 69 6f 6e 20 6f 6e 20 74 68 65  striction on the
12580 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 2e 20 20 59   second loop.  Y
12590 6f 75 20 63 61 6e 20 73 65 65 20 74 68 69 73 0a  ou can see this.
125a0 62 79 20 61 64 64 69 6e 67 20 62 6f 74 68 20 61  by adding both a
125b0 20 57 48 45 52 45 20 61 6e 64 20 61 20 48 41 56   WHERE and a HAV
125c0 49 4e 47 20 63 6c 61 75 73 65 20 74 6f 20 6f 75  ING clause to ou
125d0 72 20 65 78 61 6d 70 6c 65 20 71 75 65 72 79 3a  r example query:
125e0 3c 2f 70 3e 0a 0a 0a 3c 62 6c 6f 63 6b 71 75 6f  </p>...<blockquo
125f0 74 65 3e 3c 70 72 65 3e 0a 53 45 4c 45 43 54 20  te><pre>.SELECT 
12600 74 68 72 65 65 2c 20 6d 69 6e 28 74 68 72 65 65  three, min(three
12610 2b 66 6f 75 72 29 2b 61 76 67 28 66 6f 75 72 29  +four)+avg(four)
12620 20 0a 46 52 4f 4d 20 65 78 61 6d 70 32 0a 57 48   .FROM examp2.WH
12630 45 52 45 20 74 68 72 65 65 3e 66 6f 75 72 0a 47  ERE three>four.G
12640 52 4f 55 50 20 42 59 20 74 68 72 65 65 0a 48 41  ROUP BY three.HA
12650 56 49 4e 47 20 61 76 67 28 66 6f 75 72 29 3c 31  VING avg(four)<1
12660 30 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b  0;.</pre></block
12670 71 75 6f 74 65 3e 0a 7d 0a 0a 43 6f 64 65 20 7b  quote>.}..Code {
12680 0a 61 64 64 72 20 20 6f 70 63 6f 64 65 20 20 20  .addr  opcode   
12690 20 20 20 20 20 70 31 20 20 20 20 20 70 32 20 20       p1     p2  
126a0 20 20 20 70 33 20 20 20 20 20 20 20 20 20 20 20     p3           
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 20 20 20 20 20 20 20 20 20 0a 2d 2d 2d 2d             .----
126d0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
126e0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d  -----  -----  --
126f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12710 2d 0a 30 20 20 20 20 20 43 6f 6c 75 6d 6e 4e 61  -.0     ColumnNa
12720 6d 65 20 20 20 20 30 20 20 20 20 20 20 30 20 20  me    0      0  
12730 20 20 20 20 74 68 72 65 65 20 20 20 20 20 20 20      three       
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12750 20 20 20 20 20 20 20 0a 31 20 20 20 20 20 43 6f         .1     Co
12760 6c 75 6d 6e 4e 61 6d 65 20 20 20 20 31 20 20 20  lumnName    1   
12770 20 20 20 30 20 20 20 20 20 20 6d 69 6e 28 74 68     0      min(th
12780 72 65 65 2b 66 6f 75 72 29 2b 61 76 67 28 66 6f  ree+four)+avg(fo
12790 75 72 29 20 20 20 20 20 20 20 20 20 20 0a 32 20  ur)          .2 
127a0 20 20 20 20 41 67 67 52 65 73 65 74 20 20 20 20      AggReset    
127b0 20 20 30 20 20 20 20 20 20 33 20 20 20 20 20 20    0      3      
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127e0 20 20 20 20 20 20 20 20 0a 33 20 20 20 20 20 41          .3     A
127f0 67 67 49 6e 69 74 20 20 20 20 20 20 20 30 20 20  ggInit       0  
12800 20 20 20 20 31 20 20 20 20 20 20 70 74 72 28 30      1      ptr(0
12810 78 37 39 30 33 61 30 29 20 20 20 20 20 20 20 20  x7903a0)        
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 34                .4
12830 20 20 20 20 20 41 67 67 49 6e 69 74 20 20 20 20       AggInit    
12840 20 20 20 30 20 20 20 20 20 20 32 20 20 20 20 20     0      2     
12850 20 70 74 72 28 30 78 37 39 30 37 30 30 29 20 20   ptr(0x790700)  
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12870 20 20 20 20 0a 35 20 20 20 20 20 49 6e 74 65 67      .5     Integ
12880 65 72 20 20 20 20 20 20 20 30 20 20 20 20 20 20  er       0      
12890 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 20 20 20 20 20 20 20 0a 36 20 20 20 20            .6    
128c0 20 4f 70 65 6e 52 65 61 64 20 20 20 20 20 20 30   OpenRead      0
128d0 20 20 20 20 20 20 35 20 20 20 20 20 20 65 78 61        5      exa
128e0 6d 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  mp2             
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12900 0a 37 20 20 20 20 20 56 65 72 69 66 79 43 6f 6f  .7     VerifyCoo
12910 6b 69 65 20 20 30 20 20 20 20 20 20 39 30 39 20  kie  0      909 
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12940 20 20 20 20 20 20 20 20 20 20 20 0a 38 20 20 20             .8   
12950 20 20 52 65 77 69 6e 64 20 20 20 20 20 20 20 20    Rewind        
12960 30 20 20 20 20 20 20 32 36 20 20 20 20 20 20 20  0      26       
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12990 20 20 20 20 20 20 0a 39 20 20 20 20 20 43 6f 6c        .9     Col
129a0 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20 20  umn        0    
129b0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129d0 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 30 20              .10 
129e0 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20     Column       
129f0 20 30 20 20 20 20 20 20 31 20 20 20 20 20 20 20   0      1       
12a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a20 20 20 0a 31 31 20 20 20 20 4c 65 20 20 20 20 20    .11    Le     
12a30 20 20 20 20 20 20 20 31 20 20 20 20 20 20 32 35         1      25
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a60 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 32               .12
12a70 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20      Column      
12a80 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ab0 20 20 20 0a 31 33 20 20 20 20 4d 61 6b 65 4b 65     .13    MakeKe
12ac0 79 20 20 20 20 20 20 20 31 20 20 20 20 20 20 30  y       1      0
12ad0 20 20 20 20 20 20 6e 20 20 20 20 20 20 20 20 20        n         
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12af0 20 20 20 20 20 20 20 20 20 0a 31 34 20 20 20 20           .14    
12b00 41 67 67 46 6f 63 75 73 20 20 20 20 20 20 30 20  AggFocus      0 
12b10 20 20 20 20 20 31 37 20 20 20 20 20 20 20 20 20       17         
12b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b40 20 20 20 20 0a 31 35 20 20 20 20 43 6f 6c 75 6d      .15    Colum
12b50 6e 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20  n        0      
12b60 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b80 20 20 20 20 20 20 20 20 20 20 0a 31 36 20 20 20            .16   
12b90 20 41 67 67 53 65 74 20 20 20 20 20 20 20 20 30   AggSet        0
12ba0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bd0 0a 31 37 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20  .17    Column   
12be0 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20       0      0   
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c10 20 20 20 20 20 20 0a 31 38 20 20 20 20 43 6f 6c        .18    Col
12c20 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20 20  umn        0    
12c30 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 39 20              .19 
12c60 20 20 20 41 64 64 20 20 20 20 20 20 20 20 20 20     Add          
12c70 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
12c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ca0 20 20 0a 32 30 20 20 20 20 49 6e 74 65 67 65 72    .20    Integer
12cb0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 30 20         1      0 
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 20 20 20 20 20 20 20 0a 32 31 20 20 20 20 41          .21    A
12cf0 67 67 46 75 6e 63 20 20 20 20 20 20 20 30 20 20  ggFunc       0  
12d00 20 20 20 20 31 20 20 20 20 20 20 70 74 72 28 30      1      ptr(0
12d10 78 37 39 30 33 61 30 29 20 20 20 20 20 20 20 20  x7903a0)        
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32                .2
12d30 32 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20  2    Column     
12d40 20 20 20 30 20 20 20 20 20 20 31 20 20 20 20 20     0      1     
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 0a 32 33 20 20 20 20 49 6e 74 65 67      .23    Integ
12d80 65 72 20 20 20 20 20 20 20 32 20 20 20 20 20 20  er       2      
12d90 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 20 20 20 20 20 20 20 0a 32 34 20 20 20            .24   
12dc0 20 41 67 67 46 75 6e 63 20 20 20 20 20 20 20 30   AggFunc       0
12dd0 20 20 20 20 20 20 31 20 20 20 20 20 20 70 74 72        1      ptr
12de0 28 30 78 37 39 30 37 30 30 29 20 20 20 20 20 20  (0x790700)      
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 0a 32 35 20 20 20 20 4e 65 78 74 20 20 20 20 20  .25    Next     
12e10 20 20 20 20 20 30 20 20 20 20 20 20 39 20 20 20       0      9   
12e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e40 20 20 20 20 20 20 20 20 20 20 20 0a 32 36 20 20             .26  
12e50 20 20 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20    Close         
12e60 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 20 20 20 20 20 20 0a 32 37 20 20 20 20 41 67 67        .27    Agg
12ea0 4e 65 78 74 20 20 20 20 20 20 20 30 20 20 20 20  Next       0    
12eb0 20 20 33 37 20 20 20 20 20 20 20 20 20 20 20 20    37            
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 0a 32 38 20 20 20 20 41 67 67 47 65 74 20 20   .28    AggGet  
12ef0 20 20 20 20 20 20 30 20 20 20 20 20 20 32 20 20        0      2  
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 20 20 20 20 20 20 0a 32 39 20 20 20 20 49 6e         .29    In
12f30 74 65 67 65 72 20 20 20 20 20 20 20 31 30 20 20  teger       10  
12f40 20 20 20 30 20 20 20 20 20 20 31 30 20 20 20 20     0      10    
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f60 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 33 30               .30
12f70 20 20 20 20 47 65 20 20 20 20 20 20 20 20 20 20      Ge          
12f80 20 20 31 20 20 20 20 20 20 32 37 20 20 20 20 20    1      27     
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fb0 20 20 20 20 20 20 20 20 0a 33 31 20 20 20 20 41          .31    A
12fc0 67 67 47 65 74 20 20 20 20 20 20 20 20 30 20 20  ggGet        0  
12fd0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 33                .3
13000 32 20 20 20 20 41 67 67 47 65 74 20 20 20 20 20  2    AggGet     
13010 20 20 20 30 20 20 20 20 20 20 31 20 20 20 20 20     0      1     
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13040 20 20 20 20 0a 33 33 20 20 20 20 41 67 67 47 65      .33    AggGe
13050 74 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20  t        0      
13060 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13080 20 20 20 20 20 20 20 20 20 20 0a 33 34 20 20 20            .34   
13090 20 41 64 64 20 20 20 20 20 20 20 20 20 20 20 30   Add           0
130a0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 0a 33 35 20 20 20 20 43 61 6c 6c 62 61 63 6b 20  .35    Callback 
130e0 20 20 20 20 20 32 20 20 20 20 20 20 30 20 20 20       2      0   
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 20 20 20 20 0a 33 36 20 20 20 20 47 6f 74        .36    Got
13120 6f 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20  o          0    
13130 20 20 32 37 20 20 20 20 20 20 20 20 20 20 20 20    27            
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 0a 33 37 20 20 20 20 4e 6f 6f 70 20 20 20 20   .37    Noop    
13170 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 20 20 20 0a 33 38 20 20 20 20 48 61         .38    Ha
131b0 6c 74 20 20 20 20 20 20 20 20 20 20 30 20 20 20  lt          0   
131c0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a               .}.
131f0 0a 70 75 74 73 20 7b 0a 3c 70 3e 54 68 65 20 63  .puts {.<p>The c
13200 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 6e  ode generated in
13210 20 74 68 69 73 20 6c 61 73 74 20 65 78 61 6d 70   this last examp
13220 6c 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  le is the same a
13230 73 20 74 68 65 0a 70 72 65 76 69 6f 75 73 20 65  s the.previous e
13240 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 61 64  xcept for the ad
13250 64 69 74 69 6f 6e 20 6f 66 20 74 77 6f 20 63 6f  dition of two co
13260 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 73 20  nditional jumps 
13270 75 73 65 64 0a 74 6f 20 69 6d 70 6c 65 6d 65 6e  used.to implemen
13280 74 20 74 68 65 20 65 78 74 72 61 20 57 48 45 52  t the extra WHER
13290 45 20 61 6e 64 20 48 41 56 49 4e 47 20 63 6c 61  E and HAVING cla
132a0 75 73 65 73 2e 20 20 54 68 65 20 57 48 45 52 45  uses.  The WHERE
132b0 0a 63 6c 61 75 73 65 20 69 73 20 69 6d 70 6c 65  .clause is imple
132c0 6d 65 6e 74 65 64 20 62 79 20 69 6e 73 74 72 75  mented by instru
132d0 63 74 69 6f 6e 73 20 39 20 74 68 72 6f 75 67 68  ctions 9 through
132e0 20 31 31 20 69 6e 20 74 68 65 20 71 75 65 72 79   11 in the query
132f0 0a 6c 6f 6f 70 2e 20 20 54 68 65 20 48 41 56 49  .loop.  The HAVI
13300 4e 47 20 63 6c 61 75 73 65 20 69 73 20 69 6d 70  NG clause is imp
13310 6c 65 6d 65 6e 74 65 64 20 62 79 20 69 6e 73 74  lemented by inst
13320 72 75 63 74 69 6f 6e 20 32 38 20 74 68 72 6f 75  ruction 28 throu
13330 67 68 0a 33 30 20 69 6e 20 74 68 65 20 6f 75 74  gh.30 in the out
13340 70 75 74 20 6c 6f 6f 70 2e 3c 2f 70 3e 0a 0a 3c  put loop.</p>..<
13350 68 32 3e 55 73 69 6e 67 20 53 45 4c 45 43 54 20  h2>Using SELECT 
13360 53 74 61 74 65 6d 65 6e 74 73 20 41 73 20 54 65  Statements As Te
13370 72 6d 73 20 49 6e 20 41 6e 20 45 78 70 72 65 73  rms In An Expres
13380 73 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 54 68  sion</h2>..<p>Th
13390 65 20 76 65 72 79 20 6e 61 6d 65 20 22 53 74 72  e very name "Str
133a0 75 63 74 75 72 65 64 20 51 75 65 72 79 20 4c 61  uctured Query La
133b0 6e 67 75 61 67 65 22 20 74 65 6c 6c 73 20 75 73  nguage" tells us
133c0 20 74 68 61 74 20 53 51 4c 20 73 68 6f 75 6c 64   that SQL should
133d0 0a 73 75 70 70 6f 72 74 20 6e 65 73 74 65 64 20  .support nested 
133e0 71 75 65 72 69 65 73 2e 20 20 41 6e 64 2c 20 69  queries.  And, i
133f0 6e 20 66 61 63 74 2c 20 74 77 6f 20 64 69 66 66  n fact, two diff
13400 65 72 65 6e 74 20 6b 69 6e 64 73 20 6f 66 20 6e  erent kinds of n
13410 65 73 74 69 6e 67 0a 61 72 65 20 73 75 70 70 6f  esting.are suppo
13420 72 74 65 64 2e 20 20 41 6e 79 20 53 45 4c 45 43  rted.  Any SELEC
13430 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
13440 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c   returns a singl
13450 65 2d 72 6f 77 2c 20 73 69 6e 67 6c 65 2d 63 6f  e-row, single-co
13460 6c 75 6d 6e 0a 72 65 73 75 6c 74 20 63 61 6e 20  lumn.result can 
13470 62 65 20 75 73 65 64 20 61 73 20 61 20 74 65 72  be used as a ter
13480 6d 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69  m in an expressi
13490 6f 6e 20 6f 66 20 61 6e 6f 74 68 65 72 20 53 45  on of another SE
134a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
134b0 41 6e 64 2c 20 61 20 53 45 4c 45 43 54 20 73 74  And, a SELECT st
134c0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 72 65 74  atement that ret
134d0 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 2d 63 6f  urns a single-co
134e0 6c 75 6d 6e 2c 20 6d 75 6c 74 69 2d 72 6f 77 20  lumn, multi-row 
134f0 72 65 73 75 6c 74 0a 63 61 6e 20 62 65 20 75 73  result.can be us
13500 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d  ed as the right-
13510 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66 20  hand operand of 
13520 74 68 65 20 49 4e 20 61 6e 64 20 4e 4f 54 20 49  the IN and NOT I
13530 4e 20 6f 70 65 72 61 74 6f 72 73 2e 0a 57 65 20  N operators..We 
13540 77 69 6c 6c 20 62 65 67 69 6e 20 74 68 69 73 20  will begin this 
13550 73 65 63 74 69 6f 6e 20 77 69 74 68 20 61 6e 20  section with an 
13560 65 78 61 6d 70 6c 65 20 6f 66 20 74 68 65 20 66  example of the f
13570 69 72 73 74 20 6b 69 6e 64 20 6f 66 20 6e 65 73  irst kind of nes
13580 74 69 6e 67 2c 0a 77 68 65 72 65 20 61 20 73 69  ting,.where a si
13590 6e 67 6c 65 2d 72 6f 77 2c 20 73 69 6e 67 6c 65  ngle-row, single
135a0 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 20 69  -column SELECT i
135b0 73 20 75 73 65 64 20 61 73 20 61 20 74 65 72 6d  s used as a term
135c0 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f   in an expressio
135d0 6e 0a 6f 66 20 61 6e 6f 74 68 65 72 20 53 45 4c  n.of another SEL
135e0 45 43 54 2e 20 20 48 65 72 65 20 69 73 20 6f 75  ECT.  Here is ou
135f0 72 20 65 78 61 6d 70 6c 65 3a 3c 2f 70 3e 0a 0a  r example:</p>..
13600 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
13610 3e 0a 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  >.SELECT * FROM 
13620 65 78 61 6d 70 0a 57 48 45 52 45 20 74 77 6f 21  examp.WHERE two!
13630 3d 28 53 45 4c 45 43 54 20 74 68 72 65 65 20 46  =(SELECT three F
13640 52 4f 4d 20 65 78 61 6d 70 32 0a 20 20 20 20 20  ROM examp2.     
13650 20 20 20 20 20 20 20 57 48 45 52 45 20 66 6f 75         WHERE fou
13660 72 3d 35 29 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c  r=5);.</pre></bl
13670 6f 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e 54 68  ockquote>..<p>Th
13680 65 20 77 61 79 20 53 51 4c 69 74 65 20 64 65 61  e way SQLite dea
13690 6c 73 20 77 69 74 68 20 74 68 69 73 20 69 73 20  ls with this is 
136a0 74 6f 20 66 69 72 73 74 20 72 75 6e 20 74 68 65  to first run the
136b0 20 69 6e 6e 65 72 20 53 45 4c 45 43 54 0a 28 74   inner SELECT.(t
136c0 68 65 20 6f 6e 65 20 61 67 61 69 6e 73 74 20 65  he one against e
136d0 78 61 6d 70 32 29 20 61 6e 64 20 73 74 6f 72 65  xamp2) and store
136e0 20 69 74 73 20 72 65 73 75 6c 74 20 69 6e 20 61   its result in a
136f0 20 70 72 69 76 61 74 65 20 6d 65 6d 6f 72 79 0a   private memory.
13700 63 65 6c 6c 2e 20 20 53 51 4c 69 74 65 20 74 68  cell.  SQLite th
13710 65 6e 20 73 75 62 73 74 69 74 75 74 65 73 20 74  en substitutes t
13720 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  he value of this
13730 20 70 72 69 76 61 74 65 20 6d 65 6d 6f 72 79 0a   private memory.
13740 63 65 6c 6c 20 66 6f 72 20 74 68 65 20 69 6e 6e  cell for the inn
13750 65 72 20 53 45 4c 45 43 54 20 77 68 65 6e 20 69  er SELECT when i
13760 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20  t evaluates the 
13770 6f 75 74 65 72 20 53 45 4c 45 43 54 2e 0a 54 68  outer SELECT..Th
13780 65 20 63 6f 64 65 20 6c 6f 6f 6b 73 20 6c 69 6b  e code looks lik
13790 65 20 74 68 69 73 3a 3c 2f 70 3e 0a 7d 0a 0a 43  e this:</p>.}..C
137a0 6f 64 65 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f  ode {.addr  opco
137b0 64 65 20 20 20 20 20 20 20 20 70 31 20 20 20 20  de        p1    
137c0 20 70 32 20 20 20 20 20 70 33 20 20 20 20 20 20   p2     p3      
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  .----  ---------
13800 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ---  -----  ----
13810 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13830 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 53 74 72  ------.0     Str
13840 69 6e 67 20 20 20 20 20 20 20 20 30 20 20 20 20  ing        0    
13850 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 20 20              .1  
13880 20 20 20 4d 65 6d 53 74 6f 72 65 20 20 20 20 20     MemStore     
13890 20 30 20 20 20 20 20 20 31 20 20 20 20 20 20 20   0      1       
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 20 20 0a 32 20 20 20 20 20 49 6e 74 65 67 65 72    .2     Integer
138d0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 20 20 20 20 20 20 20 20 0a 33 20 20 20 20 20 4f          .3     O
13910 70 65 6e 52 65 61 64 20 20 20 20 20 20 31 20 20  penRead      1  
13920 20 20 20 20 35 20 20 20 20 20 20 65 78 61 6d 70      5      examp
13930 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
13940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 34                .4
13950 20 20 20 20 20 56 65 72 69 66 79 43 6f 6f 6b 69       VerifyCooki
13960 65 20 20 30 20 20 20 20 20 20 39 30 39 20 20 20  e  0      909   
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 20 20 20 20 20 20 0a 35 20 20 20 20 20           .5     
139a0 52 65 77 69 6e 64 20 20 20 20 20 20 20 20 31 20  Rewind        1 
139b0 20 20 20 20 20 31 33 20 20 20 20 20 20 20 20 20       13         
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 20 20 0a 36 20 20 20 20 20 43 6f 6c 75 6d      .6     Colum
139f0 6e 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20  n        1      
13a00 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 20 20 20 20 20 20 20 20 20 20 0a 37 20 20 20 20            .7    
13a30 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 35   Integer       5
13a40 20 20 20 20 20 20 30 20 20 20 20 20 20 35 20 20        0      5  
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 0a 38 20 20 20 20 20 4e 65 20 20 20 20 20 20 20  .8     Ne       
13a80 20 20 20 20 20 31 20 20 20 20 20 20 31 32 20 20       1      12  
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 20 20 20 20 20 0a 39 20 20 20 20 20 43 6f 6c        .9     Col
13ac0 75 6d 6e 20 20 20 20 20 20 20 20 31 20 20 20 20  umn        1    
13ad0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13af0 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 30 20              .10 
13b00 20 20 20 4d 65 6d 53 74 6f 72 65 20 20 20 20 20     MemStore     
13b10 20 30 20 20 20 20 20 20 31 20 20 20 20 20 20 20   0      1       
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 20 20 0a 31 31 20 20 20 20 47 6f 74 6f 20 20 20    .11    Goto   
13b50 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31 33         0      13
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 32               .12
13b90 20 20 20 20 4e 65 78 74 20 20 20 20 20 20 20 20      Next        
13ba0 20 20 31 20 20 20 20 20 20 36 20 20 20 20 20 20    1      6      
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bd0 20 20 20 20 20 20 20 20 0a 31 33 20 20 20 20 43          .13    C
13be0 6c 6f 73 65 20 20 20 20 20 20 20 20 20 31 20 20  lose         1  
13bf0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
13c20 34 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20  4    ColumnName 
13c30 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
13c40 20 6f 6e 65 20 20 20 20 20 20 20 20 20 20 20 20   one            
13c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c60 20 20 20 20 0a 31 35 20 20 20 20 43 6f 6c 75 6d      .15    Colum
13c70 6e 4e 61 6d 65 20 20 20 20 31 20 20 20 20 20 20  nName    1      
13c80 30 20 20 20 20 20 20 74 77 6f 20 20 20 20 20 20  0      two      
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 20 20 20 20 20 20 20 20 20 20 0a 31 36 20 20 20            .16   
13cb0 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 30   Integer       0
13cc0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 0a 31 37 20 20 20 20 4f 70 65 6e 52 65 61 64 20  .17    OpenRead 
13d00 20 20 20 20 20 30 20 20 20 20 20 20 33 20 20 20       0      3   
13d10 20 20 20 65 78 61 6d 70 20 20 20 20 20 20 20 20     examp        
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d30 20 20 20 20 20 20 0a 31 38 20 20 20 20 52 65 77        .18    Rew
13d40 69 6e 64 20 20 20 20 20 20 20 20 30 20 20 20 20  ind        0    
13d50 20 20 32 36 20 20 20 20 20 20 20 20 20 20 20 20    26            
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d80 20 0a 31 39 20 20 20 20 43 6f 6c 75 6d 6e 20 20   .19    Column  
13d90 20 20 20 20 20 20 30 20 20 20 20 20 20 31 20 20        0      1  
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 20 20 20 20 20 20 20 0a 32 30 20 20 20 20 4d 65         .20    Me
13dd0 6d 4c 6f 61 64 20 20 20 20 20 20 20 30 20 20 20  mLoad       0   
13de0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 31               .21
13e10 20 20 20 20 45 71 20 20 20 20 20 20 20 20 20 20      Eq          
13e20 20 20 31 20 20 20 20 20 20 32 35 20 20 20 20 20    1      25     
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e50 20 20 20 20 20 20 20 20 0a 32 32 20 20 20 20 43          .22    C
13e60 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20  olumn        0  
13e70 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32                .2
13ea0 33 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20  3    Column     
13eb0 20 20 20 30 20 20 20 20 20 20 31 20 20 20 20 20     0      1     
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 20 0a 32 34 20 20 20 20 43 61 6c 6c 62      .24    Callb
13ef0 61 63 6b 20 20 20 20 20 20 32 20 20 20 20 20 20  ack      2      
13f00 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 20 20 20 20 20 0a 32 35 20 20 20            .25   
13f30 20 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 30   Next          0
13f40 20 20 20 20 20 20 31 39 20 20 20 20 20 20 20 20        19        
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 0a 32 36 20 20 20 20 43 6c 6f 73       .26    Clos
13f80 65 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20  e         0     
13f90 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 20 20 20 20 20 20 20 20 0a 32 37 20 20             .27  
13fc0 20 20 48 61 6c 74 20 20 20 20 20 20 20 20 20 20    Halt          
13fd0 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14000 20 0a 7d 0a 0a 70 75 74 73 20 7b 0a 3c 70 3e 54   .}..puts {.<p>T
14010 68 65 20 70 72 69 76 61 74 65 20 6d 65 6d 6f 72  he private memor
14020 79 20 63 65 6c 6c 20 69 73 20 69 6e 69 74 69 61  y cell is initia
14030 6c 69 7a 65 64 20 74 6f 20 4e 55 4c 4c 20 62 79  lized to NULL by
14040 20 74 68 65 20 66 69 72 73 74 0a 74 77 6f 20 69   the first.two i
14050 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 49 6e  nstructions.  In
14060 73 74 72 75 63 74 69 6f 6e 73 20 32 20 74 68 72  structions 2 thr
14070 6f 75 67 68 20 31 33 20 69 6d 70 6c 65 6d 65 6e  ough 13 implemen
14080 74 20 74 68 65 20 69 6e 6e 65 72 0a 53 45 4c 45  t the inner.SELE
14090 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61  CT statement aga
140a0 69 6e 73 74 20 74 68 65 20 65 78 61 6d 70 32 20  inst the examp2 
140b0 74 61 62 6c 65 2e 20 20 4e 6f 74 69 63 65 20 74  table.  Notice t
140c0 68 61 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 73  hat instead of.s
140d0 65 6e 64 69 6e 67 20 74 68 65 20 72 65 73 75 6c  ending the resul
140e0 74 20 74 6f 20 61 20 63 61 6c 6c 62 61 63 6b 20  t to a callback 
140f0 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 20 72  or storing the r
14100 65 73 75 6c 74 20 6f 6e 20 61 20 73 6f 72 74 65  esult on a sorte
14110 72 2c 0a 74 68 65 20 72 65 73 75 6c 74 20 6f 66  r,.the result of
14120 20 74 68 65 20 71 75 65 72 79 20 69 73 20 70 75   the query is pu
14130 73 68 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 65  shed into the me
14140 6d 6f 72 79 20 63 65 6c 6c 20 62 79 20 69 6e 73  mory cell by ins
14150 74 72 75 63 74 69 6f 6e 0a 31 30 20 61 6e 64 20  truction.10 and 
14160 74 68 65 20 6c 6f 6f 70 20 69 73 20 61 62 61 6e  the loop is aban
14170 64 6f 6e 65 64 20 62 79 20 74 68 65 20 6a 75 6d  doned by the jum
14180 70 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  p at instruction
14190 20 31 31 2e 20 20 0a 54 68 65 20 6a 75 6d 70 20   11.  .The jump 
141a0 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  at instruction a
141b0 74 20 31 31 20 69 73 20 76 65 73 74 69 67 69 61  t 11 is vestigia
141c0 6c 20 61 6e 64 20 6e 65 76 65 72 20 65 78 65 63  l and never exec
141d0 75 74 65 73 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68  utes.</p>..<p>Th
141e0 65 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 69  e outer SELECT i
141f0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
14200 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 31 34   instructions 14
14210 20 74 68 72 6f 75 67 68 20 32 35 2e 0a 49 6e 20   through 25..In 
14220 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 65 20  particular, the 
14230 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
14240 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  t contains the n
14250 65 73 74 65 64 20 73 65 6c 65 63 74 0a 69 73 20  ested select.is 
14260 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 69  implemented by i
14270 6e 73 74 72 75 63 74 69 6f 6e 73 20 31 39 20 74  nstructions 19 t
14280 68 72 6f 75 67 68 20 32 31 2e 20 20 59 6f 75 20  hrough 21.  You 
14290 63 61 6e 20 73 65 65 20 74 68 61 74 0a 74 68 65  can see that.the
142a0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 69   result of the i
142b0 6e 6e 65 72 20 73 65 6c 65 63 74 20 69 73 20 6c  nner select is l
142c0 6f 61 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 73  oaded onto the s
142d0 74 61 63 6b 20 62 79 20 69 6e 73 74 72 75 63 74  tack by instruct
142e0 69 6f 6e 0a 32 30 20 61 6e 64 20 75 73 65 64 20  ion.20 and used 
142f0 62 79 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  by the condition
14300 61 6c 20 6a 75 6d 70 20 61 74 20 32 31 2e 3c 2f  al jump at 21.</
14310 70 3e 0a 0a 3c 70 3e 57 68 65 6e 20 74 68 65 20  p>..<p>When the 
14320 72 65 73 75 6c 74 20 6f 66 20 61 20 73 75 62 2d  result of a sub-
14330 73 65 6c 65 63 74 20 69 73 20 61 20 73 63 61 6c  select is a scal
14340 61 72 2c 20 61 20 73 69 6e 67 6c 65 20 70 72 69  ar, a single pri
14350 76 61 74 65 20 6d 65 6d 6f 72 79 0a 63 65 6c 6c  vate memory.cell
14360 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 61 73   can be used, as
14370 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 70 72   shown in the pr
14380 65 76 69 6f 75 73 0a 65 78 61 6d 70 6c 65 2e 20  evious.example. 
14390 20 42 75 74 20 77 68 65 6e 20 74 68 65 20 72 65   But when the re
143a0 73 75 6c 74 20 6f 66 20 61 20 73 75 62 2d 73 65  sult of a sub-se
143b0 6c 65 63 74 20 69 73 20 61 20 76 65 63 74 6f 72  lect is a vector
143c0 2c 20 73 75 63 68 0a 61 73 20 77 68 65 6e 20 74  , such.as when t
143d0 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69 73  he sub-select is
143e0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
143f0 6f 70 65 72 61 6e 64 20 6f 66 20 49 4e 20 6f 72  operand of IN or
14400 20 4e 4f 54 20 49 4e 2c 0a 61 20 64 69 66 66 65   NOT IN,.a diffe
14410 72 65 6e 74 20 61 70 70 72 6f 61 63 68 20 69 73  rent approach is
14420 20 6e 65 65 64 65 64 2e 20 20 49 6e 20 74 68 69   needed.  In thi
14430 73 20 63 61 73 65 2c 20 0a 74 68 65 20 72 65 73  s case, .the res
14440 75 6c 74 20 6f 66 20 74 68 65 20 73 75 62 2d 73  ult of the sub-s
14450 65 6c 65 63 74 20 69 73 0a 73 74 6f 72 65 64 20  elect is.stored 
14460 69 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  in a transient t
14470 61 62 6c 65 20 61 6e 64 20 74 68 65 20 63 6f 6e  able and the con
14480 74 65 6e 74 73 20 6f 66 20 74 68 61 74 20 74 61  tents of that ta
14490 62 6c 65 0a 61 72 65 20 74 65 73 74 65 64 20 75  ble.are tested u
144a0 73 69 6e 67 20 74 68 65 20 46 6f 75 6e 64 20 6f  sing the Found o
144b0 72 20 4e 6f 74 46 6f 75 6e 64 20 6f 70 65 72 61  r NotFound opera
144c0 74 6f 72 73 2e 20 20 43 6f 6e 73 69 64 65 72 20  tors.  Consider 
144d0 74 68 69 73 0a 65 78 61 6d 70 6c 65 3a 3c 2f 70  this.example:</p
144e0 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c  >..<blockquote><
144f0 70 72 65 3e 0a 53 45 4c 45 43 54 20 2a 20 46 52  pre>.SELECT * FR
14500 4f 4d 20 65 78 61 6d 70 0a 57 48 45 52 45 20 74  OM examp.WHERE t
14510 77 6f 20 49 4e 20 28 53 45 4c 45 43 54 20 74 68  wo IN (SELECT th
14520 72 65 65 20 46 52 4f 4d 20 65 78 61 6d 70 32 29  ree FROM examp2)
14530 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71  ;.</pre></blockq
14540 75 6f 74 65 3e 0a 0a 3c 70 3e 54 68 65 20 63 6f  uote>..<p>The co
14550 64 65 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  de generated to 
14560 69 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 20 6c  implement this l
14570 61 73 74 20 71 75 65 72 79 20 69 73 20 61 73 20  ast query is as 
14580 66 6f 6c 6c 6f 77 73 3a 3c 2f 70 3e 0a 7d 0a 0a  follows:</p>.}..
14590 43 6f 64 65 20 7b 0a 61 64 64 72 20 20 6f 70 63  Code {.addr  opc
145a0 6f 64 65 20 20 20 20 20 20 20 20 70 31 20 20 20  ode        p1   
145b0 20 20 70 32 20 20 20 20 20 70 33 20 20 20 20 20    p2     p3     
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d   .----  --------
145f0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d  ----  -----  ---
14600 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
14610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14620 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 4f 70  -------.0     Op
14630 65 6e 54 65 6d 70 20 20 20 20 20 20 31 20 20 20  enTemp      1   
14640 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 20               .1 
14670 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20      Integer     
14680 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 0a 32 20 20 20 20 20 4f 70 65 6e 52 65     .2     OpenRe
146c0 61 64 20 20 20 20 20 20 32 20 20 20 20 20 20 35  ad      2      5
146d0 20 20 20 20 20 20 65 78 61 6d 70 32 20 20 20 20        examp2    
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146f0 20 20 20 20 20 20 20 20 20 0a 33 20 20 20 20 20           .3     
14700 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 20 30 20  VerifyCookie  0 
14710 20 20 20 20 20 39 30 39 20 20 20 20 20 20 20 20       909        
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14740 20 20 20 20 0a 34 20 20 20 20 20 52 65 77 69 6e      .4     Rewin
14750 64 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20  d        2      
14760 31 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  10              
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14780 20 20 20 20 20 20 20 20 20 20 0a 35 20 20 20 20            .5    
14790 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 32   Column        2
147a0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 0a 36 20 20 20 20 20 49 73 4e 75 6c 6c 20 20 20  .6     IsNull   
147e0 20 20 20 20 20 2d 31 20 20 20 20 20 39 20 20 20       -1     9   
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14810 20 20 20 20 20 20 20 20 20 20 20 0a 37 20 20 20             .7   
14820 20 20 53 74 72 69 6e 67 20 20 20 20 20 20 20 20    String        
14830 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 0a 38 20 20 20 20 20 50 75 74 53 74 72 4b 65   .8     PutStrKe
14870 79 20 20 20 20 20 31 20 20 20 20 20 20 30 20 20  y     1      0  
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 20 20 20 20 0a 39 20 20 20 20 20 4e 65         .9     Ne
148b0 78 74 20 20 20 20 20 20 20 20 20 20 32 20 20 20  xt          2   
148c0 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 0a 31 30 20 20 20 20 43 6c 6f 73 65 20 20    .10    Close  
14900 20 20 20 20 20 20 20 32 20 20 20 20 20 20 30 20         2      0 
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14930 20 20 20 20 20 20 20 20 0a 31 31 20 20 20 20 43          .11    C
14940 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20 30 20 20  olumnName    0  
14950 20 20 20 20 30 20 20 20 20 20 20 6f 6e 65 20 20      0      one  
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
14980 32 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20  2    ColumnName 
14990 20 20 20 31 20 20 20 20 20 20 30 20 20 20 20 20     1      0     
149a0 20 74 77 6f 20 20 20 20 20 20 20 20 20 20 20 20   two            
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149c0 20 20 20 20 0a 31 33 20 20 20 20 49 6e 74 65 67      .13    Integ
149d0 65 72 20 20 20 20 20 20 20 30 20 20 20 20 20 20  er       0      
149e0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 20 20 20 20 20 20 20 20 20 20 0a 31 34 20 20 20            .14   
14a10 20 4f 70 65 6e 52 65 61 64 20 20 20 20 20 20 30   OpenRead      0
14a20 20 20 20 20 20 20 33 20 20 20 20 20 20 65 78 61        3      exa
14a30 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mp              
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 0a 31 35 20 20 20 20 52 65 77 69 6e 64 20 20 20  .15    Rewind   
14a60 20 20 20 20 20 30 20 20 20 20 20 20 32 35 20 20       0      25  
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 20 20 20 20 20 20 20 20 20 20 20 0a 31 36 20 20             .16  
14aa0 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20    Column        
14ab0 30 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  0      1        
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 20 0a 31 37 20 20 20 20 4e 6f 74 4e 75 6c 6c 20   .17    NotNull 
14af0 20 20 20 20 20 20 2d 31 20 20 20 20 20 32 30 20        -1     20 
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 20 20 20 0a 31 38 20 20 20 20 50 6f         .18    Po
14b30 70 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20  p           1   
14b40 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 39               .19
14b70 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 20      Goto        
14b80 20 20 30 20 20 20 20 20 20 32 34 20 20 20 20 20    0      24     
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 20 20 20 20 20 20 20 0a 32 30 20 20 20 20 4e          .20    N
14bc0 6f 74 46 6f 75 6e 64 20 20 20 20 20 20 31 20 20  otFound      1  
14bd0 20 20 20 20 32 34 20 20 20 20 20 20 20 20 20 20      24          
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 0a 32 31 20 20 20 20 43 6f 6c 75 6d 6e     .21    Column
14c10 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30          0      0
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c40 20 20 20 20 20 20 20 20 20 0a 32 32 20 20 20 20           .22    
14c50 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20  Column        0 
14c60 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
14c90 32 33 20 20 20 20 43 61 6c 6c 62 61 63 6b 20 20  23    Callback  
14ca0 20 20 20 20 32 20 20 20 20 20 20 30 20 20 20 20      2      0    
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 20 20 20 20 20 0a 32 34 20 20 20 20 4e 65 78 74       .24    Next
14ce0 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
14cf0 20 31 36 20 20 20 20 20 20 20 20 20 20 20 20 20   16             
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 0a 32 35 20 20 20 20 43 6c 6f 73 65 20 20 20 20  .25    Close    
14d30 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20       0      0   
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 20 20 20 20 20 20 0a 32 36 20 20 20 20 48 61 6c        .26    Hal
14d70 74 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20  t          0    
14d80 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14da0 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 0a              .}..
14db0 70 75 74 73 20 7b 0a 3c 70 3e 54 68 65 20 74 72  puts {.<p>The tr
14dc0 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 69 6e  ansient table in
14dd0 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
14de0 74 73 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ts of the inner 
14df0 53 45 4c 45 43 54 20 61 72 65 0a 73 74 6f 72 65  SELECT are.store
14e00 64 20 69 73 20 63 72 65 61 74 65 64 20 62 79 20  d is created by 
14e10 74 68 65 20 3c 61 20 68 72 65 66 3d 22 6f 70 63  the <a href="opc
14e20 6f 64 65 2e 68 74 6d 6c 23 4f 70 65 6e 54 65 6d  ode.html#OpenTem
14e30 70 22 3e 4f 70 65 6e 54 65 6d 70 3c 2f 61 3e 20  p">OpenTemp</a> 
14e40 0a 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20  .instruction at 
14e50 30 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20  0.  This opcode 
14e60 69 73 20 75 73 65 64 20 66 6f 72 20 74 61 62 6c  is used for tabl
14e70 65 73 20 74 68 61 74 20 65 78 69 73 74 20 66 6f  es that exist fo
14e80 72 20 74 68 65 20 0a 64 75 72 61 74 69 6f 6e 20  r the .duration 
14e90 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  of a single SQL 
14ea0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 20  statement only. 
14eb0 20 54 68 65 20 74 72 61 6e 73 69 65 6e 74 20 63   The transient c
14ec0 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 20  ursor is always 
14ed0 0a 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69  .opened read/wri
14ee0 74 65 20 65 76 65 6e 20 69 66 20 74 68 65 20 6d  te even if the m
14ef0 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
14f00 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20  read-only.  The 
14f10 74 72 61 6e 73 69 65 6e 74 20 0a 74 61 62 6c 65  transient .table
14f20 20 69 73 20 64 65 6c 65 74 65 64 20 61 75 74 6f   is deleted auto
14f30 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
14f40 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  he cursor is clo
14f50 73 65 64 2e 20 20 54 68 65 20 50 32 20 76 61 6c  sed.  The P2 val
14f60 75 65 20 0a 6f 66 20 31 20 6d 65 61 6e 73 20 74  ue .of 1 means t
14f70 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73  he cursor points
14f80 20 74 6f 20 61 20 42 54 72 65 65 20 69 6e 64 65   to a BTree inde
14f90 78 2c 20 77 68 69 63 68 20 68 61 73 20 6e 6f 20  x, which has no 
14fa0 64 61 74 61 20 62 75 74 20 63 61 6e 20 0a 68 61  data but can .ha
14fb0 76 65 20 61 6e 20 61 72 62 69 74 72 61 72 79 20  ve an arbitrary 
14fc0 6b 65 79 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65  key.</p>..<p>The
14fd0 20 69 6e 6e 65 72 20 53 45 4c 45 43 54 20 73 74   inner SELECT st
14fe0 61 74 65 6d 65 6e 74 20 69 73 20 69 6d 70 6c 65  atement is imple
14ff0 6d 65 6e 74 65 64 20 62 79 20 69 6e 73 74 72 75  mented by instru
15000 63 74 69 6f 6e 73 20 31 20 74 68 72 6f 75 67 68  ctions 1 through
15010 20 31 30 2e 0a 41 6c 6c 20 74 68 69 73 20 63 6f   10..All this co
15020 64 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  de does is make 
15030 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
15040 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
15050 66 6f 72 20 65 61 63 68 0a 72 6f 77 20 6f 66 20  for each.row of 
15060 74 68 65 20 65 78 61 6d 70 32 20 74 61 62 6c 65  the examp2 table
15070 20 77 69 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   with a non-NULL
15080 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 22   value for the "
15090 74 68 72 65 65 22 20 63 6f 6c 75 6d 6e 2e 20 20  three" column.  
150a0 0a 54 68 65 20 6b 65 79 20 66 6f 72 20 65 61 63  .The key for eac
150b0 68 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  h temporary tabl
150c0 65 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 22  e entry is the "
150d0 74 68 72 65 65 22 20 63 6f 6c 75 6d 6e 20 6f 66  three" column of
150e0 20 65 78 61 6d 70 32 20 0a 61 6e 64 20 74 68 65   examp2 .and the
150f0 20 64 61 74 61 20 69 73 20 61 6e 20 65 6d 70 74   data is an empt
15100 79 20 73 74 72 69 6e 67 20 73 69 6e 63 65 20 69  y string since i
15110 74 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  t is never used.
15120 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65 20 6f 75 74  </p>..<p>The out
15130 65 72 20 53 45 4c 45 43 54 20 69 73 20 69 6d 70  er SELECT is imp
15140 6c 65 6d 65 6e 74 65 64 20 62 79 20 69 6e 73 74  lemented by inst
15150 72 75 63 74 69 6f 6e 73 20 31 31 20 74 68 72 6f  ructions 11 thro
15160 75 67 68 20 32 35 2e 20 20 49 6e 0a 70 61 72 74  ugh 25.  In.part
15170 69 63 75 6c 61 72 2c 20 74 68 65 20 57 48 45 52  icular, the WHER
15180 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
15190 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ing the IN opera
151a0 74 6f 72 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  tor is implement
151b0 65 64 0a 62 79 20 69 6e 73 74 72 75 63 74 69 6f  ed.by instructio
151c0 6e 73 20 61 74 20 31 36 2c 20 31 37 2c 20 61 6e  ns at 16, 17, an
151d0 64 20 32 30 2e 20 20 49 6e 73 74 72 75 63 74 69  d 20.  Instructi
151e0 6f 6e 20 31 36 20 70 75 73 68 65 73 20 74 68 65  on 16 pushes the
151f0 20 76 61 6c 75 65 20 6f 66 0a 74 68 65 20 22 74   value of.the "t
15200 77 6f 22 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 74  wo" column for t
15210 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
15220 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 61 6e  nto the stack an
15230 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 31 37  d instruction 17
15240 0a 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 74  .checks to see t
15250 68 61 74 20 69 74 20 69 73 20 6e 6f 6e 2d 4e 55  hat it is non-NU
15260 4c 4c 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  LL.  If this is 
15270 73 75 63 63 65 73 73 66 75 6c 2c 20 65 78 65 63  successful, exec
15280 75 74 69 6f 6e 20 0a 6a 75 6d 70 73 20 74 6f 20  ution .jumps to 
15290 32 30 2c 20 77 68 65 72 65 20 69 74 20 74 65 73  20, where it tes
152a0 74 73 20 74 6f 20 73 65 65 20 69 66 20 74 6f 70  ts to see if top
152b0 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 6d 61   of the stack ma
152c0 74 63 68 65 73 20 61 6e 79 20 6b 65 79 20 0a 69  tches any key .i
152d0 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
152e0 74 61 62 6c 65 2e 20 20 54 68 65 20 72 65 73 74  table.  The rest
152f0 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69 73 20   of the code is 
15300 74 68 65 20 73 61 6d 65 20 61 73 20 77 68 61 74  the same as what
15310 20 68 61 73 20 0a 62 65 65 6e 20 73 68 6f 77 6e   has .been shown
15320 20 62 65 66 6f 72 65 2e 3c 2f 70 3e 0a 0a 3c 68   before.</p>..<h
15330 32 3e 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  2>Compound SELEC
15340 54 20 53 74 61 74 65 6d 65 6e 74 73 3c 2f 68 32  T Statements</h2
15350 3e 0a 0a 3c 70 3e 53 51 4c 69 74 65 20 61 6c 73  >..<p>SQLite als
15360 6f 20 61 6c 6c 6f 77 73 20 74 77 6f 20 6f 72 20  o allows two or 
15370 6d 6f 72 65 20 53 45 4c 45 43 54 20 73 74 61 74  more SELECT stat
15380 65 6d 65 6e 74 73 20 74 6f 20 62 65 20 6a 6f 69  ements to be joi
15390 6e 65 64 20 61 73 0a 70 65 65 72 73 20 75 73 69  ned as.peers usi
153a0 6e 67 20 6f 70 65 72 61 74 6f 72 73 20 55 4e 49  ng operators UNI
153b0 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 49  ON, UNION ALL, I
153c0 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 45 58  NTERSECT, and EX
153d0 43 45 50 54 2e 20 20 54 68 65 73 65 0a 63 6f 6d  CEPT.  These.com
153e0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 73 74 61  pound select sta
153f0 74 65 6d 65 6e 74 73 20 61 72 65 20 69 6d 70 6c  tements are impl
15400 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74 72  emented using tr
15410 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 73 2e 0a  ansient tables..
15420 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
15430 6f 6e 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  on is slightly d
15440 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 61 63  ifferent for eac
15450 68 20 6f 70 65 72 61 74 6f 72 2c 20 62 75 74 20  h operator, but 
15460 74 68 65 0a 62 61 73 69 63 20 69 64 65 61 73 20  the.basic ideas 
15470 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 46  are the same.  F
15480 6f 72 20 61 6e 20 65 78 61 6d 70 6c 65 20 77 65  or an example we
15490 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 45 58   will use the EX
154a0 43 45 50 54 0a 6f 70 65 72 61 74 6f 72 2e 3c 2f  CEPT.operator.</
154b0 70 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e  p>..<blockquote>
154c0 3c 70 72 65 3e 0a 53 45 4c 45 43 54 20 74 77 6f  <pre>.SELECT two
154d0 20 46 52 4f 4d 20 65 78 61 6d 70 0a 45 58 43 45   FROM examp.EXCE
154e0 50 54 0a 53 45 4c 45 43 54 20 66 6f 75 72 20 46  PT.SELECT four F
154f0 52 4f 4d 20 65 78 61 6d 70 32 3b 0a 3c 2f 70 72  ROM examp2;.</pr
15500 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  e></blockquote>.
15510 0a 3c 70 3e 54 68 65 20 72 65 73 75 6c 74 20 6f  .<p>The result o
15520 66 20 74 68 69 73 20 6c 61 73 74 20 65 78 61 6d  f this last exam
15530 70 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 65 76  ple should be ev
15540 65 72 79 20 75 6e 69 71 75 65 20 76 61 6c 75 65  ery unique value
15550 0a 6f 66 20 74 68 65 20 22 74 77 6f 22 20 63 6f  .of the "two" co
15560 6c 75 6d 6e 20 69 6e 20 74 68 65 20 65 78 61 6d  lumn in the exam
15570 70 20 74 61 62 6c 65 2c 20 65 78 63 65 70 74 20  p table, except 
15580 61 6e 79 20 76 61 6c 75 65 20 74 68 61 74 20 69  any value that i
15590 73 0a 69 6e 20 74 68 65 20 22 66 6f 75 72 22 20  s.in the "four" 
155a0 63 6f 6c 75 6d 6e 20 6f 66 20 65 78 61 6d 70 32  column of examp2
155b0 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 54 68   is removed.  Th
155c0 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  e code to implem
155d0 65 6e 74 0a 74 68 69 73 20 71 75 65 72 79 20 69  ent.this query i
155e0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 3c 2f 70  s as follows:</p
155f0 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 61 64 64 72  >.}..Code {.addr
15600 20 20 6f 70 63 6f 64 65 20 20 20 20 20 20 20 20    opcode        
15610 70 31 20 20 20 20 20 70 32 20 20 20 20 20 70 33  p1     p2     p3
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15640 20 20 20 20 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d        .----  ---
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
15660 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d    -----  -------
15670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20  ------------.0  
15690 20 20 20 4f 70 65 6e 54 65 6d 70 20 20 20 20 20     OpenTemp     
156a0 20 30 20 20 20 20 20 20 31 20 20 20 20 20 20 20   0      1       
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156d0 20 20 0a 31 20 20 20 20 20 4b 65 79 41 73 44 61    .1     KeyAsDa
156e0 74 61 20 20 20 20 20 30 20 20 20 20 20 20 31 20  ta     0      1 
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 20               .2 
15720 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20      Integer     
15730 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15760 20 20 20 0a 33 20 20 20 20 20 4f 70 65 6e 52 65     .3     OpenRe
15770 61 64 20 20 20 20 20 20 31 20 20 20 20 20 20 33  ad      1      3
15780 20 20 20 20 20 20 65 78 61 6d 70 20 20 20 20 20        examp     
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 20 20 20 20 20 20 20 20 20 0a 34 20 20 20 20 20           .4     
157b0 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 20 30 20  VerifyCookie  0 
157c0 20 20 20 20 20 39 30 39 20 20 20 20 20 20 20 20       909        
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 0a 35 20 20 20 20 20 52 65 77 69 6e      .5     Rewin
15800 64 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20  d        1      
15810 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 20 20 20 20 20 20 20 20 20 20 0a 36 20 20 20 20            .6    
15840 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 31   Column        1
15850 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15880 0a 37 20 20 20 20 20 4d 61 6b 65 52 65 63 6f 72  .7     MakeRecor
15890 64 20 20 20 20 31 20 20 20 20 20 20 30 20 20 20  d    1      0   
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 20 20 20 20 20 0a 38 20 20 20 20 20 53 74 72        .8     Str
158d0 69 6e 67 20 20 20 20 20 20 20 20 30 20 20 20 20  ing        0    
158e0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 20 20 20 20 20 20 20 20 0a 39 20 20              .9  
15910 20 20 20 50 75 74 53 74 72 4b 65 79 20 20 20 20     PutStrKey    
15920 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15950 20 20 0a 31 30 20 20 20 20 4e 65 78 74 20 20 20    .10    Next   
15960 20 20 20 20 20 20 20 31 20 20 20 20 20 20 36 20         1      6 
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 31               .11
159a0 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20 20 20      Close       
159b0 20 20 31 20 20 20 20 20 20 30 20 20 20 20 20 20    1      0      
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 0a 31 32 20 20 20 20 49 6e 74 65 67 65     .12    Intege
159f0 72 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30  r       0      0
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a20 20 20 20 20 20 20 20 20 20 0a 31 33 20 20 20 20           .13    
15a30 4f 70 65 6e 52 65 61 64 20 20 20 20 20 20 32 20  OpenRead      2 
15a40 20 20 20 20 20 35 20 20 20 20 20 20 65 78 61 6d       5      exam
15a50 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p2              
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
15a70 31 34 20 20 20 20 52 65 77 69 6e 64 20 20 20 20  14    Rewind    
15a80 20 20 20 20 32 20 20 20 20 20 20 32 30 20 20 20      2      20   
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ab0 20 20 20 20 20 0a 31 35 20 20 20 20 43 6f 6c 75       .15    Colu
15ac0 6d 6e 20 20 20 20 20 20 20 20 32 20 20 20 20 20  mn        2     
15ad0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 20 20 20 20 20 20 20 20 20 20 20 0a 31 36 20 20             .16  
15b00 20 20 4d 61 6b 65 52 65 63 6f 72 64 20 20 20 20    MakeRecord    
15b10 31 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  1      0        
15b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b40 20 0a 31 37 20 20 20 20 4e 6f 74 46 6f 75 6e 64   .17    NotFound
15b50 20 20 20 20 20 20 30 20 20 20 20 20 20 31 39 20        0      19 
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 38 20              .18 
15b90 20 20 20 44 65 6c 65 74 65 20 20 20 20 20 20 20     Delete       
15ba0 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 20 0a 31 39 20 20 20 20 4e 65 78 74 20 20 20    .19    Next   
15be0 20 20 20 20 20 20 20 32 20 20 20 20 20 20 31 35         2      15
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 30               .20
15c20 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20 20 20      Close       
15c30 20 20 32 20 20 20 20 20 20 30 20 20 20 20 20 20    2      0      
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 20 20 20 0a 32 31 20 20 20 20 43 6f 6c 75 6d 6e     .21    Column
15c70 4e 61 6d 65 20 20 20 20 30 20 20 20 20 20 20 30  Name    0      0
15c80 20 20 20 20 20 20 66 6f 75 72 20 20 20 20 20 20        four      
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ca0 20 20 20 20 20 20 20 20 20 0a 32 32 20 20 20 20           .22    
15cb0 52 65 77 69 6e 64 20 20 20 20 20 20 20 20 30 20  Rewind        0 
15cc0 20 20 20 20 20 32 36 20 20 20 20 20 20 20 20 20       26         
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cf0 20 20 20 20 0a 32 33 20 20 20 20 43 6f 6c 75 6d      .23    Colum
15d00 6e 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20  n        0      
15d10 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d30 20 20 20 20 20 20 20 20 20 20 0a 32 34 20 20 20            .24   
15d40 20 43 61 6c 6c 62 61 63 6b 20 20 20 20 20 20 31   Callback      1
15d50 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 0a 32 35 20 20 20 20 4e 65 78 74 20 20 20 20 20  .25    Next     
15d90 20 20 20 20 20 30 20 20 20 20 20 20 32 33 20 20       0      23  
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 20 20 20 20 20 20 20 20 20 20 0a 32 36 20 20             .26  
15dd0 20 20 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20    Close         
15de0 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 20 0a 32 37 20 20 20 20 48 61 6c 74 20 20 20 20   .27    Halt    
15e20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 20 20 20 0a 7d 0a 0a 70 75 74 73 20         .}..puts 
15e60 7b 0a 3c 70 3e 54 68 65 20 74 72 61 6e 73 69 65  {.<p>The transie
15e70 6e 74 20 74 61 62 6c 65 20 69 6e 20 77 68 69 63  nt table in whic
15e80 68 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  h the result is 
15e90 62 75 69 6c 74 20 69 73 20 63 72 65 61 74 65 64  built is created
15ea0 20 62 79 0a 69 6e 73 74 72 75 63 74 69 6f 6e 20   by.instruction 
15eb0 30 2e 20 20 54 68 72 65 65 20 6c 6f 6f 70 73 20  0.  Three loops 
15ec0 74 68 65 6e 20 66 6f 6c 6c 6f 77 2e 20 20 54 68  then follow.  Th
15ed0 65 20 6c 6f 6f 70 20 61 74 20 69 6e 73 74 72 75  e loop at instru
15ee0 63 74 69 6f 6e 73 0a 35 20 74 68 72 6f 75 67 68  ctions.5 through
15ef0 20 31 30 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74   10 implements t
15f00 68 65 20 66 69 72 73 74 20 53 45 4c 45 43 54 20  he first SELECT 
15f10 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
15f20 73 65 63 6f 6e 64 0a 53 45 4c 45 43 54 20 73 74  second.SELECT st
15f30 61 74 65 6d 65 6e 74 20 69 73 20 69 6d 70 6c 65  atement is imple
15f40 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6c 6f  mented by the lo
15f50 6f 70 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  op at instructio
15f60 6e 73 20 31 34 20 74 68 72 6f 75 67 68 0a 31 39  ns 14 through.19
15f70 2e 20 20 46 69 6e 61 6c 6c 79 2c 20 61 20 6c 6f  .  Finally, a lo
15f80 6f 70 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  op at instructio
15f90 6e 73 20 32 32 20 74 68 72 6f 75 67 68 20 32 35  ns 22 through 25
15fa0 20 72 65 61 64 73 20 74 68 65 20 74 72 61 6e 73   reads the trans
15fb0 69 65 6e 74 0a 74 61 62 6c 65 20 61 6e 64 20 69  ient.table and i
15fc0 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
15fd0 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
15fe0 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65 73  h row in the res
15ff0 75 6c 74 2e 3c 2f 70 3e 0a 0a 3c 70 3e 49 6e 73  ult.</p>..<p>Ins
16000 74 72 75 63 74 69 6f 6e 20 31 20 69 73 20 6f 66  truction 1 is of
16010 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6f   particular impo
16020 72 74 61 6e 63 65 20 69 6e 20 74 68 69 73 20 65  rtance in this e
16030 78 61 6d 70 6c 65 2e 20 20 4e 6f 72 6d 61 6c 6c  xample.  Normall
16040 79 2c 0a 74 68 65 20 43 6f 6c 75 6d 6e 20 69 6e  y,.the Column in
16050 73 74 72 75 63 74 69 6f 6e 20 65 78 74 72 61 63  struction extrac
16060 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ts the value of 
16070 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20  a column from a 
16080 6c 61 72 67 65 72 0a 72 65 63 6f 72 64 20 69 6e  larger.record in
16090 20 74 68 65 20 64 61 74 61 20 6f 66 20 61 6e 20   the data of an 
160a0 53 51 4c 69 74 65 20 66 69 6c 65 20 65 6e 74 72  SQLite file entr
160b0 79 2e 20 20 49 6e 73 74 72 75 63 74 69 6f 6e 20  y.  Instruction 
160c0 31 20 73 65 74 73 20 61 20 66 6c 61 67 20 6f 6e  1 sets a flag on
160d0 0a 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74  .the transient t
160e0 61 62 6c 65 20 73 6f 20 74 68 61 74 20 43 6f 6c  able so that Col
160f0 75 6d 6e 20 77 69 6c 6c 20 69 6e 73 74 65 61 64  umn will instead
16100 20 74 72 65 61 74 20 74 68 65 20 6b 65 79 20 6f   treat the key o
16110 66 20 74 68 65 0a 53 51 4c 69 74 65 20 66 69 6c  f the.SQLite fil
16120 65 20 65 6e 74 72 79 20 61 73 20 69 66 20 69 74  e entry as if it
16130 20 77 65 72 65 20 64 61 74 61 20 61 6e 64 20 65   were data and e
16140 78 74 72 61 63 74 20 63 6f 6c 75 6d 6e 20 69 6e  xtract column in
16150 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 0a 74  formation from.t
16160 68 65 20 6b 65 79 2e 3c 2f 70 3e 0a 0a 3c 70 3e  he key.</p>..<p>
16170 48 65 72 65 20 69 73 20 77 68 61 74 20 69 73 20  Here is what is 
16180 67 6f 69 6e 67 20 74 6f 20 68 61 70 70 65 6e 3a  going to happen:
16190 20 20 54 68 65 20 66 69 72 73 74 20 53 45 4c 45    The first SELE
161a0 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 77 69 6c  CT statement.wil
161b0 6c 20 63 6f 6e 73 74 72 75 63 74 20 72 6f 77 73  l construct rows
161c0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 61   of the result a
161d0 6e 64 20 73 61 76 65 20 65 61 63 68 20 72 6f 77  nd save each row
161e0 20 61 73 20 74 68 65 20 6b 65 79 20 6f 66 0a 61   as the key of.a
161f0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  n entry in the t
16200 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 2e 20  ransient table. 
16210 20 54 68 65 20 64 61 74 61 20 66 6f 72 20 65 61   The data for ea
16220 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  ch entry in the.
16230 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
16240 69 73 20 61 20 6e 65 76 65 72 20 75 73 65 64 20  is a never used 
16250 73 6f 20 77 65 20 66 69 6c 6c 20 69 74 20 69 6e  so we fill it in
16260 20 77 69 74 68 20 61 6e 20 65 6d 70 74 79 20 73   with an empty s
16270 74 72 69 6e 67 2e 0a 54 68 65 20 73 65 63 6f 6e  tring..The secon
16280 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
16290 6e 74 20 61 6c 73 6f 20 63 6f 6e 73 74 72 75 63  nt also construc
162a0 74 73 20 72 6f 77 73 2c 20 62 75 74 20 74 68 65  ts rows, but the
162b0 20 72 6f 77 73 0a 63 6f 6e 73 74 72 75 63 74 65   rows.constructe
162c0 64 20 62 79 20 74 68 65 20 73 65 63 6f 6e 64 20  d by the second 
162d0 53 45 4c 45 43 54 20 61 72 65 20 72 65 6d 6f 76  SELECT are remov
162e0 65 64 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ed from the tran
162f0 73 69 65 6e 74 20 74 61 62 6c 65 2e 0a 54 68 61  sient table..Tha
16300 74 20 69 73 20 77 68 79 20 77 65 20 77 61 6e 74  t is why we want
16310 20 74 68 65 20 72 6f 77 73 20 74 6f 20 62 65 20   the rows to be 
16320 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6b 65  stored in the ke
16330 79 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20  y of the SQLite 
16340 66 69 6c 65 0a 69 6e 73 74 65 61 64 20 6f 66 20  file.instead of 
16350 69 6e 20 74 68 65 20 64 61 74 61 20 2d 2d 20 73  in the data -- s
16360 6f 20 74 68 65 79 20 63 61 6e 20 62 65 20 65 61  o they can be ea
16370 73 69 6c 79 20 6c 6f 63 61 74 65 64 20 61 6e 64  sily located and
16380 20 64 65 6c 65 74 65 64 2e 3c 2f 70 3e 0a 0a 3c   deleted.</p>..<
16390 70 3e 4c 65 74 27 73 20 6c 6f 6f 6b 20 6d 6f 72  p>Let's look mor
163a0 65 20 63 6c 6f 73 65 6c 79 20 61 74 20 77 68 61  e closely at wha
163b0 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 68  t is happening h
163c0 65 72 65 2e 20 20 54 68 65 20 66 69 72 73 74 0a  ere.  The first.
163d0 53 45 4c 45 43 54 20 69 73 20 69 6d 70 6c 65 6d  SELECT is implem
163e0 65 6e 74 65 64 20 62 79 20 74 68 65 20 6c 6f 6f  ented by the loo
163f0 70 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  p at instruction
16400 73 20 35 20 74 68 72 6f 75 67 68 20 31 30 2e 0a  s 5 through 10..
16410 49 6e 73 74 72 75 63 74 69 6f 6e 20 35 20 69 6e  Instruction 5 in
16420 74 69 61 6c 69 7a 65 73 20 74 68 65 20 6c 6f 6f  tializes the loo
16430 70 20 62 79 20 72 65 77 69 6e 64 69 6e 67 20 69  p by rewinding i
16440 74 73 20 63 75 72 73 6f 72 2e 0a 49 6e 73 74 72  ts cursor..Instr
16450 75 63 74 69 6f 6e 20 36 20 65 78 74 72 61 63 74  uction 6 extract
16460 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
16470 68 65 20 22 74 77 6f 22 20 63 6f 6c 75 6d 6e 20  he "two" column 
16480 66 72 6f 6d 20 22 65 78 61 6d 70 22 0a 61 6e 64  from "examp".and
16490 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 37 20 63   instruction 7 c
164a0 6f 6e 76 65 72 74 73 20 74 68 69 73 20 69 6e 74  onverts this int
164b0 6f 20 61 20 72 6f 77 2e 20 20 49 6e 73 74 72 75  o a row.  Instru
164c0 63 74 69 6f 6e 20 38 20 70 75 73 68 65 73 0a 61  ction 8 pushes.a
164d0 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 6f  n empty string o
164e0 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20  nto the stack.  
164f0 46 69 6e 61 6c 6c 79 2c 20 69 6e 73 74 72 75 63  Finally, instruc
16500 74 69 6f 6e 20 39 20 77 72 69 74 65 73 20 74 68  tion 9 writes th
16510 65 0a 72 6f 77 20 69 6e 74 6f 20 74 68 65 20 74  e.row into the t
16520 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
16530 20 42 75 74 20 72 65 6d 65 6d 62 65 72 2c 20 74   But remember, t
16540 68 65 20 50 75 74 53 74 72 4b 65 79 20 6f 70 63  he PutStrKey opc
16550 6f 64 65 20 75 73 65 73 0a 74 68 65 20 74 6f 70  ode uses.the top
16560 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 61 73   of the stack as
16570 20 74 68 65 20 72 65 63 6f 72 64 20 64 61 74 61   the record data
16580 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20 6f 6e   and the next on
16590 20 73 74 61 63 6b 20 61 73 20 74 68 65 0a 6b 65   stack as the.ke
165a0 79 2e 20 20 46 6f 72 20 61 6e 20 49 4e 53 45 52  y.  For an INSER
165b0 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
165c0 20 72 6f 77 20 67 65 6e 65 72 61 74 65 64 20 62   row generated b
165d0 79 20 74 68 65 0a 4d 61 6b 65 52 65 63 6f 72 64  y the.MakeRecord
165e0 20 6f 70 63 6f 64 65 20 69 73 20 74 68 65 20 72   opcode is the r
165f0 65 63 6f 72 64 20 64 61 74 61 20 61 6e 64 20 74  ecord data and t
16600 68 65 20 72 65 63 6f 72 64 20 6b 65 79 20 69 73  he record key is
16610 20 61 6e 20 69 6e 74 65 67 65 72 0a 63 72 65 61   an integer.crea
16620 74 65 64 20 62 79 20 74 68 65 20 4e 65 77 52 65  ted by the NewRe
16630 63 6e 6f 20 6f 70 63 6f 64 65 2e 20 20 42 75 74  cno opcode.  But
16640 20 68 65 72 65 20 74 68 65 20 72 6f 6c 65 73 20   here the roles 
16650 61 72 65 20 72 65 76 65 72 73 65 64 20 61 6e 64  are reversed and
16660 0a 74 68 65 20 72 6f 77 20 63 72 65 61 74 65 64  .the row created
16670 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 20 69   by MakeRecord i
16680 73 20 74 68 65 20 72 65 63 6f 72 64 20 6b 65 79  s the record key
16690 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
166a0 64 61 74 61 20 69 73 0a 6a 75 73 74 20 61 6e 20  data is.just an 
166b0 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 3c 2f 70  empty string.</p
166c0 3e 0a 0a 3c 70 3e 54 68 65 20 73 65 63 6f 6e 64  >..<p>The second
166d0 20 53 45 4c 45 43 54 20 69 73 20 69 6d 70 6c 65   SELECT is imple
166e0 6d 65 6e 74 65 64 20 62 79 20 69 6e 73 74 72 75  mented by instru
166f0 63 74 69 6f 6e 73 20 31 34 20 74 68 72 6f 75 67  ctions 14 throug
16700 68 20 31 39 2e 0a 49 6e 73 74 72 75 63 74 69 6f  h 19..Instructio
16710 6e 20 31 34 20 69 6e 74 69 61 6c 69 7a 65 73 20  n 14 intializes 
16720 74 68 65 20 6c 6f 6f 70 20 62 79 20 72 65 77 69  the loop by rewi
16730 6e 64 69 6e 67 20 69 74 73 20 63 75 72 73 6f 72  nding its cursor
16740 2e 0a 41 20 6e 65 77 20 72 65 73 75 6c 74 20 72  ..A new result r
16750 6f 77 20 69 73 20 63 72 65 61 74 65 64 20 66 72  ow is created fr
16760 6f 6d 20 74 68 65 20 22 66 6f 75 72 22 20 63 6f  om the "four" co
16770 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 22 65  lumn of table "e
16780 78 61 6d 70 32 22 0a 62 79 20 69 6e 73 74 72 75  xamp2".by instru
16790 63 74 69 6f 6e 73 20 31 35 20 61 6e 64 20 31 36  ctions 15 and 16
167a0 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f  .  But instead o
167b0 66 20 75 73 69 6e 67 20 50 75 74 53 74 72 4b 65  f using PutStrKe
167c0 79 20 74 6f 20 77 72 69 74 65 20 74 68 69 73 0a  y to write this.
167d0 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 74 68 65  new row into the
167e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
167f0 2c 20 77 65 20 69 6e 73 74 65 61 64 20 63 61 6c  , we instead cal
16800 6c 20 44 65 6c 65 74 65 20 74 6f 20 72 65 6d 6f  l Delete to remo
16810 76 65 0a 69 74 20 66 72 6f 6d 20 74 68 65 20 74  ve.it from the t
16820 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
16830 66 20 69 74 20 65 78 69 73 74 73 2e 3c 2f 70 3e  f it exists.</p>
16840 0a 0a 3c 70 3e 54 68 65 20 72 65 73 75 6c 74 20  ..<p>The result 
16850 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
16860 73 65 6c 65 63 74 20 69 73 20 73 65 6e 74 20 74  select is sent t
16870 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  o the callback r
16880 6f 75 74 69 6e 65 0a 62 79 20 74 68 65 20 6c 6f  outine.by the lo
16890 6f 70 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  op at instructio
168a0 6e 73 20 32 32 20 74 68 72 6f 75 67 68 20 32 35  ns 22 through 25
168b0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 74 68  .  There is noth
168c0 69 6e 67 20 6e 65 77 0a 6f 72 20 72 65 6d 61 72  ing new.or remar
168d0 6b 61 62 6c 65 20 61 62 6f 75 74 20 74 68 69 73  kable about this
168e0 20 6c 6f 6f 70 2c 20 65 78 63 65 70 74 20 66 6f   loop, except fo
168f0 72 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  r the fact that 
16900 74 68 65 20 43 6f 6c 75 6d 6e 20 0a 69 6e 73 74  the Column .inst
16910 72 75 63 74 69 6f 6e 20 61 74 20 32 33 20 77 69  ruction at 23 wi
16920 6c 6c 20 62 65 20 65 78 74 72 61 63 74 69 6e 67  ll be extracting
16930 20 61 20 63 6f 6c 75 6d 6e 20 6f 75 74 20 6f 66   a column out of
16940 20 74 68 65 20 72 65 63 6f 72 64 20 6b 65 79 0a   the record key.
16950 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20  rather than the 
16960 72 65 63 6f 72 64 20 64 61 74 61 2e 3c 2f 70 3e  record data.</p>
16970 0a 0a 3c 68 32 3e 53 75 6d 6d 61 72 79 3c 2f 68  ..<h2>Summary</h
16980 32 3e 0a 0a 3c 70 3e 54 68 69 73 20 61 72 74 69  2>..<p>This arti
16990 63 6c 65 20 68 61 73 20 72 65 76 69 65 77 65 64  cle has reviewed
169a0 20 61 6c 6c 20 6f 66 20 74 68 65 20 6d 61 6a 6f   all of the majo
169b0 72 20 74 65 63 68 6e 69 71 75 65 73 20 75 73 65  r techniques use
169c0 64 20 62 79 0a 53 51 4c 69 74 65 27 73 20 56 44  d by.SQLite's VD
169d0 42 45 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  BE to implement 
169e0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  SQL statements. 
169f0 20 57 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65   What has not be
16a00 65 6e 20 73 68 6f 77 6e 0a 69 73 20 74 68 61 74  en shown.is that
16a10 20 6d 6f 73 74 20 6f 66 20 74 68 65 73 65 20 74   most of these t
16a20 65 63 68 6e 69 71 75 65 73 20 63 61 6e 20 62 65  echniques can be
16a30 20 75 73 65 64 20 69 6e 20 63 6f 6d 62 69 6e 61   used in combina
16a40 74 69 6f 6e 20 74 6f 0a 67 65 6e 65 72 61 74 65  tion to.generate
16a50 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 61 70 70   code for an app
16a60 72 6f 70 72 69 61 74 65 6c 79 20 63 6f 6d 70 6c  ropriately compl
16a70 65 78 20 71 75 65 72 79 20 73 74 61 74 65 6d 65  ex query stateme
16a80 6e 74 2e 20 20 46 6f 72 0a 65 78 61 6d 70 6c 65  nt.  For.example
16a90 2c 20 77 65 20 68 61 76 65 20 73 68 6f 77 6e 20  , we have shown 
16aa0 68 6f 77 20 73 6f 72 74 69 6e 67 20 69 73 20 61  how sorting is a
16ab0 63 63 6f 6d 70 6c 69 73 68 65 64 20 6f 6e 20 61  ccomplished on a
16ac0 20 73 69 6d 70 6c 65 20 71 75 65 72 79 0a 61 6e   simple query.an
16ad0 64 20 77 65 20 68 61 76 65 20 73 68 6f 77 6e 20  d we have shown 
16ae0 68 6f 77 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  how to implement
16af0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
16b00 79 2e 20 20 42 75 74 20 77 65 20 64 69 64 0a 6e  y.  But we did.n
16b10 6f 74 20 67 69 76 65 20 61 6e 20 65 78 61 6d 70  ot give an examp
16b20 6c 65 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 6e  le of sorting in
16b30 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
16b40 79 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  y.  This is beca
16b50 75 73 65 0a 73 6f 72 74 69 6e 67 20 61 20 63 6f  use.sorting a co
16b60 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 64 6f 65  mpound query doe
16b70 73 20 6e 6f 74 20 69 6e 74 72 6f 64 75 63 65 20  s not introduce 
16b80 61 6e 79 20 6e 65 77 20 63 6f 6e 63 65 70 74 73  any new concepts
16b90 3a 20 69 74 0a 6d 65 72 65 6c 79 20 63 6f 6d 62  : it.merely comb
16ba0 69 6e 65 73 20 74 77 6f 20 70 72 65 76 69 6f 75  ines two previou
16bb0 73 20 69 64 65 61 73 20 28 73 6f 72 74 69 6e 67  s ideas (sorting
16bc0 20 61 6e 64 20 63 6f 6d 70 6f 75 6e 64 69 6e 67   and compounding
16bd0 29 0a 69 6e 20 74 68 65 20 73 61 6d 65 20 56 44  ).in the same VD
16be0 42 45 20 70 72 6f 67 72 61 6d 2e 3c 2f 70 3e 0a  BE program.</p>.
16bf0 0a 3c 70 3e 46 6f 72 20 61 64 64 69 74 69 6f 6e  .<p>For addition
16c00 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
16c10 6e 20 68 6f 77 20 74 68 65 20 53 51 4c 69 74 65  n how the SQLite
16c20 20 6c 69 62 72 61 72 79 0a 66 75 6e 63 74 69 6f   library.functio
16c30 6e 73 2c 20 74 68 65 20 72 65 61 64 65 72 20 69  ns, the reader i
16c40 73 20 64 69 72 65 63 74 65 64 20 74 6f 20 6c 6f  s directed to lo
16c50 6f 6b 20 61 74 20 74 68 65 20 53 51 4c 69 74 65  ok at the SQLite
16c60 20 73 6f 75 72 63 65 0a 63 6f 64 65 20 64 69 72   source.code dir
16c70 65 63 74 6c 79 2e 20 20 49 66 20 79 6f 75 20 75  ectly.  If you u
16c80 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 6d 61  nderstand the ma
16c90 74 65 72 69 61 6c 20 69 6e 20 74 68 69 73 20 61  terial in this a
16ca0 72 74 69 63 6c 65 2c 0a 79 6f 75 20 73 68 6f 75  rticle,.you shou
16cb0 6c 64 20 6e 6f 74 20 68 61 76 65 20 6d 75 63 68  ld not have much
16cc0 20 64 69 66 66 69 63 75 6c 74 79 20 69 6e 20 66   difficulty in f
16cd0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 73 6f 75  ollowing the sou
16ce0 72 63 65 73 2e 0a 53 65 72 69 6f 75 73 20 73 74  rces..Serious st
16cf0 75 64 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e  udents of the in
16d00 74 65 72 6e 61 6c 73 20 6f 66 20 53 51 4c 69 74  ternals of SQLit
16d10 65 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 0a  e will probably.
16d20 61 6c 73 6f 20 77 68 61 74 20 74 6f 20 6d 61 6b  also what to mak
16d30 65 20 61 20 63 61 72 65 66 75 6c 20 73 74 75 64  e a careful stud
16d40 79 20 6f 66 20 74 68 65 20 56 44 42 45 20 6f 70  y of the VDBE op
16d50 63 6f 64 65 73 0a 61 73 20 64 6f 63 75 6d 65 6e  codes.as documen
16d60 74 65 64 20 3c 61 20 68 72 65 66 3d 22 6f 70 63  ted <a href="opc
16d70 6f 64 65 2e 68 74 6d 6c 22 3e 68 65 72 65 3c 2f  ode.html">here</
16d80 61 3e 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  a>.  Most of the
16d90 0a 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74  .opcode document
16da0 61 74 69 6f 6e 20 69 73 20 65 78 74 72 61 63 74  ation is extract
16db0 65 64 20 66 72 6f 6d 20 63 6f 6d 6d 65 6e 74 73  ed from comments
16dc0 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 0a 63   in the source.c
16dd0 6f 64 65 20 75 73 69 6e 67 20 61 20 73 63 72 69  ode using a scri
16de0 70 74 20 73 6f 20 79 6f 75 20 63 61 6e 20 61 6c  pt so you can al
16df0 73 6f 20 67 65 74 20 69 6e 66 6f 72 6d 61 74 69  so get informati
16e00 6f 6e 20 61 62 6f 75 74 20 74 68 65 0a 76 61 72  on about the.var
16e10 69 6f 75 73 20 6f 70 63 6f 64 65 73 20 64 69 72  ious opcodes dir
16e20 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 3c  ectly from the <
16e30 62 3e 76 64 62 65 2e 63 3c 2f 62 3e 20 73 6f 75  b>vdbe.c</b> sou
16e40 72 63 65 20 66 69 6c 65 2e 0a 49 66 20 79 6f 75  rce file..If you
16e50 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
16e60 6c 79 20 72 65 61 64 20 74 68 69 73 20 66 61 72  ly read this far
16e70 2c 20 79 6f 75 20 73 68 6f 75 6c 64 20 68 61 76  , you should hav
16e80 65 20 6c 69 74 74 6c 65 0a 64 69 66 66 69 63 75  e little.difficu
16e90 6c 74 79 20 75 6e 64 65 72 73 74 61 6e 64 69 6e  lty understandin
16ea0 67 20 74 68 65 20 72 65 73 74 2e 3c 2f 70 3e 0a  g the rest.</p>.
16eb0 0a 3c 70 3e 49 66 20 79 6f 75 20 66 69 6e 64 20  .<p>If you find 
16ec0 65 72 72 6f 72 73 20 69 6e 20 65 69 74 68 65 72  errors in either
16ed0 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69   the documentati
16ee0 6f 6e 20 6f 72 20 74 68 65 20 63 6f 64 65 2c 0a  on or the code,.
16ef0 66 65 65 6c 20 66 72 65 65 20 74 6f 20 66 69 78  feel free to fix
16f00 20 74 68 65 6d 20 61 6e 64 2f 6f 72 20 63 6f 6e   them and/or con
16f10 74 61 63 74 20 74 68 65 20 61 75 74 68 6f 72 20  tact the author 
16f20 61 74 0a 3c 61 20 68 72 65 66 3d 22 6d 61 69 6c  at.<a href="mail
16f30 74 6f 3a 64 72 68 40 68 77 61 63 69 2e 63 6f 6d  to:drh@hwaci.com
16f40 22 3e 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 3c  ">drh@hwaci.com<
16f50 2f 61 3e 2e 20 20 59 6f 75 72 20 62 75 67 20 66  /a>.  Your bug f
16f60 69 78 65 73 20 6f 72 0a 73 75 67 67 65 73 74 69  ixes or.suggesti
16f70 6f 6e 73 20 61 72 65 20 61 6c 77 61 79 73 20 77  ons are always w
16f80 65 6c 63 6f 6d 65 64 2e 3c 2f 70 3e 0a 7d 0a 66  elcomed.</p>.}.f
16f90 6f 6f 74 65 72 20 24 72 63 73 69 64 0a           ooter $rcsid.