/ Hex Artifact Content
Login

Artifact 59288db1ac5c0616296b26dce071c36cb611dfe9:


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 32 20 32 30 30 34 2f 30  cl,v 1.12 2004/0
0060: 35 2f 33 31 20 31 35 3a 30 36 3a 33 30 20 64 72  5/31 15:06:30 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 20 0a 3c 2f 62  ion 2.8.0.  .</b
0150: 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 7d  ></blockquote>.}
0160: 0a 0a 70 75 74 73 20 7b 0a 3c 70 3e 49 66 20 79  ..puts {.<p>If y
0170: 6f 75 20 77 61 6e 74 20 74 6f 20 6b 6e 6f 77 20  ou want to know 
0180: 68 6f 77 20 74 68 65 20 53 51 4c 69 74 65 20 6c  how the SQLite l
0190: 69 62 72 61 72 79 20 77 6f 72 6b 73 20 69 6e 74  ibrary works int
01a0: 65 72 6e 61 6c 6c 79 2c 0a 79 6f 75 20 6e 65 65  ernally,.you nee
01b0: 64 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 20  d to begin with 
01c0: 61 20 73 6f 6c 69 64 20 75 6e 64 65 72 73 74 61  a solid understa
01d0: 6e 64 69 6e 67 20 6f 66 20 74 68 65 20 56 69 72  nding of the Vir
01e0: 74 75 61 6c 20 44 61 74 61 62 61 73 65 0a 45 6e  tual Database.En
01f0: 67 69 6e 65 20 6f 72 20 56 44 42 45 2e 20 20 54  gine or VDBE.  T
0200: 68 65 20 56 44 42 45 20 6f 63 63 75 72 73 20 72  he VDBE occurs r
0210: 69 67 68 74 20 69 6e 20 74 68 65 20 6d 69 64 64  ight in the midd
0220: 6c 65 20 6f 66 20 74 68 65 0a 70 72 6f 63 65 73  le of the.proces
0230: 73 69 6e 67 20 73 74 72 65 61 6d 20 28 73 65 65  sing stream (see
0240: 20 74 68 65 20 3c 61 20 68 72 65 66 3d 22 61 72   the <a href="ar
0250: 63 68 2e 68 74 6d 6c 22 3e 61 72 63 68 69 74 65  ch.html">archite
0260: 63 74 75 72 65 20 64 69 61 67 72 61 6d 3c 2f 61  cture diagram</a
0270: 3e 29 0a 61 6e 64 20 73 6f 20 69 74 20 73 65 65  >).and so it see
0280: 6d 73 20 74 6f 20 74 6f 75 63 68 20 6d 6f 73 74  ms to touch most
0290: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 6c 69   parts of the li
02a0: 62 72 61 72 79 2e 20 20 45 76 65 6e 0a 70 61 72  brary.  Even.par
02b0: 74 73 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74  ts of the code t
02c0: 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72 65 63  hat do not direc
02d0: 74 6c 79 20 69 6e 74 65 72 61 63 74 20 77 69 74  tly interact wit
02e0: 68 20 74 68 65 20 56 44 42 45 0a 61 72 65 20 75  h the VDBE.are u
02f0: 73 75 61 6c 6c 79 20 69 6e 20 61 20 73 75 70 70  sually in a supp
0300: 6f 72 74 69 6e 67 20 72 6f 6c 65 2e 20 20 54 68  orting role.  Th
0310: 65 20 56 44 42 45 20 72 65 61 6c 6c 79 20 69 73  e VDBE really is
0320: 20 74 68 65 20 68 65 61 72 74 20 6f 66 0a 53 51   the heart of.SQ
0330: 4c 69 74 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68  Lite.</p>..<p>Th
0340: 69 73 20 61 72 74 69 63 6c 65 20 69 73 20 61 20  is article is a 
0350: 62 72 69 65 66 20 69 6e 74 72 6f 64 75 63 74 69  brief introducti
0360: 6f 6e 20 74 6f 20 68 6f 77 20 74 68 65 20 56 44  on to how the VD
0370: 42 45 0a 77 6f 72 6b 73 20 61 6e 64 20 69 6e 20  BE.works and in 
0380: 70 61 72 74 69 63 75 6c 61 72 20 68 6f 77 20 74  particular how t
0390: 68 65 20 76 61 72 69 6f 75 73 20 56 44 42 45 20  he various VDBE 
03a0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 28 64 6f  instructions.(do
03b0: 63 75 6d 65 6e 74 65 64 20 3c 61 20 68 72 65 66  cumented <a href
03c0: 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 22 3e 68  ="opcode.html">h
03d0: 65 72 65 3c 2f 61 3e 29 20 77 6f 72 6b 20 74 6f  ere</a>) work to
03e0: 67 65 74 68 65 72 0a 74 6f 20 64 6f 20 75 73 65  gether.to do use
03f0: 66 75 6c 20 74 68 69 6e 67 73 20 77 69 74 68 20  ful things with 
0400: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
0410: 68 65 20 73 74 79 6c 65 20 69 73 20 74 75 74 6f  he style is tuto
0420: 72 69 61 6c 2c 0a 62 65 67 69 6e 6e 69 6e 67 20  rial,.beginning 
0430: 77 69 74 68 20 73 69 6d 70 6c 65 20 74 61 73 6b  with simple task
0440: 73 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 74 6f  s and working to
0450: 77 61 72 64 20 73 6f 6c 76 69 6e 67 20 6d 6f 72  ward solving mor
0460: 65 0a 63 6f 6d 70 6c 65 78 20 70 72 6f 62 6c 65  e.complex proble
0470: 6d 73 2e 20 20 41 6c 6f 6e 67 20 74 68 65 20 77  ms.  Along the w
0480: 61 79 20 77 65 20 77 69 6c 6c 20 76 69 73 69 74  ay we will visit
0490: 20 6d 6f 73 74 0a 73 75 62 6d 6f 64 75 6c 65 73   most.submodules
04a0: 20 69 6e 20 74 68 65 20 53 51 4c 69 74 65 20 6c   in the SQLite l
04b0: 69 62 72 61 72 79 2e 20 20 41 66 74 65 72 20 63  ibrary.  After c
04c0: 6f 6d 70 6c 65 74 65 69 6e 67 20 74 68 69 73 20  ompleteing this 
04d0: 74 75 74 6f 72 69 61 6c 2c 0a 79 6f 75 20 73 68  tutorial,.you sh
04e0: 6f 75 6c 64 20 68 61 76 65 20 61 20 70 72 65 74  ould have a pret
04f0: 74 79 20 67 6f 6f 64 20 75 6e 64 65 72 73 74 61  ty good understa
0500: 6e 64 69 6e 67 20 6f 66 20 68 6f 77 20 53 51 4c  nding of how SQL
0510: 69 74 65 20 77 6f 72 6b 73 0a 61 6e 64 20 77 69  ite works.and wi
0520: 6c 6c 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ll be ready to b
0530: 65 67 69 6e 20 73 74 75 64 79 69 6e 67 20 74 68  egin studying th
0540: 65 20 61 63 74 75 61 6c 20 73 6f 75 72 63 65 20  e actual source 
0550: 63 6f 64 65 2e 3c 2f 70 3e 0a 0a 3c 68 32 3e 50  code.</p>..<h2>P
0560: 72 65 6c 69 6d 69 6e 61 72 69 65 73 3c 2f 68 32  reliminaries</h2
0570: 3e 0a 0a 3c 70 3e 54 68 65 20 56 44 42 45 20 69  >..<p>The VDBE i
0580: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 76 69 72 74  mplements a virt
0590: 75 61 6c 20 63 6f 6d 70 75 74 65 72 20 74 68 61  ual computer tha
05a0: 74 20 72 75 6e 73 20 61 20 70 72 6f 67 72 61 6d  t runs a program
05b0: 20 69 6e 0a 69 74 73 20 76 69 72 74 75 61 6c 20   in.its virtual 
05c0: 6d 61 63 68 69 6e 65 20 6c 61 6e 67 75 61 67 65  machine language
05d0: 2e 20 20 54 68 65 20 67 6f 61 6c 20 6f 66 20 65  .  The goal of e
05e0: 61 63 68 20 70 72 6f 67 72 61 6d 20 69 73 20 74  ach program is t
05f0: 6f 20 0a 69 6e 74 65 72 72 6f 67 61 74 65 20 6f  o .interrogate o
0600: 72 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  r change the dat
0610: 61 62 61 73 65 2e 20 20 54 6f 77 61 72 64 20 74  abase.  Toward t
0620: 68 69 73 20 65 6e 64 2c 20 74 68 65 20 6d 61 63  his end, the mac
0630: 68 69 6e 65 0a 6c 61 6e 67 75 61 67 65 20 74 68  hine.language th
0640: 61 74 20 74 68 65 20 56 44 42 45 20 69 6d 70 6c  at the VDBE impl
0650: 65 6d 65 6e 74 73 20 69 73 20 73 70 65 63 69 66  ements is specif
0660: 69 63 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20  ically designed 
0670: 74 6f 0a 73 65 61 72 63 68 2c 20 72 65 61 64 2c  to.search, read,
0680: 20 61 6e 64 20 6d 6f 64 69 66 79 20 64 61 74 61   and modify data
0690: 62 61 73 65 73 2e 3c 2f 70 3e 0a 0a 3c 70 3e 45  bases.</p>..<p>E
06a0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
06b0: 6f 66 20 74 68 65 20 56 44 42 45 20 6c 61 6e 67  of the VDBE lang
06c0: 75 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  uage contains an
06d0: 20 6f 70 63 6f 64 65 20 61 6e 64 0a 74 68 72 65   opcode and.thre
06e0: 65 20 6f 70 65 72 61 6e 64 73 20 6c 61 62 65 6c  e operands label
06f0: 65 64 20 50 31 2c 20 50 32 2c 20 61 6e 64 20 50  ed P1, P2, and P
0700: 33 2e 20 20 4f 70 65 72 61 6e 64 20 50 31 20 69  3.  Operand P1 i
0710: 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 0a 69  s an arbitrary.i
0720: 6e 74 65 67 65 72 2e 20 20 20 50 32 20 69 73 20  nteger.   P2 is 
0730: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
0740: 6e 74 65 67 65 72 2e 20 20 50 33 20 69 73 20 61  nteger.  P3 is a
0750: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 61   pointer to a da
0760: 74 61 20 0a 73 74 72 75 63 74 75 72 65 20 6f 72  ta .structure or
0770: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
0780: 20 73 74 72 69 6e 67 2c 20 70 6f 73 73 69 62 6c   string, possibl
0790: 79 20 6e 75 6c 6c 2e 20 20 4f 6e 6c 79 20 61 20  y null.  Only a 
07a0: 66 65 77 20 56 44 42 45 0a 69 6e 73 74 72 75 63  few VDBE.instruc
07b0: 74 69 6f 6e 73 20 75 73 65 20 61 6c 6c 20 74 68  tions use all th
07c0: 72 65 65 20 6f 70 65 72 61 6e 64 73 2e 20 20 4d  ree operands.  M
07d0: 61 6e 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  any instructions
07e0: 20 75 73 65 20 6f 6e 6c 79 0a 6f 6e 65 20 6f 72   use only.one or
07f0: 20 74 77 6f 20 6f 70 65 72 61 6e 64 73 2e 20 20   two operands.  
0800: 41 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6e 75  A significant nu
0810: 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63 74  mber of instruct
0820: 69 6f 6e 73 20 75 73 65 0a 6e 6f 20 6f 70 65 72  ions use.no oper
0830: 61 6e 64 73 20 61 74 20 61 6c 6c 20 62 75 74 20  ands at all but 
0840: 69 6e 73 74 65 61 64 20 74 61 6b 65 20 74 68 65  instead take the
0850: 69 72 20 64 61 74 61 20 61 6e 64 20 73 74 6f 72  ir data and stor
0860: 65 20 74 68 65 69 72 20 72 65 73 75 6c 74 73 0a  e their results.
0870: 6f 6e 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  on the execution
0880: 20 73 74 61 63 6b 2e 20 20 54 68 65 20 64 65 74   stack.  The det
0890: 61 69 6c 73 20 6f 66 20 77 68 61 74 20 65 61 63  ails of what eac
08a0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 64 6f  h instruction.do
08b0: 65 73 20 61 6e 64 20 77 68 69 63 68 20 6f 70 65  es and which ope
08c0: 72 61 6e 64 73 20 69 74 20 75 73 65 73 20 61 72  rands it uses ar
08d0: 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  e described in t
08e0: 68 65 20 73 65 70 61 72 61 74 65 0a 3c 61 20 68  he separate.<a h
08f0: 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c  ref="opcode.html
0900: 22 3e 6f 70 63 6f 64 65 20 64 65 73 63 72 69 70  ">opcode descrip
0910: 74 69 6f 6e 3c 2f 61 3e 20 64 6f 63 75 6d 65 6e  tion</a> documen
0920: 74 2e 3c 2f 70 3e 0a 0a 3c 70 3e 41 20 56 44 42  t.</p>..<p>A VDB
0930: 45 20 70 72 6f 67 72 61 6d 20 62 65 67 69 6e 73  E program begins
0940: 0a 65 78 65 63 75 74 69 6f 6e 20 6f 6e 20 69 6e  .execution on in
0950: 73 74 72 75 63 74 69 6f 6e 20 30 20 61 6e 64 20  struction 0 and 
0960: 63 6f 6e 74 69 6e 75 65 73 20 77 69 74 68 20 73  continues with s
0970: 75 63 63 65 73 73 69 76 65 20 69 6e 73 74 72 75  uccessive instru
0980: 63 74 69 6f 6e 73 0a 75 6e 74 69 6c 20 69 74 20  ctions.until it 
0990: 65 69 74 68 65 72 20 28 31 29 20 65 6e 63 6f 75  either (1) encou
09a0: 6e 74 65 72 73 20 61 20 66 61 74 61 6c 20 65 72  nters a fatal er
09b0: 72 6f 72 2c 20 28 32 29 20 65 78 65 63 75 74 65  ror, (2) execute
09c0: 73 20 61 0a 48 61 6c 74 20 69 6e 73 74 72 75 63  s a.Halt instruc
09d0: 74 69 6f 6e 2c 20 6f 72 20 28 33 29 20 61 64 76  tion, or (3) adv
09e0: 61 6e 63 65 73 20 74 68 65 20 70 72 6f 67 72 61  ances the progra
09f0: 6d 20 63 6f 75 6e 74 65 72 20 70 61 73 74 20 74  m counter past t
0a00: 68 65 0a 6c 61 73 74 20 69 6e 73 74 72 75 63 74  he.last instruct
0a10: 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ion of the progr
0a20: 61 6d 2e 20 20 57 68 65 6e 20 74 68 65 20 56 44  am.  When the VD
0a30: 42 45 20 63 6f 6d 70 6c 65 74 65 73 20 65 78 65  BE completes exe
0a40: 63 75 74 69 6f 6e 2c 0a 61 6c 6c 20 6f 70 65 6e  cution,.all open
0a50: 20 64 61 74 61 62 61 73 65 20 63 75 72 73 6f 72   database cursor
0a60: 73 20 61 72 65 20 63 6c 6f 73 65 64 2c 20 61 6c  s are closed, al
0a70: 6c 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  l memory is free
0a80: 64 2c 20 61 6e 64 20 0a 65 76 65 72 79 74 68 69  d, and .everythi
0a90: 6e 67 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f  ng is popped fro
0aa0: 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 53 6f 20  m the stack..So 
0ab0: 74 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  there are never 
0ac0: 61 6e 79 20 77 6f 72 72 69 65 73 20 61 62 6f 75  any worries abou
0ad0: 74 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 73 20 6f  t memory leaks o
0ae0: 72 20 0a 75 6e 64 65 61 6c 6c 6f 63 61 74 65 64  r .undeallocated
0af0: 20 72 65 73 6f 75 72 63 65 73 2e 3c 2f 70 3e 0a   resources.</p>.
0b00: 0a 3c 70 3e 49 66 20 79 6f 75 20 68 61 76 65 20  .<p>If you have 
0b10: 64 6f 6e 65 20 61 6e 79 20 61 73 73 65 6d 62 6c  done any assembl
0b20: 79 20 6c 61 6e 67 75 61 67 65 20 70 72 6f 67 72  y language progr
0b30: 61 6d 6d 69 6e 67 20 6f 72 20 68 61 76 65 0a 77  amming or have.w
0b40: 6f 72 6b 65 64 20 77 69 74 68 20 61 6e 79 20 6b  orked with any k
0b50: 69 6e 64 20 6f 66 20 61 62 73 74 72 61 63 74 20  ind of abstract 
0b60: 6d 61 63 68 69 6e 65 20 62 65 66 6f 72 65 2c 20  machine before, 
0b70: 61 6c 6c 20 6f 66 20 74 68 65 73 65 0a 64 65 74  all of these.det
0b80: 61 69 6c 73 20 73 68 6f 75 6c 64 20 62 65 20 66  ails should be f
0b90: 61 6d 69 6c 69 61 72 20 74 6f 20 79 6f 75 2e 20  amiliar to you. 
0ba0: 20 53 6f 20 6c 65 74 27 73 20 6a 75 6d 70 20 72   So let's jump r
0bb0: 69 67 68 74 20 69 6e 20 61 6e 64 0a 73 74 61 72  ight in and.star
0bc0: 74 20 6c 6f 6f 6b 69 6e 67 20 61 73 20 73 6f 6d  t looking as som
0bd0: 65 20 63 6f 64 65 2e 3c 2f 70 3e 0a 0a 3c 61 20  e code.</p>..<a 
0be0: 6e 61 6d 65 3d 22 69 6e 73 65 72 74 31 22 3e 0a  name="insert1">.
0bf0: 3c 68 32 3e 49 6e 73 65 72 74 69 6e 67 20 52 65  <h2>Inserting Re
0c00: 63 6f 72 64 73 20 49 6e 74 6f 20 54 68 65 20 44  cords Into The D
0c10: 61 74 61 62 61 73 65 3c 2f 68 32 3e 0a 0a 3c 70  atabase</h2>..<p
0c20: 3e 57 65 20 62 65 67 69 6e 20 77 69 74 68 20 61  >We begin with a
0c30: 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 63 61   problem that ca
0c40: 6e 20 62 65 20 73 6f 6c 76 65 64 20 75 73 69 6e  n be solved usin
0c50: 67 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  g a VDBE program
0c60: 0a 74 68 61 74 20 69 73 20 6f 6e 6c 79 20 61 20  .that is only a 
0c70: 66 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  few instructions
0c80: 20 6c 6f 6e 67 2e 20 20 53 75 70 70 6f 73 65 20   long.  Suppose 
0c90: 77 65 20 68 61 76 65 20 61 6e 20 53 51 4c 0a 74  we have an SQL.t
0ca0: 61 62 6c 65 20 74 68 61 74 20 77 61 73 20 63 72  able that was cr
0cb0: 65 61 74 65 64 20 6c 69 6b 65 20 74 68 69 73 3a  eated like this:
0cc0: 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74  </p>..<blockquot
0cd0: 65 3e 3c 70 72 65 3e 0a 43 52 45 41 54 45 20 54  e><pre>.CREATE T
0ce0: 41 42 4c 45 20 65 78 61 6d 70 28 6f 6e 65 20 74  ABLE examp(one t
0cf0: 65 78 74 2c 20 74 77 6f 20 69 6e 74 29 3b 0a 3c  ext, two int);.<
0d00: 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74  /pre></blockquot
0d10: 65 3e 0a 0a 3c 70 3e 49 6e 20 77 6f 72 64 73 2c  e>..<p>In words,
0d20: 20 77 65 20 68 61 76 65 20 61 20 64 61 74 61 62   we have a datab
0d30: 61 73 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ase table named 
0d40: 22 65 78 61 6d 70 22 20 74 68 61 74 20 68 61 73  "examp" that has
0d50: 20 74 77 6f 0a 63 6f 6c 75 6d 6e 73 20 6f 66 20   two.columns of 
0d60: 64 61 74 61 20 6e 61 6d 65 64 20 22 6f 6e 65 22  data named "one"
0d70: 20 61 6e 64 20 22 74 77 6f 22 2e 20 20 4e 6f 77   and "two".  Now
0d80: 20 73 75 70 70 6f 73 65 20 77 65 20 77 61 6e 74   suppose we want
0d90: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 73 69 6e   to insert a sin
0da0: 67 6c 65 0a 72 65 63 6f 72 64 20 69 6e 74 6f 20  gle.record into 
0db0: 74 68 69 73 20 74 61 62 6c 65 2e 20 20 4c 69 6b  this table.  Lik
0dc0: 65 20 74 68 69 73 3a 3c 2f 70 3e 0a 0a 3c 62 6c  e this:</p>..<bl
0dd0: 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 49  ockquote><pre>.I
0de0: 4e 53 45 52 54 20 49 4e 54 4f 20 65 78 61 6d 70  NSERT INTO examp
0df0: 20 56 41 4c 55 45 53 28 27 48 65 6c 6c 6f 2c 20   VALUES('Hello, 
0e00: 57 6f 72 6c 64 21 27 2c 39 39 29 3b 0a 3c 2f 70  World!',99);.</p
0e10: 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e  re></blockquote>
0e20: 0a 0a 3c 70 3e 57 65 20 63 61 6e 20 73 65 65 20  ..<p>We can see 
0e30: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
0e40: 20 74 68 61 74 20 53 51 4c 69 74 65 20 75 73 65   that SQLite use
0e50: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
0e60: 68 69 73 0a 49 4e 53 45 52 54 20 75 73 69 6e 67  his.INSERT using
0e70: 20 74 68 65 20 3c 62 3e 73 71 6c 69 74 65 3c 2f   the <b>sqlite</
0e80: 62 3e 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  b> command-line 
0e90: 75 74 69 6c 69 74 79 2e 20 20 46 69 72 73 74 20  utility.  First 
0ea0: 73 74 61 72 74 0a 75 70 20 3c 62 3e 73 71 6c 69  start.up <b>sqli
0eb0: 74 65 3c 2f 62 3e 20 6f 6e 20 61 20 6e 65 77 2c  te</b> on a new,
0ec0: 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c   empty database,
0ed0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
0ee0: 20 74 61 62 6c 65 2e 0a 4e 65 78 74 20 63 68 61   table..Next cha
0ef0: 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66  nge the output f
0f00: 6f 72 6d 61 74 20 6f 66 20 3c 62 3e 73 71 6c 69  ormat of <b>sqli
0f10: 74 65 3c 2f 62 3e 20 74 6f 20 61 20 66 6f 72 6d  te</b> to a form
0f20: 20 74 68 61 74 0a 69 73 20 64 65 73 69 67 6e 65   that.is designe
0f30: 64 20 74 6f 20 77 6f 72 6b 20 77 69 74 68 20 56  d to work with V
0f40: 44 42 45 20 70 72 6f 67 72 61 6d 20 64 75 6d 70  DBE program dump
0f50: 73 20 62 79 20 65 6e 74 65 72 69 6e 67 20 74 68  s by entering th
0f60: 65 0a 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f 6d  e.".explain" com
0f70: 6d 61 6e 64 2e 0a 46 69 6e 61 6c 6c 79 2c 20 65  mand..Finally, e
0f80: 6e 74 65 72 20 74 68 65 20 49 4e 53 45 52 54 20  nter the INSERT 
0f90: 73 74 61 74 65 6d 65 6e 74 20 73 68 6f 77 6e 20  statement shown 
0fa0: 61 62 6f 76 65 2c 20 62 75 74 20 70 72 65 63 65  above, but prece
0fb0: 64 65 20 74 68 65 0a 49 4e 53 45 52 54 20 77 69  de the.INSERT wi
0fc0: 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 6b  th the special k
0fd0: 65 79 77 6f 72 64 20 22 45 58 50 4c 41 49 4e 22  eyword "EXPLAIN"
0fe0: 2e 20 20 54 68 65 20 45 58 50 4c 41 49 4e 20 6b  .  The EXPLAIN k
0ff0: 65 79 77 6f 72 64 0a 77 69 6c 6c 20 63 61 75 73  eyword.will caus
1000: 65 20 3c 62 3e 73 71 6c 69 74 65 3c 2f 62 3e 20  e <b>sqlite</b> 
1010: 74 6f 20 70 72 69 6e 74 20 74 68 65 20 56 44 42  to print the VDB
1020: 45 20 70 72 6f 67 72 61 6d 20 72 61 74 68 65 72  E program rather
1030: 20 74 68 61 6e 20 0a 65 78 65 63 75 74 65 20 69   than .execute i
1040: 74 2e 20 20 57 65 20 68 61 76 65 3a 3c 2f 70 3e  t.  We have:</p>
1050: 0a 7d 0a 70 72 6f 63 20 43 6f 64 65 20 7b 62 6f  .}.proc Code {bo
1060: 64 79 7d 20 7b 0a 20 20 70 75 74 73 20 7b 3c 62  dy} {.  puts {<b
1070: 6c 6f 63 6b 71 75 6f 74 65 3e 3c 74 74 3e 7d 0a  lockquote><tt>}.
1080: 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 26    regsub -all {&
1090: 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  } [string trim $
10a0: 62 6f 64 79 5d 20 7b 5c 26 61 6d 70 3b 7d 20 62  body] {\&amp;} b
10b0: 6f 64 79 0a 20 20 72 65 67 73 75 62 20 2d 61 6c  ody.  regsub -al
10c0: 6c 20 7b 3e 7d 20 24 62 6f 64 79 20 7b 5c 26 67  l {>} $body {\&g
10d0: 74 3b 7d 20 62 6f 64 79 0a 20 20 72 65 67 73 75  t;} body.  regsu
10e0: 62 20 2d 61 6c 6c 20 7b 3c 7d 20 24 62 6f 64 79  b -all {<} $body
10f0: 20 7b 5c 26 6c 74 3b 7d 20 62 6f 64 79 0a 20 20   {\&lt;} body.  
1100: 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5c 28 5c  regsub -all {\(\
1110: 28 5c 28 7d 20 24 62 6f 64 79 20 7b 3c 62 3e 7d  (\(} $body {<b>}
1120: 20 62 6f 64 79 0a 20 20 72 65 67 73 75 62 20 2d   body.  regsub -
1130: 61 6c 6c 20 7b 5c 29 5c 29 5c 29 7d 20 24 62 6f  all {\)\)\)} $bo
1140: 64 79 20 7b 3c 2f 62 3e 7d 20 62 6f 64 79 0a 20  dy {</b>} body. 
1150: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 20 7d   regsub -all { }
1160: 20 24 62 6f 64 79 20 7b 5c 26 6e 62 73 70 3b 7d   $body {\&nbsp;}
1170: 20 62 6f 64 79 0a 20 20 72 65 67 73 75 62 20 2d   body.  regsub -
1180: 61 6c 6c 20 5c 6e 20 24 62 6f 64 79 20 3c 62 72  all \n $body <br
1190: 3e 5c 6e 20 62 6f 64 79 0a 20 20 70 75 74 73 20  >\n body.  puts 
11a0: 24 62 6f 64 79 0a 20 20 70 75 74 73 20 7b 3c 2f  $body.  puts {</
11b0: 74 74 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e  tt></blockquote>
11c0: 7d 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 24 20 28 28  }.}..Code {.$ ((
11d0: 28 73 71 6c 69 74 65 20 74 65 73 74 5f 64 61 74  (sqlite test_dat
11e0: 61 62 61 73 65 5f 31 29 29 29 0a 73 71 6c 69 74  abase_1))).sqlit
11f0: 65 3e 20 28 28 28 43 52 45 41 54 45 20 54 41 42  e> (((CREATE TAB
1200: 4c 45 20 65 78 61 6d 70 28 6f 6e 65 20 74 65 78  LE examp(one tex
1210: 74 2c 20 74 77 6f 20 69 6e 74 29 3b 29 29 29 0a  t, two int);))).
1220: 73 71 6c 69 74 65 3e 20 28 28 28 2e 65 78 70 6c  sqlite> (((.expl
1230: 61 69 6e 29 29 29 0a 73 71 6c 69 74 65 3e 20 28  ain))).sqlite> (
1240: 28 28 45 58 50 4c 41 49 4e 20 49 4e 53 45 52 54  ((EXPLAIN INSERT
1250: 20 49 4e 54 4f 20 65 78 61 6d 70 20 56 41 4c 55   INTO examp VALU
1260: 45 53 28 27 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64  ES('Hello, World
1270: 21 27 2c 39 39 29 3b 29 29 29 0a 61 64 64 72 20  !',99);))).addr 
1280: 20 6f 70 63 6f 64 65 20 20 20 20 20 20 20 20 70   opcode        p
1290: 31 20 20 20 20 20 70 32 20 20 20 20 20 70 33 20  1     p2     p3 
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d       .----  ----
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20  --------  ----- 
12e0: 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d   -----  --------
12f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20  -----------.0   
1310: 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 20 20    Transaction   
1320: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 0a 31 20 20 20 20 20 56 65 72 69 66 79 43 6f   .1     VerifyCo
1360: 6f 6b 69 65 20 20 30 20 20 20 20 20 20 38 31 20  okie  0      81 
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 20 20 0a 32 20 20 20 20 20 54 72         .2     Tr
13a0: 61 6e 73 61 63 74 69 6f 6e 20 20 20 31 20 20 20  ansaction   1   
13b0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 33 20               .3 
13e0: 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20      Integer     
13f0: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 0a 34 20 20 20 20 20 4f 70 65 6e 57 72     .4     OpenWr
1430: 69 74 65 20 20 20 20 20 30 20 20 20 20 20 20 33  ite     0      3
1440: 20 20 20 20 20 20 65 78 61 6d 70 20 20 20 20 20        examp     
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 20 0a 35 20 20 20 20 20           .5     
1470: 4e 65 77 52 65 63 6e 6f 20 20 20 20 20 20 30 20  NewRecno      0 
1480: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
14b0: 36 20 20 20 20 20 53 74 72 69 6e 67 20 20 20 20  6     String    
14c0: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
14d0: 20 20 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 20    Hello, World! 
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 20 20 20 0a 37 20 20 20 20 20 49 6e 74 65       .7     Inte
1500: 67 65 72 20 20 20 20 20 20 20 39 39 20 20 20 20  ger       99    
1510: 20 30 20 20 20 20 20 20 39 39 20 20 20 20 20 20   0      99      
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 0a 38 20 20 20             .8   
1540: 20 20 4d 61 6b 65 52 65 63 6f 72 64 20 20 20 20    MakeRecord    
1550: 32 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  2      0        
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 0a 39 20 20 20 20 20 50 75 74 49 6e 74 4b 65   .9     PutIntKe
1590: 79 20 20 20 20 20 30 20 20 20 20 20 20 31 20 20  y     0      1  
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 20 20 20 20 20 0a 31 30 20 20 20 20 43 6c         .10    Cl
15d0: 6f 73 65 20 20 20 20 20 20 20 20 20 30 20 20 20  ose         0   
15e0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 31               .11
1610: 20 20 20 20 43 6f 6d 6d 69 74 20 20 20 20 20 20      Commit      
1620: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 0a 31 32 20 20 20 20 48 61 6c 74 20 20     .12    Halt  
1660: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30          0      0
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 20 20 20 20 20 20 20 20 0a 7d 0a 0a 70 75 74           .}..put
16a0: 73 20 7b 3c 70 3e 41 73 20 79 6f 75 20 63 61 6e  s {<p>As you can
16b0: 20 73 65 65 20 61 62 6f 76 65 2c 20 6f 75 72 20   see above, our 
16c0: 73 69 6d 70 6c 65 20 69 6e 73 65 72 74 20 73 74  simple insert st
16d0: 61 74 65 6d 65 6e 74 20 69 73 0a 69 6d 70 6c 65  atement is.imple
16e0: 6d 65 6e 74 65 64 20 69 6e 20 31 32 20 69 6e 73  mented in 12 ins
16f0: 74 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 65 20  tructions.  The 
1700: 66 69 72 73 74 20 33 20 61 6e 64 20 6c 61 73 74  first 3 and last
1710: 20 32 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20   2 instructions 
1720: 61 72 65 20 0a 61 20 73 74 61 6e 64 61 72 64 20  are .a standard 
1730: 70 72 6f 6c 6f 67 75 65 20 61 6e 64 20 65 70 69  prologue and epi
1740: 6c 6f 67 75 65 2c 20 73 6f 20 74 68 65 20 72 65  logue, so the re
1750: 61 6c 20 77 6f 72 6b 20 69 73 20 64 6f 6e 65 20  al work is done 
1760: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 0a 37  in the middle .7
1770: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
1780: 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6a 75 6d  There are no jum
1790: 70 73 2c 20 73 6f 20 74 68 65 20 70 72 6f 67 72  ps, so the progr
17a0: 61 6d 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  am executes once
17b0: 20 74 68 72 6f 75 67 68 20 0a 66 72 6f 6d 20 74   through .from t
17c0: 6f 70 20 74 6f 20 62 6f 74 74 6f 6d 2e 20 20 4c  op to bottom.  L
17d0: 65 74 27 73 20 6e 6f 77 20 6c 6f 6f 6b 20 61 74  et's now look at
17e0: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
17f0: 6e 20 69 6e 20 64 65 74 61 69 6c 2e 3c 70 3e 0a  n in detail.<p>.
1800: 7d 0a 0a 43 6f 64 65 20 7b 0a 30 20 20 20 20 20  }..Code {.0     
1810: 54 72 61 6e 73 61 63 74 69 6f 6e 20 20 20 30 20  Transaction   0 
1820: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
1850: 31 20 20 20 20 20 56 65 72 69 66 79 43 6f 6f 6b  1     VerifyCook
1860: 69 65 20 20 30 20 20 20 20 20 20 38 31 20 20 20  ie  0      81   
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 20 20 20 20 0a 32 20 20 20 20 20 54 72 61 6e       .2     Tran
18a0: 73 61 63 74 69 6f 6e 20 20 20 31 20 20 20 20 20  saction   1     
18b0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75             .}.pu
18e0: 74 73 20 7b 0a 3c 70 3e 54 68 65 20 69 6e 73 74  ts {.<p>The inst
18f0: 72 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66 3d  ruction <a href=
1900: 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 54 72 61  "opcode.html#Tra
1910: 6e 73 61 63 74 69 6f 6e 22 3e 54 72 61 6e 73 61  nsaction">Transa
1920: 63 74 69 6f 6e 3c 2f 61 3e 20 0a 62 65 67 69 6e  ction</a> .begin
1930: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
1940: 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f    The transactio
1950: 6e 20 65 6e 64 73 20 77 68 65 6e 20 61 20 43 6f  n ends when a Co
1960: 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c 62 61 63 6b  mmit or Rollback
1970: 20 0a 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f   .opcode is enco
1980: 75 6e 74 65 72 65 64 2e 20 20 50 31 20 69 73 20  untered.  P1 is 
1990: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
19a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
19b0: 6e 20 77 68 69 63 68 20 0a 74 68 65 20 74 72 61  n which .the tra
19c0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
19d0: 74 65 64 2e 20 20 49 6e 64 65 78 20 30 20 69 73  ted.  Index 0 is
19e0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
19f0: 73 65 20 66 69 6c 65 2e 20 20 41 20 77 72 69 74  se file.  A writ
1a00: 65 20 0a 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  e .lock is obtai
1a10: 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ned on the datab
1a20: 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 61 20  ase file when a 
1a30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
1a40: 74 61 72 74 65 64 2e 20 20 0a 4e 6f 20 6f 74 68  tarted.  .No oth
1a50: 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72  er process can r
1a60: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
1a70: 20 66 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20   file while the 
1a80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a  transaction is .
1a90: 75 6e 64 65 72 77 61 79 2e 20 20 53 74 61 72 74  underway.  Start
1aa0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
1ab0: 6e 20 61 6c 73 6f 20 63 72 65 61 74 65 73 20 61  n also creates a
1ac0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1ad0: 6c 2e 20 20 41 20 0a 74 72 61 6e 73 61 63 74 69  l.  A .transacti
1ae0: 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
1af0: 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  ed before any ch
1b00: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 6d 61 64  anges can be mad
1b10: 65 20 74 6f 20 74 68 65 20 0a 64 61 74 61 62 61  e to the .databa
1b20: 73 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65 20  se.</p>..<p>The 
1b30: 69 6e 73 74 72 75 63 74 69 6f 6e 20 3c 61 20 68  instruction <a h
1b40: 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c  ref="opcode.html
1b50: 23 56 65 72 69 66 79 43 6f 6f 6b 69 65 22 3e 56  #VerifyCookie">V
1b60: 65 72 69 66 79 43 6f 6f 6b 69 65 3c 2f 61 3e 0a  erifyCookie</a>.
1b70: 63 68 65 63 6b 73 20 63 6f 6f 6b 69 65 20 30 20  checks cookie 0 
1b80: 28 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63  (the database sc
1b90: 68 65 6d 61 20 76 65 72 73 69 6f 6e 29 20 74 6f  hema version) to
1ba0: 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
1bb0: 20 65 71 75 61 6c 20 0a 74 6f 20 50 32 20 28 74   equal .to P2 (t
1bc0: 68 65 20 76 61 6c 75 65 20 6f 62 74 61 69 6e 65  he value obtaine
1bd0: 64 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  d when the datab
1be0: 61 73 65 20 73 63 68 65 6d 61 20 77 61 73 20 6c  ase schema was l
1bf0: 61 73 74 20 72 65 61 64 29 2e 20 20 0a 50 31 20  ast read).  .P1 
1c00: 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1c10: 6e 75 6d 62 65 72 20 28 30 20 66 6f 72 20 74 68  number (0 for th
1c20: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 29  e main database)
1c30: 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
1c40: 74 6f 20 0a 6d 61 6b 65 20 73 75 72 65 20 74 68  to .make sure th
1c50: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1c60: 61 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 68  a hasn't been ch
1c70: 61 6e 67 65 64 20 62 79 20 61 6e 6f 74 68 65 72  anged by another
1c80: 20 74 68 72 65 61 64 2c 20 69 6e 20 0a 77 68 69   thread, in .whi
1c90: 63 68 20 63 61 73 65 20 69 74 20 68 61 73 20 74  ch case it has t
1ca0: 6f 20 62 65 20 72 65 72 65 61 64 2e 3c 2f 70 3e  o be reread.</p>
1cb0: 0a 0a 3c 70 3e 20 54 68 65 20 73 65 63 6f 6e 64  ..<p> The second
1cc0: 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65   <a href="opcode
1cd0: 2e 68 74 6d 6c 23 54 72 61 6e 73 61 63 74 69 6f  .html#Transactio
1ce0: 6e 22 3e 54 72 61 6e 73 61 63 74 69 6f 6e 3c 2f  n">Transaction</
1cf0: 61 3e 20 0a 69 6e 73 74 72 75 63 74 69 6f 6e 20  a> .instruction 
1d00: 62 65 67 69 6e 73 20 61 20 74 72 61 6e 73 61 63  begins a transac
1d10: 74 69 6f 6e 20 61 6e 64 20 73 74 61 72 74 73 20  tion and starts 
1d20: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
1d30: 61 6c 20 66 6f 72 20 0a 64 61 74 61 62 61 73 65  al for .database
1d40: 20 31 2c 20 74 68 65 20 64 61 74 61 62 61 73 65   1, the database
1d50: 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72   used for tempor
1d60: 61 72 79 20 74 61 62 6c 65 73 2e 3c 2f 70 3e 0a  ary tables.</p>.
1d70: 7d 0a 0a 70 72 6f 63 20 73 74 61 63 6b 20 61 72  }..proc stack ar
1d80: 67 73 20 7b 0a 20 20 70 75 74 73 20 22 3c 62 6c  gs {.  puts "<bl
1d90: 6f 63 6b 71 75 6f 74 65 3e 3c 74 61 62 6c 65 20  ockquote><table 
1da0: 62 6f 72 64 65 72 3d 32 3e 22 0a 20 20 66 6f 72  border=2>".  for
1db0: 65 61 63 68 20 65 6c 65 6d 20 24 61 72 67 73 20  each elem $args 
1dc0: 7b 0a 20 20 20 20 70 75 74 73 20 22 3c 74 72 3e  {.    puts "<tr>
1dd0: 3c 74 64 20 61 6c 69 67 6e 3d 6c 65 66 74 3e 24  <td align=left>$
1de0: 65 6c 65 6d 3c 2f 74 64 3e 3c 2f 74 72 3e 22 0a  elem</td></tr>".
1df0: 20 20 7d 0a 20 20 70 75 74 73 20 22 3c 2f 74 61    }.  puts "</ta
1e00: 62 6c 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65  ble></blockquote
1e10: 3e 22 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 33 20 20  >".}..Code {.3  
1e20: 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20     Integer      
1e30: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 34 20               .4 
1e60: 20 20 20 20 4f 70 65 6e 57 72 69 74 65 20 20 20      OpenWrite   
1e70: 20 20 30 20 20 20 20 20 20 33 20 20 20 20 20 20    0      3      
1e80: 65 78 61 6d 70 20 20 20 20 20 20 20 20 20 20 20  examp           
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d                .}
1ea0: 0a 70 75 74 73 20 7b 0a 3c 70 3e 20 54 68 65 20  .puts {.<p> The 
1eb0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 3c 61 20 68  instruction <a h
1ec0: 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c  ref="opcode.html
1ed0: 23 49 6e 74 65 67 65 72 22 3e 49 6e 74 65 67 65  #Integer">Intege
1ee0: 72 3c 2f 61 3e 20 70 75 73 68 65 73 20 0a 74 68  r</a> pushes .th
1ef0: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
1f00: 50 31 20 28 30 29 20 6f 6e 74 6f 20 74 68 65 20  P1 (0) onto the 
1f10: 73 74 61 63 6b 2e 20 20 48 65 72 65 20 30 20 69  stack.  Here 0 i
1f20: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1f30: 74 68 65 20 0a 64 61 74 61 62 61 73 65 20 74 6f  the .database to
1f40: 20 75 73 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c   use in the foll
1f50: 6f 77 69 6e 67 20 4f 70 65 6e 57 72 69 74 65 20  owing OpenWrite 
1f60: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66  instruction.  If
1f70: 20 50 33 20 69 73 20 6e 6f 74 20 0a 4e 55 4c 4c   P3 is not .NULL
1f80: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 73 74   then it is a st
1f90: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
1fa0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ion of the same 
1fb0: 69 6e 74 65 67 65 72 2e 20 20 41 66 74 65 72 77  integer.  Afterw
1fc0: 61 72 64 73 20 0a 74 68 65 20 73 74 61 63 6b 20  ards .the stack 
1fd0: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
1fe0: 3c 2f 70 3e 0a 7d 0a 73 74 61 63 6b 20 7b 28 69  </p>.}.stack {(i
1ff0: 6e 74 65 67 65 72 29 20 30 7d 0a 0a 70 75 74 73  nteger) 0}..puts
2000: 20 7b 0a 3c 70 3e 20 54 68 65 20 69 6e 73 74 72   {.<p> The instr
2010: 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66 3d 22  uction <a href="
2020: 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 4f 70 65 6e  opcode.html#Open
2030: 57 72 69 74 65 22 3e 4f 70 65 6e 57 72 69 74 65  Write">OpenWrite
2040: 3c 2f 61 3e 20 6f 70 65 6e 73 20 0a 61 20 6e 65  </a> opens .a ne
2050: 77 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  w read/write cur
2060: 73 6f 72 20 77 69 74 68 20 68 61 6e 64 6c 65 20  sor with handle 
2070: 50 31 20 28 30 20 69 6e 20 74 68 69 73 20 63 61  P1 (0 in this ca
2080: 73 65 29 20 6f 6e 20 74 61 62 6c 65 20 22 65 78  se) on table "ex
2090: 61 6d 70 22 2c 20 0a 77 68 6f 73 65 20 72 6f 6f  amp", .whose roo
20a0: 74 20 70 61 67 65 20 69 73 20 50 32 20 28 33 2c  t page is P2 (3,
20b0: 20 69 6e 20 74 68 69 73 20 64 61 74 61 62 61 73   in this databas
20c0: 65 20 66 69 6c 65 29 2e 20 20 43 75 72 73 6f 72  e file).  Cursor
20d0: 20 68 61 6e 64 6c 65 73 20 63 61 6e 20 62 65 20   handles can be 
20e0: 0a 61 6e 79 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  .any non-negativ
20f0: 65 20 69 6e 74 65 67 65 72 2e 20 20 42 75 74 20  e integer.  But 
2100: 74 68 65 20 56 44 42 45 20 61 6c 6c 6f 63 61 74  the VDBE allocat
2110: 65 73 20 63 75 72 73 6f 72 73 20 69 6e 20 61 6e  es cursors in an
2120: 20 61 72 72 61 79 20 0a 77 69 74 68 20 74 68 65   array .with the
2130: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
2140: 61 79 20 62 65 69 6e 67 20 6f 6e 65 20 6d 6f 72  ay being one mor
2150: 65 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  e than the large
2160: 73 74 20 63 75 72 73 6f 72 2e 20 20 53 6f 20 0a  st cursor.  So .
2170: 74 6f 20 63 6f 6e 73 65 72 76 65 20 6d 65 6d 6f  to conserve memo
2180: 72 79 2c 20 69 74 20 69 73 20 62 65 73 74 20 74  ry, it is best t
2190: 6f 20 75 73 65 20 68 61 6e 64 6c 65 73 20 62 65  o use handles be
21a0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 7a 65 72  ginning with zer
21b0: 6f 20 61 6e 64 20 0a 77 6f 72 6b 69 6e 67 20 75  o and .working u
21c0: 70 77 61 72 64 20 63 6f 6e 73 65 63 75 74 69 76  pward consecutiv
21d0: 65 6c 79 2e 20 20 48 65 72 65 20 50 33 20 28 22  ely.  Here P3 ("
21e0: 65 78 61 6d 70 22 29 20 69 73 20 74 68 65 20 6e  examp") is the n
21f0: 61 6d 65 20 6f 66 20 74 68 65 20 0a 74 61 62 6c  ame of the .tabl
2200: 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2c 20  e being opened, 
2210: 62 75 74 20 74 68 69 73 20 69 73 20 75 6e 75 73  but this is unus
2220: 65 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 67 65 6e  ed, and only gen
2230: 65 72 61 74 65 64 20 74 6f 20 6d 61 6b 65 20 74  erated to make t
2240: 68 65 20 0a 63 6f 64 65 20 65 61 73 69 65 72 20  he .code easier 
2250: 74 6f 20 72 65 61 64 2e 20 20 54 68 69 73 20 69  to read.  This i
2260: 6e 73 74 72 75 63 74 69 6f 6e 20 70 6f 70 73 20  nstruction pops 
2270: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d  the database num
2280: 62 65 72 20 74 6f 20 75 73 65 20 0a 28 30 2c 20  ber to use .(0, 
2290: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
22a0: 65 29 20 66 72 6f 6d 20 74 68 65 20 74 6f 70 20  e) from the top 
22b0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2c 20 73 6f  of the stack, so
22c0: 20 61 66 74 65 72 77 61 72 64 73 20 74 68 65 20   afterwards the 
22d0: 0a 73 74 61 63 6b 20 69 73 20 65 6d 70 74 79 20  .stack is empty 
22e0: 61 67 61 69 6e 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f  again.</p>.}..Co
22f0: 64 65 20 7b 0a 35 20 20 20 20 20 4e 65 77 52 65  de {.5     NewRe
2300: 63 6e 6f 20 20 20 20 20 20 30 20 20 20 20 20 20  cno      0      
2310: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 20 0a 7d 0a 70 75 74 73 20 7b 0a 3c       .}.puts {.<
2340: 70 3e 20 54 68 65 20 69 6e 73 74 72 75 63 74 69  p> The instructi
2350: 6f 6e 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f  on <a href="opco
2360: 64 65 2e 68 74 6d 6c 23 4e 65 77 52 65 63 6e 6f  de.html#NewRecno
2370: 22 3e 4e 65 77 52 65 63 6e 6f 3c 2f 61 3e 20 63  ">NewRecno</a> c
2380: 72 65 61 74 65 73 20 0a 61 20 6e 65 77 20 69 6e  reates .a new in
2390: 74 65 67 65 72 20 72 65 63 6f 72 64 20 6e 75 6d  teger record num
23a0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
23b0: 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
23c0: 63 75 72 73 6f 72 20 50 31 2e 20 20 54 68 65 20  cursor P1.  The 
23d0: 0a 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69  .record number i
23e0: 73 20 6f 6e 65 20 6e 6f 74 20 63 75 72 72 65 6e  s one not curren
23f0: 74 6c 79 20 75 73 65 64 20 61 73 20 61 20 6b 65  tly used as a ke
2400: 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
2410: 20 54 68 65 20 6e 65 77 20 0a 72 65 63 6f 72 64   The new .record
2420: 20 6e 75 6d 62 65 72 20 69 73 20 70 75 73 68 65   number is pushe
2430: 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  d onto the stack
2440: 2e 20 20 41 66 74 65 72 77 61 72 64 73 20 74 68  .  Afterwards th
2450: 65 20 73 74 61 63 6b 20 6c 6f 6f 6b 73 20 6c 69  e stack looks li
2460: 6b 65 20 0a 74 68 69 73 3a 3c 2f 70 3e 0a 7d 0a  ke .this:</p>.}.
2470: 73 74 61 63 6b 20 7b 28 69 6e 74 65 67 65 72 29  stack {(integer)
2480: 20 6e 65 77 20 72 65 63 6f 72 64 20 6b 65 79 7d   new record key}
2490: 0a 0a 43 6f 64 65 20 7b 0a 36 20 20 20 20 20 53  ..Code {.6     S
24a0: 74 72 69 6e 67 20 20 20 20 20 20 20 20 30 20 20  tring        0  
24b0: 20 20 20 20 30 20 20 20 20 20 20 48 65 6c 6c 6f      0      Hello
24c0: 2c 20 57 6f 72 6c 64 21 20 20 20 20 20 20 20 20  , World!        
24d0: 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75 74 73           .}.puts
24e0: 20 7b 0a 3c 70 3e 20 54 68 65 20 69 6e 73 74 72   {.<p> The instr
24f0: 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66 3d 22  uction <a href="
2500: 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 53 74 72 69  opcode.html#Stri
2510: 6e 67 22 3e 53 74 72 69 6e 67 3c 2f 61 3e 20 70  ng">String</a> p
2520: 75 73 68 65 73 20 69 74 73 20 0a 50 33 20 6f 70  ushes its .P3 op
2530: 65 72 61 6e 64 20 6f 6e 74 6f 20 74 68 65 20 73  erand onto the s
2540: 74 61 63 6b 2e 20 20 41 66 74 65 72 77 61 72 64  tack.  Afterward
2550: 73 20 74 68 65 20 73 74 61 63 6b 20 6c 6f 6f 6b  s the stack look
2560: 73 20 6c 69 6b 65 20 74 68 69 73 3a 3c 2f 70 3e  s like this:</p>
2570: 0a 7d 0a 73 74 61 63 6b 20 7b 28 73 74 72 69 6e  .}.stack {(strin
2580: 67 29 20 22 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64  g) "Hello, World
2590: 21 22 7d 20 5c 0a 20 7b 28 69 6e 74 65 67 65 72  !"} \. {(integer
25a0: 29 20 6e 65 77 20 72 65 63 6f 72 64 20 6b 65 79  ) new record key
25b0: 7d 0a 0a 43 6f 64 65 20 7b 0a 37 20 20 20 20 20  }..Code {.7     
25c0: 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 39 39  Integer       99
25d0: 20 20 20 20 20 30 20 20 20 20 20 20 39 39 20 20       0      99  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75 74            .}.put
2600: 73 20 7b 0a 3c 70 3e 20 54 68 65 20 69 6e 73 74  s {.<p> The inst
2610: 72 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66 3d  ruction <a href=
2620: 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 49 6e 74  "opcode.html#Int
2630: 65 67 65 72 22 3e 49 6e 74 65 67 65 72 3c 2f 61  eger">Integer</a
2640: 3e 20 70 75 73 68 65 73 20 0a 69 74 73 20 50 31  > pushes .its P1
2650: 20 6f 70 65 72 61 6e 64 20 28 39 39 29 20 6f 6e   operand (99) on
2660: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41  to the stack.  A
2670: 66 74 65 72 77 61 72 64 73 20 74 68 65 20 73 74  fterwards the st
2680: 61 63 6b 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 0a  ack looks like .
2690: 74 68 69 73 3a 3c 2f 70 3e 0a 7d 0a 73 74 61 63  this:</p>.}.stac
26a0: 6b 20 7b 28 69 6e 74 65 67 65 72 29 20 39 39 7d  k {(integer) 99}
26b0: 20 5c 0a 20 7b 28 73 74 72 69 6e 67 29 20 22 48   \. {(string) "H
26c0: 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 22 7d 20 5c  ello, World!"} \
26d0: 0a 20 7b 28 69 6e 74 65 67 65 72 29 20 6e 65 77  . {(integer) new
26e0: 20 72 65 63 6f 72 64 20 6b 65 79 7d 0a 0a 43 6f   record key}..Co
26f0: 64 65 20 7b 0a 38 20 20 20 20 20 4d 61 6b 65 52  de {.8     MakeR
2700: 65 63 6f 72 64 20 20 20 20 32 20 20 20 20 20 20  ecord    2      
2710: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 20 20 0a 7d 0a 70 75 74 73 20 7b 0a 3c       .}.puts {.<
2740: 70 3e 20 54 68 65 20 69 6e 73 74 72 75 63 74 69  p> The instructi
2750: 6f 6e 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f  on <a href="opco
2760: 64 65 2e 68 74 6d 6c 23 4d 61 6b 65 52 65 63 6f  de.html#MakeReco
2770: 72 64 22 3e 4d 61 6b 65 52 65 63 6f 72 64 3c 2f  rd">MakeRecord</
2780: 61 3e 20 70 6f 70 73 20 0a 74 68 65 20 74 6f 70  a> pops .the top
2790: 20 50 31 20 65 6c 65 6d 65 6e 74 73 20 6f 66 66   P1 elements off
27a0: 20 74 68 65 20 73 74 61 63 6b 20 28 32 20 69 6e   the stack (2 in
27b0: 20 74 68 69 73 20 63 61 73 65 29 20 61 6e 64 20   this case) and 
27c0: 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e  converts them in
27d0: 74 6f 20 0a 74 68 65 20 62 69 6e 61 72 79 20 66  to .the binary f
27e0: 6f 72 6d 61 74 20 75 73 65 64 20 66 6f 72 20 73  ormat used for s
27f0: 74 6f 72 69 6e 67 20 72 65 63 6f 72 64 73 20 69  toring records i
2800: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
2810: 65 2e 20 20 0a 28 53 65 65 20 74 68 65 20 3c 61  e.  .(See the <a
2820: 20 68 72 65 66 3d 22 66 69 6c 65 66 6f 72 6d 61   href="fileforma
2830: 74 2e 68 74 6d 6c 22 3e 66 69 6c 65 20 66 6f 72  t.html">file for
2840: 6d 61 74 3c 2f 61 3e 20 64 65 73 63 72 69 70 74  mat</a> descript
2850: 69 6f 6e 20 66 6f 72 20 0a 64 65 74 61 69 6c 73  ion for .details
2860: 2e 29 20 20 54 68 65 20 6e 65 77 20 72 65 63 6f  .)  The new reco
2870: 72 64 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  rd generated by 
2880: 74 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20 69  the MakeRecord i
2890: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 0a 70  nstruction is .p
28a0: 75 73 68 65 64 20 62 61 63 6b 20 6f 6e 74 6f 20  ushed back onto 
28b0: 74 68 65 20 73 74 61 63 6b 2e 20 20 41 66 74 65  the stack.  Afte
28c0: 72 77 61 72 64 73 20 74 68 65 20 73 74 61 63 6b  rwards the stack
28d0: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
28e0: 3a 3c 2f 70 3e 0a 3c 2f 75 6c 3e 0a 7d 0a 73 74  :</p>.</ul>.}.st
28f0: 61 63 6b 20 7b 28 72 65 63 6f 72 64 29 20 22 48  ack {(record) "H
2900: 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 22 2c 20 39  ello, World!", 9
2910: 39 7d 20 5c 0a 20 7b 28 69 6e 74 65 67 65 72 29  9} \. {(integer)
2920: 20 6e 65 77 20 72 65 63 6f 72 64 20 6b 65 79 7d   new record key}
2930: 0a 0a 43 6f 64 65 20 7b 0a 39 20 20 20 20 20 50  ..Code {.9     P
2940: 75 74 49 6e 74 4b 65 79 20 20 20 20 20 30 20 20  utIntKey     0  
2950: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75 74 73           .}.puts
2980: 20 7b 0a 3c 70 3e 20 54 68 65 20 69 6e 73 74 72   {.<p> The instr
2990: 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66 3d 22  uction <a href="
29a0: 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 50 75 74 49  opcode.html#PutI
29b0: 6e 74 4b 65 79 22 3e 50 75 74 49 6e 74 4b 65 79  ntKey">PutIntKey
29c0: 3c 2f 61 3e 20 75 73 65 73 20 0a 74 68 65 20 74  </a> uses .the t
29d0: 6f 70 20 32 20 73 74 61 63 6b 20 65 6e 74 72 69  op 2 stack entri
29e0: 65 73 20 74 6f 20 77 72 69 74 65 20 61 6e 20 65  es to write an e
29f0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 74 61  ntry into the ta
2a00: 62 6c 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ble pointed to b
2a10: 79 20 0a 63 75 72 73 6f 72 20 50 31 2e 20 20 41  y .cursor P1.  A
2a20: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
2a30: 65 61 74 65 64 20 69 66 20 69 74 20 64 6f 65 73  eated if it does
2a40: 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  n't already exis
2a50: 74 20 6f 72 20 74 68 65 20 0a 64 61 74 61 20 66  t or the .data f
2a60: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  or an existing e
2a70: 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72 69 74  ntry is overwrit
2a80: 74 65 6e 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ten.  The record
2a90: 20 64 61 74 61 20 69 73 20 74 68 65 20 74 6f 70   data is the top
2aa0: 20 0a 73 74 61 63 6b 20 65 6e 74 72 79 2c 20 61   .stack entry, a
2ab0: 6e 64 20 74 68 65 20 6b 65 79 20 69 73 20 74 68  nd the key is th
2ac0: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 64 6f 77  e next entry dow
2ad0: 6e 2e 20 20 54 68 65 20 73 74 61 63 6b 20 69 73  n.  The stack is
2ae0: 20 70 6f 70 70 65 64 20 0a 74 77 69 63 65 20 62   popped .twice b
2af0: 79 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  y this instructi
2b00: 6f 6e 2e 20 20 42 65 63 61 75 73 65 20 6f 70 65  on.  Because ope
2b10: 72 61 6e 64 20 50 32 20 69 73 20 31 20 74 68 65  rand P2 is 1 the
2b20: 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e   row change coun
2b30: 74 20 0a 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  t .is incremente
2b40: 64 20 61 6e 64 20 74 68 65 20 72 6f 77 69 64 20  d and the rowid 
2b50: 69 73 20 73 74 6f 72 65 64 20 66 6f 72 20 73 75  is stored for su
2b60: 62 73 65 71 75 65 6e 74 20 72 65 74 75 72 6e 20  bsequent return 
2b70: 62 79 20 74 68 65 20 0a 73 71 6c 69 74 65 5f 6c  by the .sqlite_l
2b80: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
2b90: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66  () function.  If
2ba0: 20 50 32 20 69 73 20 30 20 74 68 65 20 72 6f 77   P2 is 0 the row
2bb0: 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73   change count is
2bc0: 20 0a 75 6e 6d 6f 64 69 66 69 65 64 2e 20 20 54   .unmodified.  T
2bd0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
2be0: 69 73 20 77 68 65 72 65 20 74 68 65 20 69 6e 73  is where the ins
2bf0: 65 72 74 20 61 63 74 75 61 6c 6c 79 20 6f 63 63  ert actually occ
2c00: 75 72 73 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65  urs.</p>.}..Code
2c10: 20 7b 0a 31 30 20 20 20 20 43 6c 6f 73 65 20 20   {.10    Close  
2c20: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 20 20 20 20 20 20 0a 7d 0a 70 75 74 73 20          .}.puts 
2c60: 7b 0a 3c 70 3e 20 54 68 65 20 69 6e 73 74 72 75  {.<p> The instru
2c70: 63 74 69 6f 6e 20 3c 61 20 68 72 65 66 3d 22 6f  ction <a href="o
2c80: 70 63 6f 64 65 2e 68 74 6d 6c 23 43 6c 6f 73 65  pcode.html#Close
2c90: 22 3e 43 6c 6f 73 65 3c 2f 61 3e 20 63 6c 6f 73  ">Close</a> clos
2ca0: 65 73 20 61 20 0a 63 75 72 73 6f 72 20 70 72 65  es a .cursor pre
2cb0: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 61  viously opened a
2cc0: 73 20 50 31 20 28 30 2c 20 74 68 65 20 6f 6e 6c  s P1 (0, the onl
2cd0: 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 29 2e 20  y open cursor). 
2ce0: 49 66 20 50 31 20 69 73 20 6e 6f 74 20 0a 63 75  If P1 is not .cu
2cf0: 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74 68  rrently open, th
2d00: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  is instruction i
2d10: 73 20 61 20 6e 6f 2d 6f 70 2e 3c 2f 70 3e 0a 7d  s a no-op.</p>.}
2d20: 0a 0a 43 6f 64 65 20 7b 0a 31 31 20 20 20 20 43  ..Code {.11    C
2d30: 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 30 20 20  ommit        0  
2d40: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d                .}
2d70: 0a 70 75 74 73 20 7b 0a 3c 70 3e 20 54 68 65 20  .puts {.<p> The 
2d80: 69 6e 73 74 72 75 63 74 69 6f 6e 20 3c 61 20 68  instruction <a h
2d90: 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c  ref="opcode.html
2da0: 23 43 6f 6d 6d 69 74 22 3e 43 6f 6d 6d 69 74 3c  #Commit">Commit<
2db0: 2f 61 3e 20 63 61 75 73 65 73 20 61 6c 6c 20 0a  /a> causes all .
2dc0: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2dd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
2de0: 61 74 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64  at have been mad
2df0: 65 20 73 69 6e 63 65 20 74 68 65 20 6c 61 73 74  e since the last
2e00: 20 0a 54 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f   .Transaction to
2e10: 20 61 63 74 75 61 6c 6c 79 20 74 61 6b 65 20 65   actually take e
2e20: 66 66 65 63 74 2e 20 20 4e 6f 20 61 64 64 69 74  ffect.  No addit
2e30: 69 6f 6e 61 6c 20 6d 6f 64 69 66 69 63 61 74 69  ional modificati
2e40: 6f 6e 73 20 61 72 65 20 0a 61 6c 6c 6f 77 65 64  ons are .allowed
2e50: 20 75 6e 74 69 6c 20 61 6e 6f 74 68 65 72 20 74   until another t
2e60: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
2e70: 61 72 74 65 64 2e 20 20 54 68 65 20 43 6f 6d 6d  arted.  The Comm
2e80: 69 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  it instruction .
2e90: 64 65 6c 65 74 65 73 20 74 68 65 20 6a 6f 75 72  deletes the jour
2ea0: 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 72 65 6c  nal file and rel
2eb0: 65 61 73 65 73 20 74 68 65 20 77 72 69 74 65 20  eases the write 
2ec0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2ed0: 62 61 73 65 2e 20 20 0a 41 20 72 65 61 64 20 6c  base.  .A read l
2ee0: 6f 63 6b 20 63 6f 6e 74 69 6e 75 65 73 20 74 6f  ock continues to
2ef0: 20 62 65 20 68 65 6c 64 20 69 66 20 74 68 65 72   be held if ther
2f00: 65 20 61 72 65 20 73 74 69 6c 6c 20 63 75 72 73  e are still curs
2f10: 6f 72 73 20 6f 70 65 6e 2e 3c 2f 70 3e 0a 7d 0a  ors open.</p>.}.
2f20: 0a 43 6f 64 65 20 7b 0a 31 32 20 20 20 20 48 61  .Code {.12    Ha
2f30: 6c 74 20 20 20 20 20 20 20 20 20 20 30 20 20 20  lt          0   
2f40: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a               .}.
2f70: 70 75 74 73 20 7b 0a 3c 70 3e 20 54 68 65 20 69  puts {.<p> The i
2f80: 6e 73 74 72 75 63 74 69 6f 6e 20 3c 61 20 68 72  nstruction <a hr
2f90: 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23  ef="opcode.html#
2fa0: 48 61 6c 74 22 3e 48 61 6c 74 3c 2f 61 3e 20 63  Halt">Halt</a> c
2fb0: 61 75 73 65 73 20 74 68 65 20 56 44 42 45 20 0a  auses the VDBE .
2fc0: 65 6e 67 69 6e 65 20 74 6f 20 65 78 69 74 20 69  engine to exit i
2fd0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 41 6c 6c  mmediately.  All
2fe0: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2c 20 4c   open cursors, L
2ff0: 69 73 74 73 2c 20 53 6f 72 74 73 2c 20 65 74 63  ists, Sorts, etc
3000: 20 61 72 65 20 0a 63 6c 6f 73 65 64 20 61 75 74   are .closed aut
3010: 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 31 20  omatically.  P1 
3020: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  is the result co
3030: 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  de returned by s
3040: 71 6c 69 74 65 5f 65 78 65 63 28 29 2e 20 20 0a  qlite_exec().  .
3050: 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61 6c  For a normal hal
3060: 74 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62  t, this should b
3070: 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e  e SQLITE_OK (0).
3080: 20 20 46 6f 72 20 65 72 72 6f 72 73 2c 20 69 74    For errors, it
3090: 20 63 61 6e 20 62 65 20 0a 73 6f 6d 65 20 6f 74   can be .some ot
30a0: 68 65 72 20 76 61 6c 75 65 2e 20 20 54 68 65 20  her value.  The 
30b0: 6f 70 65 72 61 6e 64 20 50 32 20 69 73 20 6f 6e  operand P2 is on
30c0: 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
30d0: 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  re is an error. 
30e0: 20 0a 54 68 65 72 65 20 69 73 20 61 6e 20 69 6d   .There is an im
30f0: 70 6c 69 65 64 20 22 48 61 6c 74 20 30 20 30 20  plied "Halt 0 0 
3100: 30 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  0" instruction a
3110: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
3120: 72 79 20 0a 70 72 6f 67 72 61 6d 2c 20 77 68 69  ry .program, whi
3130: 63 68 20 74 68 65 20 56 44 42 45 20 61 70 70 65  ch the VDBE appe
3140: 6e 64 73 20 77 68 65 6e 20 69 74 20 70 72 65 70  nds when it prep
3150: 61 72 65 73 20 61 20 70 72 6f 67 72 61 6d 20 74  ares a program t
3160: 6f 20 72 75 6e 2e 3c 2f 70 3e 0a 0a 0a 3c 61 20  o run.</p>...<a 
3170: 6e 61 6d 65 3d 22 74 72 61 63 65 22 3e 0a 3c 68  name="trace">.<h
3180: 32 3e 54 72 61 63 69 6e 67 20 56 44 42 45 20 50  2>Tracing VDBE P
3190: 72 6f 67 72 61 6d 20 45 78 65 63 75 74 69 6f 6e  rogram Execution
31a0: 3c 2f 68 32 3e 0a 0a 3c 70 3e 49 66 20 74 68 65  </h2>..<p>If the
31b0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
31c0: 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  is compiled with
31d0: 6f 75 74 20 74 68 65 20 4e 44 45 42 55 47 20 70  out the NDEBUG p
31e0: 72 65 70 72 6f 63 65 73 73 6f 72 20 0a 6d 61 63  reprocessor .mac
31f0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 50 52 41  ro, then the PRA
3200: 47 4d 41 20 3c 61 20 68 72 65 66 3d 22 6c 61 6e  GMA <a href="lan
3210: 67 2e 68 74 6d 6c 23 70 72 61 67 6d 61 5f 76 64  g.html#pragma_vd
3220: 62 65 5f 74 72 61 63 65 22 3e 76 64 62 65 5f 74  be_trace">vdbe_t
3230: 72 61 63 65 0a 3c 2f 61 3e 20 63 61 75 73 65 73  race.</a> causes
3240: 20 74 68 65 20 56 44 42 45 20 74 6f 20 74 72 61   the VDBE to tra
3250: 63 65 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  ce the execution
3260: 20 6f 66 20 70 72 6f 67 72 61 6d 73 2e 20 20 54   of programs.  T
3270: 68 6f 75 67 68 20 74 68 69 73 20 0a 66 65 61 74  hough this .feat
3280: 75 72 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ure was original
3290: 6c 79 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  ly intended for 
32a0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
32b0: 67 67 69 6e 67 2c 20 69 74 20 63 61 6e 20 61 6c  gging, it can al
32c0: 73 6f 20 0a 62 65 20 75 73 65 66 75 6c 20 69 6e  so .be useful in
32d0: 20 6c 65 61 72 6e 69 6e 67 20 61 62 6f 75 74 20   learning about 
32e0: 68 6f 77 20 74 68 65 20 56 44 42 45 20 6f 70 65  how the VDBE ope
32f0: 72 61 74 65 73 2e 20 20 0a 55 73 65 20 22 3c 74  rates.  .Use "<t
3300: 74 3e 50 52 41 47 4d 41 26 6e 62 73 70 3b 76 64  t>PRAGMA&nbsp;vd
3310: 62 65 5f 74 72 61 63 65 3d 4f 4e 3b 3c 2f 74 74  be_trace=ON;</tt
3320: 3e 22 20 74 6f 20 74 75 72 6e 20 74 72 61 63 69  >" to turn traci
3330: 6e 67 20 6f 6e 20 61 6e 64 20 0a 22 3c 74 74 3e  ng on and ."<tt>
3340: 50 52 41 47 4d 41 26 6e 62 73 70 3b 76 64 62 65  PRAGMA&nbsp;vdbe
3350: 5f 74 72 61 63 65 3d 4f 46 46 3c 2f 74 74 3e 22  _trace=OFF</tt>"
3360: 20 74 6f 20 74 75 72 6e 20 74 72 61 63 69 6e 67   to turn tracing
3370: 20 62 61 63 6b 20 6f 66 66 2e 20 20 0a 4c 69 6b   back off.  .Lik
3380: 65 20 74 68 69 73 3a 3c 2f 70 3e 0a 7d 0a 0a 43  e this:</p>.}..C
3390: 6f 64 65 20 7b 0a 73 71 6c 69 74 65 3e 20 28 28  ode {.sqlite> ((
33a0: 28 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72 61  (PRAGMA vdbe_tra
33b0: 63 65 3d 4f 4e 3b 29 29 29 0a 20 20 20 30 20 48  ce=ON;))).   0 H
33c0: 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 30  alt            0
33d0: 20 20 20 20 30 0a 73 71 6c 69 74 65 3e 20 28 28      0.sqlite> ((
33e0: 28 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 78 61  (INSERT INTO exa
33f0: 6d 70 20 56 41 4c 55 45 53 28 27 48 65 6c 6c 6f  mp VALUES('Hello
3400: 2c 20 57 6f 72 6c 64 21 27 2c 39 39 29 3b 29 29  , World!',99);))
3410: 29 0a 20 20 20 30 20 54 72 61 6e 73 61 63 74 69  ).   0 Transacti
3420: 6f 6e 20 20 20 20 20 30 20 20 20 20 30 0a 20 20  on     0    0.  
3430: 20 31 20 56 65 72 69 66 79 43 6f 6f 6b 69 65 20   1 VerifyCookie 
3440: 20 20 20 30 20 20 20 38 31 0a 20 20 20 32 20 54     0   81.   2 T
3450: 72 61 6e 73 61 63 74 69 6f 6e 20 20 20 20 20 31  ransaction     1
3460: 20 20 20 20 30 0a 20 20 20 33 20 49 6e 74 65 67      0.   3 Integ
3470: 65 72 20 20 20 20 20 20 20 20 20 30 20 20 20 20  er         0    
3480: 30 0a 53 74 61 63 6b 3a 20 69 3a 30 0a 20 20 20  0.Stack: i:0.   
3490: 34 20 4f 70 65 6e 57 72 69 74 65 20 20 20 20 20  4 OpenWrite     
34a0: 20 20 30 20 20 20 20 33 20 65 78 61 6d 70 0a 20    0    3 examp. 
34b0: 20 20 35 20 4e 65 77 52 65 63 6e 6f 20 20 20 20    5 NewRecno    
34c0: 20 20 20 20 30 20 20 20 20 30 0a 53 74 61 63 6b      0    0.Stack
34d0: 3a 20 69 3a 32 0a 20 20 20 36 20 53 74 72 69 6e  : i:2.   6 Strin
34e0: 67 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20  g          0    
34f0: 30 20 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 0a  0 Hello, World!.
3500: 53 74 61 63 6b 3a 20 74 5b 48 65 6c 6c 6f 2c 2e  Stack: t[Hello,.
3510: 57 6f 72 6c 64 21 5d 20 69 3a 32 0a 20 20 20 37  World!] i:2.   7
3520: 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 20   Integer        
3530: 39 39 20 20 20 20 30 20 39 39 0a 53 74 61 63 6b  99    0 99.Stack
3540: 3a 20 73 69 3a 39 39 20 74 5b 48 65 6c 6c 6f 2c  : si:99 t[Hello,
3550: 2e 57 6f 72 6c 64 21 5d 20 69 3a 32 0a 20 20 20  .World!] i:2.   
3560: 38 20 4d 61 6b 65 52 65 63 6f 72 64 20 20 20 20  8 MakeRecord    
3570: 20 20 32 20 20 20 20 30 0a 53 74 61 63 6b 3a 20    2    0.Stack: 
3580: 73 5b 2e 2e 2e 48 65 6c 6c 6f 2c 2e 57 6f 72 6c  s[...Hello,.Worl
3590: 64 21 2e 39 39 5d 20 69 3a 32 0a 20 20 20 39 20  d!.99] i:2.   9 
35a0: 50 75 74 49 6e 74 4b 65 79 20 20 20 20 20 20 20  PutIntKey       
35b0: 30 20 20 20 20 31 0a 20 20 31 30 20 43 6c 6f 73  0    1.  10 Clos
35c0: 65 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20  e           0   
35d0: 20 30 0a 20 20 31 31 20 43 6f 6d 6d 69 74 20 20   0.  11 Commit  
35e0: 20 20 20 20 20 20 20 20 30 20 20 20 20 30 0a 20          0    0. 
35f0: 20 31 32 20 48 61 6c 74 20 20 20 20 20 20 20 20   12 Halt        
3600: 20 20 20 20 30 20 20 20 20 30 0a 7d 0a 0a 70 75      0    0.}..pu
3610: 74 73 20 7b 0a 3c 70 3e 57 69 74 68 20 74 72 61  ts {.<p>With tra
3620: 63 69 6e 67 20 6d 6f 64 65 20 6f 6e 2c 20 74 68  cing mode on, th
3630: 65 20 56 44 42 45 20 70 72 69 6e 74 73 20 65 61  e VDBE prints ea
3640: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 70  ch instruction p
3650: 72 69 6f 72 0a 74 6f 20 65 78 65 63 75 74 69 6e  rior.to executin
3660: 67 20 69 74 2e 20 20 41 66 74 65 72 20 74 68 65  g it.  After the
3670: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
3680: 65 78 65 63 75 74 65 64 2c 20 74 68 65 20 74 6f  executed, the to
3690: 70 20 66 65 77 0a 65 6e 74 72 69 65 73 20 69 6e  p few.entries in
36a0: 20 74 68 65 20 73 74 61 63 6b 20 61 72 65 20 64   the stack are d
36b0: 69 73 70 6c 61 79 65 64 2e 20 20 54 68 65 20 73  isplayed.  The s
36c0: 74 61 63 6b 20 64 69 73 70 6c 61 79 20 69 73 20  tack display is 
36d0: 6f 6d 69 74 74 65 64 0a 69 66 20 74 68 65 20 73  omitted.if the s
36e0: 74 61 63 6b 20 69 73 20 65 6d 70 74 79 2e 3c 2f  tack is empty.</
36f0: 70 3e 0a 0a 3c 70 3e 4f 6e 20 74 68 65 20 73 74  p>..<p>On the st
3700: 61 63 6b 20 64 69 73 70 6c 61 79 2c 20 6d 6f 73  ack display, mos
3710: 74 20 65 6e 74 72 69 65 73 20 61 72 65 20 73 68  t entries are sh
3720: 6f 77 6e 20 77 69 74 68 20 61 20 70 72 65 66 69  own with a prefi
3730: 78 0a 74 68 61 74 20 74 65 6c 6c 73 20 74 68 65  x.that tells the
3740: 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 68 61   datatype of tha
3750: 74 20 73 74 61 63 6b 20 65 6e 74 72 79 2e 20 20  t stack entry.  
3760: 49 6e 74 65 67 65 72 73 20 62 65 67 69 6e 0a 77  Integers begin.w
3770: 69 74 68 20 22 3c 74 74 3e 69 3a 3c 2f 74 74 3e  ith "<tt>i:</tt>
3780: 22 2e 20 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69  ".  Floating poi
3790: 6e 74 20 76 61 6c 75 65 73 20 62 65 67 69 6e 20  nt values begin 
37a0: 77 69 74 68 20 22 3c 74 74 3e 72 3a 3c 2f 74 74  with "<tt>r:</tt
37b0: 3e 22 2e 0a 28 54 68 65 20 22 72 22 20 73 74 61  >"..(The "r" sta
37c0: 6e 64 73 20 66 6f 72 20 22 72 65 61 6c 2d 6e 75  nds for "real-nu
37d0: 6d 62 65 72 22 2e 29 20 20 53 74 72 69 6e 67 73  mber".)  Strings
37e0: 20 62 65 67 69 6e 20 77 69 74 68 20 65 69 74 68   begin with eith
37f0: 65 72 0a 22 3c 74 74 3e 73 3a 3c 2f 74 74 3e 22  er."<tt>s:</tt>"
3800: 2c 20 22 3c 74 74 3e 74 3a 3c 2f 74 74 3e 22 2c  , "<tt>t:</tt>",
3810: 20 22 3c 74 74 3e 65 3a 3c 2f 74 74 3e 22 20 6f   "<tt>e:</tt>" o
3820: 72 20 22 3c 74 74 3e 7a 3a 3c 2f 74 74 3e 22 2e  r "<tt>z:</tt>".
3830: 20 20 0a 54 68 65 20 64 69 66 66 65 72 65 6e 63    .The differenc
3840: 65 20 61 6d 6f 6e 67 20 74 68 65 20 73 74 72 69  e among the stri
3850: 6e 67 20 70 72 65 66 69 78 65 73 20 69 73 20 63  ng prefixes is c
3860: 61 75 73 65 64 20 62 79 20 68 6f 77 20 74 68 65  aused by how the
3870: 69 72 20 0a 6d 65 6d 6f 72 79 20 69 73 20 61 6c  ir .memory is al
3880: 6c 6f 63 61 74 65 64 2e 20 54 68 65 20 7a 3a 20  located. The z: 
3890: 73 74 72 69 6e 67 73 20 61 72 65 20 73 74 6f 72  strings are stor
38a0: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ed in memory obt
38b0: 61 69 6e 65 64 0a 66 72 6f 6d 20 3c 62 3e 6d 61  ained.from <b>ma
38c0: 6c 6c 6f 63 28 29 3c 2f 62 3e 2e 20 20 54 68 65  lloc()</b>.  The
38d0: 20 74 3a 20 73 74 72 69 6e 67 73 20 61 72 65 20   t: strings are 
38e0: 73 74 61 74 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  statically alloc
38f0: 61 74 65 64 2e 20 20 0a 54 68 65 20 65 3a 20 73  ated.  .The e: s
3900: 74 72 69 6e 67 73 20 61 72 65 20 65 70 68 65 6d  trings are ephem
3910: 65 72 61 6c 2e 20 20 41 6c 6c 20 6f 74 68 65 72  eral.  All other
3920: 20 73 74 72 69 6e 67 73 20 68 61 76 65 20 74 68   strings have th
3930: 65 20 73 3a 20 70 72 65 66 69 78 2e 20 20 0a 54  e s: prefix.  .T
3940: 68 69 73 20 64 6f 65 73 6e 27 74 20 6d 61 6b 65  his doesn't make
3950: 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63 65 20   any difference 
3960: 74 6f 20 79 6f 75 2c 0a 74 68 65 20 6f 62 73 65  to you,.the obse
3970: 72 76 65 72 2c 20 62 75 74 20 69 74 20 69 73 20  rver, but it is 
3980: 76 69 74 61 6c 6c 79 20 69 6d 70 6f 72 74 61 6e  vitally importan
3990: 74 20 74 6f 20 74 68 65 20 56 44 42 45 20 73 69  t to the VDBE si
39a0: 6e 63 65 20 74 68 65 0a 7a 3a 20 73 74 72 69 6e  nce the.z: strin
39b0: 67 73 20 6e 65 65 64 20 74 6f 20 62 65 20 70 61  gs need to be pa
39c0: 73 73 65 64 20 74 6f 20 3c 62 3e 66 72 65 65 28  ssed to <b>free(
39d0: 29 3c 2f 62 3e 20 77 68 65 6e 20 74 68 65 79 20  )</b> when they 
39e0: 61 72 65 0a 70 6f 70 70 65 64 20 74 6f 20 61 76  are.popped to av
39f0: 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
3a00: 6b 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 6f 6e  k.  Note that on
3a10: 6c 79 20 74 68 65 20 66 69 72 73 74 20 31 30 0a  ly the first 10.
3a20: 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 73 74  characters of st
3a30: 72 69 6e 67 20 76 61 6c 75 65 73 20 61 72 65 20  ring values are 
3a40: 64 69 73 70 6c 61 79 65 64 20 61 6e 64 20 74 68  displayed and th
3a50: 61 74 20 62 69 6e 61 72 79 0a 76 61 6c 75 65 73  at binary.values
3a60: 20 28 73 75 63 68 20 61 73 20 74 68 65 20 72 65   (such as the re
3a70: 73 75 6c 74 20 6f 66 20 74 68 65 20 4d 61 6b 65  sult of the Make
3a80: 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69  Record instructi
3a90: 6f 6e 29 20 61 72 65 0a 74 72 65 61 74 65 64 20  on) are.treated 
3aa0: 61 73 20 73 74 72 69 6e 67 73 2e 20 20 54 68 65  as strings.  The
3ab0: 20 6f 6e 6c 79 20 6f 74 68 65 72 20 64 61 74 61   only other data
3ac0: 74 79 70 65 20 74 68 61 74 20 63 61 6e 20 62 65  type that can be
3ad0: 20 73 74 6f 72 65 64 0a 6f 6e 20 74 68 65 20 56   stored.on the V
3ae0: 44 42 45 20 73 74 61 63 6b 20 69 73 20 61 20 4e  DBE stack is a N
3af0: 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 64 69  ULL, which is di
3b00: 73 70 6c 61 79 20 77 69 74 68 6f 75 74 20 70 72  splay without pr
3b10: 65 66 69 78 0a 61 73 20 73 69 6d 70 6c 79 20 22  efix.as simply "
3b20: 3c 74 74 3e 4e 55 4c 4c 3c 2f 74 74 3e 22 2e 20  <tt>NULL</tt>". 
3b30: 20 49 66 20 61 6e 20 69 6e 74 65 67 65 72 20 68   If an integer h
3b40: 61 73 20 62 65 65 6e 20 70 6c 61 63 65 64 20 6f  as been placed o
3b50: 6e 20 74 68 65 20 0a 73 74 61 63 6b 20 61 73 20  n the .stack as 
3b60: 62 6f 74 68 20 61 6e 20 69 6e 74 65 67 65 72 20  both an integer 
3b70: 61 6e 64 20 61 20 73 74 72 69 6e 67 2c 20 69 74  and a string, it
3b80: 73 20 70 72 65 66 69 78 20 69 73 20 22 3c 74 74  s prefix is "<tt
3b90: 3e 73 69 3a 3c 2f 74 74 3e 22 2e 0a 0a 0a 3c 61  >si:</tt>"....<a
3ba0: 20 6e 61 6d 65 3d 22 71 75 65 72 79 31 22 3e 0a   name="query1">.
3bb0: 3c 68 32 3e 53 69 6d 70 6c 65 20 51 75 65 72 69  <h2>Simple Queri
3bc0: 65 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 41 74 20 74  es</h2>..<p>At t
3bd0: 68 69 73 20 70 6f 69 6e 74 2c 20 79 6f 75 20 73  his point, you s
3be0: 68 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64  hould understand
3bf0: 20 74 68 65 20 62 61 73 69 63 73 20 6f 66 20 68   the basics of h
3c00: 6f 77 20 74 68 65 20 56 44 42 45 0a 77 72 69 74  ow the VDBE.writ
3c10: 65 73 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  es to a database
3c20: 2e 20 20 4e 6f 77 20 6c 65 74 27 73 20 6c 6f 6f  .  Now let's loo
3c30: 6b 20 61 74 20 68 6f 77 20 69 74 20 64 6f 65 73  k at how it does
3c40: 20 71 75 65 72 69 65 73 2e 0a 57 65 20 77 69 6c   queries..We wil
3c50: 6c 20 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77  l use the follow
3c60: 69 6e 67 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  ing simple SELEC
3c70: 54 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 6f  T statement as o
3c80: 75 72 20 65 78 61 6d 70 6c 65 3a 3c 2f 70 3e 0a  ur example:</p>.
3c90: 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72  .<blockquote><pr
3ca0: 65 3e 0a 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  e>.SELECT * FROM
3cb0: 20 65 78 61 6d 70 3b 0a 3c 2f 70 72 65 3e 3c 2f   examp;.</pre></
3cc0: 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e  blockquote>..<p>
3cd0: 54 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  The VDBE program
3ce0: 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
3cf0: 68 69 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  his SQL statemen
3d00: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
3d10: 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 73  </p>.}..Code {.s
3d20: 71 6c 69 74 65 3e 20 28 28 28 45 58 50 4c 41 49  qlite> (((EXPLAI
3d30: 4e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  N SELECT * FROM 
3d40: 65 78 61 6d 70 3b 29 29 29 0a 61 64 64 72 20 20  examp;))).addr  
3d50: 6f 70 63 6f 64 65 20 20 20 20 20 20 20 20 70 31  opcode        p1
3d60: 20 20 20 20 20 70 32 20 20 20 20 20 70 33 20 20       p2     p3  
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
3d90: 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
3da0: 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  --  -----  -----
3db0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dd0: 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 43 6f 6c 75  -----.0     Colu
3de0: 6d 6e 4e 61 6d 65 20 20 20 20 30 20 20 20 20 20  mnName    0     
3df0: 20 30 20 20 20 20 20 20 6f 6e 65 20 20 20 20 20   0      one     
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 20 20 20 20 20 20 20 0a 31 20 20 20             .1   
3e20: 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20    ColumnName    
3e30: 31 20 20 20 20 20 20 30 20 20 20 20 20 20 74 77  1      0      tw
3e40: 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 0a 32 20 20 20 20 20 49 6e 74 65 67 65 72 20   .2     Integer 
3e70: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 20 20 20 20 0a 33 20 20 20 20 20 4f 70         .3     Op
3eb0: 65 6e 52 65 61 64 20 20 20 20 20 20 30 20 20 20  enRead      0   
3ec0: 20 20 20 33 20 20 20 20 20 20 65 78 61 6d 70 20     3      examp 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 34 20               .4 
3ef0: 20 20 20 20 56 65 72 69 66 79 43 6f 6f 6b 69 65      VerifyCookie
3f00: 20 20 30 20 20 20 20 20 20 38 31 20 20 20 20 20    0      81     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 20 20 0a 35 20 20 20 20 20 52 65 77 69 6e 64     .5     Rewind
3f40: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31          0      1
3f50: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 20 20 20 20 20 20 20 0a 36 20 20 20 20 20           .6     
3f80: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20  Column        0 
3f90: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
3fc0: 37 20 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20  7     Column    
3fd0: 20 20 20 20 30 20 20 20 20 20 20 31 20 20 20 20      0      1    
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 20 20 20 20 0a 38 20 20 20 20 20 43 61 6c 6c       .8     Call
4010: 62 61 63 6b 20 20 20 20 20 20 32 20 20 20 20 20  back      2     
4020: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 20 20 20 20 20 20 0a 39 20 20 20             .9   
4050: 20 20 4e 65 78 74 20 20 20 20 20 20 20 20 20 20    Next          
4060: 30 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  0      6        
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 0a 31 30 20 20 20 20 43 6c 6f 73 65 20 20 20   .10    Close   
40a0: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 20 20 20 20 20 20 0a 31 31 20 20 20 20 48 61         .11    Ha
40e0: 6c 74 20 20 20 20 20 20 20 20 20 20 30 20 20 20  lt          0   
40f0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a               .}.
4120: 0a 70 75 74 73 20 7b 0a 3c 70 3e 42 65 66 6f 72  .puts {.<p>Befor
4130: 65 20 77 65 20 62 65 67 69 6e 20 6c 6f 6f 6b 69  e we begin looki
4140: 6e 67 20 61 74 20 74 68 69 73 20 70 72 6f 62 6c  ng at this probl
4150: 65 6d 2c 20 6c 65 74 27 73 20 62 72 69 65 66 6c  em, let's briefl
4160: 79 20 72 65 76 69 65 77 0a 68 6f 77 20 71 75 65  y review.how que
4170: 72 69 65 73 20 77 6f 72 6b 20 69 6e 20 53 51 4c  ries work in SQL
4180: 69 74 65 20 73 6f 20 74 68 61 74 20 77 65 20 77  ite so that we w
4190: 69 6c 6c 20 6b 6e 6f 77 20 77 68 61 74 20 77 65  ill know what we
41a0: 20 61 72 65 20 74 72 79 69 6e 67 0a 74 6f 20 61   are trying.to a
41b0: 63 63 6f 6d 70 6c 69 73 68 2e 20 20 46 6f 72 20  ccomplish.  For 
41c0: 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
41d0: 72 65 73 75 6c 74 20 6f 66 20 61 20 71 75 65 72  result of a quer
41e0: 79 2c 0a 53 51 4c 69 74 65 20 77 69 6c 6c 20 69  y,.SQLite will i
41f0: 6e 76 6f 6b 65 20 61 20 63 61 6c 6c 62 61 63 6b  nvoke a callback
4200: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
4210: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 70 72 6f  he following.pro
4220: 74 6f 74 79 70 65 3a 3c 2f 70 3e 0a 0a 3c 62 6c  totype:</p>..<bl
4230: 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 69  ockquote><pre>.i
4240: 6e 74 20 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  nt Callback(void
4250: 20 2a 70 55 73 65 72 44 61 74 61 2c 20 69 6e 74   *pUserData, int
4260: 20 6e 43 6f 6c 75 6d 6e 2c 20 63 68 61 72 20 2a   nColumn, char *
4270: 61 7a 44 61 74 61 5b 5d 2c 20 63 68 61 72 20 2a  azData[], char *
4280: 61 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 5b 5d 29 3b  azColumnName[]);
4290: 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75  .</pre></blockqu
42a0: 6f 74 65 3e 0a 0a 3c 70 3e 54 68 65 20 53 51 4c  ote>..<p>The SQL
42b0: 69 74 65 20 6c 69 62 72 61 72 79 20 73 75 70 70  ite library supp
42c0: 6c 69 65 73 20 74 68 65 20 56 44 42 45 20 77 69  lies the VDBE wi
42d0: 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  th a pointer to 
42e0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
42f0: 63 74 69 6f 6e 0a 61 6e 64 20 74 68 65 20 3c 62  ction.and the <b
4300: 3e 70 55 73 65 72 44 61 74 61 3c 2f 62 3e 20 70  >pUserData</b> p
4310: 6f 69 6e 74 65 72 2e 20 20 28 42 6f 74 68 20 74  ointer.  (Both t
4320: 68 65 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20  he callback and 
4330: 74 68 65 20 75 73 65 72 20 64 61 74 61 20 77 65  the user data we
4340: 72 65 0a 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61  re.originally pa
4350: 73 73 65 64 20 69 6e 20 61 73 20 61 72 67 75 6d  ssed in as argum
4360: 65 6e 74 73 20 74 6f 20 74 68 65 20 3c 62 3e 73  ents to the <b>s
4370: 71 6c 69 74 65 5f 65 78 65 63 28 29 3c 2f 62 3e  qlite_exec()</b>
4380: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 29 0a   API function.).
4390: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 65 20 56  The job of the V
43a0: 44 42 45 20 69 73 20 74 6f 0a 63 6f 6d 65 20 75  DBE is to.come u
43b0: 70 20 77 69 74 68 20 76 61 6c 75 65 73 20 66 6f  p with values fo
43c0: 72 20 3c 62 3e 6e 43 6f 6c 75 6d 6e 3c 2f 62 3e  r <b>nColumn</b>
43d0: 2c 20 3c 62 3e 61 7a 44 61 74 61 5b 5d 3c 2f 62  , <b>azData[]</b
43e0: 3e 2c 20 0a 61 6e 64 20 3c 62 3e 61 7a 43 6f 6c  >, .and <b>azCol
43f0: 75 6d 6e 4e 61 6d 65 5b 5d 3c 2f 62 3e 2e 0a 3c  umnName[]</b>..<
4400: 62 3e 6e 43 6f 6c 75 6d 6e 3c 2f 62 3e 20 69 73  b>nColumn</b> is
4410: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
4420: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
4430: 73 75 6c 74 73 2c 20 6f 66 20 63 6f 75 72 73 65  sults, of course
4440: 2e 0a 3c 62 3e 61 7a 43 6f 6c 75 6d 6e 4e 61 6d  ..<b>azColumnNam
4450: 65 5b 5d 3c 2f 62 3e 20 69 73 20 61 6e 20 61 72  e[]</b> is an ar
4460: 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77  ray of strings w
4470: 68 65 72 65 20 65 61 63 68 20 73 74 72 69 6e 67  here each string
4480: 20 69 73 20 74 68 65 20 6e 61 6d 65 0a 6f 66 20   is the name.of 
4490: 6f 6e 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  one of the resul
44a0: 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 3c 62 3e 61  t columns.  <b>a
44b0: 7a 44 61 74 61 5b 5d 3c 2f 62 3e 20 69 73 20 61  zData[]</b> is a
44c0: 6e 20 61 72 72 61 79 20 6f 66 20 73 74 72 69 6e  n array of strin
44d0: 67 73 20 68 6f 6c 64 69 6e 67 0a 74 68 65 20 61  gs holding.the a
44e0: 63 74 75 61 6c 20 64 61 74 61 2e 3c 2f 70 3e 0a  ctual data.</p>.
44f0: 7d 0a 0a 43 6f 64 65 20 7b 0a 30 20 20 20 20 20  }..Code {.0     
4500: 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20 30 20  ColumnName    0 
4510: 20 20 20 20 20 30 20 20 20 20 20 20 6f 6e 65 20       0      one 
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
4540: 31 20 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65  1     ColumnName
4550: 20 20 20 20 31 20 20 20 20 20 20 30 20 20 20 20      1      0    
4560: 20 20 74 77 6f 20 20 20 20 20 20 20 20 20 20 20    two           
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 0a 7d 0a 70 75 74 73 20 7b 0a 3c       .}.puts {.<
4590: 70 3e 54 68 65 20 66 69 72 73 74 20 74 77 6f 20  p>The first two 
45a0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 6e 20  instructions in 
45b0: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
45c0: 20 66 6f 72 20 6f 75 72 20 71 75 65 72 79 20 61   for our query a
45d0: 72 65 0a 63 6f 6e 63 65 72 6e 65 64 20 77 69 74  re.concerned wit
45e0: 68 20 73 65 74 74 69 6e 67 20 75 70 20 76 61 6c  h setting up val
45f0: 75 65 73 20 66 6f 72 20 3c 62 3e 61 7a 43 6f 6c  ues for <b>azCol
4600: 75 6d 6e 3c 2f 62 3e 2e 0a 54 68 65 20 3c 61 20  umn</b>..The <a 
4610: 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d  href="opcode.htm
4620: 6c 23 43 6f 6c 75 6d 6e 4e 61 6d 65 22 3e 43 6f  l#ColumnName">Co
4630: 6c 75 6d 6e 4e 61 6d 65 3c 2f 61 3e 20 69 6e 73  lumnName</a> ins
4640: 74 72 75 63 74 69 6f 6e 73 20 74 65 6c 6c 20 0a  tructions tell .
4650: 74 68 65 20 56 44 42 45 20 77 68 61 74 20 76 61  the VDBE what va
4660: 6c 75 65 73 20 74 6f 20 66 69 6c 6c 20 69 6e 20  lues to fill in 
4670: 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74  for each element
4680: 20 6f 66 20 74 68 65 20 3c 62 3e 61 7a 43 6f 6c   of the <b>azCol
4690: 75 6d 6e 4e 61 6d 65 5b 5d 3c 2f 62 3e 20 0a 61  umnName[]</b> .a
46a0: 72 72 61 79 2e 20 20 45 76 65 72 79 20 71 75 65  rray.  Every que
46b0: 72 79 20 77 69 6c 6c 20 62 65 67 69 6e 20 77 69  ry will begin wi
46c0: 74 68 20 6f 6e 65 20 43 6f 6c 75 6d 6e 4e 61 6d  th one ColumnNam
46d0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f  e instruction fo
46e0: 72 20 65 61 63 68 20 0a 63 6f 6c 75 6d 6e 20 69  r each .column i
46f0: 6e 20 74 68 65 20 72 65 73 75 6c 74 2c 20 61 6e  n the result, an
4700: 64 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20  d there will be 
4710: 61 20 6d 61 74 63 68 69 6e 67 20 43 6f 6c 75 6d  a matching Colum
4720: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f  n instruction fo
4730: 72 20 0a 65 61 63 68 20 6f 6e 65 20 6c 61 74 65  r .each one late
4740: 72 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 0a  r in the query..
4750: 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 32  </p>.}..Code {.2
4760: 20 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20       Integer    
4770: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 20 20 20 20 0a 33 20 20 20 20 20 4f 70 65 6e 52      .3     OpenR
47b0: 65 61 64 20 20 20 20 20 20 30 20 20 20 20 20 20  ead      0      
47c0: 33 20 20 20 20 20 20 65 78 61 6d 70 20 20 20 20  3      examp    
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 20 20 20 20 20 20 20 0a 34 20 20 20 20            .4    
47f0: 20 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 20 30   VerifyCookie  0
4800: 20 20 20 20 20 20 38 31 20 20 20 20 20 20 20 20        81        
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4830: 0a 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e 49 6e 73  .}.puts {.<p>Ins
4840: 74 72 75 63 74 69 6f 6e 73 20 32 20 61 6e 64 20  tructions 2 and 
4850: 33 20 6f 70 65 6e 20 61 20 72 65 61 64 20 63 75  3 open a read cu
4860: 72 73 6f 72 20 6f 6e 20 74 68 65 20 64 61 74 61  rsor on the data
4870: 62 61 73 65 20 74 61 62 6c 65 20 74 68 61 74 20  base table that 
4880: 69 73 20 0a 74 6f 20 62 65 20 71 75 65 72 69 65  is .to be querie
4890: 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 74  d.  This works t
48a0: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
48b0: 70 65 6e 57 72 69 74 65 20 69 6e 73 74 72 75 63  penWrite instruc
48c0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 49 4e 53  tion in the .INS
48d0: 45 52 54 20 65 78 61 6d 70 6c 65 20 65 78 63 65  ERT example exce
48e0: 70 74 20 74 68 61 74 20 74 68 65 20 63 75 72 73  pt that the curs
48f0: 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72  or is opened for
4900: 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 74 69   reading this ti
4910: 6d 65 20 0a 69 6e 73 74 65 61 64 20 6f 66 20 66  me .instead of f
4920: 6f 72 20 77 72 69 74 69 6e 67 2e 20 20 49 6e 73  or writing.  Ins
4930: 74 72 75 63 74 69 6f 6e 20 34 20 76 65 72 69 66  truction 4 verif
4940: 69 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ies the database
4950: 20 73 63 68 65 6d 61 20 61 73 20 0a 69 6e 20 74   schema as .in t
4960: 68 65 20 49 4e 53 45 52 54 20 65 78 61 6d 70 6c  he INSERT exampl
4970: 65 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20 7b  e.</p>.}..Code {
4980: 0a 35 20 20 20 20 20 52 65 77 69 6e 64 20 20 20  .5     Rewind   
4990: 20 20 20 20 20 30 20 20 20 20 20 20 31 30 20 20       0      10  
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49c0: 20 20 20 20 20 20 0a 7d 0a 70 75 74 73 20 7b 0a        .}.puts {.
49d0: 3c 70 3e 20 54 68 65 20 3c 61 20 68 72 65 66 3d  <p> The <a href=
49e0: 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 52 65 77  "opcode.html#Rew
49f0: 69 6e 64 22 3e 52 65 77 69 6e 64 3c 2f 61 3e 20  ind">Rewind</a> 
4a00: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 69 74  instruction init
4a10: 69 61 6c 69 7a 65 73 20 0a 61 20 6c 6f 6f 70 20  ializes .a loop 
4a20: 74 68 61 74 20 69 74 65 72 61 74 65 73 20 6f 76  that iterates ov
4a30: 65 72 20 74 68 65 20 22 65 78 61 6d 70 22 20 74  er the "examp" t
4a40: 61 62 6c 65 2e 20 49 74 20 72 65 77 69 6e 64 73  able. It rewinds
4a50: 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20 0a   the cursor P1 .
4a60: 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
4a70: 72 79 20 69 6e 20 69 74 73 20 74 61 62 6c 65 2e  ry in its table.
4a80: 20 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72    This is requir
4a90: 65 64 20 62 79 20 74 68 65 20 74 68 65 20 43 6f  ed by the the Co
4aa0: 6c 75 6d 6e 20 61 6e 64 20 0a 4e 65 78 74 20 69  lumn and .Next i
4ab0: 6e 73 74 72 75 63 74 69 6f 6e 73 2c 20 77 68 69  nstructions, whi
4ac0: 63 68 20 75 73 65 20 74 68 65 20 63 75 72 73 6f  ch use the curso
4ad0: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
4ae0: 6f 75 67 68 20 74 68 65 20 74 61 62 6c 65 2e 20  ough the table. 
4af0: 20 0a 49 66 20 74 68 65 20 74 61 62 6c 65 20 69   .If the table i
4b00: 73 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 6a 75  s empty, then ju
4b10: 6d 70 20 74 6f 20 50 32 20 28 31 30 29 2c 20 77  mp to P2 (10), w
4b20: 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 73 74  hich is the inst
4b30: 72 75 63 74 69 6f 6e 20 6a 75 73 74 20 0a 70 61  ruction just .pa
4b40: 73 74 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  st the loop.  If
4b50: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   the table is no
4b60: 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68  t empty, fall th
4b70: 72 6f 75 67 68 20 74 6f 20 74 68 65 20 66 6f 6c  rough to the fol
4b80: 6c 6f 77 69 6e 67 20 0a 69 6e 73 74 72 75 63 74  lowing .instruct
4b90: 69 6f 6e 20 61 74 20 36 2c 20 77 68 69 63 68 20  ion at 6, which 
4ba0: 69 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  is the beginning
4bb0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64   of the loop bod
4bc0: 79 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20 7b  y.</p>.}..Code {
4bd0: 0a 36 20 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20  .6     Column   
4be0: 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20       0      0   
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 0a 37 20 20 20 20 20 43 6f 6c        .7     Col
4c20: 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20 20  umn        0    
4c30: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 0a 38 20 20              .8  
4c60: 20 20 20 43 61 6c 6c 62 61 63 6b 20 20 20 20 20     Callback     
4c70: 20 32 20 20 20 20 20 20 30 20 20 20 20 20 20 20   2      0       
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 0a 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e 20    .}.puts {.<p> 
4cb0: 54 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  The instructions
4cc0: 20 36 20 74 68 72 6f 75 67 68 20 38 20 66 6f 72   6 through 8 for
4cd0: 6d 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  m the body of th
4ce0: 65 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  e loop that will
4cf0: 20 0a 65 78 65 63 75 74 65 20 6f 6e 63 65 20 66   .execute once f
4d00: 6f 72 20 65 61 63 68 20 72 65 63 6f 72 64 20 69  or each record i
4d10: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
4d20: 69 6c 65 2e 20 20 0a 0a 54 68 65 20 3c 61 20 68  ile.  ..The <a h
4d30: 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c  ref="opcode.html
4d40: 23 43 6f 6c 75 6d 6e 22 3e 43 6f 6c 75 6d 6e 3c  #Column">Column<
4d50: 2f 61 3e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  /a> instructions
4d60: 20 61 74 20 61 64 64 72 65 73 73 65 73 20 36 20   at addresses 6 
4d70: 0a 61 6e 64 20 37 20 65 61 63 68 20 74 61 6b 65  .and 7 each take
4d80: 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d   the P2-th colum
4d90: 6e 20 66 72 6f 6d 20 74 68 65 20 50 31 2d 74 68  n from the P1-th
4da0: 20 63 75 72 73 6f 72 20 61 6e 64 20 70 75 73 68   cursor and push
4db0: 20 69 74 20 6f 6e 74 6f 20 0a 74 68 65 20 73 74   it onto .the st
4dc0: 61 63 6b 2e 20 20 49 6e 20 74 68 69 73 20 65 78  ack.  In this ex
4dd0: 61 6d 70 6c 65 2c 20 74 68 65 20 66 69 72 73 74  ample, the first
4de0: 20 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74   Column instruct
4df0: 69 6f 6e 20 69 73 20 70 75 73 68 69 6e 67 20 74  ion is pushing t
4e00: 68 65 20 0a 76 61 6c 75 65 20 66 6f 72 20 74 68  he .value for th
4e10: 65 20 63 6f 6c 75 6d 6e 20 22 6f 6e 65 22 20 6f  e column "one" o
4e20: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 61 6e  nto the stack an
4e30: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 43 6f 6c  d the second Col
4e40: 75 6d 6e 20 0a 69 6e 73 74 72 75 63 74 69 6f 6e  umn .instruction
4e50: 20 69 73 20 70 75 73 68 69 6e 67 20 74 68 65 20   is pushing the 
4e60: 76 61 6c 75 65 20 66 6f 72 20 63 6f 6c 75 6d 6e  value for column
4e70: 20 22 74 77 6f 22 2e 20 20 0a 0a 54 68 65 20 3c   "two".  ..The <
4e80: 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68  a href="opcode.h
4e90: 74 6d 6c 23 43 61 6c 6c 62 61 63 6b 22 3e 43 61  tml#Callback">Ca
4ea0: 6c 6c 62 61 63 6b 3c 2f 61 3e 20 69 6e 73 74 72  llback</a> instr
4eb0: 75 63 74 69 6f 6e 20 61 74 20 61 64 64 72 65 73  uction at addres
4ec0: 73 20 38 20 0a 69 6e 76 6f 6b 65 73 20 74 68 65  s 8 .invokes the
4ed0: 20 63 61 6c 6c 62 61 63 6b 28 29 20 66 75 6e 63   callback() func
4ee0: 74 69 6f 6e 2e 20 20 54 68 65 20 50 31 20 6f 70  tion.  The P1 op
4ef0: 65 72 61 6e 64 20 74 6f 20 43 61 6c 6c 62 61 63  erand to Callbac
4f00: 6b 20 62 65 63 6f 6d 65 73 20 74 68 65 20 0a 76  k becomes the .v
4f10: 61 6c 75 65 20 66 6f 72 20 3c 62 3e 6e 43 6f 6c  alue for <b>nCol
4f20: 75 6d 6e 3c 2f 62 3e 2e 20 20 54 68 65 20 43 61  umn</b>.  The Ca
4f30: 6c 6c 62 61 63 6b 20 69 6e 73 74 72 75 63 74 69  llback instructi
4f40: 6f 6e 20 70 6f 70 73 20 50 31 20 76 61 6c 75 65  on pops P1 value
4f50: 73 20 66 72 6f 6d 0a 74 68 65 20 73 74 61 63 6b  s from.the stack
4f60: 20 61 6e 64 20 75 73 65 73 20 74 68 65 6d 20 74   and uses them t
4f70: 6f 20 66 69 6c 6c 20 74 68 65 20 3c 62 3e 61 7a  o fill the <b>az
4f80: 44 61 74 61 5b 5d 3c 2f 62 3e 20 61 72 72 61 79  Data[]</b> array
4f90: 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a  .</p>.}..Code {.
4fa0: 39 20 20 20 20 20 4e 65 78 74 20 20 20 20 20 20  9     Next      
4fb0: 20 20 20 20 30 20 20 20 20 20 20 36 20 20 20 20      0      6    
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75 74            .}.put
4ff0: 73 20 7b 0a 3c 70 3e 54 68 65 20 69 6e 73 74 72  s {.<p>The instr
5000: 75 63 74 69 6f 6e 20 61 74 20 61 64 64 72 65 73  uction at addres
5010: 73 20 39 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  s 9 implements t
5020: 68 65 20 62 72 61 6e 63 68 69 6e 67 20 70 61 72  he branching par
5030: 74 20 6f 66 20 74 68 65 20 0a 6c 6f 6f 70 2e 20  t of the .loop. 
5040: 20 54 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   Together with t
5050: 68 65 20 52 65 77 69 6e 64 20 61 74 20 61 64 64  he Rewind at add
5060: 72 65 73 73 20 35 20 69 74 20 66 6f 72 6d 73 20  ress 5 it forms 
5070: 74 68 65 20 6c 6f 6f 70 20 6c 6f 67 69 63 2e 20  the loop logic. 
5080: 20 0a 54 68 69 73 20 69 73 20 61 20 6b 65 79 20   .This is a key 
5090: 63 6f 6e 63 65 70 74 20 74 68 61 74 20 79 6f 75  concept that you
50a0: 20 73 68 6f 75 6c 64 20 70 61 79 20 63 6c 6f 73   should pay clos
50b0: 65 20 61 74 74 65 6e 74 69 6f 6e 20 74 6f 2e 20  e attention to. 
50c0: 20 20 0a 54 68 65 20 3c 61 20 68 72 65 66 3d 22    .The <a href="
50d0: 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 4e 65 78 74  opcode.html#Next
50e0: 22 3e 4e 65 78 74 3c 2f 61 3e 20 69 6e 73 74 72  ">Next</a> instr
50f0: 75 63 74 69 6f 6e 20 61 64 76 61 6e 63 65 73 20  uction advances 
5100: 74 68 65 20 63 75 72 73 6f 72 20 0a 50 31 20 74  the cursor .P1 t
5110: 6f 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72  o the next recor
5120: 64 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  d.  If the curso
5130: 72 20 61 64 76 61 6e 63 65 20 77 61 73 20 73 75  r advance was su
5140: 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 6a  ccessful, then j
5150: 75 6d 70 20 0a 69 6d 6d 65 64 69 61 74 65 6c 79  ump .immediately
5160: 20 74 6f 20 50 32 20 28 36 2c 20 74 68 65 20 62   to P2 (6, the b
5170: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
5180: 6c 6f 6f 70 20 62 6f 64 79 29 2e 20 20 49 66 20  loop body).  If 
5190: 74 68 65 20 63 75 72 73 6f 72 20 0a 77 61 73 20  the cursor .was 
51a0: 61 74 20 74 68 65 20 65 6e 64 2c 20 74 68 65 6e  at the end, then
51b0: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
51c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
51d0: 6e 73 74 72 75 63 74 69 6f 6e 2c 20 77 68 69 63  nstruction, whic
51e0: 68 20 0a 65 6e 64 73 20 74 68 65 20 6c 6f 6f 70  h .ends the loop
51f0: 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a  .</p>.}..Code {.
5200: 31 30 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20  10    Close     
5210: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 0a 31 31 20 20 20 20 48 61 6c 74       .11    Halt
5250: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
5260: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75             .}.pu
5290: 74 73 20 7b 0a 3c 70 3e 54 68 65 20 43 6c 6f 73  ts {.<p>The Clos
52a0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74  e instruction at
52b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
52c0: 70 72 6f 67 72 61 6d 20 63 6c 6f 73 65 73 20 74  program closes t
52d0: 68 65 0a 63 75 72 73 6f 72 20 74 68 61 74 20 70  he.cursor that p
52e0: 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 74  oints into the t
52f0: 61 62 6c 65 20 22 65 78 61 6d 70 22 2e 20 20 49  able "examp".  I
5300: 74 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  t is not really 
5310: 6e 65 63 65 73 73 61 72 79 0a 74 6f 20 63 61 6c  necessary.to cal
5320: 6c 20 43 6c 6f 73 65 20 68 65 72 65 20 73 69 6e  l Close here sin
5330: 63 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 77  ce all cursors w
5340: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
5350: 61 6c 6c 79 20 63 6c 6f 73 65 64 0a 62 79 20 74  ally closed.by t
5360: 68 65 20 56 44 42 45 20 77 68 65 6e 20 74 68 65  he VDBE when the
5370: 20 70 72 6f 67 72 61 6d 20 68 61 6c 74 73 2e 20   program halts. 
5380: 20 42 75 74 20 77 65 20 6e 65 65 64 65 64 20 61   But we needed a
5390: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 66 6f  n instruction.fo
53a0: 72 20 74 68 65 20 52 65 77 69 6e 64 20 74 6f 20  r the Rewind to 
53b0: 6a 75 6d 70 20 74 6f 20 73 6f 20 77 65 20 6d 69  jump to so we mi
53c0: 67 68 74 20 61 73 20 77 65 6c 6c 20 67 6f 20 61  ght as well go a
53d0: 68 65 61 64 20 61 6e 64 20 68 61 76 65 20 74 68  head and have th
53e0: 61 74 0a 69 6e 73 74 72 75 63 74 69 6f 6e 20 64  at.instruction d
53f0: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
5400: 75 6c 2e 0a 54 68 65 20 48 61 6c 74 20 69 6e 73  ul..The Halt ins
5410: 74 72 75 63 74 69 6f 6e 20 65 6e 64 73 20 74 68  truction ends th
5420: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 3c  e VDBE program.<
5430: 2f 70 3e 0a 0a 3c 70 3e 4e 6f 74 65 20 74 68 61  /p>..<p>Note tha
5440: 74 20 74 68 65 20 70 72 6f 67 72 61 6d 20 66 6f  t the program fo
5450: 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 71 75  r this SELECT qu
5460: 65 72 79 20 64 69 64 6e 27 74 20 63 6f 6e 74 61  ery didn't conta
5470: 69 6e 20 74 68 65 20 0a 54 72 61 6e 73 61 63 74  in the .Transact
5480: 69 6f 6e 20 61 6e 64 20 43 6f 6d 6d 69 74 20 69  ion and Commit i
5490: 6e 73 74 72 75 63 74 69 6f 6e 73 20 75 73 65 64  nstructions used
54a0: 20 69 6e 20 74 68 65 20 49 4e 53 45 52 54 20 65   in the INSERT e
54b0: 78 61 6d 70 6c 65 2e 20 20 42 65 63 61 75 73 65  xample.  Because
54c0: 20 0a 74 68 65 20 53 45 4c 45 43 54 20 69 73 20   .the SELECT is 
54d0: 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
54e0: 20 74 68 61 74 20 64 6f 65 73 6e 27 74 20 61 6c   that doesn't al
54f0: 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ter the database
5500: 2c 20 69 74 20 0a 64 6f 65 73 6e 27 74 20 72 65  , it .doesn't re
5510: 71 75 69 72 65 20 61 20 74 72 61 6e 73 61 63 74  quire a transact
5520: 69 6f 6e 2e 3c 2f 70 3e 0a 7d 0a 0a 0a 70 75 74  ion.</p>.}...put
5530: 73 20 7b 0a 3c 61 20 6e 61 6d 65 3d 22 71 75 65  s {.<a name="que
5540: 72 79 32 22 3e 0a 3c 68 32 3e 41 20 53 6c 69 67  ry2">.<h2>A Slig
5550: 68 74 6c 79 20 4d 6f 72 65 20 43 6f 6d 70 6c 65  htly More Comple
5560: 78 20 51 75 65 72 79 3c 2f 68 32 3e 0a 0a 3c 70  x Query</h2>..<p
5570: 3e 54 68 65 20 6b 65 79 20 70 6f 69 6e 74 73 20  >The key points 
5580: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
5590: 65 78 61 6d 70 6c 65 20 77 65 72 65 20 74 68 65  example were the
55a0: 20 75 73 65 20 6f 66 20 74 68 65 20 43 61 6c 6c   use of the Call
55b0: 62 61 63 6b 0a 69 6e 73 74 72 75 63 74 69 6f 6e  back.instruction
55c0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63   to invoke the c
55d0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
55e0: 2c 20 61 6e 64 20 74 68 65 20 75 73 65 20 6f 66  , and the use of
55f0: 20 74 68 65 20 4e 65 78 74 0a 69 6e 73 74 72 75   the Next.instru
5600: 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65  ction to impleme
5610: 6e 74 20 61 20 6c 6f 6f 70 20 6f 76 65 72 20 61  nt a loop over a
5620: 6c 6c 20 72 65 63 6f 72 64 73 20 6f 66 20 74 68  ll records of th
5630: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5640: 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 61 74  .This example at
5650: 74 65 6d 70 74 73 20 74 6f 20 64 72 69 76 65 20  tempts to drive 
5660: 68 6f 6d 65 20 74 68 6f 73 65 20 69 64 65 61 73  home those ideas
5670: 20 62 79 20 64 65 6d 6f 6e 73 74 72 61 74 69 6e   by demonstratin
5680: 67 20 61 0a 73 6c 69 67 68 74 6c 79 20 6d 6f 72  g a.slightly mor
5690: 65 20 63 6f 6d 70 6c 65 78 20 71 75 65 72 79 20  e complex query 
56a0: 74 68 61 74 20 69 6e 76 6f 6c 76 65 73 20 6d 6f  that involves mo
56b0: 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 6f 75  re columns of.ou
56c0: 74 70 75 74 2c 20 73 6f 6d 65 20 6f 66 20 77 68  tput, some of wh
56d0: 69 63 68 20 61 72 65 20 63 6f 6d 70 75 74 65 64  ich are computed
56e0: 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 61 20 57   values, and a W
56f0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
5700: 0a 6c 69 6d 69 74 73 20 77 68 69 63 68 20 72 65  .limits which re
5710: 63 6f 72 64 73 20 61 63 74 75 61 6c 6c 79 20 6d  cords actually m
5720: 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 63 61  ake it to the ca
5730: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e  llback function.
5740: 0a 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 71  .Consider this q
5750: 75 65 72 79 3a 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63  uery:</p>..<bloc
5760: 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 53 45 4c  kquote><pre>.SEL
5770: 45 43 54 20 6f 6e 65 2c 20 74 77 6f 2c 20 6f 6e  ECT one, two, on
5780: 65 20 7c 7c 20 74 77 6f 20 41 53 20 27 62 6f 74  e || two AS 'bot
5790: 68 27 0a 46 52 4f 4d 20 65 78 61 6d 70 0a 57 48  h'.FROM examp.WH
57a0: 45 52 45 20 6f 6e 65 20 4c 49 4b 45 20 27 48 25  ERE one LIKE 'H%
57b0: 27 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71  '.</pre></blockq
57c0: 75 6f 74 65 3e 0a 0a 3c 70 3e 54 68 69 73 20 71  uote>..<p>This q
57d0: 75 65 72 79 20 69 73 20 70 65 72 68 61 70 73 20  uery is perhaps 
57e0: 61 20 62 69 74 20 63 6f 6e 74 72 69 76 65 64 2c  a bit contrived,
57f0: 20 62 75 74 20 69 74 20 64 6f 65 73 20 73 65 72   but it does ser
5800: 76 65 20 74 6f 0a 69 6c 6c 75 73 74 72 61 74 65  ve to.illustrate
5810: 20 6f 75 72 20 70 6f 69 6e 74 73 2e 20 20 54 68   our points.  Th
5820: 65 20 72 65 73 75 6c 74 20 77 69 6c 6c 20 68 61  e result will ha
5830: 76 65 20 74 68 72 65 65 20 63 6f 6c 75 6d 6e 20  ve three column 
5840: 77 69 74 68 0a 6e 61 6d 65 73 20 22 6f 6e 65 22  with.names "one"
5850: 2c 20 22 74 77 6f 22 2c 20 61 6e 64 20 22 62 6f  , "two", and "bo
5860: 74 68 22 2e 20 20 54 68 65 20 66 69 72 73 74 20  th".  The first 
5870: 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  two columns are 
5880: 64 69 72 65 63 74 0a 63 6f 70 69 65 73 20 6f 66  direct.copies of
5890: 20 74 68 65 20 74 77 6f 20 63 6f 6c 75 6d 6e 73   the two columns
58a0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61 6e   in the table an
58b0: 64 20 74 68 65 20 74 68 69 72 64 20 72 65 73 75  d the third resu
58c0: 6c 74 0a 63 6f 6c 75 6d 6e 20 69 73 20 61 20 73  lt.column is a s
58d0: 74 72 69 6e 67 20 66 6f 72 6d 65 64 20 62 79 20  tring formed by 
58e0: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 20 74 68  concatenating th
58f0: 65 20 66 69 72 73 74 20 61 6e 64 0a 73 65 63 6f  e first and.seco
5900: 6e 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  nd columns of th
5910: 65 20 74 61 62 6c 65 2e 0a 46 69 6e 61 6c 6c 79  e table..Finally
5920: 2c 20 74 68 65 0a 57 48 45 52 45 20 63 6c 61 75  , the.WHERE clau
5930: 73 65 20 73 61 79 73 20 74 68 61 74 20 77 65 20  se says that we 
5940: 77 69 6c 6c 20 6f 6e 6c 79 20 63 68 6f 73 65 20  will only chose 
5950: 72 6f 77 73 20 66 6f 72 20 74 68 65 20 0a 72 65  rows for the .re
5960: 73 75 6c 74 73 20 77 68 65 72 65 20 74 68 65 20  sults where the 
5970: 22 6f 6e 65 22 20 63 6f 6c 75 6d 6e 20 62 65 67  "one" column beg
5980: 69 6e 73 20 77 69 74 68 20 61 6e 20 22 48 22 2e  ins with an "H".
5990: 0a 48 65 72 65 20 69 73 20 77 68 61 74 20 74 68  .Here is what th
59a0: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 6c  e VDBE program l
59b0: 6f 6f 6b 73 20 6c 69 6b 65 20 66 6f 72 20 74 68  ooks like for th
59c0: 69 73 20 71 75 65 72 79 3a 3c 2f 70 3e 0a 7d 0a  is query:</p>.}.
59d0: 0a 43 6f 64 65 20 7b 0a 61 64 64 72 20 20 6f 70  .Code {.addr  op
59e0: 63 6f 64 65 20 20 20 20 20 20 20 20 70 31 20 20  code        p1  
59f0: 20 20 20 70 32 20 20 20 20 20 70 33 20 20 20 20     p2     p3    
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d    .----  -------
5a30: 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d  -----  -----  --
5a40: 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
5a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 43  --------.0     C
5a70: 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20 30 20 20  olumnName    0  
5a80: 20 20 20 20 30 20 20 20 20 20 20 6f 6e 65 0a 31      0      one.1
5a90: 20 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20       ColumnName 
5aa0: 20 20 20 31 20 20 20 20 20 20 30 20 20 20 20 20     1      0     
5ab0: 20 74 77 6f 0a 32 20 20 20 20 20 43 6f 6c 75 6d   two.2     Colum
5ac0: 6e 4e 61 6d 65 20 20 20 20 32 20 20 20 20 20 20  nName    2      
5ad0: 30 20 20 20 20 20 20 62 6f 74 68 0a 33 20 20 20  0      both.3   
5ae0: 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20    Integer       
5af0: 30 20 20 20 20 20 20 30 0a 34 20 20 20 20 20 4f  0      0.4     O
5b00: 70 65 6e 52 65 61 64 20 20 20 20 20 20 30 20 20  penRead      0  
5b10: 20 20 20 20 33 20 20 20 20 20 20 65 78 61 6d 70      3      examp
5b20: 0a 35 20 20 20 20 20 56 65 72 69 66 79 43 6f 6f  .5     VerifyCoo
5b30: 6b 69 65 20 20 30 20 20 20 20 20 20 38 31 0a 36  kie  0      81.6
5b40: 20 20 20 20 20 52 65 77 69 6e 64 20 20 20 20 20       Rewind     
5b50: 20 20 20 30 20 20 20 20 20 20 31 38 0a 37 20 20     0      18.7  
5b60: 20 20 20 53 74 72 69 6e 67 20 20 20 20 20 20 20     String       
5b70: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 48   0      0      H
5b80: 25 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  %               
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 20 20 20 20 20 20 20 0a 38 20 20 20 20 20 43 6f         .8     Co
5bb0: 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20  lumn        0   
5bc0: 20 20 20 30 0a 39 20 20 20 20 20 46 75 6e 63 74     0.9     Funct
5bd0: 69 6f 6e 20 20 20 20 20 20 32 20 20 20 20 20 20  ion      2      
5be0: 30 20 20 20 20 20 20 70 74 72 28 30 78 37 66 31  0      ptr(0x7f1
5bf0: 61 63 30 29 0a 31 30 20 20 20 20 49 66 4e 6f 74  ac0).10    IfNot
5c00: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
5c10: 31 37 0a 31 31 20 20 20 20 43 6f 6c 75 6d 6e 20  17.11    Column 
5c20: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 0a         0      0.
5c30: 31 32 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20  12    Column    
5c40: 20 20 20 20 30 20 20 20 20 20 20 31 0a 31 33 20      0      1.13 
5c50: 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20     Column       
5c60: 20 30 20 20 20 20 20 20 30 0a 31 34 20 20 20 20   0      0.14    
5c70: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20  Column        0 
5c80: 20 20 20 20 20 31 0a 31 35 20 20 20 20 43 6f 6e       1.15    Con
5c90: 63 61 74 20 20 20 20 20 20 20 20 32 20 20 20 20  cat        2    
5ca0: 20 20 30 0a 31 36 20 20 20 20 43 61 6c 6c 62 61    0.16    Callba
5cb0: 63 6b 20 20 20 20 20 20 33 20 20 20 20 20 20 30  ck      3      0
5cc0: 0a 31 37 20 20 20 20 4e 65 78 74 20 20 20 20 20  .17    Next     
5cd0: 20 20 20 20 20 30 20 20 20 20 20 20 37 0a 31 38       0      7.18
5ce0: 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20 20 20      Close       
5cf0: 20 20 30 20 20 20 20 20 20 30 0a 31 39 20 20 20    0      0.19   
5d00: 20 48 61 6c 74 20 20 20 20 20 20 20 20 20 20 30   Halt          0
5d10: 20 20 20 20 20 20 30 0a 7d 0a 0a 70 75 74 73 20        0.}..puts 
5d20: 7b 0a 3c 70 3e 45 78 63 65 70 74 20 66 6f 72 20  {.<p>Except for 
5d30: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5d40: 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  , the structure 
5d50: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 66  of the program f
5d60: 6f 72 0a 74 68 69 73 20 65 78 61 6d 70 6c 65 20  or.this example 
5d70: 69 73 20 76 65 72 79 20 6d 75 63 68 20 6c 69 6b  is very much lik
5d80: 65 20 74 68 65 20 70 72 69 6f 72 20 65 78 61 6d  e the prior exam
5d90: 70 6c 65 2c 20 6a 75 73 74 20 77 69 74 68 20 61  ple, just with a
5da0: 6e 0a 65 78 74 72 61 20 63 6f 6c 75 6d 6e 2e 20  n.extra column. 
5db0: 20 54 68 65 72 65 20 61 72 65 20 6e 6f 77 20 33   There are now 3
5dc0: 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 73 74 65 61   columns, instea
5dd0: 64 20 6f 66 20 32 20 61 73 20 62 65 66 6f 72 65  d of 2 as before
5de0: 2c 0a 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  ,.and there are 
5df0: 74 68 72 65 65 20 43 6f 6c 75 6d 6e 4e 61 6d 65  three ColumnName
5e00: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 0a 41   instructions..A
5e10: 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65   cursor is opene
5e20: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 70 65 6e  d using the Open
5e30: 52 65 61 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  Read instruction
5e40: 2c 20 6a 75 73 74 20 6c 69 6b 65 20 69 6e 20 74  , just like in t
5e50: 68 65 0a 70 72 69 6f 72 20 65 78 61 6d 70 6c 65  he.prior example
5e60: 2e 20 20 54 68 65 20 52 65 77 69 6e 64 20 69 6e  .  The Rewind in
5e70: 73 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64 64  struction at add
5e80: 72 65 73 73 20 36 20 61 6e 64 20 74 68 65 0a 4e  ress 6 and the.N
5e90: 65 78 74 20 61 74 20 61 64 64 72 65 73 73 20 31  ext at address 1
5ea0: 37 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 20 6f 76  7 form a loop ov
5eb0: 65 72 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 6f  er all records o
5ec0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 0a 54  f the table.  .T
5ed0: 68 65 20 43 6c 6f 73 65 20 69 6e 73 74 72 75 63  he Close instruc
5ee0: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
5ef0: 69 73 20 74 68 65 72 65 20 74 6f 20 67 69 76 65  is there to give
5f00: 20 74 68 65 0a 52 65 77 69 6e 64 20 69 6e 73 74   the.Rewind inst
5f10: 72 75 63 74 69 6f 6e 20 73 6f 6d 65 74 68 69 6e  ruction somethin
5f20: 67 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65  g to jump to whe
5f30: 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 20 20 41  n it is done.  A
5f40: 6c 6c 20 6f 66 0a 74 68 69 73 20 69 73 20 6a 75  ll of.this is ju
5f50: 73 74 20 6c 69 6b 65 20 69 6e 20 74 68 65 20 66  st like in the f
5f60: 69 72 73 74 20 71 75 65 72 79 20 64 65 6d 6f 6e  irst query demon
5f70: 73 74 72 61 74 69 6f 6e 2e 3c 2f 70 3e 0a 0a 3c  stration.</p>..<
5f80: 70 3e 54 68 65 20 43 61 6c 6c 62 61 63 6b 20 69  p>The Callback i
5f90: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
5fa0: 69 73 20 65 78 61 6d 70 6c 65 20 68 61 73 20 74  is example has t
5fb0: 6f 20 67 65 6e 65 72 61 74 65 0a 64 61 74 61 20  o generate.data 
5fc0: 66 6f 72 20 74 68 72 65 65 20 72 65 73 75 6c 74  for three result
5fd0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 73 74 65 61 64   columns instead
5fe0: 20 6f 66 20 74 77 6f 2c 20 62 75 74 20 69 73 20   of two, but is 
5ff0: 6f 74 68 65 72 77 69 73 65 0a 74 68 65 20 73 61  otherwise.the sa
6000: 6d 65 20 61 73 20 69 6e 20 74 68 65 20 66 69 72  me as in the fir
6010: 73 74 20 71 75 65 72 79 2e 20 20 57 68 65 6e 20  st query.  When 
6020: 74 68 65 20 43 61 6c 6c 62 61 63 6b 20 69 6e 73  the Callback ins
6030: 74 72 75 63 74 69 6f 6e 0a 69 73 20 69 6e 76 6f  truction.is invo
6040: 6b 65 64 2c 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ked, the left-mo
6050: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
6060: 20 72 65 73 75 6c 74 20 73 68 6f 75 6c 64 20 62   result should b
6070: 65 0a 74 68 65 20 6c 6f 77 65 73 74 20 69 6e 20  e.the lowest in 
6080: 74 68 65 20 73 74 61 63 6b 20 61 6e 64 20 74 68  the stack and th
6090: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 72 65 73  e right-most res
60a0: 75 6c 74 20 63 6f 6c 75 6d 6e 20 73 68 6f 75 6c  ult column shoul
60b0: 64 0a 62 65 20 74 68 65 20 74 6f 70 20 6f 66 20  d.be the top of 
60c0: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 65 20 63  the stack.  We c
60d0: 61 6e 20 73 65 65 20 74 68 65 20 73 74 61 63 6b  an see the stack
60e0: 20 62 65 69 6e 67 20 73 65 74 20 75 70 20 0a 74   being set up .t
60f0: 68 69 73 20 77 61 79 20 61 74 20 61 64 64 72 65  his way at addre
6100: 73 73 65 73 20 31 31 20 74 68 72 6f 75 67 68 20  sses 11 through 
6110: 31 35 2e 20 20 54 68 65 20 43 6f 6c 75 6d 6e 20  15.  The Column 
6120: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 74 0a  instructions at.
6130: 31 31 20 61 6e 64 20 31 32 20 70 75 73 68 20 74  11 and 12 push t
6140: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
6150: 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f 6c 75  e first two colu
6160: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
6170: 74 2e 0a 54 68 65 20 74 77 6f 20 43 6f 6c 75 6d  t..The two Colum
6180: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
6190: 74 20 31 33 20 61 6e 64 20 31 34 20 70 75 6c 6c  t 13 and 14 pull
61a0: 20 69 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6e   in the values n
61b0: 65 65 64 65 64 0a 74 6f 20 63 6f 6d 70 75 74 65  eeded.to compute
61c0: 20 74 68 65 20 74 68 69 72 64 20 72 65 73 75 6c   the third resul
61d0: 74 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65  t column and the
61e0: 20 43 6f 6e 63 61 74 20 69 6e 73 74 72 75 63 74   Concat instruct
61f0: 69 6f 6e 20 61 74 0a 31 35 20 6a 6f 69 6e 73 20  ion at.15 joins 
6200: 74 68 65 6d 20 74 6f 67 65 74 68 65 72 20 69 6e  them together in
6210: 74 6f 20 61 20 73 69 6e 67 6c 65 20 65 6e 74 72  to a single entr
6220: 79 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 3c  y on the stack.<
6230: 2f 70 3e 0a 0a 3c 70 3e 54 68 65 20 6f 6e 6c 79  /p>..<p>The only
6240: 20 74 68 69 6e 67 20 74 68 61 74 20 69 73 20 72   thing that is r
6250: 65 61 6c 6c 79 20 6e 65 77 20 61 62 6f 75 74 20  eally new about 
6260: 74 68 65 20 63 75 72 72 65 6e 74 20 65 78 61 6d  the current exam
6270: 70 6c 65 0a 69 73 20 74 68 65 20 57 48 45 52 45  ple.is the WHERE
6280: 20 63 6c 61 75 73 65 20 77 68 69 63 68 20 69 73   clause which is
6290: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
62a0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 74 0a  instructions at.
62b0: 61 64 64 72 65 73 73 65 73 20 37 20 74 68 72 6f  addresses 7 thro
62c0: 75 67 68 20 31 30 2e 20 20 49 6e 73 74 72 75 63  ugh 10.  Instruc
62d0: 74 69 6f 6e 73 20 61 74 20 61 64 64 72 65 73 73  tions at address
62e0: 20 37 20 61 6e 64 20 38 20 70 75 73 68 0a 6f 6e   7 and 8 push.on
62f0: 74 6f 20 74 68 65 20 73 74 61 63 6b 20 74 68 65  to the stack the
6300: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 6f   value of the "o
6310: 6e 65 22 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  ne" column from 
6320: 74 68 65 20 74 61 62 6c 65 0a 61 6e 64 20 74 68  the table.and th
6330: 65 20 6c 69 74 65 72 61 6c 20 73 74 72 69 6e 67  e literal string
6340: 20 22 48 25 22 2e 20 20 0a 54 68 65 20 3c 61 20   "H%".  .The <a 
6350: 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d  href="opcode.htm
6360: 6c 23 46 75 6e 63 74 69 6f 6e 22 3e 46 75 6e 63  l#Function">Func
6370: 74 69 6f 6e 3c 2f 61 3e 20 69 6e 73 74 72 75 63  tion</a> instruc
6380: 74 69 6f 6e 20 61 74 20 61 64 64 72 65 73 73 20  tion at address 
6390: 39 20 0a 70 6f 70 73 20 74 68 65 73 65 20 74 77  9 .pops these tw
63a0: 6f 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68  o values from th
63b0: 65 20 73 74 61 63 6b 20 61 6e 64 20 70 75 73 68  e stack and push
63c0: 65 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  es the result of
63d0: 20 74 68 65 20 4c 49 4b 45 28 29 20 0a 66 75 6e   the LIKE() .fun
63e0: 63 74 69 6f 6e 20 62 61 63 6b 20 6f 6e 74 6f 20  ction back onto 
63f0: 74 68 65 20 73 74 61 63 6b 2e 20 20 0a 54 68 65  the stack.  .The
6400: 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65   <a href="opcode
6410: 2e 68 74 6d 6c 23 49 66 4e 6f 74 22 3e 49 66 4e  .html#IfNot">IfN
6420: 6f 74 3c 2f 61 3e 20 69 6e 73 74 72 75 63 74 69  ot</a> instructi
6430: 6f 6e 20 70 6f 70 73 20 74 68 65 20 74 6f 70 20  on pops the top 
6440: 73 74 61 63 6b 20 0a 76 61 6c 75 65 20 61 6e 64  stack .value and
6450: 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
6460: 69 61 74 65 20 6a 75 6d 70 20 66 6f 72 77 61 72  iate jump forwar
6470: 64 20 74 6f 20 74 68 65 20 4e 65 78 74 20 69 6e  d to the Next in
6480: 73 74 72 75 63 74 69 6f 6e 20 69 66 20 74 68 65  struction if the
6490: 20 0a 74 6f 70 20 76 61 6c 75 65 20 77 61 73 20   .top value was 
64a0: 66 61 6c 73 65 20 28 3c 65 6d 3e 6e 6f 74 3c 2f  false (<em>not</
64b0: 65 6d 3e 20 6e 6f 74 20 6c 69 6b 65 20 74 68 65  em> not like the
64c0: 20 6c 69 74 65 72 61 6c 20 73 74 72 69 6e 67 20   literal string 
64d0: 22 48 25 22 29 2e 20 20 0a 54 61 6b 69 6e 67 20  "H%").  .Taking 
64e0: 74 68 69 73 20 6a 75 6d 70 20 65 66 66 65 63 74  this jump effect
64f0: 69 76 65 6c 79 20 73 6b 69 70 73 20 74 68 65 20  ively skips the 
6500: 63 61 6c 6c 62 61 63 6b 2c 20 77 68 69 63 68 20  callback, which 
6510: 69 73 20 74 68 65 20 77 68 6f 6c 65 20 70 6f 69  is the whole poi
6520: 6e 74 0a 6f 66 20 74 68 65 20 57 48 45 52 45 20  nt.of the WHERE 
6530: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
6540: 72 65 73 75 6c 74 0a 6f 66 20 74 68 65 20 63 6f  result.of the co
6550: 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 72 75 65  mparison is true
6560: 2c 20 74 68 65 20 6a 75 6d 70 20 69 73 20 6e 6f  , the jump is no
6570: 74 20 74 61 6b 65 6e 20 61 6e 64 20 63 6f 6e 74  t taken and cont
6580: 72 6f 6c 0a 66 61 6c 6c 73 20 74 68 72 6f 75 67  rol.falls throug
6590: 68 20 74 6f 20 74 68 65 20 43 61 6c 6c 62 61 63  h to the Callbac
65a0: 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 62 65  k instruction be
65b0: 6c 6f 77 2e 3c 2f 70 3e 0a 0a 3c 70 3e 4e 6f 74  low.</p>..<p>Not
65c0: 69 63 65 20 68 6f 77 20 74 68 65 20 4c 49 4b 45  ice how the LIKE
65d0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 69 6d 70   operator is imp
65e0: 6c 65 6d 65 6e 74 65 64 2e 20 20 49 74 20 69 73  lemented.  It is
65f0: 20 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20   a user-defined 
6600: 0a 66 75 6e 63 74 69 6f 6e 20 69 6e 20 53 51 4c  .function in SQL
6610: 69 74 65 2c 20 73 6f 20 74 68 65 20 61 64 64 72  ite, so the addr
6620: 65 73 73 20 6f 66 20 69 74 73 20 66 75 6e 63 74  ess of its funct
6630: 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 69  ion definition i
6640: 73 20 0a 73 70 65 63 69 66 69 65 64 20 69 6e 20  s .specified in 
6650: 50 33 2e 20 20 54 68 65 20 6f 70 65 72 61 6e 64  P3.  The operand
6660: 20 50 31 20 69 73 20 74 68 65 20 6e 75 6d 62 65   P1 is the numbe
6670: 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
6680: 67 75 6d 65 6e 74 73 20 66 6f 72 20 0a 69 74 20  guments for .it 
6690: 74 6f 20 74 61 6b 65 20 66 72 6f 6d 20 74 68 65  to take from the
66a0: 20 73 74 61 63 6b 2e 20 20 49 6e 20 74 68 69 73   stack.  In this
66b0: 20 63 61 73 65 20 74 68 65 20 4c 49 4b 45 28 29   case the LIKE()
66c0: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
66d0: 32 20 0a 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  2 .arguments.  T
66e0: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  he arguments are
66f0: 20 74 61 6b 65 6e 20 6f 66 66 20 74 68 65 20 73   taken off the s
6700: 74 61 63 6b 20 69 6e 20 72 65 76 65 72 73 65 20  tack in reverse 
6710: 6f 72 64 65 72 20 0a 28 72 69 67 68 74 2d 74 6f  order .(right-to
6720: 2d 6c 65 66 74 29 2c 20 73 6f 20 74 68 65 20 70  -left), so the p
6730: 61 74 74 65 72 6e 20 74 6f 20 6d 61 74 63 68 20  attern to match 
6740: 69 73 20 74 68 65 20 74 6f 70 20 73 74 61 63 6b  is the top stack
6750: 20 65 6c 65 6d 65 6e 74 2c 20 61 6e 64 20 0a 74   element, and .t
6760: 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
6770: 69 73 20 74 68 65 20 64 61 74 61 20 74 6f 20 63  is the data to c
6780: 6f 6d 70 61 72 65 2e 20 20 54 68 65 20 72 65 74  ompare.  The ret
6790: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 70 75 73  urn value is pus
67a0: 68 65 64 20 0a 6f 6e 74 6f 20 74 68 65 20 73 74  hed .onto the st
67b0: 61 63 6b 2e 3c 2f 70 3e 0a 0a 0a 3c 61 20 6e 61  ack.</p>...<a na
67c0: 6d 65 3d 22 70 61 74 74 65 72 6e 31 22 3e 0a 3c  me="pattern1">.<
67d0: 68 32 3e 41 20 54 65 6d 70 6c 61 74 65 20 46 6f  h2>A Template Fo
67e0: 72 20 53 45 4c 45 43 54 20 50 72 6f 67 72 61 6d  r SELECT Program
67f0: 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 54 68 65 20 66  s</h2>..<p>The f
6800: 69 72 73 74 20 74 77 6f 20 71 75 65 72 79 20 65  irst two query e
6810: 78 61 6d 70 6c 65 73 20 69 6c 6c 75 73 74 72 61  xamples illustra
6820: 74 65 20 61 20 6b 69 6e 64 20 6f 66 20 74 65 6d  te a kind of tem
6830: 70 6c 61 74 65 20 74 68 61 74 0a 65 76 65 72 79  plate that.every
6840: 20 53 45 4c 45 43 54 20 70 72 6f 67 72 61 6d 20   SELECT program 
6850: 77 69 6c 6c 20 66 6f 6c 6c 6f 77 2e 20 20 42 61  will follow.  Ba
6860: 73 69 63 61 6c 6c 79 2c 20 77 65 20 68 61 76 65  sically, we have
6870: 3a 3c 2f 70 3e 0a 0a 3c 70 3e 0a 3c 6f 6c 3e 0a  :</p>..<p>.<ol>.
6880: 3c 6c 69 3e 49 6e 69 74 69 61 6c 69 7a 65 20 74  <li>Initialize t
6890: 68 65 20 3c 62 3e 61 7a 43 6f 6c 75 6d 6e 4e 61  he <b>azColumnNa
68a0: 6d 65 5b 5d 3c 2f 62 3e 20 61 72 72 61 79 20 66  me[]</b> array f
68b0: 6f 72 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  or the callback.
68c0: 3c 2f 6c 69 3e 0a 3c 6c 69 3e 4f 70 65 6e 20 61  </li>.<li>Open a
68d0: 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
68e0: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 71 75 65   table to be que
68f0: 72 69 65 64 2e 3c 2f 6c 69 3e 0a 3c 6c 69 3e 46  ried.</li>.<li>F
6900: 6f 72 20 65 61 63 68 20 72 65 63 6f 72 64 20 69  or each record i
6910: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 64 6f 3a  n the table, do:
6920: 0a 20 20 20 20 3c 6f 6c 20 74 79 70 65 3d 22 61  .    <ol type="a
6930: 22 3e 0a 20 20 20 20 3c 6c 69 3e 49 66 20 74 68  ">.    <li>If th
6940: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  e WHERE clause e
6950: 76 61 6c 75 61 74 65 73 20 74 6f 20 46 41 4c 53  valuates to FALS
6960: 45 2c 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  E, then skip the
6970: 20 73 74 65 70 73 20 74 68 61 74 0a 20 20 20 20   steps that.    
6980: 20 20 20 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 63      follow and c
6990: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e  ontinue to the n
69a0: 65 78 74 20 72 65 63 6f 72 64 2e 3c 2f 6c 69 3e  ext record.</li>
69b0: 0a 20 20 20 20 3c 6c 69 3e 43 6f 6d 70 75 74 65  .    <li>Compute
69c0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72   all columns for
69d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
69e0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 3c   of the result.<
69f0: 2f 6c 69 3e 0a 20 20 20 20 3c 6c 69 3e 49 6e 76  /li>.    <li>Inv
6a00: 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
6a10: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68   function for th
6a20: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
6a30: 20 74 68 65 20 72 65 73 75 6c 74 2e 3c 2f 6c 69   the result.</li
6a40: 3e 0a 20 20 20 20 3c 2f 6f 6c 3e 0a 3c 6c 69 3e  >.    </ol>.<li>
6a50: 43 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  Close the cursor
6a60: 2e 3c 2f 6c 69 3e 0a 3c 2f 6f 6c 3e 0a 3c 2f 70  .</li>.</ol>.</p
6a70: 3e 0a 0a 3c 70 3e 54 68 69 73 20 74 65 6d 70 6c  >..<p>This templ
6a80: 61 74 65 20 77 69 6c 6c 20 62 65 20 65 78 70 61  ate will be expa
6a90: 6e 64 65 64 20 63 6f 6e 73 69 64 65 72 61 62 6c  nded considerabl
6aa0: 79 20 61 73 20 77 65 20 63 6f 6e 73 69 64 65 72  y as we consider
6ab0: 0a 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70  .additional comp
6ac0: 6c 69 63 61 74 69 6f 6e 73 20 73 75 63 68 20 61  lications such a
6ad0: 73 20 6a 6f 69 6e 73 2c 20 63 6f 6d 70 6f 75 6e  s joins, compoun
6ae0: 64 20 73 65 6c 65 63 74 73 2c 20 75 73 69 6e 67  d selects, using
6af0: 0a 69 6e 64 69 63 65 73 20 74 6f 20 73 70 65 65  .indices to spee
6b00: 64 20 74 68 65 20 73 65 61 72 63 68 2c 20 73 6f  d the search, so
6b10: 72 74 69 6e 67 2c 20 61 6e 64 20 61 67 67 72 65  rting, and aggre
6b20: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a 77  gate functions.w
6b30: 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
6b40: 47 52 4f 55 50 20 42 59 20 61 6e 64 20 48 41 56  GROUP BY and HAV
6b50: 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 42 75 74  ING clauses..But
6b60: 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 63 20   the same basic 
6b70: 69 64 65 61 73 20 77 69 6c 6c 20 63 6f 6e 74 69  ideas will conti
6b80: 6e 75 65 20 74 6f 20 61 70 70 6c 79 2e 3c 2f 70  nue to apply.</p
6b90: 3e 0a 0a 3c 68 32 3e 55 50 44 41 54 45 20 41 6e  >..<h2>UPDATE An
6ba0: 64 20 44 45 4c 45 54 45 20 53 74 61 74 65 6d 65  d DELETE Stateme
6bb0: 6e 74 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 54 68 65  nts</h2>..<p>The
6bc0: 20 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45   UPDATE and DELE
6bd0: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
6be0: 65 20 63 6f 64 65 64 20 75 73 69 6e 67 20 61 20  e coded using a 
6bf0: 74 65 6d 70 6c 61 74 65 0a 74 68 61 74 20 69 73  template.that is
6c00: 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f   very similar to
6c10: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
6c20: 65 6d 65 6e 74 20 74 65 6d 70 6c 61 74 65 2e 20  ement template. 
6c30: 20 54 68 65 20 6d 61 69 6e 0a 64 69 66 66 65 72   The main.differ
6c40: 65 6e 63 65 2c 20 6f 66 20 63 6f 75 72 73 65 2c  ence, of course,
6c50: 20 69 73 20 74 68 61 74 20 74 68 65 20 65 6e 64   is that the end
6c60: 20 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 6f   action is to mo
6c70: 64 69 66 79 20 74 68 65 0a 64 61 74 61 62 61 73  dify the.databas
6c80: 65 20 72 61 74 68 65 72 20 74 68 61 6e 20 69 6e  e rather than in
6c90: 76 6f 6b 65 20 61 20 63 61 6c 6c 62 61 63 6b 20  voke a callback 
6ca0: 66 75 6e 63 74 69 6f 6e 2e 20 20 42 65 63 61 75  function.  Becau
6cb0: 73 65 20 69 74 20 6d 6f 64 69 66 69 65 73 20 0a  se it modifies .
6cc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 74 20  the database it 
6cd0: 77 69 6c 6c 20 61 6c 73 6f 20 75 73 65 20 74 72  will also use tr
6ce0: 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20 4c 65 74  ansactions.  Let
6cf0: 27 73 20 62 65 67 69 6e 0a 62 79 20 6c 6f 6f 6b  's begin.by look
6d00: 69 6e 67 20 61 74 20 61 20 44 45 4c 45 54 45 20  ing at a DELETE 
6d10: 73 74 61 74 65 6d 65 6e 74 3a 3c 2f 70 3e 0a 0a  statement:</p>..
6d20: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
6d30: 3e 0a 44 45 4c 45 54 45 20 46 52 4f 4d 20 65 78  >.DELETE FROM ex
6d40: 61 6d 70 20 57 48 45 52 45 20 74 77 6f 3c 35 30  amp WHERE two<50
6d50: 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71  ;.</pre></blockq
6d60: 75 6f 74 65 3e 0a 0a 3c 70 3e 54 68 69 73 20 44  uote>..<p>This D
6d70: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
6d80: 77 69 6c 6c 20 72 65 6d 6f 76 65 20 65 76 65 72  will remove ever
6d90: 79 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  y record from th
6da0: 65 20 22 65 78 61 6d 70 22 0a 74 61 62 6c 65 20  e "examp".table 
6db0: 77 68 65 72 65 20 74 68 65 20 22 74 77 6f 22 20  where the "two" 
6dc0: 63 6f 6c 75 6d 6e 20 69 73 20 6c 65 73 73 20 74  column is less t
6dd0: 68 61 6e 20 35 30 2e 0a 54 68 65 20 63 6f 64 65  han 50..The code
6de0: 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 64 6f   generated to do
6df0: 20 74 68 69 73 20 69 73 20 61 73 20 66 6f 6c 6c   this is as foll
6e00: 6f 77 73 3a 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65  ows:</p>.}..Code
6e10: 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f 64 65 20   {.addr  opcode 
6e20: 20 20 20 20 20 20 20 70 31 20 20 20 20 20 70 32         p1     p2
6e30: 20 20 20 20 20 70 33 20 20 20 20 20 20 20 20 20       p3         
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 2d 2d               .--
6e60: 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
6e70: 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20    -----  -----  
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 0a 30 20 20 20 20 20 54 72 61 6e 73 61  ---.0     Transa
6eb0: 63 74 69 6f 6e 20 20 20 31 20 20 20 20 20 20 30  ction   1      0
6ec0: 0a 31 20 20 20 20 20 54 72 61 6e 73 61 63 74 69  .1     Transacti
6ed0: 6f 6e 20 20 20 30 20 20 20 20 20 20 30 0a 32 20  on   0      0.2 
6ee0: 20 20 20 20 56 65 72 69 66 79 43 6f 6f 6b 69 65      VerifyCookie
6ef0: 20 20 30 20 20 20 20 20 20 31 37 38 0a 33 20 20    0      178.3  
6f00: 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20     Integer      
6f10: 20 30 20 20 20 20 20 20 30 0a 34 20 20 20 20 20   0      0.4     
6f20: 4f 70 65 6e 52 65 61 64 20 20 20 20 20 20 30 20  OpenRead      0 
6f30: 20 20 20 20 20 33 20 20 20 20 20 20 65 78 61 6d       3      exam
6f40: 70 0a 35 20 20 20 20 20 52 65 77 69 6e 64 20 20  p.5     Rewind  
6f50: 20 20 20 20 20 20 30 20 20 20 20 20 20 31 32 0a        0      12.
6f60: 36 20 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20  6     Column    
6f70: 20 20 20 20 30 20 20 20 20 20 20 31 0a 37 20 20      0      1.7  
6f80: 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20     Integer      
6f90: 20 35 30 20 20 20 20 20 30 20 20 20 20 20 20 35   50     0      5
6fa0: 30 0a 38 20 20 20 20 20 47 65 20 20 20 20 20 20  0.8     Ge      
6fb0: 20 20 20 20 20 20 31 20 20 20 20 20 20 31 31 0a        1      11.
6fc0: 39 20 20 20 20 20 52 65 63 6e 6f 20 20 20 20 20  9     Recno     
6fd0: 20 20 20 20 30 20 20 20 20 20 20 30 0a 31 30 20      0      0.10 
6fe0: 20 20 20 4c 69 73 74 57 72 69 74 65 20 20 20 20     ListWrite    
6ff0: 20 30 20 20 20 20 20 20 30 0a 31 31 20 20 20 20   0      0.11    
7000: 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 30 20  Next          0 
7010: 20 20 20 20 20 36 0a 31 32 20 20 20 20 43 6c 6f       6.12    Clo
7020: 73 65 20 20 20 20 20 20 20 20 20 30 20 20 20 20  se         0    
7030: 20 20 30 0a 31 33 20 20 20 20 4c 69 73 74 52 65    0.13    ListRe
7040: 77 69 6e 64 20 20 20 20 30 20 20 20 20 20 20 30  wind    0      0
7050: 0a 31 34 20 20 20 20 49 6e 74 65 67 65 72 20 20  .14    Integer  
7060: 20 20 20 20 20 30 20 20 20 20 20 20 30 0a 31 35       0      0.15
7070: 20 20 20 20 4f 70 65 6e 57 72 69 74 65 20 20 20      OpenWrite   
7080: 20 20 30 20 20 20 20 20 20 33 0a 31 36 20 20 20    0      3.16   
7090: 20 4c 69 73 74 52 65 61 64 20 20 20 20 20 20 30   ListRead      0
70a0: 20 20 20 20 20 20 32 30 0a 31 37 20 20 20 20 4e        20.17    N
70b0: 6f 74 45 78 69 73 74 73 20 20 20 20 20 30 20 20  otExists     0  
70c0: 20 20 20 20 31 39 0a 31 38 20 20 20 20 44 65 6c      19.18    Del
70d0: 65 74 65 20 20 20 20 20 20 20 20 30 20 20 20 20  ete        0    
70e0: 20 20 31 0a 31 39 20 20 20 20 47 6f 74 6f 20 20    1.19    Goto  
70f0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31          0      1
7100: 36 0a 32 30 20 20 20 20 4c 69 73 74 52 65 73 65  6.20    ListRese
7110: 74 20 20 20 20 20 30 20 20 20 20 20 20 30 0a 32  t     0      0.2
7120: 31 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20 20  1    Close      
7130: 20 20 20 30 20 20 20 20 20 20 30 0a 32 32 20 20     0      0.22  
7140: 20 20 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20    Commit        
7150: 30 20 20 20 20 20 20 30 0a 32 33 20 20 20 20 48  0      0.23    H
7160: 61 6c 74 20 20 20 20 20 20 20 20 20 20 30 20 20  alt          0  
7170: 20 20 20 20 30 0a 7d 0a 0a 70 75 74 73 20 7b 0a      0.}..puts {.
7180: 3c 70 3e 48 65 72 65 20 69 73 20 77 68 61 74 20  <p>Here is what 
7190: 74 68 65 20 70 72 6f 67 72 61 6d 20 6d 75 73 74  the program must
71a0: 20 64 6f 2e 20 20 46 69 72 73 74 20 69 74 20 68   do.  First it h
71b0: 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 61 6c 6c  as to locate all
71c0: 20 6f 66 0a 74 68 65 20 72 65 63 6f 72 64 73 20   of.the records 
71d0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 22 65 78  in the table "ex
71e0: 61 6d 70 22 20 74 68 61 74 20 61 72 65 20 74 6f  amp" that are to
71f0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 54 68   be deleted.  Th
7200: 69 73 20 69 73 0a 64 6f 6e 65 20 75 73 69 6e 67  is is.done using
7210: 20 61 20 6c 6f 6f 70 20 76 65 72 79 20 6d 75 63   a loop very muc
7220: 68 20 6c 69 6b 65 20 74 68 65 20 6c 6f 6f 70 20  h like the loop 
7230: 75 73 65 64 20 69 6e 20 74 68 65 20 53 45 4c 45  used in the SELE
7240: 43 54 20 65 78 61 6d 70 6c 65 73 0a 61 62 6f 76  CT examples.abov
7250: 65 2e 20 20 4f 6e 63 65 20 61 6c 6c 20 72 65 63  e.  Once all rec
7260: 6f 72 64 73 20 68 61 76 65 20 62 65 65 6e 20 6c  ords have been l
7270: 6f 63 61 74 65 64 2c 20 74 68 65 6e 20 77 65 20  ocated, then we 
7280: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 68 72 6f  can go back thro
7290: 75 67 68 0a 61 6e 64 20 64 65 6c 65 74 65 20 74  ugh.and delete t
72a0: 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 20  hem one by one. 
72b0: 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 63 61   Note that we ca
72c0: 6e 6e 6f 74 20 64 65 6c 65 74 65 20 65 61 63 68  nnot delete each
72d0: 20 72 65 63 6f 72 64 0a 61 73 20 73 6f 6f 6e 20   record.as soon 
72e0: 61 73 20 77 65 20 66 69 6e 64 20 69 74 2e 20 20  as we find it.  
72f0: 57 65 20 68 61 76 65 20 74 6f 20 6c 6f 63 61 74  We have to locat
7300: 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 66 69  e all records fi
7310: 72 73 74 2c 20 74 68 65 6e 0a 67 6f 20 62 61 63  rst, then.go bac
7320: 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
7330: 6d 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  m.  This is beca
7340: 75 73 65 20 74 68 65 20 53 51 4c 69 74 65 20 64  use the SQLite d
7350: 61 74 61 62 61 73 65 0a 62 61 63 6b 65 6e 64 20  atabase.backend 
7360: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
7370: 20 73 63 61 6e 20 6f 72 64 65 72 20 61 66 74 65   scan order afte
7380: 72 20 61 20 64 65 6c 65 74 65 20 6f 70 65 72 61  r a delete opera
7390: 74 69 6f 6e 2e 0a 41 6e 64 20 69 66 20 74 68 65  tion..And if the
73a0: 20 73 63 61 6e 0a 6f 72 64 65 72 20 63 68 61 6e   scan.order chan
73b0: 67 65 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ges in the middl
73c0: 65 20 6f 66 20 74 68 65 20 73 63 61 6e 2c 20 73  e of the scan, s
73d0: 6f 6d 65 20 72 65 63 6f 72 64 73 20 6d 69 67 68  ome records migh
73e0: 74 20 62 65 0a 76 69 73 69 74 65 64 20 6d 6f 72  t be.visited mor
73f0: 65 20 74 68 61 6e 20 6f 6e 63 65 20 61 6e 64 20  e than once and 
7400: 6f 74 68 65 72 20 72 65 63 6f 72 64 73 20 6d 69  other records mi
7410: 67 68 74 20 6e 6f 74 20 62 65 20 76 69 73 69 74  ght not be visit
7420: 65 64 20 61 74 20 61 6c 6c 2e 3c 2f 70 3e 0a 0a  ed at all.</p>..
7430: 3c 70 3e 53 6f 20 74 68 65 20 69 6d 70 6c 65 6d  <p>So the implem
7440: 65 6e 74 69 6f 6e 20 6f 66 20 44 45 4c 45 54 45  ention of DELETE
7450: 20 69 73 20 72 65 61 6c 6c 79 20 69 6e 20 74 77   is really in tw
7460: 6f 20 6c 6f 6f 70 73 2e 20 20 54 68 65 20 66 69  o loops.  The fi
7470: 72 73 74 20 6c 6f 6f 70 20 0a 28 69 6e 73 74 72  rst loop .(instr
7480: 75 63 74 69 6f 6e 73 20 35 20 74 68 72 6f 75 67  uctions 5 throug
7490: 68 20 31 31 29 20 6c 6f 63 61 74 65 73 20 74 68  h 11) locates th
74a0: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 61  e records that a
74b0: 72 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  re to be deleted
74c0: 20 0a 61 6e 64 20 73 61 76 65 73 20 74 68 65 69   .and saves thei
74d0: 72 20 6b 65 79 73 20 6f 6e 74 6f 20 61 20 74 65  r keys onto a te
74e0: 6d 70 6f 72 61 72 79 20 6c 69 73 74 2c 20 61 6e  mporary list, an
74f0: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 6f  d the second loo
7500: 70 20 0a 28 69 6e 73 74 72 75 63 74 69 6f 6e 73  p .(instructions
7510: 20 31 36 20 74 68 72 6f 75 67 68 20 31 39 29 20   16 through 19) 
7520: 75 73 65 73 20 74 68 65 20 6b 65 79 20 6c 69 73  uses the key lis
7530: 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
7540: 72 65 63 6f 72 64 73 20 6f 6e 65 20 0a 62 79 20  records one .by 
7550: 6f 6e 65 2e 20 20 3c 2f 70 3e 0a 7d 0a 0a 0a 43  one.  </p>.}...C
7560: 6f 64 65 20 7b 0a 30 20 20 20 20 20 54 72 61 6e  ode {.0     Tran
7570: 73 61 63 74 69 6f 6e 20 20 20 31 20 20 20 20 20  saction   1     
7580: 20 30 0a 31 20 20 20 20 20 54 72 61 6e 73 61 63   0.1     Transac
7590: 74 69 6f 6e 20 20 20 30 20 20 20 20 20 20 30 0a  tion   0      0.
75a0: 32 20 20 20 20 20 56 65 72 69 66 79 43 6f 6f 6b  2     VerifyCook
75b0: 69 65 20 20 30 20 20 20 20 20 20 31 37 38 0a 33  ie  0      178.3
75c0: 20 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20       Integer    
75d0: 20 20 20 30 20 20 20 20 20 20 30 0a 34 20 20 20     0      0.4   
75e0: 20 20 4f 70 65 6e 52 65 61 64 20 20 20 20 20 20    OpenRead      
75f0: 30 20 20 20 20 20 20 33 20 20 20 20 20 20 65 78  0      3      ex
7600: 61 6d 70 0a 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e  amp.}.puts {.<p>
7610: 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 30 20 74  Instructions 0 t
7620: 68 6f 75 67 68 20 34 20 61 72 65 20 61 73 20 69  hough 4 are as i
7630: 6e 20 74 68 65 20 49 4e 53 45 52 54 20 65 78 61  n the INSERT exa
7640: 6d 70 6c 65 2e 20 20 54 68 65 79 20 73 74 61 72  mple.  They star
7650: 74 20 0a 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  t .transactions 
7660: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 61 6e 64  for the main and
7670: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
7680: 61 73 65 73 2c 20 76 65 72 69 66 79 20 74 68 65  ases, verify the
7690: 20 64 61 74 61 62 61 73 65 20 0a 73 63 68 65 6d   database .schem
76a0: 61 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  a for the main d
76b0: 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6f 70 65  atabase, and ope
76c0: 6e 20 61 20 72 65 61 64 20 63 75 72 73 6f 72 20  n a read cursor 
76d0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 22 65  on the table ."e
76e0: 78 61 6d 70 22 2e 20 20 4e 6f 74 69 63 65 20 74  xamp".  Notice t
76f0: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
7700: 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  s opened for rea
7710: 64 69 6e 67 2c 20 6e 6f 74 20 77 72 69 74 69 6e  ding, not writin
7720: 67 2e 20 20 41 74 20 0a 74 68 69 73 20 73 74 61  g.  At .this sta
7730: 67 65 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ge of the progra
7740: 6d 20 77 65 20 61 72 65 20 6f 6e 6c 79 20 67 6f  m we are only go
7750: 69 6e 67 20 74 6f 20 62 65 20 73 63 61 6e 6e 69  ing to be scanni
7760: 6e 67 20 74 68 65 20 74 61 62 6c 65 2c 20 0a 6e  ng the table, .n
7770: 6f 74 20 63 68 61 6e 67 69 6e 67 20 69 74 2e 20  ot changing it. 
7780: 20 57 65 20 77 69 6c 6c 20 72 65 6f 70 65 6e 20   We will reopen 
7790: 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20 66  the same table f
77a0: 6f 72 20 77 72 69 74 69 6e 67 20 6c 61 74 65 72  or writing later
77b0: 2c 20 61 74 20 0a 69 6e 73 74 72 75 63 74 69 6f  , at .instructio
77c0: 6e 20 31 35 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64  n 15.</p>.}..Cod
77d0: 65 20 7b 0a 35 20 20 20 20 20 52 65 77 69 6e 64  e {.5     Rewind
77e0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31          0      1
77f0: 32 0a 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e 41 73  2.}.puts {.<p>As
7800: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 65   in the SELECT e
7810: 78 61 6d 70 6c 65 2c 20 74 68 65 20 3c 61 20 68  xample, the <a h
7820: 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c  ref="opcode.html
7830: 23 52 65 77 69 6e 64 22 3e 52 65 77 69 6e 64 3c  #Rewind">Rewind<
7840: 2f 61 3e 20 0a 69 6e 73 74 72 75 63 74 69 6f 6e  /a> .instruction
7850: 20 72 65 77 69 6e 64 73 20 74 68 65 20 63 75 72   rewinds the cur
7860: 73 6f 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e  sor to the begin
7870: 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 61 62 6c  ning of the tabl
7880: 65 2c 20 72 65 61 64 79 69 6e 67 20 0a 69 74 20  e, readying .it 
7890: 66 6f 72 20 75 73 65 20 69 6e 20 74 68 65 20 6c  for use in the l
78a0: 6f 6f 70 20 62 6f 64 79 2e 3c 2f 70 3e 0a 7d 0a  oop body.</p>.}.
78b0: 0a 43 6f 64 65 20 7b 0a 36 20 20 20 20 20 43 6f  .Code {.6     Co
78c0: 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20  lumn        0   
78d0: 20 20 20 31 0a 37 20 20 20 20 20 49 6e 74 65 67     1.7     Integ
78e0: 65 72 20 20 20 20 20 20 20 35 30 20 20 20 20 20  er       50     
78f0: 30 20 20 20 20 20 20 35 30 0a 38 20 20 20 20 20  0      50.8     
7900: 47 65 20 20 20 20 20 20 20 20 20 20 20 20 31 20  Ge            1 
7910: 20 20 20 20 20 31 31 0a 7d 0a 70 75 74 73 20 7b       11.}.puts {
7920: 0a 3c 70 3e 54 68 65 20 57 48 45 52 45 20 63 6c  .<p>The WHERE cl
7930: 61 75 73 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e  ause is implemen
7940: 74 65 64 20 62 79 20 69 6e 73 74 72 75 63 74 69  ted by instructi
7950: 6f 6e 73 20 36 20 74 68 72 6f 75 67 68 20 38 2e  ons 6 through 8.
7960: 0a 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 65 20  .The job of the 
7970: 77 68 65 72 65 20 63 6c 61 75 73 65 20 69 73 20  where clause is 
7980: 74 6f 20 73 6b 69 70 20 74 68 65 20 4c 69 73 74  to skip the List
7990: 57 72 69 74 65 20 69 66 20 74 68 65 20 57 48 45  Write if the WHE
79a0: 52 45 0a 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  RE.condition is 
79b0: 66 61 6c 73 65 2e 20 20 54 6f 20 74 68 69 73 20  false.  To this 
79c0: 65 6e 64 2c 20 69 74 20 6a 75 6d 70 73 20 61 68  end, it jumps ah
79d0: 65 61 64 20 74 6f 20 74 68 65 20 4e 65 78 74 20  ead to the Next 
79e0: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 69 66 20 74  instruction.if t
79f0: 68 65 20 22 74 77 6f 22 20 63 6f 6c 75 6d 6e 20  he "two" column 
7a00: 28 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68  (extracted by th
7a10: 65 20 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63  e Column instruc
7a20: 74 69 6f 6e 29 20 69 73 0a 67 72 65 61 74 65 72  tion) is.greater
7a30: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
7a40: 6f 20 35 30 2e 3c 2f 70 3e 0a 0a 3c 70 3e 41 73  o 50.</p>..<p>As
7a50: 20 62 65 66 6f 72 65 2c 20 74 68 65 20 43 6f 6c   before, the Col
7a60: 75 6d 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  umn instruction 
7a70: 75 73 65 73 20 63 75 72 73 6f 72 20 50 31 20 61  uses cursor P1 a
7a80: 6e 64 20 70 75 73 68 65 73 20 74 68 65 20 64 61  nd pushes the da
7a90: 74 61 20 0a 72 65 63 6f 72 64 20 69 6e 20 63 6f  ta .record in co
7aa0: 6c 75 6d 6e 20 50 32 20 28 31 2c 20 63 6f 6c 75  lumn P2 (1, colu
7ab0: 6d 6e 20 22 74 77 6f 22 29 20 6f 6e 74 6f 20 74  mn "two") onto t
7ac0: 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 49  he stack.  The I
7ad0: 6e 74 65 67 65 72 20 0a 69 6e 73 74 72 75 63 74  nteger .instruct
7ae0: 69 6f 6e 20 70 75 73 68 65 73 20 74 68 65 20 76  ion pushes the v
7af0: 61 6c 75 65 20 35 30 20 6f 6e 74 6f 20 74 68 65  alue 50 onto the
7b00: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
7b10: 6b 2e 20 20 41 66 74 65 72 20 74 68 65 73 65 20  k.  After these 
7b20: 0a 74 77 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  .two instruction
7b30: 73 20 74 68 65 20 73 74 61 63 6b 20 6c 6f 6f 6b  s the stack look
7b40: 73 20 6c 69 6b 65 3a 3c 2f 70 3e 0a 7d 0a 73 74  s like:</p>.}.st
7b50: 61 63 6b 20 7b 28 69 6e 74 65 67 65 72 29 20 35  ack {(integer) 5
7b60: 30 7d 20 5c 0a 20 20 7b 28 72 65 63 6f 72 64 29  0} \.  {(record)
7b70: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
7b80: 66 6f 72 20 63 6f 6c 75 6d 6e 20 22 74 77 6f 22  for column "two"
7b90: 20 7d 0a 0a 70 75 74 73 20 7b 0a 3c 70 3e 54 68   }..puts {.<p>Th
7ba0: 65 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64  e <a href="opcod
7bb0: 65 2e 68 74 6d 6c 23 47 65 22 3e 47 65 3c 2f 61  e.html#Ge">Ge</a
7bc0: 3e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  > operator compa
7bd0: 72 65 73 20 74 68 65 20 74 6f 70 20 74 77 6f 20  res the top two 
7be0: 0a 65 6c 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  .elements on the
7bf0: 20 73 74 61 63 6b 2c 20 70 6f 70 73 20 74 68 65   stack, pops the
7c00: 6d 2c 20 61 6e 64 20 74 68 65 6e 20 62 72 61 6e  m, and then bran
7c10: 63 68 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ches based on th
7c20: 65 20 72 65 73 75 6c 74 20 0a 6f 66 20 74 68 65  e result .of the
7c30: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66   comparison.  If
7c40: 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
7c50: 65 6e 74 20 69 73 20 3e 3d 20 74 68 65 20 74 6f  ent is >= the to
7c60: 70 20 65 6c 65 6d 65 6e 74 2c 20 74 68 65 6e 20  p element, then 
7c70: 0a 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73  .jump to address
7c80: 20 50 32 20 28 74 68 65 20 4e 65 78 74 20 69 6e   P2 (the Next in
7c90: 73 74 72 75 63 74 69 6f 6e 20 61 74 20 74 68 65  struction at the
7ca0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
7cb0: 29 2e 20 20 0a 42 65 63 61 75 73 65 20 50 31 20  ).  .Because P1 
7cc0: 69 73 20 74 72 75 65 2c 20 69 66 20 65 69 74 68  is true, if eith
7cd0: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
7ce0: 4c 4c 20 28 61 6e 64 20 74 68 75 73 20 74 68 65  LL (and thus the
7cf0: 20 72 65 73 75 6c 74 20 69 73 20 0a 4e 55 4c 4c   result is .NULL
7d00: 29 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20  ) then take the 
7d10: 6a 75 6d 70 2e 20 20 49 66 20 77 65 20 64 6f 6e  jump.  If we don
7d20: 27 74 20 6a 75 6d 70 2c 20 6a 75 73 74 20 61 64  't jump, just ad
7d30: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
7d40: 74 20 0a 69 6e 73 74 72 75 63 74 69 6f 6e 2e 3c  t .instruction.<
7d50: 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 39 20  /p>.}..Code {.9 
7d60: 20 20 20 20 52 65 63 6e 6f 20 20 20 20 20 20 20      Recno       
7d70: 20 20 30 20 20 20 20 20 20 30 0a 31 30 20 20 20    0      0.10   
7d80: 20 4c 69 73 74 57 72 69 74 65 20 20 20 20 20 30   ListWrite     0
7d90: 20 20 20 20 20 20 30 0a 7d 0a 70 75 74 73 20 7b        0.}.puts {
7da0: 0a 3c 70 3e 54 68 65 20 3c 61 20 68 72 65 66 3d  .<p>The <a href=
7db0: 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 52 65 63  "opcode.html#Rec
7dc0: 6e 6f 22 3e 52 65 63 6e 6f 3c 2f 61 3e 20 69 6e  no">Recno</a> in
7dd0: 73 74 72 75 63 74 69 6f 6e 20 70 75 73 68 65 73  struction pushes
7de0: 20 6f 6e 74 6f 20 74 68 65 20 0a 73 74 61 63 6b   onto the .stack
7df0: 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
7e00: 68 20 69 73 20 74 68 65 20 66 69 72 73 74 20 34  h is the first 4
7e10: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 74 68   bytes of the th
7e20: 65 20 6b 65 79 20 74 6f 20 74 68 65 20 63 75 72  e key to the cur
7e30: 72 65 6e 74 20 0a 65 6e 74 72 79 20 69 6e 20 61  rent .entry in a
7e40: 20 73 65 71 75 65 6e 74 69 61 6c 20 73 63 61 6e   sequential scan
7e50: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 70 6f   of the table po
7e60: 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72 73  inted to by curs
7e70: 6f 72 20 50 31 2e 0a 54 68 65 20 3c 61 20 68 72  or P1..The <a hr
7e80: 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23  ef="opcode.html#
7e90: 4c 69 73 74 57 72 69 74 65 22 3e 4c 69 73 74 57  ListWrite">ListW
7ea0: 72 69 74 65 3c 2f 61 3e 20 69 6e 73 74 72 75 63  rite</a> instruc
7eb0: 74 69 6f 6e 20 77 72 69 74 65 73 20 74 68 65 20  tion writes the 
7ec0: 0a 69 6e 74 65 67 65 72 20 6f 6e 20 74 68 65 20  .integer on the 
7ed0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
7ee0: 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72   into a temporar
7ef0: 79 20 73 74 6f 72 61 67 65 20 6c 69 73 74 20 61  y storage list a
7f00: 6e 64 20 70 6f 70 73 20 0a 74 68 65 20 74 6f 70  nd pops .the top
7f10: 20 65 6c 65 6d 65 6e 74 2e 20 20 54 68 69 73 20   element.  This 
7f20: 69 73 20 74 68 65 20 69 6d 70 6f 72 74 61 6e 74  is the important
7f30: 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 6c 6f   work of this lo
7f40: 6f 70 2c 20 74 6f 20 73 74 6f 72 65 20 74 68 65  op, to store the
7f50: 20 0a 6b 65 79 73 20 6f 66 20 74 68 65 20 72 65   .keys of the re
7f60: 63 6f 72 64 73 20 74 6f 20 62 65 20 64 65 6c 65  cords to be dele
7f70: 74 65 64 20 73 6f 20 77 65 20 63 61 6e 20 64 65  ted so we can de
7f80: 6c 65 74 65 20 74 68 65 6d 20 69 6e 20 74 68 65  lete them in the
7f90: 20 73 65 63 6f 6e 64 20 0a 6c 6f 6f 70 2e 20 20   second .loop.  
7fa0: 41 66 74 65 72 20 74 68 69 73 20 4c 69 73 74 57  After this ListW
7fb0: 72 69 74 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  rite instruction
7fc0: 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 65 6d   the stack is em
7fd0: 70 74 79 20 61 67 61 69 6e 2e 3c 2f 70 3e 0a 7d  pty again.</p>.}
7fe0: 0a 0a 43 6f 64 65 20 7b 0a 31 31 20 20 20 20 4e  ..Code {.11    N
7ff0: 65 78 74 20 20 20 20 20 20 20 20 20 20 30 20 20  ext          0  
8000: 20 20 20 20 36 0a 31 32 20 20 20 20 43 6c 6f 73      6.12    Clos
8010: 65 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20  e         0     
8020: 20 30 0a 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e 20   0.}.puts {.<p> 
8030: 54 68 65 20 4e 65 78 74 20 69 6e 73 74 72 75 63  The Next instruc
8040: 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20  tion increments 
8050: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
8060: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  int to the next 
8070: 0a 65 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  .element in the 
8080: 74 61 62 6c 65 20 70 6f 69 6e 74 65 64 20 74 6f  table pointed to
8090: 20 62 79 20 63 75 72 73 6f 72 20 50 30 2c 20 61   by cursor P0, a
80a0: 6e 64 20 69 66 20 69 74 20 77 61 73 20 73 75 63  nd if it was suc
80b0: 63 65 73 73 66 75 6c 20 0a 62 72 61 6e 63 68 65  cessful .branche
80c0: 73 20 74 6f 20 50 32 20 28 36 2c 20 74 68 65 20  s to P2 (6, the 
80d0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
80e0: 20 6c 6f 6f 70 20 62 6f 64 79 29 2e 20 20 54 68   loop body).  Th
80f0: 65 20 43 6c 6f 73 65 20 0a 69 6e 73 74 72 75 63  e Close .instruc
8100: 74 69 6f 6e 20 63 6c 6f 73 65 73 20 63 75 72 73  tion closes curs
8110: 6f 72 20 50 31 2e 20 20 49 74 20 64 6f 65 73 6e  or P1.  It doesn
8120: 27 74 20 61 66 66 65 63 74 20 74 68 65 20 74 65  't affect the te
8130: 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
8140: 0a 6c 69 73 74 20 62 65 63 61 75 73 65 20 69 74  .list because it
8150: 20 69 73 6e 27 74 20 61 73 73 6f 63 69 61 74 65   isn't associate
8160: 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 50 31  d with cursor P1
8170: 3b 20 69 74 20 69 73 20 69 6e 73 74 65 61 64 20  ; it is instead 
8180: 61 20 67 6c 6f 62 61 6c 20 0a 77 6f 72 6b 69 6e  a global .workin
8190: 67 20 6c 69 73 74 20 28 77 68 69 63 68 20 63 61  g list (which ca
81a0: 6e 20 62 65 20 73 61 76 65 64 20 77 69 74 68 20  n be saved with 
81b0: 4c 69 73 74 50 75 73 68 29 2e 3c 2f 70 3e 0a 7d  ListPush).</p>.}
81c0: 0a 0a 43 6f 64 65 20 7b 0a 31 33 20 20 20 20 4c  ..Code {.13    L
81d0: 69 73 74 52 65 77 69 6e 64 20 20 20 20 30 20 20  istRewind    0  
81e0: 20 20 20 20 30 0a 7d 0a 70 75 74 73 20 7b 0a 3c      0.}.puts {.<
81f0: 70 3e 20 54 68 65 20 3c 61 20 68 72 65 66 3d 22  p> The <a href="
8200: 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 4c 69 73 74  opcode.html#List
8210: 52 65 77 69 6e 64 22 3e 4c 69 73 74 52 65 77 69  Rewind">ListRewi
8220: 6e 64 3c 2f 61 3e 20 69 6e 73 74 72 75 63 74 69  nd</a> instructi
8230: 6f 6e 20 0a 72 65 77 69 6e 64 73 20 74 68 65 20  on .rewinds the 
8240: 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
8250: 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 62 65  e list to the be
8260: 67 69 6e 6e 69 6e 67 2e 20 20 54 68 69 73 20 70  ginning.  This p
8270: 72 65 70 61 72 65 73 20 69 74 20 0a 66 6f 72 20  repares it .for 
8280: 75 73 65 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  use in the secon
8290: 64 20 6c 6f 6f 70 2e 3c 2f 70 3e 0a 7d 0a 0a 43  d loop.</p>.}..C
82a0: 6f 64 65 20 7b 0a 31 34 20 20 20 20 49 6e 74 65  ode {.14    Inte
82b0: 67 65 72 20 20 20 20 20 20 20 30 20 20 20 20 20  ger       0     
82c0: 20 30 0a 31 35 20 20 20 20 4f 70 65 6e 57 72 69   0.15    OpenWri
82d0: 74 65 20 20 20 20 20 30 20 20 20 20 20 20 33 0a  te     0      3.
82e0: 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e 20 41 73 20  }.puts {.<p> As 
82f0: 69 6e 20 74 68 65 20 49 4e 53 45 52 54 20 65 78  in the INSERT ex
8300: 61 6d 70 6c 65 2c 20 77 65 20 70 75 73 68 20 74  ample, we push t
8310: 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  he database numb
8320: 65 72 20 50 31 20 28 30 2c 20 74 68 65 20 6d 61  er P1 (0, the ma
8330: 69 6e 20 0a 64 61 74 61 62 61 73 65 29 20 6f 6e  in .database) on
8340: 74 6f 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64  to the stack and
8350: 20 75 73 65 20 4f 70 65 6e 57 72 69 74 65 20 74   use OpenWrite t
8360: 6f 20 6f 70 65 6e 20 74 68 65 20 63 75 72 73 6f  o open the curso
8370: 72 20 50 31 20 6f 6e 20 74 61 62 6c 65 20 0a 50  r P1 on table .P
8380: 32 20 28 62 61 73 65 20 70 61 67 65 20 33 2c 20  2 (base page 3, 
8390: 22 65 78 61 6d 70 22 29 20 66 6f 72 20 6d 6f 64  "examp") for mod
83a0: 69 66 69 63 61 74 69 6f 6e 2e 3c 2f 70 3e 0a 7d  ification.</p>.}
83b0: 0a 0a 43 6f 64 65 20 7b 0a 31 36 20 20 20 20 4c  ..Code {.16    L
83c0: 69 73 74 52 65 61 64 20 20 20 20 20 20 30 20 20  istRead      0  
83d0: 20 20 20 20 32 30 0a 31 37 20 20 20 20 4e 6f 74      20.17    Not
83e0: 45 78 69 73 74 73 20 20 20 20 20 30 20 20 20 20  Exists     0    
83f0: 20 20 31 39 0a 31 38 20 20 20 20 44 65 6c 65 74    19.18    Delet
8400: 65 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20  e        0      
8410: 31 0a 31 39 20 20 20 20 47 6f 74 6f 20 20 20 20  1.19    Goto    
8420: 20 20 20 20 20 20 30 20 20 20 20 20 20 31 36 0a        0      16.
8430: 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e 54 68 69 73  }.puts {.<p>This
8440: 20 6c 6f 6f 70 20 64 6f 65 73 20 74 68 65 20 61   loop does the a
8450: 63 74 75 61 6c 20 64 65 6c 65 74 69 6e 67 2e 20  ctual deleting. 
8460: 20 49 74 20 69 73 20 6f 72 67 61 6e 69 7a 65 64   It is organized
8470: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
8480: 6d 20 0a 74 68 65 20 6f 6e 65 20 69 6e 20 74 68  m .the one in th
8490: 65 20 55 50 44 41 54 45 20 65 78 61 6d 70 6c 65  e UPDATE example
84a0: 2e 20 20 54 68 65 20 4c 69 73 74 52 65 61 64 20  .  The ListRead 
84b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 70 6c 61 79  instruction play
84c0: 73 20 74 68 65 20 72 6f 6c 65 20 0a 74 68 61 74  s the role .that
84d0: 20 74 68 65 20 4e 65 78 74 20 64 69 64 20 69 6e   the Next did in
84e0: 20 74 68 65 20 49 4e 53 45 52 54 20 6c 6f 6f 70   the INSERT loop
84f0: 2c 20 62 75 74 20 62 65 63 61 75 73 65 20 69 74  , but because it
8500: 20 6a 75 6d 70 73 20 74 6f 20 50 32 20 6f 6e 20   jumps to P2 on 
8510: 0a 66 61 69 6c 75 72 65 2c 20 61 6e 64 20 4e 65  .failure, and Ne
8520: 78 74 20 6a 75 6d 70 73 20 6f 6e 20 73 75 63 63  xt jumps on succ
8530: 65 73 73 2c 20 77 65 20 70 75 74 20 69 74 20 61  ess, we put it a
8540: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
8550: 68 65 20 6c 6f 6f 70 20 0a 69 6e 73 74 65 61 64  he loop .instead
8560: 20 6f 66 20 74 68 65 20 65 6e 64 2e 20 20 54 68   of the end.  Th
8570: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
8580: 20 68 61 76 65 20 74 6f 20 70 75 74 20 61 20 47   have to put a G
8590: 6f 74 6f 20 61 74 20 74 68 65 20 65 6e 64 20 6f  oto at the end o
85a0: 66 20 0a 74 68 65 20 6c 6f 6f 70 20 74 6f 20 6a  f .the loop to j
85b0: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
85c0: 74 68 65 20 6c 6f 6f 70 20 74 65 73 74 20 61 74  the loop test at
85d0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20   the beginning. 
85e0: 20 53 6f 20 74 68 69 73 20 0a 6c 6f 6f 70 20 68   So this .loop h
85f0: 61 73 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  as the form of a
8600: 20 43 20 77 68 69 6c 65 28 29 7b 2e 2e 2e 7d 20   C while(){...} 
8610: 6c 6f 6f 70 2c 20 77 68 69 6c 65 20 74 68 65 20  loop, while the 
8620: 6c 6f 6f 70 20 69 6e 20 74 68 65 20 49 4e 53 45  loop in the INSE
8630: 52 54 20 0a 65 78 61 6d 70 6c 65 20 68 61 64 20  RT .example had 
8640: 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 20 64 6f  the form of a do
8650: 7b 2e 2e 2e 7d 77 68 69 6c 65 28 29 20 6c 6f 6f  {...}while() loo
8660: 70 2e 20 20 54 68 65 20 44 65 6c 65 74 65 20 69  p.  The Delete i
8670: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 66 69 6c 6c  nstruction .fill
8680: 73 20 74 68 65 20 72 6f 6c 65 20 74 68 61 74 20  s the role that 
8690: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
86a0: 63 74 69 6f 6e 20 64 69 64 20 69 6e 20 74 68 65  ction did in the
86b0: 20 70 72 65 63 65 64 69 6e 67 20 65 78 61 6d 70   preceding examp
86c0: 6c 65 73 2e 0a 3c 2f 70 3e 0a 3c 70 3e 54 68 65  les..</p>.<p>The
86d0: 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65   <a href="opcode
86e0: 2e 68 74 6d 6c 23 4c 69 73 74 52 65 61 64 22 3e  .html#ListRead">
86f0: 4c 69 73 74 52 65 61 64 3c 2f 61 3e 20 69 6e 73  ListRead</a> ins
8700: 74 72 75 63 74 69 6f 6e 20 72 65 61 64 73 20 61  truction reads a
8710: 6e 20 0a 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20  n .element from 
8720: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  the temporary st
8730: 6f 72 61 67 65 20 6c 69 73 74 20 61 6e 64 20 70  orage list and p
8740: 75 73 68 65 73 20 69 74 20 6f 6e 74 6f 20 74 68  ushes it onto th
8750: 65 20 73 74 61 63 6b 2e 20 20 0a 49 66 20 74 68  e stack.  .If th
8760: 69 73 20 77 61 73 20 73 75 63 63 65 73 73 66 75  is was successfu
8770: 6c 2c 20 69 74 20 63 6f 6e 74 69 6e 75 65 73 20  l, it continues 
8780: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
8790: 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 69  ruction.  If thi
87a0: 73 20 0a 66 61 69 6c 73 20 62 65 63 61 75 73 65  s .fails because
87b0: 20 74 68 65 20 6c 69 73 74 20 69 73 20 65 6d 70   the list is emp
87c0: 74 79 2c 20 69 74 20 62 72 61 6e 63 68 65 73 20  ty, it branches 
87d0: 74 6f 20 50 32 2c 20 77 68 69 63 68 20 69 73 20  to P2, which is 
87e0: 74 68 65 20 0a 69 6e 73 74 72 75 63 74 69 6f 6e  the .instruction
87f0: 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20   just after the 
8800: 6c 6f 6f 70 2e 20 20 41 66 74 65 72 77 61 72 64  loop.  Afterward
8810: 73 20 74 68 65 20 73 74 61 63 6b 20 6c 6f 6f 6b  s the stack look
8820: 73 20 6c 69 6b 65 3a 3c 2f 70 3e 0a 7d 0a 73 74  s like:</p>.}.st
8830: 61 63 6b 20 7b 28 69 6e 74 65 67 65 72 29 20 6b  ack {(integer) k
8840: 65 79 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72  ey for current r
8850: 65 63 6f 72 64 7d 0a 0a 70 75 74 73 20 7b 0a 3c  ecord}..puts {.<
8860: 70 3e 4e 6f 74 69 63 65 20 74 68 65 20 73 69 6d  p>Notice the sim
8870: 69 6c 61 72 69 74 79 20 62 65 74 77 65 65 6e 20  ilarity between 
8880: 74 68 65 20 4c 69 73 74 52 65 61 64 20 61 6e 64  the ListRead and
8890: 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   Next instructio
88a0: 6e 73 2e 20 20 0a 42 6f 74 68 20 6f 70 65 72 61  ns.  .Both opera
88b0: 74 69 6f 6e 73 20 77 6f 72 6b 20 61 63 63 6f 72  tions work accor
88c0: 64 69 6e 67 20 74 6f 20 74 68 69 73 20 72 75 6c  ding to this rul
88d0: 65 3a 0a 3c 2f 70 3e 0a 3c 62 6c 6f 63 6b 71 75  e:.</p>.<blockqu
88e0: 6f 74 65 3e 0a 50 75 73 68 20 74 68 65 20 6e 65  ote>.Push the ne
88f0: 78 74 20 22 74 68 69 6e 67 22 20 6f 6e 74 6f 20  xt "thing" onto 
8900: 74 68 65 20 73 74 61 63 6b 20 61 6e 64 20 66 61  the stack and fa
8910: 6c 6c 20 74 68 72 6f 75 67 68 20 4f 52 20 6a 75  ll through OR ju
8920: 6d 70 20 74 6f 20 50 32 2c 20 0a 64 65 70 65 6e  mp to P2, .depen
8930: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
8940: 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 69 73 20  or not there is 
8950: 61 20 6e 65 78 74 20 22 74 68 69 6e 67 22 20 74  a next "thing" t
8960: 6f 20 70 75 73 68 2e 0a 3c 2f 62 6c 6f 63 6b 71  o push..</blockq
8970: 75 6f 74 65 3e 0a 3c 70 3e 4f 6e 65 20 64 69 66  uote>.<p>One dif
8980: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
8990: 4e 65 78 74 20 61 6e 64 20 4c 69 73 74 52 65 61  Next and ListRea
89a0: 64 20 69 73 20 74 68 65 69 72 20 69 64 65 61 20  d is their idea 
89b0: 6f 66 20 61 20 22 74 68 69 6e 67 22 2e 20 20 0a  of a "thing".  .
89c0: 54 68 65 20 22 74 68 69 6e 67 73 22 20 66 6f 72  The "things" for
89d0: 20 74 68 65 20 4e 65 78 74 20 69 6e 73 74 72 75   the Next instru
89e0: 63 74 69 6f 6e 20 61 72 65 20 72 65 63 6f 72 64  ction are record
89f0: 73 20 69 6e 20 61 20 64 61 74 61 62 61 73 65 20  s in a database 
8a00: 66 69 6c 65 2e 20 20 0a 22 54 68 69 6e 67 73 22  file.  ."Things"
8a10: 20 66 6f 72 20 4c 69 73 74 52 65 61 64 20 61 72   for ListRead ar
8a20: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 69  e integer keys i
8a30: 6e 20 61 20 6c 69 73 74 2e 20 20 41 6e 6f 74 68  n a list.  Anoth
8a40: 65 72 20 64 69 66 66 65 72 65 6e 63 65 20 0a 69  er difference .i
8a50: 73 20 77 68 65 74 68 65 72 20 74 6f 20 6a 75 6d  s whether to jum
8a60: 70 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  p or fall throug
8a70: 68 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  h if there is no
8a80: 20 6e 65 78 74 20 22 74 68 69 6e 67 22 2e 20 20   next "thing".  
8a90: 49 6e 20 74 68 69 73 20 0a 63 61 73 65 2c 20 4e  In this .case, N
8aa0: 65 78 74 20 66 61 6c 6c 73 20 74 68 72 6f 75 67  ext falls throug
8ab0: 68 2c 20 61 6e 64 20 4c 69 73 74 52 65 61 64 20  h, and ListRead 
8ac0: 6a 75 6d 70 73 2e 20 4c 61 74 65 72 20 6f 6e 2c  jumps. Later on,
8ad0: 20 77 65 20 77 69 6c 6c 20 73 65 65 20 0a 6f 74   we will see .ot
8ae0: 68 65 72 20 6c 6f 6f 70 69 6e 67 20 69 6e 73 74  her looping inst
8af0: 72 75 63 74 69 6f 6e 73 20 28 4e 65 78 74 49 64  ructions (NextId
8b00: 78 20 61 6e 64 20 53 6f 72 74 4e 65 78 74 29 20  x and SortNext) 
8b10: 74 68 61 74 20 6f 70 65 72 61 74 65 20 75 73 69  that operate usi
8b20: 6e 67 20 74 68 65 20 0a 73 61 6d 65 20 70 72 69  ng the .same pri
8b30: 6e 63 69 70 6c 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e  nciple.</p>..<p>
8b40: 54 68 65 20 3c 61 20 68 72 65 66 3d 22 6f 70 63  The <a href="opc
8b50: 6f 64 65 2e 68 74 6d 6c 23 4e 6f 74 45 78 69 73  ode.html#NotExis
8b60: 74 73 22 3e 4e 6f 74 45 78 69 73 74 73 3c 2f 61  ts">NotExists</a
8b70: 3e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 70 6f  > instruction po
8b80: 70 73 20 0a 74 68 65 20 74 6f 70 20 73 74 61 63  ps .the top stac
8b90: 6b 20 65 6c 65 6d 65 6e 74 20 61 6e 64 20 75 73  k element and us
8ba0: 65 73 20 69 74 20 61 73 20 61 6e 20 69 6e 74 65  es it as an inte
8bb0: 67 65 72 20 6b 65 79 2e 20 20 49 66 20 61 20 72  ger key.  If a r
8bc0: 65 63 6f 72 64 20 77 69 74 68 20 0a 74 68 61 74  ecord with .that
8bd0: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 65 78   key does not ex
8be0: 69 73 74 20 69 6e 20 74 61 62 6c 65 20 50 31 2c  ist in table P1,
8bf0: 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
8c00: 2e 20 20 49 66 20 61 20 72 65 63 6f 72 64 20 64  .  If a record d
8c10: 6f 65 73 20 0a 65 78 69 73 74 2c 20 74 68 65 6e  oes .exist, then
8c20: 20 66 61 6c 6c 20 74 68 72 75 20 74 6f 20 74 68   fall thru to th
8c30: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
8c40: 6f 6e 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73  on.  In this cas
8c50: 65 20 50 32 20 74 61 6b 65 73 20 0a 75 73 20 74  e P2 takes .us t
8c60: 6f 20 74 68 65 20 47 6f 74 6f 20 61 74 20 74 68  o the Goto at th
8c70: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
8c80: 70 2c 20 77 68 69 63 68 20 6a 75 6d 70 73 20 62  p, which jumps b
8c90: 61 63 6b 20 74 6f 20 74 68 65 20 4c 69 73 74 52  ack to the ListR
8ca0: 65 61 64 20 0a 61 74 20 74 68 65 20 62 65 67 69  ead .at the begi
8cb0: 6e 6e 69 6e 67 2e 20 20 54 68 69 73 20 63 6f 75  nning.  This cou
8cc0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 63 6f 64  ld have been cod
8cd0: 65 64 20 74 6f 20 68 61 76 65 20 50 32 20 62 65  ed to have P2 be
8ce0: 20 31 36 2c 20 74 68 65 20 0a 4c 69 73 74 52 65   16, the .ListRe
8cf0: 61 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ad at the start 
8d00: 6f 66 20 74 68 65 20 6c 6f 6f 70 2c 20 62 75 74  of the loop, but
8d10: 20 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73   the SQLite pars
8d20: 65 72 20 77 68 69 63 68 20 67 65 6e 65 72 61 74  er which generat
8d30: 65 64 20 0a 74 68 69 73 20 63 6f 64 65 20 64 69  ed .this code di
8d40: 64 6e 27 74 20 6d 61 6b 65 20 74 68 61 74 20 6f  dn't make that o
8d50: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 3c 2f 70 3e  ptimization.</p>
8d60: 0a 3c 70 3e 54 68 65 20 3c 61 20 68 72 65 66 3d  .<p>The <a href=
8d70: 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 44 65 6c  "opcode.html#Del
8d80: 65 74 65 22 3e 44 65 6c 65 74 65 3c 2f 61 3e 20  ete">Delete</a> 
8d90: 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
8da0: 20 74 68 69 73 20 0a 6c 6f 6f 70 3b 20 69 74 20   this .loop; it 
8db0: 70 6f 70 73 20 61 6e 20 69 6e 74 65 67 65 72 20  pops an integer 
8dc0: 6b 65 79 20 6f 66 66 20 74 68 65 20 73 74 61 63  key off the stac
8dd0: 6b 20 28 70 6c 61 63 65 64 20 74 68 65 72 65 20  k (placed there 
8de0: 62 79 20 74 68 65 20 0a 70 72 65 63 65 64 69 6e  by the .precedin
8df0: 67 20 4c 69 73 74 52 65 61 64 29 20 61 6e 64 20  g ListRead) and 
8e00: 64 65 6c 65 74 65 73 20 74 68 65 20 72 65 63 6f  deletes the reco
8e10: 72 64 20 6f 66 20 63 75 72 73 6f 72 20 50 31 20  rd of cursor P1 
8e20: 74 68 61 74 20 68 61 73 20 74 68 61 74 20 6b 65  that has that ke
8e30: 79 2e 20 20 0a 42 65 63 61 75 73 65 20 50 32 20  y.  .Because P2 
8e40: 69 73 20 74 72 75 65 2c 20 74 68 65 20 72 6f 77  is true, the row
8e50: 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
8e60: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 3c  is incremented.<
8e70: 2f 70 3e 0a 3c 70 3e 54 68 65 20 3c 61 20 68 72  /p>.<p>The <a hr
8e80: 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23  ef="opcode.html#
8e90: 47 6f 74 6f 22 3e 47 6f 74 6f 3c 2f 61 3e 20 6a  Goto">Goto</a> j
8ea0: 75 6d 70 73 20 62 61 63 6b 20 74 6f 20 74 68 65  umps back to the
8eb0: 20 62 65 67 69 6e 6e 69 6e 67 20 0a 6f 66 20 74   beginning .of t
8ec0: 68 65 20 6c 6f 6f 70 2e 20 20 54 68 69 73 20 69  he loop.  This i
8ed0: 73 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  s the end of the
8ee0: 20 6c 6f 6f 70 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f   loop.</p>.}..Co
8ef0: 64 65 20 7b 0a 32 30 20 20 20 20 4c 69 73 74 52  de {.20    ListR
8f00: 65 73 65 74 20 20 20 20 20 30 20 20 20 20 20 20  eset     0      
8f10: 30 0a 32 31 20 20 20 20 43 6c 6f 73 65 20 20 20  0.21    Close   
8f20: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 0a 32        0      0.2
8f30: 32 20 20 20 20 43 6f 6d 6d 69 74 20 20 20 20 20  2    Commit     
8f40: 20 20 20 30 20 20 20 20 20 20 30 0a 32 33 20 20     0      0.23  
8f50: 20 20 48 61 6c 74 20 20 20 20 20 20 20 20 20 20    Halt          
8f60: 30 20 20 20 20 20 20 30 0a 7d 0a 70 75 74 73 20  0      0.}.puts 
8f70: 7b 0a 3c 70 3e 54 68 69 73 20 62 6c 6f 63 6b 20  {.<p>This block 
8f80: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  of instruction c
8f90: 6c 65 61 6e 73 20 75 70 20 74 68 65 20 56 44 42  leans up the VDB
8fa0: 45 20 70 72 6f 67 72 61 6d 2e 20 54 68 72 65 65  E program. Three
8fb0: 20 6f 66 20 74 68 65 73 65 20 0a 69 6e 73 74 72   of these .instr
8fc0: 75 63 74 69 6f 6e 73 20 61 72 65 6e 27 74 20 72  uctions aren't r
8fd0: 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2c 20  eally required, 
8fe0: 62 75 74 20 61 72 65 20 67 65 6e 65 72 61 74 65  but are generate
8ff0: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
9000: 0a 70 61 72 73 65 72 20 66 72 6f 6d 20 69 74 73  .parser from its
9010: 20 63 6f 64 65 20 74 65 6d 70 6c 61 74 65 73 2c   code templates,
9020: 20 77 68 69 63 68 20 61 72 65 20 64 65 73 69 67   which are desig
9030: 6e 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f  ned to handle mo
9040: 72 65 20 0a 63 6f 6d 70 6c 69 63 61 74 65 64 20  re .complicated 
9050: 63 61 73 65 73 2e 3c 2f 70 3e 0a 3c 70 3e 54 68  cases.</p>.<p>Th
9060: 65 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64  e <a href="opcod
9070: 65 2e 68 74 6d 6c 23 4c 69 73 74 52 65 73 65 74  e.html#ListReset
9080: 22 3e 4c 69 73 74 52 65 73 65 74 3c 2f 61 3e 20  ">ListReset</a> 
9090: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6d 70 74  instruction empt
90a0: 69 65 73 20 0a 74 68 65 20 74 65 6d 70 6f 72 61  ies .the tempora
90b0: 72 79 20 73 74 6f 72 61 67 65 20 6c 69 73 74 2e  ry storage list.
90c0: 20 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 65    This list is e
90d0: 6d 70 74 69 65 64 20 61 75 74 6f 6d 61 74 69 63  mptied automatic
90e0: 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 20 0a 56  ally when the .V
90f0: 44 42 45 20 70 72 6f 67 72 61 6d 20 74 65 72 6d  DBE program term
9100: 69 6e 61 74 65 73 2c 20 73 6f 20 69 74 20 69 73  inates, so it is
9110: 6e 27 74 20 6e 65 63 65 73 73 61 72 79 20 69 6e  n't necessary in
9120: 20 74 68 69 73 20 63 61 73 65 2e 20 20 54 68 65   this case.  The
9130: 20 43 6c 6f 73 65 20 0a 69 6e 73 74 72 75 63 74   Close .instruct
9140: 69 6f 6e 20 63 6c 6f 73 65 73 20 74 68 65 20 63  ion closes the c
9150: 75 72 73 6f 72 20 50 31 2e 20 20 41 67 61 69 6e  ursor P1.  Again
9160: 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  , this is done b
9170: 79 20 74 68 65 20 56 44 42 45 20 0a 65 6e 67 69  y the VDBE .engi
9180: 6e 65 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  ne when it is fi
9190: 6e 69 73 68 65 64 20 72 75 6e 6e 69 6e 67 20 74  nished running t
91a0: 68 69 73 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  his program.  Th
91b0: 65 20 43 6f 6d 6d 69 74 20 65 6e 64 73 20 74 68  e Commit ends th
91c0: 65 20 0a 63 75 72 72 65 6e 74 20 74 72 61 6e 73  e .current trans
91d0: 61 63 74 69 6f 6e 20 73 75 63 63 65 73 73 66 75  action successfu
91e0: 6c 6c 79 2c 20 61 6e 64 20 63 61 75 73 65 73 20  lly, and causes 
91f0: 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 68 61 74  all changes that
9200: 20 6f 63 63 75 72 72 65 64 20 0a 69 6e 20 74 68   occurred .in th
9210: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  is transaction t
9220: 6f 20 62 65 20 73 61 76 65 64 20 74 6f 20 74 68  o be saved to th
9230: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
9240: 20 66 69 6e 61 6c 20 48 61 6c 74 20 69 73 20 61   final Halt is a
9250: 6c 73 6f 20 0a 75 6e 6e 65 63 63 65 73 73 61 72  lso .unneccessar
9260: 79 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 61  y, since it is a
9270: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 56 44  dded to every VD
9280: 42 45 20 70 72 6f 67 72 61 6d 20 77 68 65 6e 20  BE program when 
9290: 69 74 20 69 73 20 0a 70 72 65 70 61 72 65 64 20  it is .prepared 
92a0: 74 6f 20 72 75 6e 2e 3c 2f 70 3e 0a 0a 0a 3c 70  to run.</p>...<p
92b0: 3e 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e  >UPDATE statemen
92c0: 74 73 20 77 6f 72 6b 20 76 65 72 79 20 6d 75 63  ts work very muc
92d0: 68 20 6c 69 6b 65 20 44 45 4c 45 54 45 20 73 74  h like DELETE st
92e0: 61 74 65 6d 65 6e 74 73 20 65 78 63 65 70 74 0a  atements except.
92f0: 74 68 61 74 20 69 6e 73 74 65 61 64 20 6f 66 20  that instead of 
9300: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 72 65 63  deleting the rec
9310: 6f 72 64 20 74 68 65 79 20 72 65 70 6c 61 63 65  ord they replace
9320: 20 69 74 20 77 69 74 68 20 61 20 6e 65 77 20 6f   it with a new o
9330: 6e 65 2e 0a 43 6f 6e 73 69 64 65 72 20 74 68 69  ne..Consider thi
9340: 73 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f 70 3e 0a  s example:.</p>.
9350: 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72  .<blockquote><pr
9360: 65 3e 0a 55 50 44 41 54 45 20 65 78 61 6d 70 20  e>.UPDATE examp 
9370: 53 45 54 20 6f 6e 65 3d 20 27 28 27 20 7c 7c 20  SET one= '(' || 
9380: 6f 6e 65 20 7c 7c 20 27 29 27 20 57 48 45 52 45  one || ')' WHERE
9390: 20 74 77 6f 20 3c 20 35 30 3b 0a 3c 2f 70 72 65   two < 50;.</pre
93a0: 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a  ></blockquote>..
93b0: 3c 70 3e 49 6e 73 74 65 61 64 20 6f 66 20 64 65  <p>Instead of de
93c0: 6c 65 74 69 6e 67 20 72 65 63 6f 72 64 73 20 77  leting records w
93d0: 68 65 72 65 20 74 68 65 20 22 74 77 6f 22 20 63  here the "two" c
93e0: 6f 6c 75 6d 6e 20 69 73 20 6c 65 73 73 20 74 68  olumn is less th
93f0: 61 6e 0a 35 30 2c 20 74 68 69 73 20 73 74 61 74  an.50, this stat
9400: 65 6d 65 6e 74 20 6a 75 73 74 20 70 75 74 73 20  ement just puts 
9410: 74 68 65 20 22 6f 6e 65 22 20 63 6f 6c 75 6d 6e  the "one" column
9420: 20 69 6e 20 70 61 72 65 6e 74 68 65 73 65 73 0a   in parentheses.
9430: 54 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  The VDBE program
9440: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
9450: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 6c  is statement fol
9460: 6c 6f 77 73 3a 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64  lows:</p>.}..Cod
9470: 65 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f 64 65  e {.addr  opcode
9480: 20 20 20 20 20 20 20 20 70 31 20 20 20 20 20 70          p1     p
9490: 32 20 20 20 20 20 70 33 20 20 20 20 20 20 20 20  2     p3        
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 2d                .-
94c0: 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
94d0: 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20  -  -----  ----- 
94e0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
94f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9500: 2d 2d 2d 2d 0a 30 20 20 20 20 20 54 72 61 6e 73  ----.0     Trans
9510: 61 63 74 69 6f 6e 20 20 20 31 20 20 20 20 20 20  action   1      
9520: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 20 20 20 20 20 20 20 20 20 20 0a 31 20 20 20 20            .1    
9550: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 20 20 30   Transaction   0
9560: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 0a 32 20 20 20 20 20 56 65 72 69 66 79 43 6f 6f  .2     VerifyCoo
95a0: 6b 69 65 20 20 30 20 20 20 20 20 20 31 37 38 20  kie  0      178 
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95d0: 20 20 20 20 20 20 20 20 20 20 20 0a 33 20 20 20             .3   
95e0: 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20    Integer       
95f0: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 0a 34 20 20 20 20 20 4f 70 65 6e 52 65 61 64   .4     OpenRead
9630: 20 20 20 20 20 20 30 20 20 20 20 20 20 33 20 20        0      3  
9640: 20 20 20 20 65 78 61 6d 70 20 20 20 20 20 20 20      examp       
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 20 20 20 20 20 20 0a 35 20 20 20 20 20 52 65         .5     Re
9670: 77 69 6e 64 20 20 20 20 20 20 20 20 30 20 20 20  wind        0   
9680: 20 20 20 31 32 20 20 20 20 20 20 20 20 20 20 20     12           
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 36 20               .6 
96b0: 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20      Column      
96c0: 20 20 30 20 20 20 20 20 20 31 20 20 20 20 20 20    0      1      
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 20 20 0a 37 20 20 20 20 20 49 6e 74 65 67 65     .7     Intege
9700: 72 20 20 20 20 20 20 20 35 30 20 20 20 20 20 30  r       50     0
9710: 20 20 20 20 20 20 35 30 20 20 20 20 20 20 20 20        50        
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 20 20 20 20 20 20 20 20 20 0a 38 20 20 20 20 20           .8     
9740: 47 65 20 20 20 20 20 20 20 20 20 20 20 20 31 20  Ge            1 
9750: 20 20 20 20 20 31 31 20 20 20 20 20 20 20 20 20       11         
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
9780: 39 20 20 20 20 20 52 65 63 6e 6f 20 20 20 20 20  9     Recno     
9790: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 20 20 20 20 0a 31 30 20 20 20 20 4c 69 73 74       .10    List
97d0: 57 72 69 74 65 20 20 20 20 20 30 20 20 20 20 20  Write     0     
97e0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 20 20 20 20 20 20 20 20 20 0a 31 31 20 20             .11  
9810: 20 20 4e 65 78 74 20 20 20 20 20 20 20 20 20 20    Next          
9820: 30 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  0      6        
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 20 20 0a 31 32 20 20 20 20 43 6c 6f        .12    Clo
9860: 73 65 20 20 20 20 20 20 20 20 20 30 20 20 20 20  se         0    
9870: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 33 20              .13 
98a0: 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20     Integer      
98b0: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98e0: 20 20 0a 31 34 20 20 20 20 4f 70 65 6e 57 72 69    .14    OpenWri
98f0: 74 65 20 20 20 20 20 30 20 20 20 20 20 20 33 20  te     0      3 
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 35               .15
9930: 20 20 20 20 4c 69 73 74 52 65 77 69 6e 64 20 20      ListRewind  
9940: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9970: 20 20 20 0a 31 36 20 20 20 20 4c 69 73 74 52 65     .16    ListRe
9980: 61 64 20 20 20 20 20 20 30 20 20 20 20 20 20 32  ad      0      2
9990: 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
99c0: 37 20 20 20 20 44 75 70 20 20 20 20 20 20 20 20  7    Dup        
99d0: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 20 20 20 0a 31 38 20 20 20 20 4e 6f 74 45 78      .18    NotEx
9a10: 69 73 74 73 20 20 20 20 20 30 20 20 20 20 20 20  ists     0      
9a20: 31 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20  16              
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
9a50: 31 39 20 20 20 20 53 74 72 69 6e 67 20 20 20 20  19    String    
9a60: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
9a70: 20 20 28 20 20 20 20 20 20 20 20 20 20 20 20 20    (             
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 20 20 0a 32 30 20 20 20 20 43 6f 6c 75       .20    Colu
9aa0: 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20 20 20  mn        0     
9ab0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 20 20 20 20 20 20 20 20 20 20 20 0a 32 31 20 20             .21  
9ae0: 20 20 43 6f 6e 63 61 74 20 20 20 20 20 20 20 20    Concat        
9af0: 32 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  2      0        
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b20: 20 0a 32 32 20 20 20 20 53 74 72 69 6e 67 20 20   .22    String  
9b30: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
9b40: 20 20 20 20 29 20 20 20 20 20 20 20 20 20 20 20      )           
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 20 20 20 20 20 20 20 0a 32 33 20 20 20 20 43 6f         .23    Co
9b70: 6e 63 61 74 20 20 20 20 20 20 20 20 32 20 20 20  ncat        2   
9b80: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 34               .24
9bb0: 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20      Column      
9bc0: 20 20 30 20 20 20 20 20 20 31 20 20 20 20 20 20    0      1      
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 20 20 20 0a 32 35 20 20 20 20 4d 61 6b 65 52 65     .25    MakeRe
9c00: 63 6f 72 64 20 20 20 20 32 20 20 20 20 20 20 30  cord    2      0
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c30: 20 20 20 20 20 20 20 20 20 0a 32 36 20 20 20 20           .26    
9c40: 50 75 74 49 6e 74 4b 65 79 20 20 20 20 20 30 20  PutIntKey     0 
9c50: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
9c80: 32 37 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20  27    Goto      
9c90: 20 20 20 20 30 20 20 20 20 20 20 31 36 20 20 20      0      16   
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 20 20 20 20 20 20 20 0a 32 38 20 20 20            .28   
9cd0: 20 4c 69 73 74 52 65 73 65 74 20 20 20 20 20 30   ListReset     0
9ce0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 0a 32 39 20 20 20 20 43 6c 6f 73 65 20 20 20 20  .29    Close    
9d20: 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20       0      0   
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 20 20 20 0a 33 30 20 20 20 20 43 6f 6d        .30    Com
9d60: 6d 69 74 20 20 20 20 20 20 20 20 30 20 20 20 20  mit        0    
9d70: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 0a 33 31 20              .31 
9da0: 20 20 20 48 61 6c 74 20 20 20 20 20 20 20 20 20     Halt         
9db0: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 0a 7d 0a 0a 70 75 74 73 20 7b 0a 3c 70 3e    .}..puts {.<p>
9df0: 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20  This program is 
9e00: 65 73 73 65 6e 74 69 61 6c 6c 79 20 74 68 65 20  essentially the 
9e10: 73 61 6d 65 20 61 73 20 74 68 65 20 44 45 4c 45  same as the DELE
9e20: 54 45 20 70 72 6f 67 72 61 6d 20 65 78 63 65 70  TE program excep
9e30: 74 20 0a 74 68 61 74 20 74 68 65 20 62 6f 64 79  t .that the body
9e40: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 6c   of the second l
9e50: 6f 6f 70 20 68 61 73 20 62 65 65 6e 20 72 65 70  oop has been rep
9e60: 6c 61 63 65 20 62 79 20 61 20 73 65 71 75 65 6e  lace by a sequen
9e70: 63 65 20 6f 66 20 0a 69 6e 73 74 72 75 63 74 69  ce of .instructi
9e80: 6f 6e 73 20 28 61 74 20 61 64 64 72 65 73 73 65  ons (at addresse
9e90: 73 20 31 37 20 74 68 72 6f 75 67 68 20 32 36 29  s 17 through 26)
9ea0: 20 74 68 61 74 20 75 70 64 61 74 65 20 74 68 65   that update the
9eb0: 20 72 65 63 6f 72 64 20 72 61 74 68 65 72 20 0a   record rather .
9ec0: 74 68 61 6e 20 64 65 6c 65 74 65 20 69 74 2e 20  than delete it. 
9ed0: 20 4d 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e   Most of this in
9ee0: 73 74 72 75 63 74 69 6f 6e 20 73 65 71 75 65 6e  struction sequen
9ef0: 63 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  ce should alread
9f00: 79 20 62 65 20 0a 66 61 6d 69 6c 69 61 72 20 74  y be .familiar t
9f10: 6f 20 79 6f 75 2c 20 62 75 74 20 74 68 65 72 65  o you, but there
9f20: 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66   are a couple of
9f30: 20 6d 69 6e 6f 72 20 74 77 69 73 74 73 20 73 6f   minor twists so
9f40: 20 77 65 20 77 69 6c 6c 20 67 6f 20 0a 6f 76 65   we will go .ove
9f50: 72 20 69 74 20 62 72 69 65 66 6c 79 2e 20 20 41  r it briefly.  A
9f60: 6c 73 6f 20 6e 6f 74 65 20 74 68 61 74 20 74 68  lso note that th
9f70: 65 20 6f 72 64 65 72 20 6f 66 20 73 6f 6d 65 20  e order of some 
9f80: 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  of the instructi
9f90: 6f 6e 73 20 0a 62 65 66 6f 72 65 20 61 6e 64 20  ons .before and 
9fa0: 61 66 74 65 72 20 74 68 65 20 32 6e 64 20 6c 6f  after the 2nd lo
9fb0: 6f 70 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  op has changed. 
9fc0: 20 54 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   This is just th
9fd0: 65 20 77 61 79 20 74 68 65 20 0a 53 51 4c 69 74  e way the .SQLit
9fe0: 65 20 70 61 72 73 65 72 20 63 68 6f 73 65 20 74  e parser chose t
9ff0: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 63 6f 64  o output the cod
a000: 65 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72  e using a differ
a010: 65 6e 74 20 74 65 6d 70 6c 61 74 65 2e 3c 2f 70  ent template.</p
a020: 3e 0a 0a 3c 70 3e 41 73 20 77 65 20 65 6e 74 65  >..<p>As we ente
a030: 72 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6f  r the interior o
a040: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 6f  f the second loo
a050: 70 20 28 61 74 20 69 6e 73 74 72 75 63 74 69 6f  p (at instructio
a060: 6e 20 31 37 29 0a 74 68 65 20 73 74 61 63 6b 20  n 17).the stack 
a070: 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c  contains a singl
a080: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
a090: 69 73 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  is the key of th
a0a0: 65 0a 72 65 63 6f 72 64 20 77 65 20 77 61 6e 74  e.record we want
a0b0: 20 74 6f 20 6d 6f 64 69 66 79 2e 20 20 57 65 20   to modify.  We 
a0c0: 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 6e 65 65  are going to nee
a0d0: 64 20 74 6f 20 75 73 65 20 74 68 69 73 0a 6b 65  d to use this.ke
a0e0: 79 20 74 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f  y twice: once to
a0f0: 20 66 65 74 63 68 20 74 68 65 20 6f 6c 64 20 76   fetch the old v
a100: 61 6c 75 65 20 6f 66 20 74 68 65 20 72 65 63 6f  alue of the reco
a110: 72 64 20 61 6e 64 0a 61 20 73 65 63 6f 6e 64 20  rd and.a second 
a120: 74 69 6d 65 20 74 6f 20 77 72 69 74 65 20 62 61  time to write ba
a130: 63 6b 20 74 68 65 20 72 65 76 69 73 65 64 20 72  ck the revised r
a140: 65 63 6f 72 64 2e 20 20 53 6f 20 74 68 65 20 66  ecord.  So the f
a150: 69 72 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  irst instruction
a160: 0a 69 73 20 61 20 44 75 70 20 74 6f 20 6d 61 6b  .is a Dup to mak
a170: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  e a duplicate of
a180: 20 74 68 65 20 6b 65 79 20 6f 6e 20 74 68 65 20   the key on the 
a190: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
a1a0: 2e 20 20 54 68 65 0a 44 75 70 20 69 6e 73 74 72  .  The.Dup instr
a1b0: 75 63 74 69 6f 6e 20 77 69 6c 6c 20 64 75 70 6c  uction will dupl
a1c0: 69 63 61 74 65 20 61 6e 79 20 65 6c 65 6d 65 6e  icate any elemen
a1d0: 74 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2c 20  t of the stack, 
a1e0: 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 74 6f 70  not just the top
a1f0: 0a 65 6c 65 6d 65 6e 74 2e 20 20 59 6f 75 20 73  .element.  You s
a200: 70 65 63 69 66 79 20 77 68 69 63 68 20 65 6c 65  pecify which ele
a210: 6d 65 6e 74 20 74 6f 20 64 75 70 6c 69 63 61 74  ment to duplicat
a220: 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 0a 50 31  ion using the.P1
a230: 20 6f 70 65 72 61 6e 64 2e 20 20 57 68 65 6e 20   operand.  When 
a240: 50 31 20 69 73 20 30 2c 20 74 68 65 20 74 6f 70  P1 is 0, the top
a250: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73   of the stack is
a260: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 57 68 65   duplicated..Whe
a270: 6e 20 50 31 20 69 73 20 31 2c 20 74 68 65 20 6e  n P1 is 1, the n
a280: 65 78 74 20 65 6c 65 6d 65 6e 74 20 64 6f 77 6e  ext element down
a290: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 64 75   on the stack du
a2a0: 70 6c 69 63 61 74 69 6f 6e 2e 0a 41 6e 64 20 73  plication..And s
a2b0: 6f 20 66 6f 72 74 68 2e 3c 2f 70 3e 0a 0a 3c 70  o forth.</p>..<p
a2c0: 3e 41 66 74 65 72 20 64 75 70 6c 69 63 61 74 69  >After duplicati
a2d0: 6e 67 20 74 68 65 20 6b 65 79 2c 20 74 68 65 20  ng the key, the 
a2e0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
a2f0: 2c 20 4e 6f 74 45 78 69 73 74 73 2c 0a 70 6f 70  , NotExists,.pop
a300: 73 20 74 68 65 20 73 74 61 63 6b 20 6f 6e 63 65  s the stack once
a310: 20 61 6e 64 20 75 73 65 73 20 74 68 65 20 76 61   and uses the va
a320: 6c 75 65 20 70 6f 70 70 65 64 20 61 73 20 61 20  lue popped as a 
a330: 6b 65 79 20 74 6f 0a 63 68 65 63 6b 20 74 68 65  key to.check the
a340: 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20   existence of a 
a350: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 64 61  record in the da
a360: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
a370: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 65 63   there is no rec
a380: 6f 72 64 20 0a 66 6f 72 20 74 68 69 73 20 6b 65  ord .for this ke
a390: 79 2c 20 69 74 20 6a 75 6d 70 73 20 62 61 63 6b  y, it jumps back
a3a0: 20 74 6f 20 74 68 65 20 4c 69 73 74 52 65 61 64   to the ListRead
a3b0: 20 74 6f 20 67 65 74 20 61 6e 6f 74 68 65 72 20   to get another 
a3c0: 6b 65 79 2e 3c 2f 70 3e 0a 0a 3c 70 3e 49 6e 73  key.</p>..<p>Ins
a3d0: 74 72 75 63 74 69 6f 6e 73 20 31 39 20 74 68 72  tructions 19 thr
a3e0: 6f 75 67 68 20 32 35 20 63 6f 6e 73 74 72 75 63  ough 25 construc
a3f0: 74 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  t a new database
a400: 20 72 65 63 6f 72 64 0a 74 68 61 74 20 77 69 6c   record.that wil
a410: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 70  l be used to rep
a420: 6c 61 63 65 20 74 68 65 20 65 78 69 73 74 69 6e  lace the existin
a430: 67 20 72 65 63 6f 72 64 2e 20 20 54 68 69 73 20  g record.  This 
a440: 69 73 0a 74 68 65 20 73 61 6d 65 20 6b 69 6e 64  is.the same kind
a450: 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 77 65   of code that we
a460: 20 73 61 77 20 0a 69 6e 20 74 68 65 20 64 65 73   saw .in the des
a470: 63 72 69 70 74 69 6f 6e 20 6f 66 20 49 4e 53 45  cription of INSE
a480: 52 54 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20  RT and will not 
a490: 62 65 20 64 65 73 63 72 69 62 65 64 20 66 75 72  be described fur
a4a0: 74 68 65 72 2e 0a 41 66 74 65 72 20 69 6e 73 74  ther..After inst
a4b0: 72 75 63 74 69 6f 6e 20 32 35 20 65 78 65 63 75  ruction 25 execu
a4c0: 74 65 73 2c 20 74 68 65 20 73 74 61 63 6b 20 6c  tes, the stack l
a4d0: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 3c  ooks like this:<
a4e0: 2f 70 3e 0a 7d 0a 0a 73 74 61 63 6b 20 7b 28 72  /p>.}..stack {(r
a4f0: 65 63 6f 72 64 29 20 6e 65 77 20 64 61 74 61 20  ecord) new data 
a500: 72 65 63 6f 72 64 7d 20 7b 28 69 6e 74 65 67 65  record} {(intege
a510: 72 29 20 6b 65 79 7d 0a 0a 70 75 74 73 20 7b 0a  r) key}..puts {.
a520: 3c 70 3e 54 68 65 20 50 75 74 49 6e 74 4b 65 79  <p>The PutIntKey
a530: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 28 61 6c   instruction (al
a540: 73 6f 20 64 65 73 63 72 69 62 65 64 0a 64 75 72  so described.dur
a550: 69 6e 67 20 74 68 65 20 64 69 73 63 75 73 73 69  ing the discussi
a560: 6f 6e 20 61 62 6f 75 74 20 49 4e 53 45 52 54 29  on about INSERT)
a570: 20 77 72 69 74 65 73 20 61 6e 20 65 6e 74 72 79   writes an entry
a580: 20 69 6e 74 6f 20 74 68 65 0a 64 61 74 61 62 61   into the.databa
a590: 73 65 20 66 69 6c 65 20 77 68 6f 73 65 20 64 61  se file whose da
a5a0: 74 61 20 69 73 20 74 68 65 20 74 6f 70 20 6f 66  ta is the top of
a5b0: 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64 20 77   the stack and w
a5c0: 68 6f 73 65 20 6b 65 79 0a 69 73 20 74 68 65 20  hose key.is the 
a5d0: 6e 65 78 74 20 6f 6e 20 74 68 65 20 73 74 61 63  next on the stac
a5e0: 6b 2c 20 61 6e 64 20 74 68 65 6e 20 70 6f 70 73  k, and then pops
a5f0: 20 74 68 65 20 73 74 61 63 6b 20 74 77 69 63 65   the stack twice
a600: 2e 20 20 54 68 65 0a 50 75 74 49 6e 74 4b 65 79  .  The.PutIntKey
a610: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
a620: 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
a630: 64 61 74 61 20 6f 66 20 61 6e 20 65 78 69 73 74  data of an exist
a640: 69 6e 67 20 72 65 63 6f 72 64 0a 77 69 74 68 20  ing record.with 
a650: 74 68 65 20 73 61 6d 65 20 6b 65 79 2c 20 77 68  the same key, wh
a660: 69 63 68 20 69 73 20 77 68 61 74 20 77 65 20 77  ich is what we w
a670: 61 6e 74 20 68 65 72 65 2e 20 20 4f 76 65 72 77  ant here.  Overw
a680: 72 69 74 69 6e 67 20 77 61 73 20 6e 6f 74 0a 61  riting was not.a
a690: 6e 20 69 73 73 75 65 20 77 69 74 68 20 49 4e 53  n issue with INS
a6a0: 45 52 54 20 62 65 63 61 75 73 65 20 77 69 74 68  ERT because with
a6b0: 20 49 4e 53 45 52 54 20 74 68 65 20 6b 65 79 20   INSERT the key 
a6c0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 0a 62 79  was generated.by
a6d0: 20 74 68 65 20 4e 65 77 52 65 63 6e 6f 20 69 6e   the NewRecno in
a6e0: 73 74 72 75 63 74 69 6f 6e 20 77 68 69 63 68 20  struction which 
a6f0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
a700: 20 70 72 6f 76 69 64 65 20 61 20 6b 65 79 0a 74   provide a key.t
a710: 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  hat has not been
a720: 20 75 73 65 64 20 62 65 66 6f 72 65 2e 3c 2f 70   used before.</p
a730: 3e 0a 7d 0a 0a 69 66 20 30 20 7b 3c 70 3e 28 42  >.}..if 0 {<p>(B
a740: 79 20 74 68 65 20 77 61 79 2c 20 73 69 6e 63 65  y the way, since
a750: 20 6b 65 79 73 20 6d 75 73 74 0a 61 6c 6c 20 62   keys must.all b
a760: 65 20 75 6e 69 71 75 65 20 61 6e 64 20 65 61 63  e unique and eac
a770: 68 20 6b 65 79 20 69 73 20 61 20 33 32 2d 62 69  h key is a 32-bi
a780: 74 20 69 6e 74 65 67 65 72 2c 20 61 20 73 69 6e  t integer, a sin
a790: 67 6c 65 0a 53 51 4c 69 74 65 20 64 61 74 61 62  gle.SQLite datab
a7a0: 61 73 65 20 74 61 62 6c 65 20 63 61 6e 20 68 61  ase table can ha
a7b0: 76 65 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  ve no more than 
a7c0: 32 3c 73 75 70 3e 33 32 3c 2f 73 75 70 3e 0a 72  2<sup>32</sup>.r
a7d0: 6f 77 73 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20  ows.  Actually, 
a7e0: 74 68 65 20 4b 65 79 20 69 6e 73 74 72 75 63 74  the Key instruct
a7f0: 69 6f 6e 20 73 74 61 72 74 73 20 74 6f 20 62 65  ion starts to be
a800: 63 6f 6d 65 0a 76 65 72 79 20 69 6e 65 66 66 69  come.very ineffi
a810: 63 69 65 6e 74 20 61 73 20 79 6f 75 20 61 70 70  cient as you app
a820: 72 6f 61 63 68 20 74 68 69 73 20 75 70 70 65 72  roach this upper
a830: 20 62 6f 75 6e 64 2c 20 73 6f 20 69 74 0a 69 73   bound, so it.is
a840: 20 62 65 73 74 20 74 6f 20 6b 65 65 70 20 74 68   best to keep th
a850: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
a860: 69 65 73 20 62 65 6c 6f 77 20 32 3c 73 75 70 3e  ies below 2<sup>
a870: 33 31 3c 2f 73 75 70 3e 0a 6f 72 20 73 6f 2e 20  31</sup>.or so. 
a880: 20 53 75 72 65 6c 79 20 61 20 63 6f 75 70 6c 65   Surely a couple
a890: 20 62 69 6c 6c 69 6f 6e 20 72 65 63 6f 72 64 73   billion records
a8a0: 20 77 69 6c 6c 20 62 65 20 65 6e 6f 75 67 68 20   will be enough 
a8b0: 66 6f 72 0a 6d 6f 73 74 20 61 70 70 6c 69 63 61  for.most applica
a8c0: 74 69 6f 6e 73 21 29 3c 2f 70 3e 0a 7d 0a 0a 70  tions!)</p>.}..p
a8d0: 75 74 73 20 7b 0a 3c 68 32 3e 43 52 45 41 54 45  uts {.<h2>CREATE
a8e0: 20 61 6e 64 20 44 52 4f 50 3c 2f 68 32 3e 0a 0a   and DROP</h2>..
a8f0: 3c 70 3e 55 73 69 6e 67 20 43 52 45 41 54 45 20  <p>Using CREATE 
a900: 6f 72 20 44 52 4f 50 20 74 6f 20 63 72 65 61 74  or DROP to creat
a910: 65 20 6f 72 20 64 65 73 74 72 6f 79 20 61 20 74  e or destroy a t
a920: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
a930: 0a 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65  .really the same
a940: 20 61 73 20 64 6f 69 6e 67 20 61 6e 20 49 4e 53   as doing an INS
a950: 45 52 54 20 6f 72 20 44 45 4c 45 54 45 20 66 72  ERT or DELETE fr
a960: 6f 6d 20 74 68 65 20 73 70 65 63 69 61 6c 0a 22  om the special."
a970: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74  sqlite_master" t
a980: 61 62 6c 65 2c 20 61 74 20 6c 65 61 73 74 20 66  able, at least f
a990: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 20 6f 66  rom the point of
a9a0: 20 76 69 65 77 20 6f 66 20 74 68 65 20 56 44 42   view of the VDB
a9b0: 45 2e 0a 54 68 65 20 73 71 6c 69 74 65 5f 6d 61  E..The sqlite_ma
a9c0: 73 74 65 72 20 74 61 62 6c 65 20 69 73 20 61 20  ster table is a 
a9d0: 73 70 65 63 69 61 6c 20 74 61 62 6c 65 20 74 68  special table th
a9e0: 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
a9f0: 6c 6c 79 0a 63 72 65 61 74 65 64 20 66 6f 72 20  lly.created for 
aa00: 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74  every SQLite dat
aa10: 61 62 61 73 65 2e 20 20 49 74 20 6c 6f 6f 6b 73  abase.  It looks
aa20: 20 6c 69 6b 65 20 74 68 69 73 3a 3c 2f 70 3e 0a   like this:</p>.
aa30: 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72  .<blockquote><pr
aa40: 65 3e 0a 43 52 45 41 54 45 20 54 41 42 4c 45 20  e>.CREATE TABLE 
aa50: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 28 0a  sqlite_master (.
aa60: 20 20 74 79 70 65 20 20 20 20 20 20 54 45 58 54    type      TEXT
aa70: 2c 20 20 20 20 2d 2d 20 65 69 74 68 65 72 20 22  ,    -- either "
aa80: 74 61 62 6c 65 22 20 6f 72 20 22 69 6e 64 65 78  table" or "index
aa90: 22 0a 20 20 6e 61 6d 65 20 20 20 20 20 20 54 45  ".  name      TE
aaa0: 58 54 2c 20 20 20 20 2d 2d 20 6e 61 6d 65 20 6f  XT,    -- name o
aab0: 66 20 74 68 69 73 20 74 61 62 6c 65 20 6f 72 20  f this table or 
aac0: 69 6e 64 65 78 0a 20 20 74 62 6c 5f 6e 61 6d 65  index.  tbl_name
aad0: 20 20 54 45 58 54 2c 20 20 20 20 2d 2d 20 66 6f    TEXT,    -- fo
aae0: 72 20 69 6e 64 69 63 65 73 3a 20 6e 61 6d 65 20  r indices: name 
aaf0: 6f 66 20 61 73 73 6f 63 69 61 74 65 64 20 74 61  of associated ta
ab00: 62 6c 65 0a 20 20 73 71 6c 20 20 20 20 20 20 20  ble.  sql       
ab10: 54 45 58 54 20 20 20 20 20 2d 2d 20 53 51 4c 20  TEXT     -- SQL 
ab20: 74 65 78 74 20 6f 66 20 74 68 65 20 6f 72 69 67  text of the orig
ab30: 69 6e 61 6c 20 43 52 45 41 54 45 20 73 74 61 74  inal CREATE stat
ab40: 65 6d 65 6e 74 0a 29 0a 3c 2f 70 72 65 3e 3c 2f  ement.).</pre></
ab50: 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e  blockquote>..<p>
ab60: 45 76 65 72 79 20 74 61 62 6c 65 20 28 65 78 63  Every table (exc
ab70: 65 70 74 20 74 68 65 20 22 73 71 6c 69 74 65 5f  ept the "sqlite_
ab80: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 69 74  master" table it
ab90: 73 65 6c 66 29 0a 61 6e 64 20 65 76 65 72 79 20  self).and every 
aba0: 6e 61 6d 65 64 20 69 6e 64 65 78 20 69 6e 20 61  named index in a
abb0: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
abc0: 65 20 68 61 73 20 61 6e 20 65 6e 74 72 79 0a 69  e has an entry.i
abd0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
abe0: 74 65 72 20 74 61 62 6c 65 2e 20 20 59 6f 75 20  ter table.  You 
abf0: 63 61 6e 20 71 75 65 72 79 20 74 68 69 73 20 74  can query this t
ac00: 61 62 6c 65 20 75 73 69 6e 67 0a 61 20 53 45 4c  able using.a SEL
ac10: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6a 75  ECT statement ju
ac20: 73 74 20 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65  st like any othe
ac30: 72 20 74 61 62 6c 65 2e 20 20 42 75 74 20 79 6f  r table.  But yo
ac40: 75 20 61 72 65 0a 6e 6f 74 20 61 6c 6c 6f 77 65  u are.not allowe
ac50: 64 20 74 6f 20 64 69 72 65 63 74 6c 79 20 63 68  d to directly ch
ac60: 61 6e 67 65 20 74 68 65 20 74 61 62 6c 65 20 75  ange the table u
ac70: 73 69 6e 67 20 55 50 44 41 54 45 2c 20 49 4e 53  sing UPDATE, INS
ac80: 45 52 54 2c 0a 6f 72 20 44 45 4c 45 54 45 2e 20  ERT,.or DELETE. 
ac90: 20 43 68 61 6e 67 65 73 20 74 6f 20 73 71 6c 69   Changes to sqli
aca0: 74 65 5f 6d 61 73 74 65 72 20 68 61 76 65 20 74  te_master have t
acb0: 6f 20 6f 63 63 75 72 20 75 73 69 6e 67 0a 74 68  o occur using.th
acc0: 65 20 43 52 45 41 54 45 20 61 6e 64 20 44 52 4f  e CREATE and DRO
acd0: 50 20 63 6f 6d 6d 61 6e 64 73 20 62 65 63 61 75  P commands becau
ace0: 73 65 20 53 51 4c 69 74 65 20 61 6c 73 6f 20 68  se SQLite also h
acf0: 61 73 20 74 6f 20 75 70 64 61 74 65 0a 73 6f 6d  as to update.som
ad00: 65 20 6f 66 20 69 74 73 20 69 6e 74 65 72 6e 61  e of its interna
ad10: 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
ad20: 73 20 77 68 65 6e 20 74 61 62 6c 65 73 20 61 6e  s when tables an
ad30: 64 20 69 6e 64 69 63 65 73 0a 61 72 65 20 61 64  d indices.are ad
ad40: 64 65 64 20 6f 72 20 64 65 73 74 72 6f 79 65 64  ded or destroyed
ad50: 2e 3c 2f 70 3e 0a 0a 3c 70 3e 42 75 74 20 66 72  .</p>..<p>But fr
ad60: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20  om the point of 
ad70: 76 69 65 77 20 6f 66 20 74 68 65 20 56 44 42 45  view of the VDBE
ad80: 2c 20 61 20 43 52 45 41 54 45 20 77 6f 72 6b 73  , a CREATE works
ad90: 0a 70 72 65 74 74 79 20 6d 75 63 68 20 6c 69 6b  .pretty much lik
ada0: 65 20 61 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  e an INSERT and 
adb0: 61 20 44 52 4f 50 20 77 6f 72 6b 73 20 6c 69 6b  a DROP works lik
adc0: 65 20 61 20 44 45 4c 45 54 45 2e 0a 57 68 65 6e  e a DELETE..When
add0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
ade0: 61 72 79 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20  ary opens to an 
adf0: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
ae00: 65 2c 0a 74 68 65 20 66 69 72 73 74 20 74 68 69  e,.the first thi
ae10: 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 20  ng it does is a 
ae20: 53 45 4c 45 43 54 20 74 6f 20 72 65 61 64 20 74  SELECT to read t
ae30: 68 65 20 22 73 71 6c 22 0a 63 6f 6c 75 6d 6e 73  he "sql".columns
ae40: 20 66 72 6f 6d 20 61 6c 6c 20 65 6e 74 72 69 65   from all entrie
ae50: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
ae60: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 54 68  master table..Th
ae70: 65 20 22 73 71 6c 22 20 63 6f 6c 75 6d 6e 20 63  e "sql" column c
ae80: 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70  ontains the comp
ae90: 6c 65 74 65 20 53 51 4c 20 74 65 78 74 20 6f 66  lete SQL text of
aea0: 20 74 68 65 0a 43 52 45 41 54 45 20 73 74 61 74   the.CREATE stat
aeb0: 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69  ement that origi
aec0: 6e 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20  nally generated 
aed0: 74 68 65 20 69 6e 64 65 78 20 6f 72 0a 74 61 62  the index or.tab
aee0: 6c 65 2e 20 20 54 68 69 73 20 74 65 78 74 20 69  le.  This text i
aef0: 73 20 66 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  s fed back into 
af00: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
af10: 72 0a 61 6e 64 20 75 73 65 64 20 74 6f 20 72 65  r.and used to re
af20: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 0a 69 6e  construct the.in
af30: 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
af40: 63 74 75 72 65 73 20 64 65 73 63 72 69 62 69 6e  ctures describin
af50: 67 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74  g the index or t
af60: 61 62 6c 65 2e 3c 2f 70 3e 0a 0a 3c 68 32 3e 55  able.</p>..<h2>U
af70: 73 69 6e 67 20 49 6e 64 65 78 65 73 20 54 6f 20  sing Indexes To 
af80: 53 70 65 65 64 20 53 65 61 72 63 68 69 6e 67 3c  Speed Searching<
af90: 2f 68 32 3e 0a 0a 3c 70 3e 49 6e 20 74 68 65 20  /h2>..<p>In the 
afa0: 65 78 61 6d 70 6c 65 20 71 75 65 72 69 65 73 20  example queries 
afb0: 61 62 6f 76 65 2c 20 65 76 65 72 79 20 72 6f 77  above, every row
afc0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   of the table be
afd0: 69 6e 67 0a 71 75 65 72 69 65 64 20 6d 75 73 74  ing.queried must
afe0: 20 62 65 20 6c 6f 61 64 65 64 20 6f 66 66 20 6f   be loaded off o
aff0: 66 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 65  f the disk and e
b000: 78 61 6d 69 6e 65 64 2c 20 65 76 65 6e 20 69 66  xamined, even if
b010: 20 6f 6e 6c 79 0a 61 20 73 6d 61 6c 6c 20 70 65   only.a small pe
b020: 72 63 65 6e 74 61 67 65 20 6f 66 20 74 68 65 20  rcentage of the 
b030: 72 6f 77 73 20 65 6e 64 20 75 70 20 69 6e 20 74  rows end up in t
b040: 68 65 20 72 65 73 75 6c 74 2e 20 20 54 68 69 73  he result.  This
b050: 20 63 61 6e 0a 74 61 6b 65 20 61 20 6c 6f 6e 67   can.take a long
b060: 20 74 69 6d 65 20 6f 6e 20 61 20 62 69 67 20 74   time on a big t
b070: 61 62 6c 65 2e 20 20 54 6f 20 73 70 65 65 64 20  able.  To speed 
b080: 74 68 69 6e 67 73 20 75 70 2c 20 53 51 4c 69 74  things up, SQLit
b090: 65 0a 63 61 6e 20 75 73 65 20 61 6e 20 69 6e 64  e.can use an ind
b0a0: 65 78 2e 3c 2f 70 3e 0a 0a 3c 70 3e 41 6e 20 53  ex.</p>..<p>An S
b0b0: 51 4c 69 74 65 20 66 69 6c 65 20 61 73 73 6f 63  QLite file assoc
b0c0: 69 61 74 65 73 20 61 20 6b 65 79 20 77 69 74 68  iates a key with
b0d0: 20 73 6f 6d 65 20 64 61 74 61 2e 20 20 46 6f 72   some data.  For
b0e0: 20 61 6e 20 53 51 4c 69 74 65 0a 74 61 62 6c 65   an SQLite.table
b0f0: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
b100: 69 6c 65 20 69 73 20 73 65 74 20 75 70 20 73 6f  ile is set up so
b110: 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 69 73   that the key is
b120: 20 61 6e 20 69 6e 74 65 67 65 72 0a 61 6e 64 20   an integer.and 
b130: 74 68 65 20 64 61 74 61 20 69 73 20 74 68 65 20  the data is the 
b140: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
b150: 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74  one row of the t
b160: 61 62 6c 65 2e 0a 49 6e 64 69 63 65 73 20 69 6e  able..Indices in
b170: 20 53 51 4c 69 74 65 20 72 65 76 65 72 73 65 20   SQLite reverse 
b180: 74 68 69 73 20 61 72 72 61 6e 67 65 6d 65 6e 74  this arrangement
b190: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6b 65 79  .  The index key
b1a0: 0a 69 73 20 28 73 6f 6d 65 20 6f 66 29 20 74 68  .is (some of) th
b1b0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 65  e information be
b1c0: 69 6e 67 20 73 74 6f 72 65 64 20 61 6e 64 20 74  ing stored and t
b1d0: 68 65 20 69 6e 64 65 78 20 64 61 74 61 20 0a 69  he index data .i
b1e0: 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 54 6f  s an integer..To
b1f0: 20 61 63 63 65 73 73 20 61 20 74 61 62 6c 65 20   access a table 
b200: 72 6f 77 20 74 68 61 74 20 68 61 73 20 73 6f 6d  row that has som
b210: 65 20 70 61 72 74 69 63 75 6c 61 72 0a 63 6f 6e  e particular.con
b220: 74 65 6e 74 2c 20 77 65 20 66 69 72 73 74 20 6c  tent, we first l
b230: 6f 6f 6b 20 75 70 20 74 68 65 20 63 6f 6e 74 65  ook up the conte
b240: 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  nt in the index 
b250: 74 61 62 6c 65 20 74 6f 20 66 69 6e 64 0a 69 74  table to find.it
b260: 73 20 69 6e 74 65 67 65 72 20 69 6e 64 65 78 2c  s integer index,
b270: 20 74 68 65 6e 20 77 65 20 75 73 65 20 74 68 61   then we use tha
b280: 74 20 69 6e 74 65 67 65 72 20 74 6f 20 6c 6f 6f  t integer to loo
b290: 6b 20 75 70 20 74 68 65 0a 63 6f 6d 70 6c 65 74  k up the.complet
b2a0: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
b2b0: 74 61 62 6c 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e 4e  table.</p>..<p>N
b2c0: 6f 74 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  ote that SQLite 
b2d0: 75 73 65 73 20 62 2d 74 72 65 65 73 2c 20 77 68  uses b-trees, wh
b2e0: 69 63 68 20 61 72 65 20 61 20 73 6f 72 74 65 64  ich are a sorted
b2f0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2c   data structure,
b300: 20 0a 73 6f 20 69 6e 64 69 63 65 73 20 63 61 6e   .so indices can
b310: 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 74 68   be used when th
b320: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
b330: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
b340: 74 65 6d 65 6e 74 0a 63 6f 6e 74 61 69 6e 73 20  tement.contains 
b350: 74 65 73 74 73 20 66 6f 72 20 65 71 75 61 6c 69  tests for equali
b360: 74 79 20 6f 72 20 69 6e 65 71 75 61 6c 69 74 79  ty or inequality
b370: 2e 20 20 51 75 65 72 69 65 73 20 6c 69 6b 65 20  .  Queries like 
b380: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 63  the following .c
b390: 61 6e 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20  an use an index 
b3a0: 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  if it is availab
b3b0: 6c 65 3a 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63 6b 71  le:</p>..<blockq
b3c0: 75 6f 74 65 3e 3c 70 72 65 3e 0a 53 45 4c 45 43  uote><pre>.SELEC
b3d0: 54 20 2a 20 46 52 4f 4d 20 65 78 61 6d 70 20 57  T * FROM examp W
b3e0: 48 45 52 45 20 74 77 6f 3d 3d 35 30 3b 0a 53 45  HERE two==50;.SE
b3f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 78 61 6d  LECT * FROM exam
b400: 70 20 57 48 45 52 45 20 74 77 6f 3c 35 30 3b 0a  p WHERE two<50;.
b410: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 78  SELECT * FROM ex
b420: 61 6d 70 20 57 48 45 52 45 20 74 77 6f 20 49 4e  amp WHERE two IN
b430: 20 28 35 30 2c 20 31 30 30 29 3b 0a 3c 2f 70 72   (50, 100);.</pr
b440: 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  e></blockquote>.
b450: 0a 3c 70 3e 49 66 20 74 68 65 72 65 20 65 78 69  .<p>If there exi
b460: 73 74 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61  sts an index tha
b470: 74 20 6d 61 70 73 20 74 68 65 20 22 74 77 6f 22  t maps the "two"
b480: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 22   column of the "
b490: 65 78 61 6d 70 22 0a 74 61 62 6c 65 20 69 6e 74  examp".table int
b4a0: 6f 20 69 6e 74 65 67 65 72 73 2c 20 74 68 65 6e  o integers, then
b4b0: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 75 73 65   SQLite will use
b4c0: 20 74 68 61 74 20 69 6e 64 65 78 20 74 6f 20 66   that index to f
b4d0: 69 6e 64 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ind the integer.
b4e0: 6b 65 79 73 20 6f 66 20 61 6c 6c 20 72 6f 77 73  keys of all rows
b4f0: 20 69 6e 20 65 78 61 6d 70 20 74 68 61 74 20 68   in examp that h
b500: 61 76 65 20 61 20 76 61 6c 75 65 20 6f 66 20 35  ave a value of 5
b510: 30 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 74 77 6f  0 for column two
b520: 2c 20 6f 72 20 0a 61 6c 6c 20 72 6f 77 73 20 74  , or .all rows t
b530: 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61  hat are less tha
b540: 6e 20 35 30 2c 20 65 74 63 2e 0a 42 75 74 20 74  n 50, etc..But t
b550: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
b560: 72 69 65 73 20 63 61 6e 6e 6f 74 20 75 73 65 20  ries cannot use 
b570: 74 68 65 20 69 6e 64 65 78 3a 3c 2f 70 3e 0a 0a  the index:</p>..
b580: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
b590: 3e 0a 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  >.SELECT * FROM 
b5a0: 65 78 61 6d 70 20 57 48 45 52 45 20 74 77 6f 25  examp WHERE two%
b5b0: 35 30 20 3d 3d 20 31 30 3b 0a 53 45 4c 45 43 54  50 == 10;.SELECT
b5c0: 20 2a 20 46 52 4f 4d 20 65 78 61 6d 70 20 57 48   * FROM examp WH
b5d0: 45 52 45 20 74 77 6f 26 31 32 37 20 3d 3d 20 33  ERE two&127 == 3
b5e0: 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71  ;.</pre></blockq
b5f0: 75 6f 74 65 3e 0a 0a 3c 70 3e 4e 6f 74 65 20 74  uote>..<p>Note t
b600: 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 70  hat the SQLite p
b610: 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61  arser will not a
b620: 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65 20 63  lways generate c
b630: 6f 64 65 20 74 6f 20 75 73 65 20 61 6e 20 0a 69  ode to use an .i
b640: 6e 64 65 78 2c 20 65 76 65 6e 20 69 66 20 69 74  ndex, even if it
b650: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
b660: 64 6f 20 73 6f 2e 20 20 54 68 65 20 66 6f 6c 6c  do so.  The foll
b670: 6f 77 69 6e 67 20 71 75 65 72 69 65 73 20 77 69  owing queries wi
b680: 6c 6c 20 6e 6f 74 20 0a 63 75 72 72 65 6e 74 6c  ll not .currentl
b690: 79 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 3a  y use the index:
b6a0: 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74  </p>..<blockquot
b6b0: 65 3e 3c 70 72 65 3e 0a 53 45 4c 45 43 54 20 2a  e><pre>.SELECT *
b6c0: 20 46 52 4f 4d 20 65 78 61 6d 70 20 57 48 45 52   FROM examp WHER
b6d0: 45 20 74 77 6f 2b 31 30 20 3d 3d 20 35 30 3b 0a  E two+10 == 50;.
b6e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 78  SELECT * FROM ex
b6f0: 61 6d 70 20 57 48 45 52 45 20 74 77 6f 3d 3d 35  amp WHERE two==5
b700: 30 20 4f 52 20 74 77 6f 3d 3d 31 30 30 3b 0a 3c  0 OR two==100;.<
b710: 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74  /pre></blockquot
b720: 65 3e 0a 0a 3c 70 3e 54 6f 20 75 6e 64 65 72 73  e>..<p>To unders
b730: 74 61 6e 64 20 62 65 74 74 65 72 20 68 6f 77 20  tand better how 
b740: 69 6e 64 69 63 65 73 20 77 6f 72 6b 2c 20 6c 65  indices work, le
b750: 74 73 20 66 69 72 73 74 20 6c 6f 6f 6b 20 61 74  ts first look at
b760: 20 68 6f 77 0a 74 68 65 79 20 61 72 65 20 63 72   how.they are cr
b770: 65 61 74 65 64 2e 20 20 4c 65 74 27 73 20 67 6f  eated.  Let's go
b780: 20 61 68 65 61 64 20 61 6e 64 20 70 75 74 20 61   ahead and put a
b790: 6e 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74  n index on the t
b7a0: 77 6f 0a 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  wo.column of the
b7b0: 20 65 78 61 6d 70 20 74 61 62 6c 65 2e 20 20 57   examp table.  W
b7c0: 65 20 68 61 76 65 3a 3c 2f 70 3e 0a 0a 3c 62 6c  e have:</p>..<bl
b7d0: 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 43  ockquote><pre>.C
b7e0: 52 45 41 54 45 20 49 4e 44 45 58 20 65 78 61 6d  REATE INDEX exam
b7f0: 70 5f 69 64 78 31 20 4f 4e 20 65 78 61 6d 70 28  p_idx1 ON examp(
b800: 74 77 6f 29 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c  two);.</pre></bl
b810: 6f 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e 54 68  ockquote>..<p>Th
b820: 65 20 56 44 42 45 20 63 6f 64 65 20 67 65 6e 65  e VDBE code gene
b830: 72 61 74 65 64 20 62 79 20 74 68 65 20 61 62 6f  rated by the abo
b840: 76 65 20 73 74 61 74 65 6d 65 6e 74 20 6c 6f 6f  ve statement loo
b850: 6b 73 20 6c 69 6b 65 20 74 68 65 0a 66 6f 6c 6c  ks like the.foll
b860: 6f 77 69 6e 67 3a 3c 2f 70 3e 0a 7d 0a 0a 43 6f  owing:</p>.}..Co
b870: 64 65 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f 64  de {.addr  opcod
b880: 65 20 20 20 20 20 20 20 20 70 31 20 20 20 20 20  e        p1     
b890: 70 32 20 20 20 20 20 70 33 20 20 20 20 20 20 20  p2     p3       
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
b8c0: 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
b8d0: 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  --  -----  -----
b8e0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
b8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b900: 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 54 72 61 6e  -----.0     Tran
b910: 73 61 63 74 69 6f 6e 20 20 20 31 20 20 20 20 20  saction   1     
b920: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 20 20 20 20 20 20 20 20 20 20 20 0a 31 20 20 20             .1   
b950: 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 20 20    Transaction   
b960: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 0a 32 20 20 20 20 20 56 65 72 69 66 79 43 6f   .2     VerifyCo
b9a0: 6f 6b 69 65 20 20 30 20 20 20 20 20 20 31 37 38  okie  0      178
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 33 20 20              .3  
b9e0: 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20     Integer      
b9f0: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 0a 34 20 20 20 20 20 4f 70 65 6e 57 72 69    .4     OpenWri
ba30: 74 65 20 20 20 20 20 30 20 20 20 20 20 20 32 20  te     0      2 
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 20 20 20 20 20 20 0a 35 20 20 20 20 20 4e          .5     N
ba70: 65 77 52 65 63 6e 6f 20 20 20 20 20 20 30 20 20  ewRecno      0  
ba80: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 36                .6
bab0: 20 20 20 20 20 53 74 72 69 6e 67 20 20 20 20 20       String     
bac0: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
bad0: 20 69 6e 64 65 78 20 20 20 20 20 20 20 20 20 20   index          
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 20 20 20 0a 37 20 20 20 20 20 53 74 72 69 6e      .7     Strin
bb00: 67 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20  g        0      
bb10: 30 20 20 20 20 20 20 65 78 61 6d 70 5f 69 64 78  0      examp_idx
bb20: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
bb30: 20 20 20 20 20 20 20 20 20 20 0a 38 20 20 20 20            .8    
bb40: 20 53 74 72 69 6e 67 20 20 20 20 20 20 20 20 30   String        0
bb50: 20 20 20 20 20 20 30 20 20 20 20 20 20 65 78 61        0      exa
bb60: 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mp              
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 0a 39 20 20 20 20 20 43 72 65 61 74 65 49 6e 64  .9     CreateInd
bb90: 65 78 20 20 20 30 20 20 20 20 20 20 30 20 20 20  ex   0      0   
bba0: 20 20 20 70 74 72 28 30 78 37 39 31 33 38 30 29     ptr(0x791380)
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 20 20 20 0a 31 30 20 20 20 20 44 75 70        .10    Dup
bbd0: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
bbe0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 31 20              .11 
bc10: 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20     Integer      
bc20: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 0a 31 32 20 20 20 20 4f 70 65 6e 57 72 69    .12    OpenWri
bc60: 74 65 20 20 20 20 20 31 20 20 20 20 20 20 30 20  te     1      0 
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 20 20 20 20 0a 31 33 20 20 20 20 53          .13    S
bca0: 74 72 69 6e 67 20 20 20 20 20 20 20 20 30 20 20  tring        0  
bcb0: 20 20 20 20 30 20 20 20 20 20 20 43 52 45 41 54      0      CREAT
bcc0: 45 20 49 4e 44 45 58 20 65 78 61 6d 70 5f 69 64  E INDEX examp_id
bcd0: 78 31 20 4f 4e 20 65 78 61 6d 70 28 74 77 0a 31  x1 ON examp(tw.1
bce0: 34 20 20 20 20 4d 61 6b 65 52 65 63 6f 72 64 20  4    MakeRecord 
bcf0: 20 20 20 35 20 20 20 20 20 20 30 20 20 20 20 20     5      0     
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 0a 31 35 20 20 20 20 50 75 74 49 6e      .15    PutIn
bd30: 74 4b 65 79 20 20 20 20 20 30 20 20 20 20 20 20  tKey     0      
bd40: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 20 20 20 20 20 20 20 20 0a 31 36 20 20 20            .16   
bd70: 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 30   Integer       0
bd80: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 0a 31 37 20 20 20 20 4f 70 65 6e 52 65 61 64 20  .17    OpenRead 
bdc0: 20 20 20 20 20 32 20 20 20 20 20 20 33 20 20 20       2      3   
bdd0: 20 20 20 65 78 61 6d 70 20 20 20 20 20 20 20 20     examp        
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 20 20 20 0a 31 38 20 20 20 20 52 65 77        .18    Rew
be00: 69 6e 64 20 20 20 20 20 20 20 20 32 20 20 20 20  ind        2    
be10: 20 20 32 34 20 20 20 20 20 20 20 20 20 20 20 20    24            
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 0a 31 39 20 20 20 20 52 65 63 6e 6f 20 20 20   .19    Recno   
be50: 20 20 20 20 20 20 32 20 20 20 20 20 20 30 20 20        2      0  
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 20 20 20 20 20 20 0a 32 30 20 20 20 20 43 6f         .20    Co
be90: 6c 75 6d 6e 20 20 20 20 20 20 20 20 32 20 20 20  lumn        2   
bea0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 31               .21
bed0: 20 20 20 20 4d 61 6b 65 49 64 78 4b 65 79 20 20      MakeIdxKey  
bee0: 20 20 31 20 20 20 20 20 20 30 20 20 20 20 20 20    1      0      
bef0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 20 20 20 0a 32 32 20 20 20 20 49 64 78 50 75 74     .22    IdxPut
bf20: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 30          1      0
bf30: 20 20 20 20 20 20 69 6e 64 65 78 65 64 20 63 6f        indexed co
bf40: 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e  lumns are not un
bf50: 69 71 75 65 20 20 20 20 20 0a 32 33 20 20 20 20  ique     .23    
bf60: 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 32 20  Next          2 
bf70: 20 20 20 20 20 31 39 20 20 20 20 20 20 20 20 20       19         
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 0a 32 34 20 20 20 20 43 6c 6f 73 65      .24    Close
bfb0: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
bfc0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 20 20 20 20 20 20 20 20 0a 32 35 20 20 20            .25   
bff0: 20 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20 31   Close         1
c000: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 0a 32 36 20 20 20 20 49 6e 74 65 67 65 72 20 20  .26    Integer  
c040: 20 20 20 20 20 33 33 33 20 20 20 20 30 20 20 20       333    0   
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 20 20 20 0a 32 37 20 20 20 20 53 65 74        .27    Set
c080: 43 6f 6f 6b 69 65 20 20 20 20 20 30 20 20 20 20  Cookie     0    
c090: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 38 20              .28 
c0c0: 20 20 20 43 6c 6f 73 65 20 20 20 20 20 20 20 20     Close        
c0d0: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 0a 32 39 20 20 20 20 43 6f 6d 6d 69 74 20    .29    Commit 
c110: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 20 20 20 20 20 20 0a 33 30 20 20 20 20 48          .30    H
c150: 61 6c 74 20 20 20 20 20 20 20 20 20 20 30 20 20  alt          0  
c160: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d                .}
c190: 0a 0a 70 75 74 73 20 7b 0a 3c 70 3e 52 65 6d 65  ..puts {.<p>Reme
c1a0: 6d 62 65 72 20 74 68 61 74 20 65 76 65 72 79 20  mber that every 
c1b0: 74 61 62 6c 65 20 28 65 78 63 65 70 74 20 73 71  table (except sq
c1c0: 6c 69 74 65 5f 6d 61 73 74 65 72 29 20 61 6e 64  lite_master) and
c1d0: 20 65 76 65 72 79 20 6e 61 6d 65 64 0a 69 6e 64   every named.ind
c1e0: 65 78 20 68 61 73 20 61 6e 20 65 6e 74 72 79 20  ex has an entry 
c1f0: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
c200: 73 74 65 72 20 74 61 62 6c 65 2e 20 20 53 69 6e  ster table.  Sin
c210: 63 65 20 77 65 20 61 72 65 20 63 72 65 61 74 69  ce we are creati
c220: 6e 67 0a 61 20 6e 65 77 20 69 6e 64 65 78 2c 20  ng.a new index, 
c230: 77 65 20 68 61 76 65 20 74 6f 20 61 64 64 20 61  we have to add a
c240: 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 73 71   new entry to sq
c250: 6c 69 74 65 5f 6d 61 73 74 65 72 2e 20 20 54 68  lite_master.  Th
c260: 69 73 20 69 73 0a 68 61 6e 64 6c 65 64 20 62 79  is is.handled by
c270: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 33 20   instructions 3 
c280: 74 68 72 6f 75 67 68 20 31 35 2e 20 20 41 64 64  through 15.  Add
c290: 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  ing an entry to 
c2a0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 77 6f  sqlite_master.wo
c2b0: 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 61 6e  rks just like an
c2c0: 79 20 6f 74 68 65 72 20 49 4e 53 45 52 54 20 73  y other INSERT s
c2d0: 74 61 74 65 6d 65 6e 74 20 73 6f 20 77 65 20 77  tatement so we w
c2e0: 69 6c 6c 20 6e 6f 74 20 73 61 79 20 61 6e 79 6d  ill not say anym
c2f0: 6f 72 65 0a 61 62 6f 75 74 20 69 74 20 68 65 72  ore.about it her
c300: 65 2e 20 20 49 6e 20 74 68 69 73 20 65 78 61 6d  e.  In this exam
c310: 70 6c 65 2c 20 77 65 20 77 61 6e 74 20 74 6f 20  ple, we want to 
c320: 66 6f 63 75 73 20 6f 6e 20 70 6f 70 75 6c 61 74  focus on populat
c330: 69 6e 67 20 74 68 65 0a 6e 65 77 20 69 6e 64 65  ing the.new inde
c340: 78 20 77 69 74 68 20 76 61 6c 69 64 20 64 61 74  x with valid dat
c350: 61 2c 20 77 68 69 63 68 20 68 61 70 70 65 6e 73  a, which happens
c360: 20 6f 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   on instructions
c370: 20 31 36 20 74 68 72 6f 75 67 68 20 0a 32 33 2e   16 through .23.
c380: 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 31  </p>.}..Code {.1
c390: 36 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20  6    Integer    
c3a0: 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 20 0a 31 37 20 20 20 20 4f 70 65 6e 52      .17    OpenR
c3e0: 65 61 64 20 20 20 20 20 20 32 20 20 20 20 20 20  ead      2      
c3f0: 33 20 20 20 20 20 20 65 78 61 6d 70 20 20 20 20  3      examp    
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 70 75 74            .}.put
c420: 73 20 7b 0a 3c 70 3e 54 68 65 20 66 69 72 73 74  s {.<p>The first
c430: 20 74 68 69 6e 67 20 74 68 61 74 20 68 61 70 70   thing that happ
c440: 65 6e 73 20 69 73 20 74 68 61 74 20 77 65 20 6f  ens is that we o
c450: 70 65 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65  pen the table be
c460: 69 6e 67 0a 69 6e 64 65 78 65 64 20 66 6f 72 20  ing.indexed for 
c470: 72 65 61 64 69 6e 67 2e 20 20 49 6e 20 6f 72 64  reading.  In ord
c480: 65 72 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  er to construct 
c490: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 74  an index for a t
c4a0: 61 62 6c 65 2c 0a 77 65 20 68 61 76 65 20 74 6f  able,.we have to
c4b0: 20 6b 6e 6f 77 20 77 68 61 74 20 69 73 20 69 6e   know what is in
c4c0: 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68   that table.  Th
c4d0: 65 20 69 6e 64 65 78 20 68 61 73 20 61 6c 72 65  e index has alre
c4e0: 61 64 79 20 62 65 65 6e 20 0a 6f 70 65 6e 65 64  ady been .opened
c4f0: 20 66 6f 72 20 77 72 69 74 69 6e 67 20 75 73 69   for writing usi
c500: 6e 67 20 63 75 72 73 6f 72 20 30 20 62 79 20 69  ng cursor 0 by i
c510: 6e 73 74 72 75 63 74 69 6f 6e 73 20 33 20 61 6e  nstructions 3 an
c520: 64 20 34 2e 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65  d 4.</p>.}..Code
c530: 20 7b 0a 31 38 20 20 20 20 52 65 77 69 6e 64 20   {.18    Rewind 
c540: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 32 34         2      24
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 39               .19
c580: 20 20 20 20 52 65 63 6e 6f 20 20 20 20 20 20 20      Recno       
c590: 20 20 32 20 20 20 20 20 20 30 20 20 20 20 20 20    2      0      
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5c0: 20 20 20 0a 32 30 20 20 20 20 43 6f 6c 75 6d 6e     .20    Column
c5d0: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 31          2      1
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c600: 20 20 20 20 20 20 20 20 20 0a 32 31 20 20 20 20           .21    
c610: 4d 61 6b 65 49 64 78 4b 65 79 20 20 20 20 31 20  MakeIdxKey    1 
c620: 20 20 20 20 20 30 20 20 20 20 20 20 6e 20 20 20       0      n   
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
c650: 32 32 20 20 20 20 49 64 78 50 75 74 20 20 20 20  22    IdxPut    
c660: 20 20 20 20 31 20 20 20 20 20 20 30 20 20 20 20      1      0    
c670: 20 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e    indexed column
c680: 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65  s are not unique
c690: 20 20 20 20 20 0a 32 33 20 20 20 20 4e 65 78 74       .23    Next
c6a0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
c6b0: 20 31 39 20 20 20 20 20 20 20 20 20 20 20 20 20   19             
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 0a 7d 0a 70 75 74 73 20 7b 0a 3c 70 3e 49 6e 73  .}.puts {.<p>Ins
c6f0: 74 72 75 63 74 69 6f 6e 73 20 31 38 20 74 68 72  tructions 18 thr
c700: 6f 75 67 68 20 32 33 20 69 6d 70 6c 65 6d 65 6e  ough 23 implemen
c710: 74 20 61 20 6c 6f 6f 70 20 6f 76 65 72 20 65 76  t a loop over ev
c720: 65 72 79 20 72 6f 77 20 6f 66 20 74 68 65 20 0a  ery row of the .
c730: 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
c740: 78 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 74  xed.  For each t
c750: 61 62 6c 65 20 72 6f 77 2c 20 77 65 20 66 69 72  able row, we fir
c760: 73 74 20 65 78 74 72 61 63 74 20 74 68 65 20 69  st extract the i
c770: 6e 74 65 67 65 72 20 0a 6b 65 79 20 66 6f 72 20  nteger .key for 
c780: 74 68 61 74 20 72 6f 77 20 75 73 69 6e 67 20 52  that row using R
c790: 65 63 6e 6f 20 69 6e 20 69 6e 73 74 72 75 63 74  ecno in instruct
c7a0: 69 6f 6e 20 31 39 2c 20 74 68 65 6e 20 67 65 74  ion 19, then get
c7b0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 74   the value of .t
c7c0: 68 65 20 22 74 77 6f 22 20 63 6f 6c 75 6d 6e 20  he "two" column 
c7d0: 75 73 69 6e 67 20 43 6f 6c 75 6d 6e 20 69 6e 20  using Column in 
c7e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 32 30 2e 20  instruction 20. 
c7f0: 20 0a 54 68 65 20 3c 61 20 68 72 65 66 3d 22 6f   .The <a href="o
c800: 70 63 6f 64 65 2e 68 74 6d 6c 23 4d 61 6b 65 49  pcode.html#MakeI
c810: 64 78 4b 65 79 22 3e 4d 61 6b 65 49 64 78 4b 65  dxKey">MakeIdxKe
c820: 79 3c 2f 61 3e 20 69 6e 73 74 72 75 63 74 69 6f  y</a> instructio
c830: 6e 20 61 74 20 32 31 20 0a 63 6f 6e 76 65 72 74  n at 21 .convert
c840: 73 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  s data from the 
c850: 22 74 77 6f 22 20 63 6f 6c 75 6d 6e 20 28 77 68  "two" column (wh
c860: 69 63 68 20 69 73 20 6f 6e 20 74 68 65 20 74 6f  ich is on the to
c870: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 29 20  p of the stack) 
c880: 0a 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 69 6e  .into a valid in
c890: 64 65 78 20 6b 65 79 2e 20 20 46 6f 72 20 61 6e  dex key.  For an
c8a0: 20 69 6e 64 65 78 20 6f 6e 20 61 20 73 69 6e 67   index on a sing
c8b0: 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 69 73 20  le column, this 
c8c0: 69 73 20 0a 62 61 73 69 63 61 6c 6c 79 20 61 20  is .basically a 
c8d0: 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 69 66 20 74  no-op.  But if t
c8e0: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 74 6f  he P1 operand to
c8f0: 20 4d 61 6b 65 49 64 78 4b 65 79 20 68 61 64 20   MakeIdxKey had 
c900: 62 65 65 6e 20 0a 67 72 65 61 74 65 72 20 74 68  been .greater th
c910: 61 6e 20 6f 6e 65 20 6d 75 6c 74 69 70 6c 65 20  an one multiple 
c920: 65 6e 74 72 69 65 73 20 77 6f 75 6c 64 20 68 61  entries would ha
c930: 76 65 20 62 65 65 6e 20 70 6f 70 70 65 64 20 66  ve been popped f
c940: 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 0a 61  rom the stack .a
c950: 6e 64 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  nd converted int
c960: 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  o a single index
c970: 20 6b 65 79 2e 20 20 0a 54 68 65 20 3c 61 20 68   key.  .The <a h
c980: 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74 6d 6c  ref="opcode.html
c990: 23 49 64 78 50 75 74 22 3e 49 64 78 50 75 74 3c  #IdxPut">IdxPut<
c9a0: 2f 61 3e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  /a> instruction 
c9b0: 61 74 20 32 32 20 69 73 20 77 68 61 74 20 0a 61  at 22 is what .a
c9c0: 63 74 75 61 6c 6c 79 20 63 72 65 61 74 65 73 20  ctually creates 
c9d0: 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
c9e0: 20 20 49 64 78 50 75 74 20 70 6f 70 73 20 74 77    IdxPut pops tw
c9f0: 6f 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20  o elements from 
ca00: 74 68 65 20 0a 73 74 61 63 6b 2e 20 20 54 68 65  the .stack.  The
ca10: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
ca20: 6b 20 69 73 20 75 73 65 64 20 61 73 20 61 20 6b  k is used as a k
ca30: 65 79 20 74 6f 20 66 65 74 63 68 20 61 6e 20 65  ey to fetch an e
ca40: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 0a 69  ntry from the .i
ca50: 6e 64 65 78 20 74 61 62 6c 65 2e 20 20 54 68 65  ndex table.  The
ca60: 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 68  n the integer wh
ca70: 69 63 68 20 77 61 73 20 73 65 63 6f 6e 64 20 6f  ich was second o
ca80: 6e 20 73 74 61 63 6b 20 69 73 20 61 64 64 65 64  n stack is added
ca90: 20 74 6f 20 74 68 65 20 0a 73 65 74 20 6f 66 20   to the .set of 
caa0: 69 6e 74 65 67 65 72 73 20 66 6f 72 20 74 68 61  integers for tha
cab0: 74 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20  t index and the 
cac0: 6e 65 77 20 72 65 63 6f 72 64 20 69 73 20 77 72  new record is wr
cad0: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
cae0: 65 20 0a 64 61 74 61 62 61 73 65 20 66 69 6c 65  e .database file
caf0: 2e 20 20 4e 6f 74 65 0a 74 68 61 74 20 74 68 65  .  Note.that the
cb00: 20 73 61 6d 65 20 69 6e 64 65 78 20 65 6e 74 72   same index entr
cb10: 79 20 63 61 6e 20 73 74 6f 72 65 20 6d 75 6c 74  y can store mult
cb20: 69 70 6c 65 20 69 6e 74 65 67 65 72 73 20 69 66  iple integers if
cb30: 20 74 68 65 72 65 0a 61 72 65 20 74 77 6f 20 6f   there.are two o
cb40: 72 20 6d 6f 72 65 20 74 61 62 6c 65 20 65 6e 74  r more table ent
cb50: 72 69 65 73 20 77 69 74 68 20 74 68 65 20 73 61  ries with the sa
cb60: 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  me value for the
cb70: 20 74 77 6f 0a 63 6f 6c 75 6d 6e 2e 0a 3c 2f 70   two.column..</p
cb80: 3e 0a 0a 3c 70 3e 4e 6f 77 20 6c 65 74 27 73 20  >..<p>Now let's 
cb90: 6c 6f 6f 6b 20 61 74 20 68 6f 77 20 74 68 69 73  look at how this
cba0: 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75   index will be u
cbb0: 73 65 64 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  sed.  Consider t
cbc0: 68 65 0a 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he.following que
cbd0: 72 79 3a 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63 6b 71  ry:</p>..<blockq
cbe0: 75 6f 74 65 3e 3c 70 72 65 3e 0a 53 45 4c 45 43  uote><pre>.SELEC
cbf0: 54 20 2a 20 46 52 4f 4d 20 65 78 61 6d 70 20 57  T * FROM examp W
cc00: 48 45 52 45 20 74 77 6f 3d 3d 35 30 3b 0a 3c 2f  HERE two==50;.</
cc10: 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65  pre></blockquote
cc20: 3e 0a 0a 3c 70 3e 53 51 4c 69 74 65 20 67 65 6e  >..<p>SQLite gen
cc30: 65 72 61 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f  erates the follo
cc40: 77 69 6e 67 20 56 44 42 45 20 63 6f 64 65 20 74  wing VDBE code t
cc50: 6f 20 68 61 6e 64 6c 65 20 74 68 69 73 20 71 75  o handle this qu
cc60: 65 72 79 3a 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65  ery:</p>.}..Code
cc70: 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f 64 65 20   {.addr  opcode 
cc80: 20 20 20 20 20 20 20 70 31 20 20 20 20 20 70 32         p1     p2
cc90: 20 20 20 20 20 70 33 20 20 20 20 20 20 20 20 20       p3         
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 2d 2d               .--
ccc0: 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
ccd0: 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20    -----  -----  
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd00: 2d 2d 2d 0a 30 20 20 20 20 20 43 6f 6c 75 6d 6e  ---.0     Column
cd10: 4e 61 6d 65 20 20 20 20 30 20 20 20 20 20 20 30  Name    0      0
cd20: 20 20 20 20 20 20 6f 6e 65 20 20 20 20 20 20 20        one       
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 20 20 20 20 20 20 20 0a 31 20 20 20 20 20           .1     
cd50: 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20 31 20  ColumnName    1 
cd60: 20 20 20 20 20 30 20 20 20 20 20 20 74 77 6f 20       0      two 
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
cd90: 32 20 20 20 20 20 49 6e 74 65 67 65 72 20 20 20  2     Integer   
cda0: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdd0: 20 20 20 20 20 0a 33 20 20 20 20 20 4f 70 65 6e       .3     Open
cde0: 52 65 61 64 20 20 20 20 20 20 30 20 20 20 20 20  Read      0     
cdf0: 20 33 20 20 20 20 20 20 65 78 61 6d 70 20 20 20   3      examp   
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 20 20 20 20 20 20 20 20 0a 34 20 20 20             .4   
ce20: 20 20 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 20    VerifyCookie  
ce30: 30 20 20 20 20 20 20 32 35 36 20 20 20 20 20 20  0      256      
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 20 20 20 20 20 20 0a 35 20 20 20 20 20 49 6e 74        .5     Int
ce70: 65 67 65 72 20 20 20 20 20 20 20 30 20 20 20 20  eger       0    
ce80: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 36 20 20              .6  
ceb0: 20 20 20 4f 70 65 6e 52 65 61 64 20 20 20 20 20     OpenRead     
cec0: 20 31 20 20 20 20 20 20 34 20 20 20 20 20 20 65   1      4      e
ced0: 78 61 6d 70 5f 69 64 78 31 20 20 20 20 20 20 20  xamp_idx1       
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cef0: 20 20 0a 37 20 20 20 20 20 49 6e 74 65 67 65 72    .7     Integer
cf00: 20 20 20 20 20 20 20 35 30 20 20 20 20 20 30 20         50     0 
cf10: 20 20 20 20 20 35 30 20 20 20 20 20 20 20 20 20       50         
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 0a 38 20 20 20 20 20 4d 61 6b 65 4b 65     .8     MakeKe
cf40: 79 20 20 20 20 20 20 20 31 20 20 20 20 20 20 30  y       1      0
cf50: 20 20 20 20 20 20 6e 20 20 20 20 20 20 20 20 20        n         
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 20 20 20 20 20 20 0a 39 20 20 20 20 20           .9     
cf80: 4d 65 6d 53 74 6f 72 65 20 20 20 20 20 20 30 20  MemStore      0 
cf90: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
cfc0: 31 30 20 20 20 20 4d 6f 76 65 54 6f 20 20 20 20  10    MoveTo    
cfd0: 20 20 20 20 31 20 20 20 20 20 20 31 39 20 20 20      1      19   
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 20 20 20 20 20 20 20 0a 31 31 20 20 20            .11   
d010: 20 4d 65 6d 4c 6f 61 64 20 20 20 20 20 20 20 30   MemLoad       0
d020: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 0a 31 32 20 20 20 20 49 64 78 47 54 20 20 20 20  .12    IdxGT    
d060: 20 20 20 20 20 31 20 20 20 20 20 20 31 39 20 20       1      19  
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d090: 20 20 20 20 20 20 20 20 20 20 20 0a 31 33 20 20             .13  
d0a0: 20 20 49 64 78 52 65 63 6e 6f 20 20 20 20 20 20    IdxRecno      
d0b0: 31 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  1      0        
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 0a 31 34 20 20 20 20 4d 6f 76 65 54 6f 20 20   .14    MoveTo  
d0f0: 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0a 31 35 20 20 20 20 43 6f         .15    Co
d130: 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20  lumn        0   
d140: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 36               .16
d170: 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20      Column      
d180: 20 20 30 20 20 20 20 20 20 31 20 20 20 20 20 20    0      1      
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 0a 31 37 20 20 20 20 43 61 6c 6c 62 61     .17    Callba
d1c0: 63 6b 20 20 20 20 20 20 32 20 20 20 20 20 20 30  ck      2      0
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 20 20 20 20 0a 31 38 20 20 20 20           .18    
d200: 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 31 20  Next          1 
d210: 20 20 20 20 20 31 31 20 20 20 20 20 20 20 20 20       11         
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
d240: 31 39 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20  19    Close     
d250: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 20 20 0a 32 30 20 20 20 20 43 6c 6f 73       .20    Clos
d290: 65 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20  e         1     
d2a0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 20 20 20 20 20 20 0a 32 31 20 20             .21  
d2d0: 20 20 48 61 6c 74 20 20 20 20 20 20 20 20 20 20    Halt          
d2e0: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 0a 7d 0a 0a 70 75 74 73 20 7b 0a 3c 70 3e 54   .}..puts {.<p>T
d320: 68 65 20 53 45 4c 45 43 54 20 62 65 67 69 6e 73  he SELECT begins
d330: 20 69 6e 20 61 20 66 61 6d 69 6c 69 61 72 20 66   in a familiar f
d340: 61 73 68 69 6f 6e 2e 20 20 46 69 72 73 74 20 74  ashion.  First t
d350: 68 65 20 63 6f 6c 75 6d 6e 0a 6e 61 6d 65 73 20  he column.names 
d360: 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
d370: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 62 65  and the table be
d380: 69 6e 67 20 71 75 65 72 69 65 64 20 69 73 20 6f  ing queried is o
d390: 70 65 6e 65 64 2e 0a 54 68 69 6e 67 73 20 62 65  pened..Things be
d3a0: 63 6f 6d 65 20 64 69 66 66 65 72 65 6e 74 20 62  come different b
d3b0: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 69 6e  eginning with in
d3c0: 73 74 72 75 63 74 69 6f 6e 73 20 35 20 61 6e 64  structions 5 and
d3d0: 20 36 20 77 68 65 72 65 0a 74 68 65 20 69 6e 64   6 where.the ind
d3e0: 65 78 20 66 69 6c 65 20 69 73 20 61 6c 73 6f 20  ex file is also 
d3f0: 6f 70 65 6e 65 64 2e 20 20 49 6e 73 74 72 75 63  opened.  Instruc
d400: 74 69 6f 6e 73 20 37 20 61 6e 64 20 38 20 6d 61  tions 7 and 8 ma
d410: 6b 65 0a 61 20 6b 65 79 20 77 69 74 68 20 74 68  ke.a key with th
d420: 65 20 76 61 6c 75 65 20 6f 66 20 35 30 2e 20 20  e value of 50.  
d430: 0a 54 68 65 20 3c 61 20 68 72 65 66 3d 22 6f 70  .The <a href="op
d440: 63 6f 64 65 2e 68 74 6d 6c 23 4d 65 6d 53 74 6f  code.html#MemSto
d450: 72 65 22 3e 4d 65 6d 53 74 6f 72 65 3c 2f 61 3e  re">MemStore</a>
d460: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20   instruction at 
d470: 39 20 73 74 6f 72 65 73 20 0a 74 68 65 20 69 6e  9 stores .the in
d480: 64 65 78 20 6b 65 79 20 69 6e 20 56 44 42 45 20  dex key in VDBE 
d490: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
d4a0: 30 2e 20 20 54 68 65 20 56 44 42 45 20 6d 65 6d  0.  The VDBE mem
d4b0: 6f 72 79 20 69 73 20 75 73 65 64 20 74 6f 20 0a  ory is used to .
d4c0: 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20  avoid having to 
d4d0: 66 65 74 63 68 20 61 20 76 61 6c 75 65 20 66 72  fetch a value fr
d4e0: 6f 6d 20 64 65 65 70 20 69 6e 20 74 68 65 20 73  om deep in the s
d4f0: 74 61 63 6b 2c 20 77 68 69 63 68 20 63 61 6e 20  tack, which can 
d500: 62 65 20 64 6f 6e 65 2c 0a 62 75 74 20 6d 61 6b  be done,.but mak
d510: 65 73 20 74 68 65 20 70 72 6f 67 72 61 6d 20 68  es the program h
d520: 61 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74  arder to generat
d530: 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  e.  The followin
d540: 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 3c  g instruction .<
d550: 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68  a href="opcode.h
d560: 74 6d 6c 23 4d 6f 76 65 54 6f 22 3e 4d 6f 76 65  tml#MoveTo">Move
d570: 54 6f 3c 2f 61 3e 20 61 74 20 61 64 64 72 65 73  To</a> at addres
d580: 73 20 31 30 20 70 6f 70 73 20 74 68 65 20 6b 65  s 10 pops the ke
d590: 79 20 6f 66 66 20 0a 74 68 65 20 73 74 61 63 6b  y off .the stack
d5a0: 20 61 6e 64 20 6d 6f 76 65 73 20 74 68 65 20 69   and moves the i
d5b0: 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74  ndex cursor to t
d5c0: 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  he first row of 
d5d0: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 0a  the index with .
d5e0: 74 68 61 74 20 6b 65 79 2e 20 20 54 68 69 73 20  that key.  This 
d5f0: 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
d600: 63 75 72 73 6f 72 20 66 6f 72 20 75 73 65 20 69  cursor for use i
d610: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
d620: 6c 6f 6f 70 2e 3c 2f 70 3e 0a 0a 3c 70 3e 49 6e  loop.</p>..<p>In
d630: 73 74 72 75 63 74 69 6f 6e 73 20 31 31 20 74 68  structions 11 th
d640: 72 6f 75 67 68 20 31 38 20 69 6d 70 6c 65 6d 65  rough 18 impleme
d650: 6e 74 20 61 20 6c 6f 6f 70 20 6f 76 65 72 20 61  nt a loop over a
d660: 6c 6c 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  ll index records
d670: 20 0a 77 69 74 68 20 74 68 65 20 6b 65 79 20 74   .with the key t
d680: 68 61 74 20 77 61 73 20 66 65 74 63 68 65 64 20  hat was fetched 
d690: 62 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 38  by instruction 8
d6a0: 2e 20 20 41 6c 6c 20 6f 66 20 74 68 65 20 69 6e  .  All of the in
d6b0: 64 65 78 20 0a 72 65 63 6f 72 64 73 20 77 69 74  dex .records wit
d6c0: 68 20 74 68 69 73 20 6b 65 79 20 77 69 6c 6c 20  h this key will 
d6d0: 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 69 6e  be contiguous in
d6e0: 20 74 68 65 20 69 6e 64 65 78 20 74 61 62 6c 65   the index table
d6f0: 2c 20 73 6f 20 77 65 20 77 61 6c 6b 20 0a 74 68  , so we walk .th
d700: 72 6f 75 67 68 20 74 68 65 6d 20 61 6e 64 20 66  rough them and f
d710: 65 74 63 68 20 74 68 65 20 63 6f 72 72 65 73 70  etch the corresp
d720: 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 6b 65 79  onding table key
d730: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e   from the index.
d740: 20 20 0a 54 68 69 73 20 74 61 62 6c 65 20 6b 65    .This table ke
d750: 79 20 69 73 20 74 68 65 6e 20 75 73 65 64 20 74  y is then used t
d760: 6f 20 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  o move the curso
d770: 72 20 74 6f 20 74 68 61 74 20 72 6f 77 20 69 6e  r to that row in
d780: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 0a 54 68   the table.  .Th
d790: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6c 6f  e rest of the lo
d7a0: 6f 70 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  op is the same a
d7b0: 73 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 74  s the loop for t
d7c0: 68 65 20 6e 6f 6e 2d 69 6e 64 65 78 65 64 20 53  he non-indexed S
d7d0: 45 4c 45 43 54 20 0a 71 75 65 72 79 2e 3c 2f 70  ELECT .query.</p
d7e0: 3e 0a 0a 3c 70 3e 54 68 65 20 6c 6f 6f 70 20 62  >..<p>The loop b
d7f0: 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 3c  egins with the <
d800: 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68  a href="opcode.h
d810: 74 6d 6c 23 4d 65 6d 4c 6f 61 64 22 3e 4d 65 6d  tml#MemLoad">Mem
d820: 4c 6f 61 64 3c 2f 61 3e 20 0a 69 6e 73 74 72 75  Load</a> .instru
d830: 63 74 69 6f 6e 20 61 74 20 31 31 20 77 68 69 63  ction at 11 whic
d840: 68 20 70 75 73 68 65 73 20 61 20 63 6f 70 79 20  h pushes a copy 
d850: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  of the index key
d860: 20 62 61 63 6b 20 6f 6e 74 6f 20 74 68 65 20 0a   back onto the .
d870: 73 74 61 63 6b 2e 20 20 54 68 65 20 69 6e 73 74  stack.  The inst
d880: 72 75 63 74 69 6f 6e 20 3c 61 20 68 72 65 66 3d  ruction <a href=
d890: 22 6f 70 63 6f 64 65 2e 68 74 6d 6c 23 49 64 78  "opcode.html#Idx
d8a0: 47 54 22 3e 49 64 78 47 54 3c 2f 61 3e 20 61 74  GT">IdxGT</a> at
d8b0: 20 31 32 20 0a 63 6f 6d 70 61 72 65 73 20 74 68   12 .compares th
d8c0: 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6b 65 79  e key to the key
d8d0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
d8e0: 69 6e 64 65 78 20 72 65 63 6f 72 64 20 70 6f 69  index record poi
d8f0: 6e 74 65 64 20 74 6f 20 62 79 20 0a 63 75 72 73  nted to by .curs
d900: 6f 72 20 50 31 2e 20 20 49 66 20 74 68 65 20 69  or P1.  If the i
d910: 6e 64 65 78 20 6b 65 79 20 61 74 20 74 68 65 20  ndex key at the 
d920: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6c  current cursor l
d930: 6f 63 61 74 69 6f 6e 20 69 73 20 67 72 65 61 74  ocation is great
d940: 65 72 20 0a 74 68 61 6e 20 74 68 65 20 74 68 65  er .than the the
d950: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 6c 6f   index we are lo
d960: 6f 6b 69 6e 67 20 66 6f 72 2c 20 74 68 65 6e 20  oking for, then 
d970: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
d980: 6c 6f 6f 70 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68  loop.</p>..<p>Th
d990: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3c 61  e instruction <a
d9a0: 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68 74   href="opcode.ht
d9b0: 6d 6c 23 49 64 78 52 65 63 6e 6f 22 3e 49 64 78  ml#IdxRecno">Idx
d9c0: 52 65 63 6e 6f 3c 2f 61 3e 20 61 74 20 31 33 20  Recno</a> at 13 
d9d0: 0a 70 75 73 68 65 73 20 6f 6e 74 6f 20 74 68 65  .pushes onto the
d9e0: 20 73 74 61 63 6b 20 74 68 65 20 74 61 62 6c 65   stack the table
d9f0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
da00: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 20  rom the index.  
da10: 54 68 65 20 0a 66 6f 6c 6c 6f 77 69 6e 67 20 4d  The .following M
da20: 6f 76 65 54 6f 20 70 6f 70 73 20 69 74 20 61 6e  oveTo pops it an
da30: 64 20 6d 6f 76 65 73 20 74 68 65 20 74 61 62 6c  d moves the tabl
da40: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 61 74  e cursor to that
da50: 20 72 6f 77 2e 20 20 54 68 65 20 0a 6e 65 78 74   row.  The .next
da60: 20 33 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20   3 instructions 
da70: 73 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  select the colum
da80: 6e 20 64 61 74 61 20 74 68 65 20 73 61 6d 65 20  n data the same 
da90: 77 61 79 20 61 73 20 69 6e 20 74 68 65 20 6e 6f  way as in the no
daa0: 6e 2d 0a 69 6e 64 65 78 65 64 20 63 61 73 65 2e  n-.indexed case.
dab0: 20 54 68 65 20 43 6f 6c 75 6d 6e 20 69 6e 73 74   The Column inst
dac0: 72 75 63 74 69 6f 6e 73 20 66 65 74 63 68 20 74  ructions fetch t
dad0: 68 65 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 61  he column data a
dae0: 6e 64 20 74 68 65 20 0a 63 61 6c 6c 62 61 63 6b  nd the .callback
daf0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
db00: 6f 6b 65 64 2e 20 20 54 68 65 20 66 69 6e 61 6c  oked.  The final
db10: 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   Next instructio
db20: 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 0a  n advances the .
db30: 69 6e 64 65 78 20 63 75 72 73 6f 72 2c 20 6e 6f  index cursor, no
db40: 74 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  t the table curs
db50: 6f 72 2c 20 74 6f 20 74 68 65 20 6e 65 78 74 20  or, to the next 
db60: 72 6f 77 2c 20 61 6e 64 20 74 68 65 6e 20 62 72  row, and then br
db70: 61 6e 63 68 65 73 20 0a 62 61 63 6b 20 74 6f 20  anches .back to 
db80: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
db90: 20 6c 6f 6f 70 20 69 66 20 74 68 65 72 65 20 61   loop if there a
dba0: 72 65 20 61 6e 79 20 69 6e 64 65 78 20 72 65 63  re any index rec
dbb0: 6f 72 64 73 20 6c 65 66 74 2e 3c 2f 70 3e 0a 0a  ords left.</p>..
dbc0: 3c 70 3e 53 69 6e 63 65 20 74 68 65 20 69 6e 64  <p>Since the ind
dbd0: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  ex is used to lo
dbe0: 6f 6b 20 75 70 20 76 61 6c 75 65 73 20 69 6e 20  ok up values in 
dbf0: 74 68 65 20 74 61 62 6c 65 2c 0a 69 74 20 69 73  the table,.it is
dc00: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
dc10: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
dc20: 62 6c 65 20 62 65 20 6b 65 70 74 20 63 6f 6e 73  ble be kept cons
dc30: 69 73 74 65 6e 74 2e 0a 4e 6f 77 20 74 68 61 74  istent..Now that
dc40: 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
dc50: 65 78 20 6f 6e 20 74 68 65 20 65 78 61 6d 70 20  ex on the examp 
dc60: 74 61 62 6c 65 2c 20 77 65 20 77 69 6c 6c 20 68  table, we will h
dc70: 61 76 65 0a 74 6f 20 75 70 64 61 74 65 20 74 68  ave.to update th
dc80: 61 74 20 69 6e 64 65 78 20 77 68 65 6e 65 76 65  at index wheneve
dc90: 72 20 64 61 74 61 20 69 73 20 69 6e 73 65 72 74  r data is insert
dca0: 65 64 2c 20 64 65 6c 65 74 65 64 2c 20 6f 72 0a  ed, deleted, or.
dcb0: 63 68 61 6e 67 65 64 20 69 6e 20 74 68 65 20 65  changed in the e
dcc0: 78 61 6d 70 20 74 61 62 6c 65 2e 20 20 52 65 6d  xamp table.  Rem
dcd0: 65 6d 62 65 72 20 74 68 65 20 66 69 72 73 74 20  ember the first 
dce0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 0a 77 68  example above.wh
dcf0: 65 72 65 20 77 65 20 77 65 72 65 20 61 62 6c 65  ere we were able
dd00: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
dd10: 20 72 6f 77 20 69 6e 74 6f 20 74 68 65 20 22 65   row into the "e
dd20: 78 61 6d 70 22 20 74 61 62 6c 65 20 75 73 69 6e  xamp" table usin
dd30: 67 0a 31 32 20 56 44 42 45 20 69 6e 73 74 72 75  g.12 VDBE instru
dd40: 63 74 69 6f 6e 73 2e 20 20 4e 6f 77 20 74 68 61  ctions.  Now tha
dd50: 74 20 74 68 69 73 20 74 61 62 6c 65 20 69 73 20  t this table is 
dd60: 69 6e 64 65 78 65 64 2c 20 31 39 0a 69 6e 73 74  indexed, 19.inst
dd70: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 72 65 71  ructions are req
dd80: 75 69 72 65 64 2e 20 20 54 68 65 20 53 51 4c 20  uired.  The SQL 
dd90: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 69  statement is thi
dda0: 73 3a 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63 6b 71 75  s:</p>..<blockqu
ddb0: 6f 74 65 3e 3c 70 72 65 3e 0a 49 4e 53 45 52 54  ote><pre>.INSERT
ddc0: 20 49 4e 54 4f 20 65 78 61 6d 70 20 56 41 4c 55   INTO examp VALU
ddd0: 45 53 28 27 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64  ES('Hello, World
dde0: 21 27 2c 39 39 29 3b 0a 3c 2f 70 72 65 3e 3c 2f  !',99);.</pre></
ddf0: 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e  blockquote>..<p>
de00: 41 6e 64 20 74 68 65 20 67 65 6e 65 72 61 74 65  And the generate
de10: 64 20 63 6f 64 65 20 6c 6f 6f 6b 73 20 6c 69 6b  d code looks lik
de20: 65 20 74 68 69 73 3a 3c 2f 70 3e 0a 7d 0a 0a 43  e this:</p>.}..C
de30: 6f 64 65 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f  ode {.addr  opco
de40: 64 65 20 20 20 20 20 20 20 20 70 31 20 20 20 20  de        p1    
de50: 20 70 32 20 20 20 20 20 70 33 20 20 20 20 20 20   p2     p3      
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  .----  ---------
de90: 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ---  -----  ----
dea0: 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
deb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dec0: 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20 54 72 61  ------.0     Tra
ded0: 6e 73 61 63 74 69 6f 6e 20 20 20 31 20 20 20 20  nsaction   1    
dee0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 20 20              .1  
df10: 20 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 20     Transaction  
df20: 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 0a 32 20 20 20 20 20 56 65 72 69 66 79 43    .2     VerifyC
df60: 6f 6f 6b 69 65 20 20 30 20 20 20 20 20 20 32 35  ookie  0      25
df70: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 33 20               .3 
dfa0: 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20      Integer     
dfb0: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 20 20 20 0a 34 20 20 20 20 20 4f 70 65 6e 57 72     .4     OpenWr
dff0: 69 74 65 20 20 20 20 20 30 20 20 20 20 20 20 33  ite     0      3
e000: 20 20 20 20 20 20 65 78 61 6d 70 20 20 20 20 20        examp     
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 20 20 0a 35 20 20 20 20 20           .5     
e030: 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 30 20  Integer       0 
e040: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
e070: 36 20 20 20 20 20 4f 70 65 6e 57 72 69 74 65 20  6     OpenWrite 
e080: 20 20 20 20 31 20 20 20 20 20 20 34 20 20 20 20      1      4    
e090: 20 20 65 78 61 6d 70 5f 69 64 78 31 20 20 20 20    examp_idx1    
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 20 20 20 20 0a 37 20 20 20 20 20 4e 65 77 52       .7     NewR
e0c0: 65 63 6e 6f 20 20 20 20 20 20 30 20 20 20 20 20  ecno      0     
e0d0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 20 20 20 20 0a 38 20 20 20             .8   
e100: 20 20 53 74 72 69 6e 67 20 20 20 20 20 20 20 20    String        
e110: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 48 65  0      0      He
e120: 6c 6c 6f 2c 20 57 6f 72 6c 64 21 20 20 20 20 20  llo, World!     
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 0a 39 20 20 20 20 20 49 6e 74 65 67 65 72 20   .9     Integer 
e150: 20 20 20 20 20 20 39 39 20 20 20 20 20 30 20 20        99     0  
e160: 20 20 20 20 39 39 20 20 20 20 20 20 20 20 20 20      99          
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 20 0a 31 30 20 20 20 20 44 75         .10    Du
e190: 70 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20  p           2   
e1a0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 31               .11
e1d0: 20 20 20 20 44 75 70 20 20 20 20 20 20 20 20 20      Dup         
e1e0: 20 20 31 20 20 20 20 20 20 31 20 20 20 20 20 20    1      1      
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 0a 31 32 20 20 20 20 4d 61 6b 65 49 64     .12    MakeId
e220: 78 4b 65 79 20 20 20 20 31 20 20 20 20 20 20 30  xKey    1      0
e230: 20 20 20 20 20 20 6e 20 20 20 20 20 20 20 20 20        n         
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 20 20 20 20 20 20 20 0a 31 33 20 20 20 20           .13    
e260: 49 64 78 50 75 74 20 20 20 20 20 20 20 20 31 20  IdxPut        1 
e270: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
e2a0: 31 34 20 20 20 20 4d 61 6b 65 52 65 63 6f 72 64  14    MakeRecord
e2b0: 20 20 20 20 32 20 20 20 20 20 20 30 20 20 20 20      2      0    
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 20 20 20 0a 31 35 20 20 20 20 50 75 74 49       .15    PutI
e2f0: 6e 74 4b 65 79 20 20 20 20 20 30 20 20 20 20 20  ntKey     0     
e300: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 20 20 20 20 20 20 20 20 20 20 0a 31 36 20 20             .16  
e330: 20 20 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20    Close         
e340: 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 0a 31 37 20 20 20 20 43 6c 6f 73 65 20 20 20   .17    Close   
e380: 20 20 20 20 20 20 31 20 20 20 20 20 20 30 20 20        1      0  
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 20 20 20 20 0a 31 38 20 20 20 20 43 6f         .18    Co
e3c0: 6d 6d 69 74 20 20 20 20 20 20 20 20 30 20 20 20  mmit        0   
e3d0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 39               .19
e400: 20 20 20 20 48 61 6c 74 20 20 20 20 20 20 20 20      Halt        
e410: 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e440: 20 20 20 0a 7d 0a 0a 70 75 74 73 20 7b 0a 3c 70     .}..puts {.<p
e450: 3e 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  >At this point, 
e460: 79 6f 75 20 73 68 6f 75 6c 64 20 75 6e 64 65 72  you should under
e470: 73 74 61 6e 64 20 74 68 65 20 56 44 42 45 20 77  stand the VDBE w
e480: 65 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 0a 66 69  ell enough to.fi
e490: 67 75 72 65 20 6f 75 74 20 6f 6e 20 79 6f 75 72  gure out on your
e4a0: 20 6f 77 6e 20 68 6f 77 20 74 68 65 20 61 62 6f   own how the abo
e4b0: 76 65 20 70 72 6f 67 72 61 6d 20 77 6f 72 6b 73  ve program works
e4c0: 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 6e 6f  .  So we will.no
e4d0: 74 20 64 69 73 63 75 73 73 20 69 74 20 66 75 72  t discuss it fur
e4e0: 74 68 65 72 20 69 6e 20 74 68 69 73 20 74 65 78  ther in this tex
e4f0: 74 2e 3c 2f 70 3e 0a 0a 3c 68 32 3e 4a 6f 69 6e  t.</p>..<h2>Join
e500: 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 49 6e 20 61 20  s</h2>..<p>In a 
e510: 6a 6f 69 6e 2c 20 74 77 6f 20 6f 72 20 6d 6f 72  join, two or mor
e520: 65 20 74 61 62 6c 65 73 20 61 72 65 20 63 6f 6d  e tables are com
e530: 62 69 6e 65 64 20 74 6f 20 67 65 6e 65 72 61 74  bined to generat
e540: 65 20 61 20 73 69 6e 67 6c 65 0a 72 65 73 75 6c  e a single.resul
e550: 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74  t.  The result t
e560: 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  able consists of
e570: 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
e580: 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 6f 66 20 72  combination.of r
e590: 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 74 61 62  ows from the tab
e5a0: 6c 65 73 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64  les being joined
e5b0: 2e 20 20 54 68 65 20 65 61 73 69 65 73 74 20 61  .  The easiest a
e5c0: 6e 64 20 6d 6f 73 74 20 6e 61 74 75 72 61 6c 0a  nd most natural.
e5d0: 77 61 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  way to implement
e5e0: 20 74 68 69 73 20 69 73 20 77 69 74 68 20 6e 65   this is with ne
e5f0: 73 74 65 64 20 6c 6f 6f 70 73 2e 3c 2f 70 3e 0a  sted loops.</p>.
e600: 0a 3c 70 3e 52 65 63 61 6c 6c 20 74 68 65 20 71  .<p>Recall the q
e610: 75 65 72 79 20 74 65 6d 70 6c 61 74 65 20 64 69  uery template di
e620: 73 63 75 73 73 65 64 20 61 62 6f 76 65 20 77 68  scussed above wh
e630: 65 72 65 20 74 68 65 72 65 20 77 61 73 20 61 0a  ere there was a.
e640: 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
e650: 20 73 65 61 72 63 68 65 64 20 74 68 72 6f 75 67   searched throug
e660: 68 20 65 76 65 72 79 20 72 65 63 6f 72 64 20 6f  h every record o
e670: 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 49 6e 20  f the table..In 
e680: 61 20 6a 6f 69 6e 20 77 65 20 68 61 76 65 20 62  a join we have b
e690: 61 73 69 63 61 6c 6c 79 20 74 68 65 20 73 61 6d  asically the sam
e6a0: 65 20 74 68 69 6e 67 20 65 78 63 65 70 74 20 74  e thing except t
e6b0: 68 61 74 20 74 68 65 72 65 0a 61 72 65 20 6e 65  hat there.are ne
e6c0: 73 74 65 64 20 6c 6f 6f 70 73 2e 20 20 46 6f 72  sted loops.  For
e6d0: 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 6a 6f 69   example, to joi
e6e0: 6e 20 74 77 6f 20 74 61 62 6c 65 73 2c 20 74 68  n two tables, th
e6f0: 65 20 71 75 65 72 79 0a 74 65 6d 70 6c 61 74 65  e query.template
e700: 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65   might look some
e710: 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a  thing like this:
e720: 3c 2f 70 3e 0a 0a 3c 70 3e 0a 3c 6f 6c 3e 0a 3c  </p>..<p>.<ol>.<
e730: 6c 69 3e 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  li>Initialize th
e740: 65 20 3c 62 3e 61 7a 43 6f 6c 75 6d 6e 4e 61 6d  e <b>azColumnNam
e750: 65 5b 5d 3c 2f 62 3e 20 61 72 72 61 79 20 66 6f  e[]</b> array fo
e760: 72 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 3c  r the callback.<
e770: 2f 6c 69 3e 0a 3c 6c 69 3e 4f 70 65 6e 20 74 77  /li>.<li>Open tw
e780: 6f 20 63 75 72 73 6f 72 73 2c 20 6f 6e 65 20 74  o cursors, one t
e790: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 20 74 77  o each of the tw
e7a0: 6f 20 74 61 62 6c 65 73 20 62 65 69 6e 67 20 71  o tables being q
e7b0: 75 65 72 69 65 64 2e 3c 2f 6c 69 3e 0a 3c 6c 69  ueried.</li>.<li
e7c0: 3e 46 6f 72 20 65 61 63 68 20 72 65 63 6f 72 64  >For each record
e7d0: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 74 61   in the first ta
e7e0: 62 6c 65 2c 20 64 6f 3a 0a 20 20 20 20 3c 6f 6c  ble, do:.    <ol
e7f0: 20 74 79 70 65 3d 22 61 22 3e 0a 20 20 20 20 3c   type="a">.    <
e800: 6c 69 3e 46 6f 72 20 65 61 63 68 20 72 65 63 6f  li>For each reco
e810: 72 64 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64  rd in the second
e820: 20 74 61 62 6c 65 20 64 6f 3a 0a 20 20 20 20 20   table do:.     
e830: 20 3c 6f 6c 20 74 79 70 65 3d 22 69 22 3e 0a 20   <ol type="i">. 
e840: 20 20 20 20 20 3c 6c 69 3e 49 66 20 74 68 65 20       <li>If the 
e850: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 76 61  WHERE clause eva
e860: 6c 75 61 74 65 73 20 74 6f 20 46 41 4c 53 45 2c  luates to FALSE,
e870: 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 73   then skip the s
e880: 74 65 70 73 20 74 68 61 74 0a 20 20 20 20 20 20  teps that.      
e890: 20 20 20 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 63      follow and c
e8a0: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e  ontinue to the n
e8b0: 65 78 74 20 72 65 63 6f 72 64 2e 3c 2f 6c 69 3e  ext record.</li>
e8c0: 0a 20 20 20 20 20 20 3c 6c 69 3e 43 6f 6d 70 75  .      <li>Compu
e8d0: 74 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66  te all columns f
e8e0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
e8f0: 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
e900: 2e 3c 2f 6c 69 3e 0a 20 20 20 20 20 20 3c 6c 69  .</li>.      <li
e910: 3e 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c  >Invoke the call
e920: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 66 6f  back function fo
e930: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
e940: 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  w of the result.
e950: 3c 2f 6c 69 3e 0a 20 20 20 20 20 20 3c 2f 6f 6c  </li>.      </ol
e960: 3e 3c 2f 6c 69 3e 0a 20 20 20 20 3c 2f 6f 6c 3e  ></li>.    </ol>
e970: 0a 3c 6c 69 3e 43 6c 6f 73 65 20 62 6f 74 68 20  .<li>Close both 
e980: 63 75 72 73 6f 72 73 2e 3c 2f 6c 69 3e 0a 3c 2f  cursors.</li>.</
e990: 6f 6c 3e 0a 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 69  ol>.</p>..<p>Thi
e9a0: 73 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20  s template will 
e9b0: 77 6f 72 6b 2c 20 62 75 74 20 69 74 20 69 73 20  work, but it is 
e9c0: 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20 73 6c 6f  likely to be slo
e9d0: 77 20 73 69 6e 63 65 20 77 65 0a 61 72 65 20 6e  w since we.are n
e9e0: 6f 77 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ow dealing with 
e9f0: 61 6e 20 4f 28 4e 3c 73 75 70 3e 32 3c 2f 73 75  an O(N<sup>2</su
ea00: 70 3e 29 20 6c 6f 6f 70 2e 20 20 42 75 74 20 69  p>) loop.  But i
ea10: 74 20 6f 66 74 65 6e 20 77 6f 72 6b 73 0a 6f 75  t often works.ou
ea20: 74 20 74 68 61 74 20 74 68 65 20 57 48 45 52 45  t that the WHERE
ea30: 20 63 6c 61 75 73 65 20 63 61 6e 20 62 65 20 66   clause can be f
ea40: 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 65 72  actored into ter
ea50: 6d 73 20 61 6e 64 20 74 68 61 74 20 6f 6e 65 20  ms and that one 
ea60: 6f 72 0a 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or.more of those
ea70: 20 74 65 72 6d 73 20 77 69 6c 6c 20 69 6e 76 6f   terms will invo
ea80: 6c 76 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  lve only columns
ea90: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 74 61   in the first ta
eaa0: 62 6c 65 2e 0a 57 68 65 6e 20 74 68 69 73 20 68  ble..When this h
eab0: 61 70 70 65 6e 73 2c 20 77 65 20 63 61 6e 20 66  appens, we can f
eac0: 61 63 74 6f 72 20 70 61 72 74 20 6f 66 20 74 68  actor part of th
ead0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
eae0: 65 73 74 20 6f 75 74 20 6f 66 0a 74 68 65 20 69  est out of.the i
eaf0: 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e 64 20 67 61  nner loop and ga
eb00: 69 6e 20 61 20 6c 6f 74 20 6f 66 20 65 66 66 69  in a lot of effi
eb10: 63 69 65 6e 63 79 2e 20 20 53 6f 20 61 20 62 65  ciency.  So a be
eb20: 74 74 65 72 20 74 65 6d 70 6c 61 74 65 0a 77 6f  tter template.wo
eb30: 75 6c 64 20 62 65 20 73 6f 6d 65 74 68 69 6e 67  uld be something
eb40: 20 6c 69 6b 65 20 74 68 69 73 3a 3c 2f 70 3e 0a   like this:</p>.
eb50: 0a 3c 70 3e 0a 3c 6f 6c 3e 0a 3c 6c 69 3e 49 6e  .<p>.<ol>.<li>In
eb60: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 3c 62 3e  itialize the <b>
eb70: 61 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 5b 5d 3c 2f  azColumnName[]</
eb80: 62 3e 20 61 72 72 61 79 20 66 6f 72 20 74 68 65  b> array for the
eb90: 20 63 61 6c 6c 62 61 63 6b 2e 3c 2f 6c 69 3e 0a   callback.</li>.
eba0: 3c 6c 69 3e 4f 70 65 6e 20 74 77 6f 20 63 75 72  <li>Open two cur
ebb0: 73 6f 72 73 2c 20 6f 6e 65 20 74 6f 20 65 61 63  sors, one to eac
ebc0: 68 20 6f 66 20 74 68 65 20 74 77 6f 20 74 61 62  h of the two tab
ebd0: 6c 65 73 20 62 65 69 6e 67 20 71 75 65 72 69 65  les being querie
ebe0: 64 2e 3c 2f 6c 69 3e 0a 3c 6c 69 3e 46 6f 72 20  d.</li>.<li>For 
ebf0: 65 61 63 68 20 72 65 63 6f 72 64 20 69 6e 20 74  each record in t
ec00: 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 2c 20  he first table, 
ec10: 64 6f 3a 0a 20 20 20 20 3c 6f 6c 20 74 79 70 65  do:.    <ol type
ec20: 3d 22 61 22 3e 0a 20 20 20 20 3c 6c 69 3e 45 76  ="a">.    <li>Ev
ec30: 61 6c 75 61 74 65 20 74 65 72 6d 73 20 6f 66 20  aluate terms of 
ec40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
ec50: 20 74 68 61 74 20 6f 6e 6c 79 20 69 6e 76 6f 6c   that only invol
ec60: 76 65 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a  ve columns from.
ec70: 20 20 20 20 20 20 20 20 74 68 65 20 66 69 72 73          the firs
ec80: 74 20 74 61 62 6c 65 2e 20 20 49 66 20 61 6e 79  t table.  If any
ec90: 20 74 65 72 6d 20 69 73 20 66 61 6c 73 65 20 28   term is false (
eca0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65  meaning that the
ecb0: 20 77 68 6f 6c 65 0a 20 20 20 20 20 20 20 20 57   whole.        W
ecc0: 48 45 52 45 20 63 6c 61 75 73 65 20 6d 75 73 74  HERE clause must
ecd0: 20 62 65 20 66 61 6c 73 65 29 20 74 68 65 6e 20   be false) then 
ece0: 73 6b 69 70 20 74 68 65 20 72 65 73 74 20 6f 66  skip the rest of
ecf0: 20 74 68 69 73 20 6c 6f 6f 70 20 61 6e 64 0a 20   this loop and. 
ed00: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 20         continue 
ed10: 74 6f 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f  to the next reco
ed20: 72 64 2e 3c 2f 6c 69 3e 0a 20 20 20 20 3c 6c 69  rd.</li>.    <li
ed30: 3e 46 6f 72 20 65 61 63 68 20 72 65 63 6f 72 64  >For each record
ed40: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74   in the second t
ed50: 61 62 6c 65 20 64 6f 3a 0a 20 20 20 20 20 20 3c  able do:.      <
ed60: 6f 6c 20 74 79 70 65 3d 22 69 22 3e 0a 20 20 20  ol type="i">.   
ed70: 20 20 20 3c 6c 69 3e 49 66 20 74 68 65 20 57 48     <li>If the WH
ed80: 45 52 45 20 63 6c 61 75 73 65 20 65 76 61 6c 75  ERE clause evalu
ed90: 61 74 65 73 20 74 6f 20 46 41 4c 53 45 2c 20 74  ates to FALSE, t
eda0: 68 65 6e 20 73 6b 69 70 20 74 68 65 20 73 74 65  hen skip the ste
edb0: 70 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ps that.        
edc0: 20 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 63 6f 6e    follow and con
edd0: 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78  tinue to the nex
ede0: 74 20 72 65 63 6f 72 64 2e 3c 2f 6c 69 3e 0a 20  t record.</li>. 
edf0: 20 20 20 20 20 3c 6c 69 3e 43 6f 6d 70 75 74 65       <li>Compute
ee00: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72   all columns for
ee10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
ee20: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 3c   of the result.<
ee30: 2f 6c 69 3e 0a 20 20 20 20 20 20 3c 6c 69 3e 49  /li>.      <li>I
ee40: 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61  nvoke the callba
ee50: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ck function for 
ee60: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
ee70: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 3c 2f  of the result.</
ee80: 6c 69 3e 0a 20 20 20 20 20 20 3c 2f 6f 6c 3e 3c  li>.      </ol><
ee90: 2f 6c 69 3e 0a 20 20 20 20 3c 2f 6f 6c 3e 0a 3c  /li>.    </ol>.<
eea0: 6c 69 3e 43 6c 6f 73 65 20 62 6f 74 68 20 63 75  li>Close both cu
eeb0: 72 73 6f 72 73 2e 3c 2f 6c 69 3e 0a 3c 2f 6f 6c  rsors.</li>.</ol
eec0: 3e 0a 3c 2f 70 3e 0a 0a 3c 70 3e 41 64 64 69 74  >.</p>..<p>Addit
eed0: 69 6f 6e 61 6c 20 73 70 65 65 64 2d 75 70 20 63  ional speed-up c
eee0: 61 6e 20 6f 63 63 75 72 20 69 66 20 61 6e 20 69  an occur if an i
eef0: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
ef00: 20 74 6f 20 73 70 65 65 64 0a 74 68 65 20 73 65   to speed.the se
ef10: 61 72 63 68 20 6f 66 20 65 69 74 68 65 72 20 6f  arch of either o
ef20: 72 20 74 68 65 20 74 77 6f 20 6c 6f 6f 70 73 2e  r the two loops.
ef30: 3c 2f 70 3e 0a 0a 3c 70 3e 53 51 4c 69 74 65 20  </p>..<p>SQLite 
ef40: 61 6c 77 61 79 73 20 63 6f 6e 73 74 72 75 63 74  always construct
ef50: 73 20 74 68 65 20 6c 6f 6f 70 73 20 69 6e 20 74  s the loops in t
ef60: 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73  he same order as
ef70: 20 74 68 65 0a 74 61 62 6c 65 73 20 61 70 70 65   the.tables appe
ef80: 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
ef90: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
efa0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
efb0: 54 68 65 0a 6c 65 66 74 2d 6d 6f 73 74 20 74 61  The.left-most ta
efc0: 62 6c 65 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ble becomes the 
efd0: 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e 64 20 74  outer loop and t
efe0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 74 61  he right-most ta
eff0: 62 6c 65 0a 62 65 63 6f 6d 65 73 20 74 68 65 20  ble.becomes the 
f000: 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 20 49 74 20  inner loop.  It 
f010: 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 69 6e 20  is possible, in 
f020: 74 68 65 6f 72 79 2c 20 74 6f 20 72 65 6f 72 64  theory, to reord
f030: 65 72 0a 74 68 65 20 6c 6f 6f 70 73 20 69 6e 20  er.the loops in 
f040: 73 6f 6d 65 20 63 69 72 63 75 6d 73 74 61 6e 63  some circumstanc
f050: 65 73 20 74 6f 20 73 70 65 65 64 20 74 68 65 20  es to speed the 
f060: 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68  evaluation of th
f070: 65 0a 6a 6f 69 6e 2e 20 20 42 75 74 20 53 51 4c  e.join.  But SQL
f080: 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 61 74 74  ite does not att
f090: 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69  empt this optimi
f0a0: 7a 61 74 69 6f 6e 2e 3c 2f 70 3e 0a 0a 3c 70 3e  zation.</p>..<p>
f0b0: 59 6f 75 20 63 61 6e 20 73 65 65 20 68 6f 77 20  You can see how 
f0c0: 53 51 4c 69 74 65 20 63 6f 6e 73 74 72 75 63 74  SQLite construct
f0d0: 73 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 69  s nested loops i
f0e0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
f0f0: 65 78 61 6d 70 6c 65 3a 3c 2f 70 3e 0a 0a 3c 62  example:</p>..<b
f100: 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a  lockquote><pre>.
f110: 43 52 45 41 54 45 20 54 41 42 4c 45 20 65 78 61  CREATE TABLE exa
f120: 6d 70 32 28 74 68 72 65 65 20 69 6e 74 2c 20 66  mp2(three int, f
f130: 6f 75 72 20 69 6e 74 29 3b 0a 53 45 4c 45 43 54  our int);.SELECT
f140: 20 2a 20 46 52 4f 4d 20 65 78 61 6d 70 2c 20 65   * FROM examp, e
f150: 78 61 6d 70 32 20 57 48 45 52 45 20 74 77 6f 3c  xamp2 WHERE two<
f160: 35 30 20 41 4e 44 20 66 6f 75 72 3d 3d 74 77 6f  50 AND four==two
f170: 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71  ;.</pre></blockq
f180: 75 6f 74 65 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a  uote>.}..Code {.
f190: 61 64 64 72 20 20 6f 70 63 6f 64 65 20 20 20 20  addr  opcode    
f1a0: 20 20 20 20 70 31 20 20 20 20 20 70 32 20 20 20      p1     p2   
f1b0: 20 20 70 33 20 20 20 20 20 20 20 20 20 20 20 20    p3            
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 20 20 20 20 20 20 0a 2d 2d 2d 2d 20            .---- 
f1e0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d   ------------  -
f1f0: 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d  ----  -----  ---
f200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f220: 0a 30 20 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d  .0     ColumnNam
f230: 65 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20  e    0      0   
f240: 20 20 20 65 78 61 6d 70 2e 6f 6e 65 20 20 20 20     examp.one    
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 0a 31 20 20 20 20 20 43 6f 6c        .1     Col
f270: 75 6d 6e 4e 61 6d 65 20 20 20 20 31 20 20 20 20  umnName    1    
f280: 20 20 30 20 20 20 20 20 20 65 78 61 6d 70 2e 74    0      examp.t
f290: 77 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  wo              
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 20 20              .2  
f2b0: 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20     ColumnName   
f2c0: 20 32 20 20 20 20 20 20 30 20 20 20 20 20 20 65   2      0      e
f2d0: 78 61 6d 70 32 2e 74 68 72 65 65 20 20 20 20 20  xamp2.three     
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 20 0a 33 20 20 20 20 20 43 6f 6c 75 6d 6e 4e    .3     ColumnN
f300: 61 6d 65 20 20 20 20 33 20 20 20 20 20 20 30 20  ame    3      0 
f310: 20 20 20 20 20 65 78 61 6d 70 32 2e 66 6f 75 72       examp2.four
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 20 20 20 20 20 0a 34 20 20 20 20 20 49          .4     I
f340: 6e 74 65 67 65 72 20 20 20 20 20 20 20 30 20 20  nteger       0  
f350: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 35                .5
f380: 20 20 20 20 20 4f 70 65 6e 52 65 61 64 20 20 20       OpenRead   
f390: 20 20 20 30 20 20 20 20 20 20 33 20 20 20 20 20     0      3     
f3a0: 20 65 78 61 6d 70 20 20 20 20 20 20 20 20 20 20   examp          
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 20 20 20 20 0a 36 20 20 20 20 20 56 65 72 69 66      .6     Verif
f3d0: 79 43 6f 6f 6b 69 65 20 20 30 20 20 20 20 20 20  yCookie  0      
f3e0: 39 30 39 20 20 20 20 20 20 20 20 20 20 20 20 20  909             
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
f410: 37 20 20 20 20 20 49 6e 74 65 67 65 72 20 20 20  7     Integer   
f420: 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 20 20 20 20 20 0a 38 20 20 20 20 20 4f 70 65 6e       .8     Open
f460: 52 65 61 64 20 20 20 20 20 20 31 20 20 20 20 20  Read      1     
f470: 20 35 20 20 20 20 20 20 65 78 61 6d 70 32 20 20   5      examp2  
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 20 20 20 20 20 20 20 20 20 0a 39 20 20 20             .9   
f4a0: 20 20 52 65 77 69 6e 64 20 20 20 20 20 20 20 20    Rewind        
f4b0: 30 20 20 20 20 20 20 32 34 20 20 20 20 20 20 20  0      24       
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 20 20 20 20 0a 31 30 20 20 20 20 43 6f 6c        .10    Col
f4f0: 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20 20  umn        0    
f500: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 31 20              .11 
f530: 20 20 20 49 6e 74 65 67 65 72 20 20 20 20 20 20     Integer      
f540: 20 35 30 20 20 20 20 20 30 20 20 20 20 20 20 35   50     0      5
f550: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 0a 31 32 20 20 20 20 47 65 20 20 20 20 20    .12    Ge     
f580: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 32 33         1      23
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 33               .13
f5c0: 20 20 20 20 52 65 77 69 6e 64 20 20 20 20 20 20      Rewind      
f5d0: 20 20 31 20 20 20 20 20 20 32 33 20 20 20 20 20    1      23     
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0a 31 34 20 20 20 20 43          .14    C
f610: 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 31 20 20  olumn        1  
f620: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
f650: 35 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20  5    Column     
f660: 20 20 20 30 20 20 20 20 20 20 31 20 20 20 20 20     0      1     
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 20 20 0a 31 36 20 20 20 20 4e 65 20 20 20      .16    Ne   
f6a0: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
f6b0: 32 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  22              
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6d0: 20 20 20 20 20 20 20 20 20 20 0a 31 37 20 20 20            .17   
f6e0: 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30   Column        0
f6f0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 0a 31 38 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20  .18    Column   
f730: 20 20 20 20 20 30 20 20 20 20 20 20 31 20 20 20       0      1   
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 20 20 20 20 0a 31 39 20 20 20 20 43 6f 6c        .19    Col
f770: 75 6d 6e 20 20 20 20 20 20 20 20 31 20 20 20 20  umn        1    
f780: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 30 20              .20 
f7b0: 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20     Column       
f7c0: 20 31 20 20 20 20 20 20 31 20 20 20 20 20 20 20   1      1       
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 20 0a 32 31 20 20 20 20 43 61 6c 6c 62 61 63    .21    Callbac
f800: 6b 20 20 20 20 20 20 34 20 20 20 20 20 20 30 20  k      4      0 
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 20 20 20 20 20 20 20 20 0a 32 32 20 20 20 20 4e          .22    N
f840: 65 78 74 20 20 20 20 20 20 20 20 20 20 31 20 20  ext          1  
f850: 20 20 20 20 31 34 20 20 20 20 20 20 20 20 20 20      14          
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 0a 32 33 20 20 20 20 4e 65 78 74 20 20     .23    Next  
f890: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31          0      1
f8a0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8c0: 20 20 20 20 20 20 20 20 20 0a 32 34 20 20 20 20           .24    
f8d0: 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20 30 20  Close         0 
f8e0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
f910: 32 35 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20  25    Close     
f920: 20 20 20 20 31 20 20 20 20 20 20 30 20 20 20 20      1      0    
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 20 20 20 0a 32 36 20 20 20 20 48 61 6c 74       .26    Halt
f960: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
f970: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 0a 70             .}..p
f9a0: 75 74 73 20 7b 0a 3c 70 3e 54 68 65 20 6f 75 74  uts {.<p>The out
f9b0: 65 72 20 6c 6f 6f 70 20 6f 76 65 72 20 74 61 62  er loop over tab
f9c0: 6c 65 20 65 78 61 6d 70 20 69 73 20 69 6d 70 6c  le examp is impl
f9d0: 65 6d 65 6e 74 20 62 79 20 69 6e 73 74 72 75 63  ement by instruc
f9e0: 74 69 6f 6e 73 0a 37 20 74 68 72 6f 75 67 68 20  tions.7 through 
f9f0: 32 33 2e 20 20 54 68 65 20 69 6e 6e 65 72 20 6c  23.  The inner l
fa00: 6f 6f 70 20 69 73 20 69 6e 73 74 72 75 63 74 69  oop is instructi
fa10: 6f 6e 73 20 31 33 20 74 68 72 6f 75 67 68 20 32  ons 13 through 2
fa20: 32 2e 0a 4e 6f 74 69 63 65 20 74 68 61 74 20 74  2..Notice that t
fa30: 68 65 20 22 74 77 6f 3c 35 30 22 20 74 65 72 6d  he "two<50" term
fa40: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 65 78   of the WHERE ex
fa50: 70 72 65 73 73 69 6f 6e 20 69 6e 76 6f 6c 76 65  pression involve
fa60: 73 0a 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 66  s.only columns f
fa70: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 74 61  rom the first ta
fa80: 62 6c 65 20 61 6e 64 20 63 61 6e 20 62 65 20 66  ble and can be f
fa90: 61 63 74 6f 72 65 64 20 6f 75 74 20 6f 66 0a 74  actored out of.t
faa0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 20  he inner loop.  
fab0: 53 51 4c 69 74 65 20 64 6f 65 73 20 74 68 69 73  SQLite does this
fac0: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 73 20   and implements 
fad0: 74 68 65 20 22 74 77 6f 3c 35 30 22 0a 74 65 73  the "two<50".tes
fae0: 74 20 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  t in instruction
faf0: 73 20 31 30 20 74 68 72 6f 75 67 68 20 31 32 2e  s 10 through 12.
fb00: 20 20 54 68 65 20 22 66 6f 75 72 3d 3d 74 77 6f    The "four==two
fb10: 22 20 74 65 73 74 20 69 73 0a 69 6d 70 6c 65 6d  " test is.implem
fb20: 65 6e 74 20 62 79 20 69 6e 73 74 72 75 63 74 69  ent by instructi
fb30: 6f 6e 73 20 31 34 20 74 68 72 6f 75 67 68 20 31  ons 14 through 1
fb40: 36 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  6 in the inner l
fb50: 6f 6f 70 2e 3c 2f 70 3e 0a 0a 3c 70 3e 53 51 4c  oop.</p>..<p>SQL
fb60: 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 69 6d 70  ite does not imp
fb70: 6f 73 65 20 61 6e 79 20 61 72 62 69 74 72 61 72  ose any arbitrar
fb80: 79 20 6c 69 6d 69 74 73 20 6f 6e 20 74 68 65 20  y limits on the 
fb90: 74 61 62 6c 65 73 20 69 6e 0a 61 20 6a 6f 69 6e  tables in.a join
fba0: 2e 20 20 49 74 20 61 6c 73 6f 20 61 6c 6c 6f 77  .  It also allow
fbb0: 73 20 61 20 74 61 62 6c 65 20 74 6f 20 62 65 20  s a table to be 
fbc0: 6a 6f 69 6e 65 64 20 77 69 74 68 20 69 74 73 65  joined with itse
fbd0: 6c 66 2e 3c 2f 70 3e 0a 0a 3c 68 32 3e 54 68 65  lf.</p>..<h2>The
fbe0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
fbf0: 3c 2f 68 32 3e 0a 0a 3c 70 3e 46 6f 72 20 68 69  </h2>..<p>For hi
fc00: 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73  storical reasons
fc10: 2c 20 61 6e 64 20 66 6f 72 20 65 66 66 69 63 69  , and for effici
fc20: 65 6e 63 79 2c 20 61 6c 6c 20 73 6f 72 74 69 6e  ency, all sortin
fc30: 67 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a  g is currently .
fc40: 64 6f 6e 65 20 69 6e 20 6d 65 6d 6f 72 79 2e 3c  done in memory.<
fc50: 2f 70 3e 0a 0a 3c 70 3e 53 51 4c 69 74 65 20 69  /p>..<p>SQLite i
fc60: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 4f 52  mplements the OR
fc70: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 75 73  DER BY clause us
fc80: 69 6e 67 20 61 20 73 70 65 63 69 61 6c 0a 73 65  ing a special.se
fc90: 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  t of instruction
fca0: 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 6e 20  s to control an 
fcb0: 6f 62 6a 65 63 74 20 63 61 6c 6c 65 64 20 61 20  object called a 
fcc0: 73 6f 72 74 65 72 2e 20 20 49 6e 20 74 68 65 0a  sorter.  In the.
fcd0: 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 20  inner-most loop 
fce0: 6f 66 20 74 68 65 20 71 75 65 72 79 2c 20 77 68  of the query, wh
fcf0: 65 72 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20  ere there would 
fd00: 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 61 20 43 61  normally be.a Ca
fd10: 6c 6c 62 61 63 6b 20 69 6e 73 74 72 75 63 74 69  llback instructi
fd20: 6f 6e 2c 20 69 6e 73 74 65 61 64 20 61 20 72 65  on, instead a re
fd30: 63 6f 72 64 20 69 73 20 63 6f 6e 73 74 72 75 63  cord is construc
fd40: 74 65 64 20 74 68 61 74 0a 63 6f 6e 74 61 69 6e  ted that.contain
fd50: 73 20 62 6f 74 68 20 63 61 6c 6c 62 61 63 6b 20  s both callback 
fd60: 70 61 72 61 6d 65 74 65 72 73 20 61 6e 64 20 61  parameters and a
fd70: 20 6b 65 79 2e 20 20 54 68 69 73 20 72 65 63 6f   key.  This reco
fd80: 72 64 0a 69 73 20 61 64 64 65 64 20 74 6f 20 74  rd.is added to t
fd90: 68 65 20 73 6f 72 74 65 72 20 28 69 6e 20 61 20  he sorter (in a 
fda0: 6c 69 6e 6b 65 64 20 6c 69 73 74 29 2e 20 20 41  linked list).  A
fdb0: 66 74 65 72 20 74 68 65 20 71 75 65 72 79 20 6c  fter the query l
fdc0: 6f 6f 70 20 0a 66 69 6e 69 73 68 65 73 2c 20 74  oop .finishes, t
fdd0: 68 65 20 6c 69 73 74 20 6f 66 20 72 65 63 6f 72  he list of recor
fde0: 64 73 20 69 73 20 73 6f 72 74 65 64 20 61 6e 64  ds is sorted and
fdf0: 20 74 68 69 73 20 6c 69 73 74 20 69 73 20 77 61   this list is wa
fe00: 6c 6b 65 64 2e 20 20 46 6f 72 20 0a 65 61 63 68  lked.  For .each
fe10: 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 6c   record on the l
fe20: 69 73 74 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ist, the callbac
fe30: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 46  k is invoked.  F
fe40: 69 6e 61 6c 6c 79 2c 20 74 68 65 20 73 6f 72 74  inally, the sort
fe50: 65 72 0a 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  er.is closed and
fe60: 20 6d 65 6d 6f 72 79 20 69 73 20 64 65 61 6c 6c   memory is deall
fe70: 6f 63 61 74 65 64 2e 3c 2f 70 3e 0a 0a 3c 70 3e  ocated.</p>..<p>
fe80: 57 65 20 63 61 6e 20 73 65 65 20 74 68 65 20 70  We can see the p
fe90: 72 6f 63 65 73 73 20 69 6e 20 61 63 74 69 6f 6e  rocess in action
fea0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
feb0: 67 20 71 75 65 72 79 3a 3c 2f 70 3e 0a 0a 3c 62  g query:</p>..<b
fec0: 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a  lockquote><pre>.
fed0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 78  SELECT * FROM ex
fee0: 61 6d 70 20 4f 52 44 45 52 20 42 59 20 6f 6e 65  amp ORDER BY one
fef0: 20 44 45 53 43 2c 20 74 77 6f 3b 0a 3c 2f 70 72   DESC, two;.</pr
ff00: 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  e></blockquote>.
ff10: 7d 0a 0a 43 6f 64 65 20 7b 0a 61 64 64 72 20 20  }..Code {.addr  
ff20: 6f 70 63 6f 64 65 20 20 20 20 20 20 20 20 70 31  opcode        p1
ff30: 20 20 20 20 20 70 32 20 20 20 20 20 70 33 20 20       p2     p3  
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 20 20 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d      .----  -----
ff70: 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20  -------  -----  
ff80: 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
ff90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ffa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20  ----------.0    
ffb0: 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20 30   ColumnName    0
ffc0: 20 20 20 20 20 20 30 20 20 20 20 20 20 6f 6e 65        0      one
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fff0: 0a 31 20 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d  .1     ColumnNam
10000 65 20 20 20 20 31 20 20 20 20 20 20 30 20 20 20  e    1      0   
10010 20 20 20 74 77 6f 20 20 20 20 20 20 20 20 20 20     two          
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 20 20 20 20 20 20 0a 32 20 20 20 20 20 49 6e 74        .2     Int
10040 65 67 65 72 20 20 20 20 20 20 20 30 20 20 20 20  eger       0    
10050 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 20 20 20 20 20 20 20 20 20 20 20 0a 33 20 20              .3  
10080 20 20 20 4f 70 65 6e 52 65 61 64 20 20 20 20 20     OpenRead     
10090 20 30 20 20 20 20 20 20 33 20 20 20 20 20 20 65   0      3      e
100a0 78 61 6d 70 20 20 20 20 20 20 20 20 20 20 20 20  xamp            
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 20 20 0a 34 20 20 20 20 20 56 65 72 69 66 79 43    .4     VerifyC
100d0 6f 6f 6b 69 65 20 20 30 20 20 20 20 20 20 39 30  ookie  0      90
100e0 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 35 20               .5 
10110 20 20 20 20 52 65 77 69 6e 64 20 20 20 20 20 20      Rewind      
10120 20 20 30 20 20 20 20 20 20 31 34 20 20 20 20 20    0      14     
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 20 20 20 20 20 20 20 20 0a 36 20 20 20 20 20 43          .6     C
10160 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20  olumn        0  
10170 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 37                .7
101a0 20 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20       Column     
101b0 20 20 20 30 20 20 20 20 20 20 31 20 20 20 20 20     0      1     
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 20 0a 38 20 20 20 20 20 53 6f 72 74 4d      .8     SortM
101f0 61 6b 65 52 65 63 20 20 20 32 20 20 20 20 20 20  akeRec   2      
10200 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
10230 39 20 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20  9     Column    
10240 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 0a 31 30 20 20 20 20 43 6f 6c 75       .10    Colu
10280 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20 20 20  mn        0     
10290 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 20 20 0a 31 31 20 20             .11  
102c0 20 20 53 6f 72 74 4d 61 6b 65 4b 65 79 20 20 20    SortMakeKey   
102d0 32 20 20 20 20 20 20 30 20 20 20 20 20 20 44 2b  2      0      D+
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 0a 31 32 20 20 20 20 53 6f 72 74 50 75 74 20   .12    SortPut 
10310 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10340 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 33 20              .13 
10350 20 20 20 4e 65 78 74 20 20 20 20 20 20 20 20 20     Next         
10360 20 30 20 20 20 20 20 20 36 20 20 20 20 20 20 20   0      6       
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0a 31 34 20 20 20 20 43 6c         .14    Cl
103a0 6f 73 65 20 20 20 20 20 20 20 20 20 30 20 20 20  ose         0   
103b0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 20 20 0a 31 35 20 20 20 20 53 6f 72 74 20 20 20    .15    Sort   
103f0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 36               .16
10430 20 20 20 20 53 6f 72 74 4e 65 78 74 20 20 20 20      SortNext    
10440 20 20 30 20 20 20 20 20 20 31 39 20 20 20 20 20    0      19     
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0a 31 37 20 20 20 20 53          .17    S
10480 6f 72 74 43 61 6c 6c 62 61 63 6b 20 20 32 20 20  ortCallback  2  
10490 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
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 0a 31 38 20 20 20 20 47 6f 74 6f 20 20     .18    Goto  
104d0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31          0      1
104e0 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
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 0a 31                .1
10510 39 20 20 20 20 53 6f 72 74 52 65 73 65 74 20 20  9    SortReset  
10520 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 20 20 20 0a 32 30 20 20 20 20 48 61 6c 74 20      .20    Halt 
10560 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
10570 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
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 0a 7d 0a 0a 70 75            .}..pu
105a0 74 73 20 7b 0a 3c 70 3e 54 68 65 72 65 20 69 73  ts {.<p>There is
105b0 20 6f 6e 6c 79 20 6f 6e 65 20 73 6f 72 74 65 72   only one sorter
105c0 20 6f 62 6a 65 63 74 2c 20 73 6f 20 74 68 65 72   object, so ther
105d0 65 20 61 72 65 20 6e 6f 20 69 6e 73 74 72 75 63  e are no instruc
105e0 74 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 0a 6f  tions to open .o
105f0 72 20 63 6c 6f 73 65 20 69 74 2e 20 20 49 74 20  r close it.  It 
10600 69 73 20 6f 70 65 6e 65 64 20 61 75 74 6f 6d 61  is opened automa
10610 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 6e 65 65  tically when nee
10620 64 65 64 2c 20 61 6e 64 20 69 74 20 69 73 20 63  ded, and it is c
10630 6c 6f 73 65 64 20 0a 77 68 65 6e 20 74 68 65 20  losed .when the 
10640 56 44 42 45 20 70 72 6f 67 72 61 6d 20 68 61 6c  VDBE program hal
10650 74 73 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65 20  ts.</p>..<p>The 
10660 71 75 65 72 79 20 6c 6f 6f 70 20 69 73 20 62 75  query loop is bu
10670 69 6c 74 20 66 72 6f 6d 20 69 6e 73 74 72 75 63  ilt from instruc
10680 74 69 6f 6e 73 20 35 20 74 68 72 6f 75 67 68 20  tions 5 through 
10690 31 33 2e 20 20 49 6e 73 74 72 75 63 74 69 6f 6e  13.  Instruction
106a0 73 0a 36 20 74 68 72 6f 75 67 68 20 38 20 62 75  s.6 through 8 bu
106b0 69 6c 64 20 61 20 72 65 63 6f 72 64 20 74 68 61  ild a record tha
106c0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61  t contains the a
106d0 7a 44 61 74 61 5b 5d 20 76 61 6c 75 65 73 20 66  zData[] values f
106e0 6f 72 20 61 20 73 69 6e 67 6c 65 0a 69 6e 76 6f  or a single.invo
106f0 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 61  cation of the ca
10700 6c 6c 62 61 63 6b 2e 20 20 41 20 73 6f 72 74 20  llback.  A sort 
10710 6b 65 79 20 69 73 20 67 65 6e 65 72 61 74 65 64  key is generated
10720 20 62 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   by instructions
10730 0a 39 20 74 68 72 6f 75 67 68 20 31 31 2e 20 20  .9 through 11.  
10740 49 6e 73 74 72 75 63 74 69 6f 6e 20 31 32 20 63  Instruction 12 c
10750 6f 6d 62 69 6e 65 73 20 74 68 65 20 69 6e 76 6f  ombines the invo
10760 63 61 74 69 6f 6e 20 72 65 63 6f 72 64 20 61 6e  cation record an
10770 64 20 74 68 65 0a 73 6f 72 74 20 6b 65 79 20 69  d the.sort key i
10780 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 65 6e 74  nto a single ent
10790 72 79 20 61 6e 64 20 70 75 74 73 20 74 68 61 74  ry and puts that
107a0 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 73 6f   entry on the so
107b0 72 74 20 6c 69 73 74 2e 3c 70 3e 0a 0a 3c 70 3e  rt list.<p>..<p>
107c0 54 68 65 20 50 33 20 61 72 67 75 6d 65 6e 74 20  The P3 argument 
107d0 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 31  of instruction 1
107e0 31 20 69 73 20 6f 66 20 70 61 72 74 69 63 75 6c  1 is of particul
107f0 61 72 20 69 6e 74 65 72 65 73 74 2e 20 20 54 68  ar interest.  Th
10800 65 0a 73 6f 72 74 20 6b 65 79 20 69 73 20 66 6f  e.sort key is fo
10810 72 6d 65 64 20 62 79 20 70 72 65 70 65 6e 64 69  rmed by prependi
10820 6e 67 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  ng one character
10830 20 66 72 6f 6d 20 50 33 20 74 6f 20 65 61 63 68   from P3 to each
10840 20 73 74 72 69 6e 67 0a 61 6e 64 20 63 6f 6e 63   string.and conc
10850 61 74 65 6e 61 74 69 6e 67 20 61 6c 6c 20 74 68  atenating all th
10860 65 20 73 74 72 69 6e 67 73 2e 20 20 54 68 65 20  e strings.  The 
10870 73 6f 72 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  sort comparison 
10880 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 6c 6f  function will.lo
10890 6f 6b 20 61 74 20 74 68 69 73 20 63 68 61 72 61  ok at this chara
108a0 63 74 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e  cter to determin
108b0 65 20 77 68 65 74 68 65 72 20 74 68 65 20 73 6f  e whether the so
108c0 72 74 20 6f 72 64 65 72 20 69 73 0a 61 73 63 65  rt order is.asce
108d0 6e 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64  nding or descend
108e0 69 6e 67 2c 20 61 6e 64 20 77 68 65 74 68 65 72  ing, and whether
108f0 20 74 6f 20 73 6f 72 74 20 61 73 20 61 20 73 74   to sort as a st
10900 72 69 6e 67 20 6f 72 20 6e 75 6d 62 65 72 2e 20  ring or number. 
10910 20 0a 49 6e 20 74 68 69 73 20 65 78 61 6d 70 6c   .In this exampl
10920 65 2c 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c  e, the first col
10930 75 6d 6e 20 73 68 6f 75 6c 64 20 62 65 20 73 6f  umn should be so
10940 72 74 65 64 20 61 73 20 61 20 73 74 72 69 6e 67  rted as a string
10950 20 0a 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20   .in descending 
10960 6f 72 64 65 72 20 73 6f 20 69 74 73 20 70 72 65  order so its pre
10970 66 69 78 20 69 73 20 22 44 22 20 61 6e 64 20 74  fix is "D" and t
10980 68 65 20 73 65 63 6f 6e 64 20 63 6f 6c 75 6d 6e  he second column
10990 20 73 68 6f 75 6c 64 20 0a 73 6f 72 74 65 64 20   should .sorted 
109a0 6e 75 6d 65 72 69 63 61 6c 6c 79 20 69 6e 20 61  numerically in a
109b0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 73  scending order s
109c0 6f 20 69 74 73 20 70 72 65 66 69 78 20 69 73 20  o its prefix is 
109d0 22 2b 22 2e 20 20 41 73 63 65 6e 64 69 6e 67 20  "+".  Ascending 
109e0 0a 73 74 72 69 6e 67 20 73 6f 72 74 69 6e 67 20  .string sorting 
109f0 75 73 65 73 20 22 41 22 2c 20 61 6e 64 20 64 65  uses "A", and de
10a00 73 63 65 6e 64 69 6e 67 20 6e 75 6d 65 72 69 63  scending numeric
10a10 20 73 6f 72 74 69 6e 67 20 75 73 65 73 20 22 2d   sorting uses "-
10a20 22 2e 3c 2f 70 3e 0a 0a 3c 70 3e 41 66 74 65 72  ".</p>..<p>After
10a30 20 74 68 65 20 71 75 65 72 79 20 6c 6f 6f 70 20   the query loop 
10a40 65 6e 64 73 2c 20 74 68 65 20 74 61 62 6c 65 20  ends, the table 
10a50 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 69 73  being queried is
10a60 20 63 6c 6f 73 65 64 20 61 74 0a 69 6e 73 74 72   closed at.instr
10a70 75 63 74 69 6f 6e 20 31 34 2e 20 20 54 68 69 73  uction 14.  This
10a80 20 69 73 20 64 6f 6e 65 20 65 61 72 6c 79 20 69   is done early i
10a90 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77  n order to allow
10aa0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
10ab0 0a 6f 72 20 74 68 72 65 61 64 73 20 74 6f 20 61  .or threads to a
10ac0 63 63 65 73 73 20 74 68 61 74 20 74 61 62 6c 65  ccess that table
10ad0 2c 20 69 66 20 64 65 73 69 72 65 64 2e 20 20 54  , if desired.  T
10ae0 68 65 20 6c 69 73 74 20 6f 66 20 72 65 63 6f 72  he list of recor
10af0 64 73 0a 74 68 61 74 20 77 61 73 20 62 75 69 6c  ds.that was buil
10b00 74 20 75 70 20 69 6e 73 69 64 65 20 74 68 65 20  t up inside the 
10b10 71 75 65 72 79 20 6c 6f 6f 70 20 69 73 20 73 6f  query loop is so
10b20 72 74 65 64 20 62 79 20 74 68 65 20 69 6e 73 74  rted by the inst
10b30 72 75 63 74 69 6f 6e 0a 61 74 20 31 35 2e 20 20  ruction.at 15.  
10b40 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 31 36 20  Instructions 16 
10b50 74 68 72 6f 75 67 68 20 31 38 20 77 61 6c 6b 20  through 18 walk 
10b60 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 63 6f  through the reco
10b70 72 64 20 6c 69 73 74 0a 28 77 68 69 63 68 20 69  rd list.(which i
10b80 73 20 6e 6f 77 20 69 6e 20 73 6f 72 74 65 64 20  s now in sorted 
10b90 6f 72 64 65 72 29 20 61 6e 64 20 69 6e 76 6f 6b  order) and invok
10ba0 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  e the callback o
10bb0 6e 63 65 20 66 6f 72 0a 65 61 63 68 20 72 65 63  nce for.each rec
10bc0 6f 72 64 2e 20 20 46 69 6e 61 6c 6c 79 2c 20 74  ord.  Finally, t
10bd0 68 65 20 73 6f 72 74 65 72 20 69 73 20 63 6c 6f  he sorter is clo
10be0 73 65 64 20 61 74 20 69 6e 73 74 72 75 63 74 69  sed at instructi
10bf0 6f 6e 20 31 39 2e 3c 2f 70 3e 0a 0a 3c 68 32 3e  on 19.</p>..<h2>
10c00 41 67 67 72 65 67 61 74 65 20 46 75 6e 63 74 69  Aggregate Functi
10c10 6f 6e 73 20 41 6e 64 20 54 68 65 20 47 52 4f 55  ons And The GROU
10c20 50 20 42 59 20 61 6e 64 20 48 41 56 49 4e 47 20  P BY and HAVING 
10c30 43 6c 61 75 73 65 73 3c 2f 68 32 3e 0a 0a 3c 70  Clauses</h2>..<p
10c40 3e 54 6f 20 63 6f 6d 70 75 74 65 20 61 67 67 72  >To compute aggr
10c50 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2c  egate functions,
10c60 20 74 68 65 20 56 44 42 45 20 69 6d 70 6c 65 6d   the VDBE implem
10c70 65 6e 74 73 20 61 20 73 70 65 63 69 61 6c 20 0a  ents a special .
10c80 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 61  data structure a
10c90 6e 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  nd instructions 
10ca0 66 6f 72 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  for controlling 
10cb0 74 68 61 74 20 64 61 74 61 20 73 74 72 75 63 74  that data struct
10cc0 75 72 65 2e 0a 54 68 65 20 64 61 74 61 20 73 74  ure..The data st
10cd0 72 75 63 74 75 72 65 20 69 73 20 61 6e 20 75 6e  ructure is an un
10ce0 6f 72 64 65 72 65 64 20 73 65 74 20 6f 66 20 62  ordered set of b
10cf0 75 63 6b 65 74 73 2c 20 77 68 65 72 65 20 65 61  uckets, where ea
10d00 63 68 20 62 75 63 6b 65 74 0a 68 61 73 20 61 20  ch bucket.has a 
10d10 6b 65 79 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  key and one or m
10d20 6f 72 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ore memory locat
10d30 69 6f 6e 73 2e 20 20 57 69 74 68 69 6e 20 74 68  ions.  Within th
10d40 65 20 71 75 65 72 79 0a 6c 6f 6f 70 2c 20 74 68  e query.loop, th
10d50 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
10d60 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e  e is used to con
10d70 73 74 72 75 63 74 20 61 20 6b 65 79 20 61 6e 64  struct a key and
10d80 20 74 68 65 20 62 75 63 6b 65 74 0a 77 69 74 68   the bucket.with
10d90 20 74 68 61 74 20 6b 65 79 20 69 73 20 62 72 6f   that key is bro
10da0 75 67 68 74 20 69 6e 74 6f 20 66 6f 63 75 73 2e  ught into focus.
10db0 20 20 41 20 6e 65 77 20 62 75 63 6b 65 74 20 69    A new bucket i
10dc0 73 20 63 72 65 61 74 65 64 20 77 69 74 68 0a 74  s created with.t
10dd0 68 65 20 6b 65 79 20 69 66 20 6f 6e 65 20 64 69  he key if one di
10de0 64 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  d not previously
10df0 20 65 78 69 73 74 2e 20 20 4f 6e 63 65 20 74 68   exist.  Once th
10e00 65 20 62 75 63 6b 65 74 20 69 73 20 69 6e 0a 66  e bucket is in.f
10e10 6f 63 75 73 2c 20 74 68 65 20 6d 65 6d 6f 72 79  ocus, the memory
10e20 20 6c 6f 63 61 74 69 6f 6e 73 20 6f 66 20 74 68   locations of th
10e30 65 20 62 75 63 6b 65 74 20 61 72 65 20 75 73 65  e bucket are use
10e40 64 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 0a  d to accumulate.
10e50 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
10e60 65 20 76 61 72 69 6f 75 73 20 61 67 67 72 65 67  e various aggreg
10e70 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  ate functions.  
10e80 41 66 74 65 72 20 74 68 65 20 71 75 65 72 79 0a  After the query.
10e90 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 2c  loop terminates,
10ea0 20 65 61 63 68 20 62 75 63 6b 65 74 20 69 73 20   each bucket is 
10eb0 76 69 73 69 74 65 64 20 6f 6e 63 65 20 74 6f 20  visited once to 
10ec0 67 65 6e 65 72 61 74 65 20 61 0a 73 69 6e 67 6c  generate a.singl
10ed0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
10ee0 75 6c 74 73 2e 3c 2f 70 3e 0a 0a 3c 70 3e 41 6e  ults.</p>..<p>An
10ef0 20 65 78 61 6d 70 6c 65 20 77 69 6c 6c 20 68 65   example will he
10f00 6c 70 20 74 6f 20 63 6c 61 72 69 66 79 20 74 68  lp to clarify th
10f10 69 73 20 63 6f 6e 63 65 70 74 2e 20 20 43 6f 6e  is concept.  Con
10f20 73 69 64 65 72 20 74 68 65 0a 66 6f 6c 6c 6f 77  sider the.follow
10f30 69 6e 67 20 71 75 65 72 79 3a 3c 2f 70 3e 0a 0a  ing query:</p>..
10f40 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
10f50 3e 0a 53 45 4c 45 43 54 20 74 68 72 65 65 2c 20  >.SELECT three, 
10f60 6d 69 6e 28 74 68 72 65 65 2b 66 6f 75 72 29 2b  min(three+four)+
10f70 61 76 67 28 66 6f 75 72 29 20 0a 46 52 4f 4d 20  avg(four) .FROM 
10f80 65 78 61 6d 70 32 0a 47 52 4f 55 50 20 42 59 20  examp2.GROUP BY 
10f90 74 68 72 65 65 3b 0a 3c 2f 70 72 65 3e 3c 2f 62  three;.</pre></b
10fa0 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a 0a 3c 70 3e  lockquote>...<p>
10fb0 54 68 65 20 56 44 42 45 20 63 6f 64 65 20 67 65  The VDBE code ge
10fc0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
10fd0 20 71 75 65 72 79 20 69 73 20 61 73 20 66 6f 6c   query is as fol
10fe0 6c 6f 77 73 3a 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64  lows:</p>.}..Cod
10ff0 65 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f 64 65  e {.addr  opcode
11000 20 20 20 20 20 20 20 20 70 31 20 20 20 20 20 70          p1     p
11010 32 20 20 20 20 20 70 33 20 20 20 20 20 20 20 20  2     p3        
11020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 2d                .-
11040 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
11050 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20  -  -----  ----- 
11060 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
11070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11080 2d 2d 2d 2d 0a 30 20 20 20 20 20 43 6f 6c 75 6d  ----.0     Colum
11090 6e 4e 61 6d 65 20 20 20 20 30 20 20 20 20 20 20  nName    0      
110a0 30 20 20 20 20 20 20 74 68 72 65 65 20 20 20 20  0      three    
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 20 20 20 20 20 20 20 0a 31 20 20 20 20            .1    
110d0 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20 31   ColumnName    1
110e0 20 20 20 20 20 20 30 20 20 20 20 20 20 6d 69 6e        0      min
110f0 28 74 68 72 65 65 2b 66 6f 75 72 29 2b 61 76 67  (three+four)+avg
11100 28 66 6f 75 72 29 20 20 20 20 20 20 20 20 20 20  (four)          
11110 0a 32 20 20 20 20 20 41 67 67 52 65 73 65 74 20  .2     AggReset 
11120 20 20 20 20 20 30 20 20 20 20 20 20 33 20 20 20       0      3   
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 20 20 20 20 20 20 20 20 20 20 20 0a 33 20 20 20             .3   
11160 20 20 41 67 67 49 6e 69 74 20 20 20 20 20 20 20    AggInit       
11170 30 20 20 20 20 20 20 31 20 20 20 20 20 20 70 74  0      1      pt
11180 72 28 30 78 37 39 30 33 61 30 29 20 20 20 20 20  r(0x7903a0)     
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 0a 34 20 20 20 20 20 41 67 67 49 6e 69 74 20   .4     AggInit 
111b0 20 20 20 20 20 20 30 20 20 20 20 20 20 32 20 20        0      2  
111c0 20 20 20 20 70 74 72 28 30 78 37 39 30 37 30 30      ptr(0x790700
111d0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
111e0 20 20 20 20 20 20 20 0a 35 20 20 20 20 20 49 6e         .5     In
111f0 74 65 67 65 72 20 20 20 20 20 20 20 30 20 20 20  teger       0   
11200 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 36 20               .6 
11230 20 20 20 20 4f 70 65 6e 52 65 61 64 20 20 20 20      OpenRead    
11240 20 20 30 20 20 20 20 20 20 35 20 20 20 20 20 20    0      5      
11250 65 78 61 6d 70 32 20 20 20 20 20 20 20 20 20 20  examp2          
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 20 20 20 0a 37 20 20 20 20 20 56 65 72 69 66 79     .7     Verify
11280 43 6f 6f 6b 69 65 20 20 30 20 20 20 20 20 20 39  Cookie  0      9
11290 30 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20  09              
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 38                .8
112c0 20 20 20 20 20 52 65 77 69 6e 64 20 20 20 20 20       Rewind     
112d0 20 20 20 30 20 20 20 20 20 20 32 33 20 20 20 20     0      23    
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 20 20 20 20 20 20 20 0a 39 20 20 20 20 20           .9     
11310 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20  Column        0 
11320 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
11350 31 30 20 20 20 20 4d 61 6b 65 4b 65 79 20 20 20  10    MakeKey   
11360 20 20 20 20 31 20 20 20 20 20 20 30 20 20 20 20      1      0    
11370 20 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20    n             
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11390 20 20 20 20 20 0a 31 31 20 20 20 20 41 67 67 46       .11    AggF
113a0 6f 63 75 73 20 20 20 20 20 20 30 20 20 20 20 20  ocus      0     
113b0 20 31 34 20 20 20 20 20 20 20 20 20 20 20 20 20   14             
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 0a 31 32 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20  .12    Column   
113f0 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20       0      0   
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 20 20 20 20 0a 31 33 20 20 20 20 41 67 67        .13    Agg
11430 53 65 74 20 20 20 20 20 20 20 20 30 20 20 20 20  Set        0    
11440 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 34 20              .14 
11470 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20     Column       
11480 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20   0      0       
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114b0 20 20 0a 31 35 20 20 20 20 43 6f 6c 75 6d 6e 20    .15    Column 
114c0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31 20         0      1 
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114f0 20 20 20 20 20 20 20 20 0a 31 36 20 20 20 20 41          .16    A
11500 64 64 20 20 20 20 20 20 20 20 20 20 20 30 20 20  dd           0  
11510 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
11540 37 20 20 20 20 49 6e 74 65 67 65 72 20 20 20 20  7    Integer    
11550 20 20 20 31 20 20 20 20 20 20 30 20 20 20 20 20     1      0     
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11580 20 20 20 20 0a 31 38 20 20 20 20 41 67 67 46 75      .18    AggFu
11590 6e 63 20 20 20 20 20 20 20 30 20 20 20 20 20 20  nc       0      
115a0 31 20 20 20 20 20 20 70 74 72 28 30 78 37 39 30  1      ptr(0x790
115b0 33 61 30 29 20 20 20 20 20 20 20 20 20 20 20 20  3a0)            
115c0 20 20 20 20 20 20 20 20 20 20 0a 31 39 20 20 20            .19   
115d0 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30   Column        0
115e0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 0a 32 30 20 20 20 20 49 6e 74 65 67 65 72 20 20  .20    Integer  
11620 20 20 20 20 20 32 20 20 20 20 20 20 30 20 20 20       2      0   
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11650 20 20 20 20 20 20 0a 32 31 20 20 20 20 41 67 67        .21    Agg
11660 46 75 6e 63 20 20 20 20 20 20 20 30 20 20 20 20  Func       0    
11670 20 20 31 20 20 20 20 20 20 70 74 72 28 30 78 37    1      ptr(0x7
11680 39 30 37 30 30 29 20 20 20 20 20 20 20 20 20 20  90700)          
11690 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 32 20              .22 
116a0 20 20 20 4e 65 78 74 20 20 20 20 20 20 20 20 20     Next         
116b0 20 30 20 20 20 20 20 20 39 20 20 20 20 20 20 20   0      9       
116c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116e0 20 20 20 20 20 20 20 0a 32 33 20 20 20 20 43 6c         .23    Cl
116f0 6f 73 65 20 20 20 20 20 20 20 20 20 30 20 20 20  ose         0   
11700 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11730 20 20 0a 32 34 20 20 20 20 41 67 67 4e 65 78 74    .24    AggNext
11740 20 20 20 20 20 20 20 30 20 20 20 20 20 20 33 31         0      31
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0a 32 35 20 20 20 20 41          .25    A
11780 67 67 47 65 74 20 20 20 20 20 20 20 20 30 20 20  ggGet        0  
11790 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 20 20 20 0a 32 36 20 20 20 20 41 67 67 47 65 74     .26    AggGet
117d0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31          0      1
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0a 32                .2
11810 37 20 20 20 20 41 67 67 47 65 74 20 20 20 20 20  7    AggGet     
11820 20 20 20 30 20 20 20 20 20 20 32 20 20 20 20 20     0      2     
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11850 20 20 20 20 0a 32 38 20 20 20 20 41 64 64 20 20      .28    Add  
11860 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
11870 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 20 20 20 20 20 20 20 20 20 20 0a 32 39 20 20 20            .29   
118a0 20 43 61 6c 6c 62 61 63 6b 20 20 20 20 20 20 32   Callback      2
118b0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118e0 0a 33 30 20 20 20 20 47 6f 74 6f 20 20 20 20 20  .30    Goto     
118f0 20 20 20 20 20 30 20 20 20 20 20 20 32 34 20 20       0      24  
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 20 20 20 20 20 20 20 20 20 20 0a 33 31 20 20             .31  
11930 20 20 4e 6f 6f 70 20 20 20 20 20 20 20 20 20 20    Noop          
11940 30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  0      0        
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 0a 33 32 20 20 20 20 48 61 6c 74 20 20 20 20   .32    Halt    
11980 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 20 20 20 0a 7d 0a 0a 70 75 74 73 20         .}..puts 
119c0 7b 0a 3c 70 3e 54 68 65 20 66 69 72 73 74 20 69  {.<p>The first i
119d0 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 69 6e  nstruction of in
119e0 74 65 72 65 73 74 20 69 73 20 74 68 65 20 0a 3c  terest is the .<
119f0 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65 2e 68  a href="opcode.h
11a00 74 6d 6c 23 41 67 67 52 65 73 65 74 22 3e 41 67  tml#AggReset">Ag
11a10 67 52 65 73 65 74 3c 2f 61 3e 20 61 74 20 32 2e  gReset</a> at 2.
11a20 0a 54 68 65 20 41 67 67 52 65 73 65 74 20 69 6e  .The AggReset in
11a30 73 74 72 75 63 74 69 6f 6e 20 69 6e 69 74 69 61  struction initia
11a40 6c 69 7a 65 73 20 74 68 65 20 73 65 74 20 6f 66  lizes the set of
11a50 20 62 75 63 6b 65 74 73 20 74 6f 20 62 65 20 74   buckets to be t
11a60 68 65 0a 65 6d 70 74 79 20 73 65 74 20 61 6e 64  he.empty set and
11a70 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
11a80 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
11a90 73 6c 6f 74 73 20 61 76 61 69 6c 61 62 6c 65 20  slots available 
11aa0 69 6e 20 65 61 63 68 0a 62 75 63 6b 65 74 20 61  in each.bucket a
11ab0 73 20 50 32 2e 20 20 49 6e 20 74 68 69 73 20 65  s P2.  In this e
11ac0 78 61 6d 70 6c 65 2c 20 65 61 63 68 20 62 75 63  xample, each buc
11ad0 6b 65 74 20 77 69 6c 6c 20 68 6f 6c 64 20 33 20  ket will hold 3 
11ae0 6d 65 6d 6f 72 79 20 73 6c 6f 74 73 2e 0a 49 74  memory slots..It
11af0 20 69 73 20 6e 6f 74 20 6f 62 76 69 6f 75 73 2c   is not obvious,
11b00 20 62 75 74 20 69 66 20 79 6f 75 20 6c 6f 6f 6b   but if you look
11b10 20 63 6c 6f 73 65 6c 79 20 61 74 20 74 68 65 20   closely at the 
11b20 72 65 73 74 20 6f 66 20 74 68 65 20 70 72 6f 67  rest of the prog
11b30 72 61 6d 0a 79 6f 75 20 63 61 6e 20 66 69 67 75  ram.you can figu
11b40 72 65 20 6f 75 74 20 77 68 61 74 20 65 61 63 68  re out what each
11b50 20 6f 66 20 74 68 65 73 65 20 73 6c 6f 74 73 20   of these slots 
11b60 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 2e  is intended for.
11b70 3c 2f 70 3e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74  </p>..<blockquot
11b80 65 3e 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d  e><table border=
11b90 22 32 22 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d  "2" cellpadding=
11ba0 22 35 22 3e 0a 3c 74 72 3e 3c 74 68 3e 4d 65 6d  "5">.<tr><th>Mem
11bb0 6f 72 79 20 53 6c 6f 74 3c 2f 74 68 3e 3c 74 68  ory Slot</th><th
11bc0 3e 49 6e 74 65 6e 64 65 64 20 55 73 65 20 4f 66  >Intended Use Of
11bd0 20 54 68 69 73 20 4d 65 6d 6f 72 79 20 53 6c 6f   This Memory Slo
11be0 74 3c 2f 74 68 3e 3c 2f 74 72 3e 0a 3c 74 72 3e  t</th></tr>.<tr>
11bf0 3c 74 64 3e 30 3c 2f 74 64 3e 3c 74 64 3e 54 68  <td>0</td><td>Th
11c00 65 20 22 74 68 72 65 65 22 20 63 6f 6c 75 6d 6e  e "three" column
11c10 20 2d 2d 20 74 68 65 20 6b 65 79 20 74 6f 20 74   -- the key to t
11c20 68 65 20 62 75 63 6b 65 74 3c 2f 74 64 3e 3c 2f  he bucket</td></
11c30 74 72 3e 0a 3c 74 72 3e 3c 74 64 3e 31 3c 2f 74  tr>.<tr><td>1</t
11c40 64 3e 3c 74 64 3e 54 68 65 20 6d 69 6e 69 6d 75  d><td>The minimu
11c50 6d 20 22 74 68 72 65 65 2b 66 6f 75 72 22 20 76  m "three+four" v
11c60 61 6c 75 65 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 3c  alue</td></tr>.<
11c70 74 72 3e 3c 74 64 3e 32 3c 2f 74 64 3e 3c 74 64  tr><td>2</td><td
11c80 3e 54 68 65 20 73 75 6d 20 6f 66 20 61 6c 6c 20  >The sum of all 
11c90 22 66 6f 75 72 22 20 76 61 6c 75 65 73 2e 20 54  "four" values. T
11ca0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 63  his is used to c
11cb0 6f 6d 70 75 74 65 20 0a 20 20 20 22 61 76 67 28  ompute .   "avg(
11cc0 66 6f 75 72 29 22 2e 3c 2f 74 64 3e 3c 2f 74 72  four)".</td></tr
11cd0 3e 0a 3c 2f 74 61 62 6c 65 3e 3c 2f 62 6c 6f 63  >.</table></bloc
11ce0 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e 54 68 65 20  kquote>..<p>The 
11cf0 71 75 65 72 79 20 6c 6f 6f 70 20 69 73 20 69 6d  query loop is im
11d00 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 69 6e 73  plemented by ins
11d10 74 72 75 63 74 69 6f 6e 73 20 38 20 74 68 72 6f  tructions 8 thro
11d20 75 67 68 20 32 32 2e 0a 54 68 65 20 61 67 67 72  ugh 22..The aggr
11d30 65 67 61 74 65 20 6b 65 79 20 73 70 65 63 69 66  egate key specif
11d40 69 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50  ied by the GROUP
11d50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 63 6f   BY clause is co
11d60 6d 70 75 74 65 64 0a 62 79 20 69 6e 73 74 72 75  mputed.by instru
11d70 63 74 69 6f 6e 73 20 39 20 61 6e 64 20 31 30 2e  ctions 9 and 10.
11d80 20 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 31 31    Instruction 11
11d90 20 63 61 75 73 65 73 20 74 68 65 20 61 70 70 72   causes the appr
11da0 6f 70 72 69 61 74 65 0a 62 75 63 6b 65 74 20 74  opriate.bucket t
11db0 6f 20 63 6f 6d 65 20 69 6e 74 6f 20 66 6f 63 75  o come into focu
11dc0 73 2e 20 20 49 66 20 61 20 62 75 63 6b 65 74 20  s.  If a bucket 
11dd0 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 6b  with the given k
11de0 65 79 20 64 6f 65 73 0a 6e 6f 74 20 61 6c 72 65  ey does.not alre
11df0 61 64 79 20 65 78 69 73 74 73 2c 20 61 20 6e 65  ady exists, a ne
11e00 77 20 62 75 63 6b 65 74 20 69 73 20 63 72 65 61  w bucket is crea
11e10 74 65 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ted and control 
11e20 66 61 6c 6c 73 0a 74 68 72 6f 75 67 68 20 74 6f  falls.through to
11e30 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 31 32   instructions 12
11e40 20 61 6e 64 20 31 33 20 77 68 69 63 68 20 69 6e   and 13 which in
11e50 69 74 69 61 6c 69 7a 65 20 74 68 65 20 62 75 63  itialize the buc
11e60 6b 65 74 2e 0a 49 66 20 74 68 65 20 62 75 63 6b  ket..If the buck
11e70 65 74 20 64 6f 65 73 20 61 6c 72 65 61 64 79 20  et does already 
11e80 65 78 69 73 74 2c 20 74 68 65 6e 20 61 20 6a 75  exist, then a ju
11e90 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20 69 6e  mp is made to in
11ea0 73 74 72 75 63 74 69 6f 6e 0a 31 34 2e 20 20 54  struction.14.  T
11eb0 68 65 20 76 61 6c 75 65 73 20 6f 66 20 61 67 67  he values of agg
11ec0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
11ed0 20 61 72 65 20 75 70 64 61 74 65 64 20 62 79 20   are updated by 
11ee0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  the instructions
11ef0 0a 62 65 74 77 65 65 6e 20 31 31 20 61 6e 64 20  .between 11 and 
11f00 32 31 2e 20 20 49 6e 73 74 72 75 63 74 69 6f 6e  21.  Instruction
11f10 73 20 31 34 20 74 68 72 6f 75 67 68 20 31 38 20  s 14 through 18 
11f20 75 70 64 61 74 65 20 6d 65 6d 6f 72 79 0a 73 6c  update memory.sl
11f30 6f 74 20 31 20 74 6f 20 68 6f 6c 64 20 74 68 65  ot 1 to hold the
11f40 20 6e 65 78 74 20 76 61 6c 75 65 20 22 6d 69 6e   next value "min
11f50 28 74 68 72 65 65 2b 66 6f 75 72 29 22 2e 20 20  (three+four)".  
11f60 54 68 65 6e 20 74 68 65 20 73 75 6d 20 6f 66 20  Then the sum of 
11f70 74 68 65 20 0a 22 66 6f 75 72 22 20 63 6f 6c 75  the ."four" colu
11f80 6d 6e 20 69 73 20 75 70 64 61 74 65 64 20 62 79  mn is updated by
11f90 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 31 39   instructions 19
11fa0 20 74 68 72 6f 75 67 68 20 32 31 2e 3c 2f 70 3e   through 21.</p>
11fb0 0a 0a 3c 70 3e 41 66 74 65 72 20 74 68 65 20 71  ..<p>After the q
11fc0 75 65 72 79 20 6c 6f 6f 70 20 69 73 20 66 69 6e  uery loop is fin
11fd0 69 73 68 65 64 2c 20 74 68 65 20 74 61 62 6c 65  ished, the table
11fe0 20 22 65 78 61 6d 70 32 22 20 69 73 20 63 6c 6f   "examp2" is clo
11ff0 73 65 64 20 61 74 0a 69 6e 73 74 72 75 63 74 69  sed at.instructi
12000 6f 6e 20 32 33 20 73 6f 20 74 68 61 74 20 69 74  on 23 so that it
12010 73 20 6c 6f 63 6b 20 77 69 6c 6c 20 62 65 20 72  s lock will be r
12020 65 6c 65 61 73 65 64 20 61 6e 64 20 69 74 20 63  eleased and it c
12030 61 6e 20 62 65 0a 75 73 65 64 20 62 79 20 6f 74  an be.used by ot
12040 68 65 72 20 74 68 72 65 61 64 73 20 6f 72 20 70  her threads or p
12050 72 6f 63 65 73 73 65 73 2e 20 20 54 68 65 20 6e  rocesses.  The n
12060 65 78 74 20 73 74 65 70 20 69 73 20 74 6f 20 6c  ext step is to l
12070 6f 6f 70 0a 6f 76 65 72 20 61 6c 6c 20 61 67 67  oop.over all agg
12080 72 65 67 61 74 65 20 62 75 63 6b 65 74 73 20 61  regate buckets a
12090 6e 64 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  nd output one ro
120a0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  w of the result 
120b0 66 6f 72 0a 65 61 63 68 20 62 75 63 6b 65 74 2e  for.each bucket.
120c0 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
120d0 79 20 74 68 65 20 6c 6f 6f 70 20 61 74 20 69 6e  y the loop at in
120e0 73 74 72 75 63 74 69 6f 6e 73 20 32 34 0a 74 68  structions 24.th
120f0 72 6f 75 67 68 20 33 30 2e 20 20 54 68 65 20 41  rough 30.  The A
12100 67 67 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69  ggNext instructi
12110 6f 6e 20 61 74 20 32 34 20 62 72 69 6e 67 73 20  on at 24 brings 
12120 74 68 65 20 6e 65 78 74 20 62 75 63 6b 65 74 0a  the next bucket.
12130 69 6e 74 6f 20 66 6f 63 75 73 2c 20 6f 72 20 6a  into focus, or j
12140 75 6d 70 73 20 74 6f 20 74 68 65 20 65 6e 64 20  umps to the end 
12150 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 61  of the loop if a
12160 6c 6c 20 62 75 63 6b 65 74 73 20 68 61 76 65 0a  ll buckets have.
12170 62 65 65 6e 20 65 78 61 6d 69 6e 65 64 20 61 6c  been examined al
12180 72 65 61 64 79 2e 20 20 54 68 65 20 33 20 63 6f  ready.  The 3 co
12190 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73  lumns of the res
121a0 75 6c 74 20 61 72 65 20 66 65 74 63 68 65 64 20  ult are fetched 
121b0 66 72 6f 6d 20 0a 74 68 65 20 61 67 67 72 65 67  from .the aggreg
121c0 61 74 6f 72 20 62 75 63 6b 65 74 20 69 6e 20 6f  ator bucket in o
121d0 72 64 65 72 20 61 74 20 69 6e 73 74 72 75 63 74  rder at instruct
121e0 69 6f 6e 73 20 32 35 20 74 68 72 6f 75 67 68 20  ions 25 through 
121f0 32 37 2e 0a 46 69 6e 61 6c 6c 79 2c 20 74 68 65  27..Finally, the
12200 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
12210 6f 6b 65 64 20 61 74 20 69 6e 73 74 72 75 63 74  oked at instruct
12220 69 6f 6e 20 32 39 2e 3c 2f 70 3e 0a 0a 3c 70 3e  ion 29.</p>..<p>
12230 49 6e 20 73 75 6d 6d 61 72 79 20 74 68 65 6e 2c  In summary then,
12240 20 61 6e 79 20 71 75 65 72 79 20 77 69 74 68 20   any query with 
12250 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
12260 6f 6e 73 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ons is implement
12270 65 64 0a 62 79 20 74 77 6f 20 6c 6f 6f 70 73 2e  ed.by two loops.
12280 20 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70    The first loop
12290 20 73 63 61 6e 73 20 74 68 65 20 69 6e 70 75 74   scans the input
122a0 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6d 70 75   table and compu
122b0 74 65 73 0a 61 67 67 72 65 67 61 74 65 20 69 6e  tes.aggregate in
122c0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 62  formation into b
122d0 75 63 6b 65 74 73 20 61 6e 64 20 74 68 65 20 73  uckets and the s
122e0 65 63 6f 6e 64 20 6c 6f 6f 70 20 73 63 61 6e 73  econd loop scans
122f0 20 74 68 72 6f 75 67 68 0a 61 6c 6c 20 74 68 65   through.all the
12300 20 62 75 63 6b 65 74 73 20 74 6f 20 63 6f 6d 70   buckets to comp
12310 75 74 65 20 74 68 65 20 66 69 6e 61 6c 20 72 65  ute the final re
12320 73 75 6c 74 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68  sult.</p>..<p>Th
12330 65 20 72 65 61 6c 69 7a 61 74 69 6f 6e 20 74 68  e realization th
12340 61 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  at an aggregate 
12350 71 75 65 72 79 20 69 73 20 72 65 61 6c 6c 79 20  query is really 
12360 74 77 6f 20 63 6f 6e 73 65 71 75 74 69 76 65 0a  two consequtive.
12370 6c 6f 6f 70 73 20 6d 61 6b 65 73 20 69 74 20 6d  loops makes it m
12380 75 63 68 20 65 61 73 69 65 72 20 74 6f 20 75 6e  uch easier to un
12390 64 65 72 73 74 61 6e 64 20 74 68 65 20 64 69 66  derstand the dif
123a0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a  ference between.
123b0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  a WHERE clause a
123c0 6e 64 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  nd a HAVING clau
123d0 73 65 20 69 6e 20 53 51 4c 20 71 75 65 72 79 20  se in SQL query 
123e0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 0a  statement.  The.
123f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
12400 61 20 72 65 73 74 72 69 63 74 69 6f 6e 20 6f 6e  a restriction on
12410 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   the first loop 
12420 61 6e 64 20 74 68 65 20 48 41 56 49 4e 47 0a 63  and the HAVING.c
12430 6c 61 75 73 65 20 69 73 20 61 20 72 65 73 74 72  lause is a restr
12440 69 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 65  iction on the se
12450 63 6f 6e 64 20 6c 6f 6f 70 2e 20 20 59 6f 75 20  cond loop.  You 
12460 63 61 6e 20 73 65 65 20 74 68 69 73 0a 62 79 20  can see this.by 
12470 61 64 64 69 6e 67 20 62 6f 74 68 20 61 20 57 48  adding both a WH
12480 45 52 45 20 61 6e 64 20 61 20 48 41 56 49 4e 47  ERE and a HAVING
12490 20 63 6c 61 75 73 65 20 74 6f 20 6f 75 72 20 65   clause to our e
124a0 78 61 6d 70 6c 65 20 71 75 65 72 79 3a 3c 2f 70  xample query:</p
124b0 3e 0a 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e  >...<blockquote>
124c0 3c 70 72 65 3e 0a 53 45 4c 45 43 54 20 74 68 72  <pre>.SELECT thr
124d0 65 65 2c 20 6d 69 6e 28 74 68 72 65 65 2b 66 6f  ee, min(three+fo
124e0 75 72 29 2b 61 76 67 28 66 6f 75 72 29 20 0a 46  ur)+avg(four) .F
124f0 52 4f 4d 20 65 78 61 6d 70 32 0a 57 48 45 52 45  ROM examp2.WHERE
12500 20 74 68 72 65 65 3e 66 6f 75 72 0a 47 52 4f 55   three>four.GROU
12510 50 20 42 59 20 74 68 72 65 65 0a 48 41 56 49 4e  P BY three.HAVIN
12520 47 20 61 76 67 28 66 6f 75 72 29 3c 31 30 3b 0a  G avg(four)<10;.
12530 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f  </pre></blockquo
12540 74 65 3e 0a 7d 0a 0a 43 6f 64 65 20 7b 0a 61 64  te>.}..Code {.ad
12550 64 72 20 20 6f 70 63 6f 64 65 20 20 20 20 20 20  dr  opcode      
12560 20 20 70 31 20 20 20 20 20 70 32 20 20 20 20 20    p1     p2     
12570 70 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p3              
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 20 20 20 20 20 20 20 0a 2d 2d 2d 2d 20 20 2d          .----  -
125a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
125b0 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  --  -----  -----
125c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
125d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 30  --------------.0
125e0 20 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20       ColumnName 
125f0 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
12600 20 74 68 72 65 65 20 20 20 20 20 20 20 20 20 20   three          
12610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12620 20 20 20 20 0a 31 20 20 20 20 20 43 6f 6c 75 6d      .1     Colum
12630 6e 4e 61 6d 65 20 20 20 20 31 20 20 20 20 20 20  nName    1      
12640 30 20 20 20 20 20 20 6d 69 6e 28 74 68 72 65 65  0      min(three
12650 2b 66 6f 75 72 29 2b 61 76 67 28 66 6f 75 72 29  +four)+avg(four)
12660 20 20 20 20 20 20 20 20 20 20 0a 32 20 20 20 20            .2    
12670 20 41 67 67 52 65 73 65 74 20 20 20 20 20 20 30   AggReset      0
12680 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 20 20 20 20 0a 33 20 20 20 20 20 41 67 67 49       .3     AggI
126c0 6e 69 74 20 20 20 20 20 20 20 30 20 20 20 20 20  nit       0     
126d0 20 31 20 20 20 20 20 20 70 74 72 28 30 78 37 39   1      ptr(0x79
126e0 30 33 61 30 29 20 20 20 20 20 20 20 20 20 20 20  03a0)           
126f0 20 20 20 20 20 20 20 20 20 20 20 0a 34 20 20 20             .4   
12700 20 20 41 67 67 49 6e 69 74 20 20 20 20 20 20 20    AggInit       
12710 30 20 20 20 20 20 20 32 20 20 20 20 20 20 70 74  0      2      pt
12720 72 28 30 78 37 39 30 37 30 30 29 20 20 20 20 20  r(0x790700)     
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 20 0a 35 20 20 20 20 20 49 6e 74 65 67 65 72 20   .5     Integer 
12750 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 20 20 20 0a 36 20 20 20 20 20 4f 70         .6     Op
12790 65 6e 52 65 61 64 20 20 20 20 20 20 30 20 20 20  enRead      0   
127a0 20 20 20 35 20 20 20 20 20 20 65 78 61 6d 70 32     5      examp2
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 37 20               .7 
127d0 20 20 20 20 56 65 72 69 66 79 43 6f 6f 6b 69 65      VerifyCookie
127e0 20 20 30 20 20 20 20 20 20 39 30 39 20 20 20 20    0      909    
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 20 20 20 20 20 20 20 20 0a 38 20 20 20 20 20 52          .8     R
12820 65 77 69 6e 64 20 20 20 20 20 20 20 20 30 20 20  ewind        0  
12830 20 20 20 20 32 36 20 20 20 20 20 20 20 20 20 20      26          
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12860 20 20 20 0a 39 20 20 20 20 20 43 6f 6c 75 6d 6e     .9     Column
12870 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30          0      0
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 20 20 20 20 20 20 0a 31 30 20 20 20 20           .10    
128b0 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20  Column        0 
128c0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
128f0 31 31 20 20 20 20 4c 65 20 20 20 20 20 20 20 20  11    Le        
12900 20 20 20 20 31 20 20 20 20 20 20 32 35 20 20 20      1      25   
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0a 31 32 20 20 20            .12   
12940 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30   Column        0
12950 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 0a 31 33 20 20 20 20 4d 61 6b 65 4b 65 79 20 20  .13    MakeKey  
12990 20 20 20 20 20 31 20 20 20 20 20 20 30 20 20 20       1      0   
129a0 20 20 20 6e 20 20 20 20 20 20 20 20 20 20 20 20     n            
129b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129c0 20 20 20 20 20 20 0a 31 34 20 20 20 20 41 67 67        .14    Agg
129d0 46 6f 63 75 73 20 20 20 20 20 20 30 20 20 20 20  Focus      0    
129e0 20 20 31 37 20 20 20 20 20 20 20 20 20 20 20 20    17            
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a10 20 0a 31 35 20 20 20 20 43 6f 6c 75 6d 6e 20 20   .15    Column  
12a20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0a 31 36 20 20 20 20 41 67         .16    Ag
12a60 67 53 65 74 20 20 20 20 20 20 20 20 30 20 20 20  gSet        0   
12a70 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 37               .17
12aa0 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20      Column      
12ab0 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ae0 20 20 20 0a 31 38 20 20 20 20 43 6f 6c 75 6d 6e     .18    Column
12af0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31          0      1
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b20 20 20 20 20 20 20 20 20 20 0a 31 39 20 20 20 20           .19    
12b30 41 64 64 20 20 20 20 20 20 20 20 20 20 20 30 20  Add           0 
12b40 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
12b70 32 30 20 20 20 20 49 6e 74 65 67 65 72 20 20 20  20    Integer   
12b80 20 20 20 20 31 20 20 20 20 20 20 30 20 20 20 20      1      0    
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bb0 20 20 20 20 20 0a 32 31 20 20 20 20 41 67 67 46       .21    AggF
12bc0 75 6e 63 20 20 20 20 20 20 20 30 20 20 20 20 20  unc       0     
12bd0 20 31 20 20 20 20 20 20 70 74 72 28 30 78 37 39   1      ptr(0x79
12be0 30 33 61 30 29 20 20 20 20 20 20 20 20 20 20 20  03a0)           
12bf0 20 20 20 20 20 20 20 20 20 20 20 0a 32 32 20 20             .22  
12c00 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20    Column        
12c10 30 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  0      1        
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c40 20 0a 32 33 20 20 20 20 49 6e 74 65 67 65 72 20   .23    Integer 
12c50 20 20 20 20 20 20 32 20 20 20 20 20 20 30 20 20        2      0  
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c80 20 20 20 20 20 20 20 0a 32 34 20 20 20 20 41 67         .24    Ag
12c90 67 46 75 6e 63 20 20 20 20 20 20 20 30 20 20 20  gFunc       0   
12ca0 20 20 20 31 20 20 20 20 20 20 70 74 72 28 30 78     1      ptr(0x
12cb0 37 39 30 37 30 30 29 20 20 20 20 20 20 20 20 20  790700)         
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 35               .25
12cd0 20 20 20 20 4e 65 78 74 20 20 20 20 20 20 20 20      Next        
12ce0 20 20 30 20 20 20 20 20 20 39 20 20 20 20 20 20    0      9      
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 20 20 20 20 20 20 0a 32 36 20 20 20 20 43          .26    C
12d20 6c 6f 73 65 20 20 20 20 20 20 20 20 20 30 20 20  lose         0  
12d30 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 0a 32 37 20 20 20 20 41 67 67 4e 65 78     .27    AggNex
12d70 74 20 20 20 20 20 20 20 30 20 20 20 20 20 20 33  t       0      3
12d80 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32                .2
12db0 38 20 20 20 20 41 67 67 47 65 74 20 20 20 20 20  8    AggGet     
12dc0 20 20 20 30 20 20 20 20 20 20 32 20 20 20 20 20     0      2     
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12df0 20 20 20 20 0a 32 39 20 20 20 20 49 6e 74 65 67      .29    Integ
12e00 65 72 20 20 20 20 20 20 20 31 30 20 20 20 20 20  er       10     
12e10 30 20 20 20 20 20 20 31 30 20 20 20 20 20 20 20  0      10       
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 0a 33 30 20 20 20            .30   
12e40 20 47 65 20 20 20 20 20 20 20 20 20 20 20 20 31   Ge            1
12e50 20 20 20 20 20 20 32 37 20 20 20 20 20 20 20 20        27        
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 20 20 20 0a 33 31 20 20 20 20 41 67 67 47       .31    AggG
12e90 65 74 20 20 20 20 20 20 20 20 30 20 20 20 20 20  et        0     
12ea0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ec0 20 20 20 20 20 20 20 20 20 20 20 0a 33 32 20 20             .32  
12ed0 20 20 41 67 67 47 65 74 20 20 20 20 20 20 20 20    AggGet        
12ee0 30 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  0      1        
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f10 20 0a 33 33 20 20 20 20 41 67 67 47 65 74 20 20   .33    AggGet  
12f20 20 20 20 20 20 20 30 20 20 20 20 20 20 32 20 20        0      2  
12f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f50 20 20 20 20 20 20 20 0a 33 34 20 20 20 20 41 64         .34    Ad
12f60 64 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20  d           0   
12f70 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
12f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 33 35               .35
12fa0 20 20 20 20 43 61 6c 6c 62 61 63 6b 20 20 20 20      Callback    
12fb0 20 20 32 20 20 20 20 20 20 30 20 20 20 20 20 20    2      0      
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 20 20 0a 33 36 20 20 20 20 47 6f 74 6f 20 20     .36    Goto  
12ff0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 32          0      2
13000 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 33                .3
13030 37 20 20 20 20 4e 6f 6f 70 20 20 20 20 20 20 20  7    Noop       
13040 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13070 20 20 20 20 0a 33 38 20 20 20 20 48 61 6c 74 20      .38    Halt 
13080 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
13090 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130b0 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 0a 70 75            .}..pu
130c0 74 73 20 7b 0a 3c 70 3e 54 68 65 20 63 6f 64 65  ts {.<p>The code
130d0 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
130e0 69 73 20 6c 61 73 74 20 65 78 61 6d 70 6c 65 20  is last example 
130f0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
13100 68 65 0a 70 72 65 76 69 6f 75 73 20 65 78 63 65  he.previous exce
13110 70 74 20 66 6f 72 20 74 68 65 20 61 64 64 69 74  pt for the addit
13120 69 6f 6e 20 6f 66 20 74 77 6f 20 63 6f 6e 64 69  ion of two condi
13130 74 69 6f 6e 61 6c 20 6a 75 6d 70 73 20 75 73 65  tional jumps use
13140 64 0a 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d.to implement t
13150 68 65 20 65 78 74 72 61 20 57 48 45 52 45 20 61  he extra WHERE a
13160 6e 64 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  nd HAVING clause
13170 73 2e 20 20 54 68 65 20 57 48 45 52 45 0a 63 6c  s.  The WHERE.cl
13180 61 75 73 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e  ause is implemen
13190 74 65 64 20 62 79 20 69 6e 73 74 72 75 63 74 69  ted by instructi
131a0 6f 6e 73 20 39 20 74 68 72 6f 75 67 68 20 31 31  ons 9 through 11
131b0 20 69 6e 20 74 68 65 20 71 75 65 72 79 0a 6c 6f   in the query.lo
131c0 6f 70 2e 20 20 54 68 65 20 48 41 56 49 4e 47 20  op.  The HAVING 
131d0 63 6c 61 75 73 65 20 69 73 20 69 6d 70 6c 65 6d  clause is implem
131e0 65 6e 74 65 64 20 62 79 20 69 6e 73 74 72 75 63  ented by instruc
131f0 74 69 6f 6e 20 32 38 20 74 68 72 6f 75 67 68 0a  tion 28 through.
13200 33 30 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  30 in the output
13210 20 6c 6f 6f 70 2e 3c 2f 70 3e 0a 0a 3c 68 32 3e   loop.</p>..<h2>
13220 55 73 69 6e 67 20 53 45 4c 45 43 54 20 53 74 61  Using SELECT Sta
13230 74 65 6d 65 6e 74 73 20 41 73 20 54 65 72 6d 73  tements As Terms
13240 20 49 6e 20 41 6e 20 45 78 70 72 65 73 73 69 6f   In An Expressio
13250 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 54 68 65 20 76  n</h2>..<p>The v
13260 65 72 79 20 6e 61 6d 65 20 22 53 74 72 75 63 74  ery name "Struct
13270 75 72 65 64 20 51 75 65 72 79 20 4c 61 6e 67 75  ured Query Langu
13280 61 67 65 22 20 74 65 6c 6c 73 20 75 73 20 74 68  age" tells us th
13290 61 74 20 53 51 4c 20 73 68 6f 75 6c 64 0a 73 75  at SQL should.su
132a0 70 70 6f 72 74 20 6e 65 73 74 65 64 20 71 75 65  pport nested que
132b0 72 69 65 73 2e 20 20 41 6e 64 2c 20 69 6e 20 66  ries.  And, in f
132c0 61 63 74 2c 20 74 77 6f 20 64 69 66 66 65 72 65  act, two differe
132d0 6e 74 20 6b 69 6e 64 73 20 6f 66 20 6e 65 73 74  nt kinds of nest
132e0 69 6e 67 0a 61 72 65 20 73 75 70 70 6f 72 74 65  ing.are supporte
132f0 64 2e 20 20 41 6e 79 20 53 45 4c 45 43 54 20 73  d.  Any SELECT s
13300 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 72 65  tatement that re
13310 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 2d 72  turns a single-r
13320 6f 77 2c 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d  ow, single-colum
13330 6e 0a 72 65 73 75 6c 74 20 63 61 6e 20 62 65 20  n.result can be 
13340 75 73 65 64 20 61 73 20 61 20 74 65 72 6d 20 69  used as a term i
13350 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
13360 6f 66 20 61 6e 6f 74 68 65 72 20 53 45 4c 45 43  of another SELEC
13370 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 41 6e 64  T statement..And
13380 2c 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  , a SELECT state
13390 6d 65 6e 74 20 74 68 61 74 20 72 65 74 75 72 6e  ment that return
133a0 73 20 61 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d  s a single-colum
133b0 6e 2c 20 6d 75 6c 74 69 2d 72 6f 77 20 72 65 73  n, multi-row res
133c0 75 6c 74 0a 63 61 6e 20 62 65 20 75 73 65 64 20  ult.can be used 
133d0 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  as the right-han
133e0 64 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65  d operand of the
133f0 20 49 4e 20 61 6e 64 20 4e 4f 54 20 49 4e 20 6f   IN and NOT IN o
13400 70 65 72 61 74 6f 72 73 2e 0a 57 65 20 77 69 6c  perators..We wil
13410 6c 20 62 65 67 69 6e 20 74 68 69 73 20 73 65 63  l begin this sec
13420 74 69 6f 6e 20 77 69 74 68 20 61 6e 20 65 78 61  tion with an exa
13430 6d 70 6c 65 20 6f 66 20 74 68 65 20 66 69 72 73  mple of the firs
13440 74 20 6b 69 6e 64 20 6f 66 20 6e 65 73 74 69 6e  t kind of nestin
13450 67 2c 0a 77 68 65 72 65 20 61 20 73 69 6e 67 6c  g,.where a singl
13460 65 2d 72 6f 77 2c 20 73 69 6e 67 6c 65 2d 63 6f  e-row, single-co
13470 6c 75 6d 6e 20 53 45 4c 45 43 54 20 69 73 20 75  lumn SELECT is u
13480 73 65 64 20 61 73 20 61 20 74 65 72 6d 20 69 6e  sed as a term in
13490 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 6f   an expression.o
134a0 66 20 61 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  f another SELECT
134b0 2e 20 20 48 65 72 65 20 69 73 20 6f 75 72 20 65  .  Here is our e
134c0 78 61 6d 70 6c 65 3a 3c 2f 70 3e 0a 0a 3c 62 6c  xample:</p>..<bl
134d0 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 53  ockquote><pre>.S
134e0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 78 61  ELECT * FROM exa
134f0 6d 70 0a 57 48 45 52 45 20 74 77 6f 21 3d 28 53  mp.WHERE two!=(S
13500 45 4c 45 43 54 20 74 68 72 65 65 20 46 52 4f 4d  ELECT three FROM
13510 20 65 78 61 6d 70 32 0a 20 20 20 20 20 20 20 20   examp2.        
13520 20 20 20 20 57 48 45 52 45 20 66 6f 75 72 3d 35      WHERE four=5
13530 29 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b  );.</pre></block
13540 71 75 6f 74 65 3e 0a 0a 3c 70 3e 54 68 65 20 77  quote>..<p>The w
13550 61 79 20 53 51 4c 69 74 65 20 64 65 61 6c 73 20  ay SQLite deals 
13560 77 69 74 68 20 74 68 69 73 20 69 73 20 74 6f 20  with this is to 
13570 66 69 72 73 74 20 72 75 6e 20 74 68 65 20 69 6e  first run the in
13580 6e 65 72 20 53 45 4c 45 43 54 0a 28 74 68 65 20  ner SELECT.(the 
13590 6f 6e 65 20 61 67 61 69 6e 73 74 20 65 78 61 6d  one against exam
135a0 70 32 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  p2) and store it
135b0 73 20 72 65 73 75 6c 74 20 69 6e 20 61 20 70 72  s result in a pr
135c0 69 76 61 74 65 20 6d 65 6d 6f 72 79 0a 63 65 6c  ivate memory.cel
135d0 6c 2e 20 20 53 51 4c 69 74 65 20 74 68 65 6e 20  l.  SQLite then 
135e0 73 75 62 73 74 69 74 75 74 65 73 20 74 68 65 20  substitutes the 
135f0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 70 72  value of this pr
13600 69 76 61 74 65 20 6d 65 6d 6f 72 79 0a 63 65 6c  ivate memory.cel
13610 6c 20 66 6f 72 20 74 68 65 20 69 6e 6e 65 72 20  l for the inner 
13620 53 45 4c 45 43 54 20 77 68 65 6e 20 69 74 20 65  SELECT when it e
13630 76 61 6c 75 61 74 65 73 20 74 68 65 20 6f 75 74  valuates the out
13640 65 72 20 53 45 4c 45 43 54 2e 0a 54 68 65 20 63  er SELECT..The c
13650 6f 64 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  ode looks like t
13660 68 69 73 3a 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64 65  his:</p>.}..Code
13670 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f 64 65 20   {.addr  opcode 
13680 20 20 20 20 20 20 20 70 31 20 20 20 20 20 70 32         p1     p2
13690 20 20 20 20 20 70 33 20 20 20 20 20 20 20 20 20       p3         
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 2d 2d               .--
136c0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
136d0 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20    -----  -----  
136e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13700 2d 2d 2d 0a 30 20 20 20 20 20 53 74 72 69 6e 67  ---.0     String
13710 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30          0      0
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13740 20 20 20 20 20 20 20 20 20 0a 31 20 20 20 20 20           .1     
13750 4d 65 6d 53 74 6f 72 65 20 20 20 20 20 20 30 20  MemStore      0 
13760 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
13790 32 20 20 20 20 20 49 6e 74 65 67 65 72 20 20 20  2     Integer   
137a0 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20      0      0    
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137d0 20 20 20 20 20 0a 33 20 20 20 20 20 4f 70 65 6e       .3     Open
137e0 52 65 61 64 20 20 20 20 20 20 31 20 20 20 20 20  Read      1     
137f0 20 35 20 20 20 20 20 20 65 78 61 6d 70 32 20 20   5      examp2  
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13810 20 20 20 20 20 20 20 20 20 20 20 0a 34 20 20 20             .4   
13820 20 20 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 20    VerifyCookie  
13830 30 20 20 20 20 20 20 39 30 39 20 20 20 20 20 20  0      909      
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13860 20 20 20 20 20 20 0a 35 20 20 20 20 20 52 65 77        .5     Rew
13870 69 6e 64 20 20 20 20 20 20 20 20 31 20 20 20 20  ind        1    
13880 20 20 31 33 20 20 20 20 20 20 20 20 20 20 20 20    13            
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138b0 20 0a 36 20 20 20 20 20 43 6f 6c 75 6d 6e 20 20   .6     Column  
138c0 20 20 20 20 20 20 31 20 20 20 20 20 20 31 20 20        1      1  
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0a 37 20 20 20 20 20 49 6e         .7     In
13900 74 65 67 65 72 20 20 20 20 20 20 20 35 20 20 20  teger       5   
13910 20 20 20 30 20 20 20 20 20 20 35 20 20 20 20 20     0      5     
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 38 20               .8 
13940 20 20 20 20 4e 65 20 20 20 20 20 20 20 20 20 20      Ne          
13950 20 20 31 20 20 20 20 20 20 31 32 20 20 20 20 20    1      12     
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13980 20 20 20 0a 39 20 20 20 20 20 43 6f 6c 75 6d 6e     .9     Column
13990 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 30          1      0
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 20 20 20 20 20 20 20 20 0a 31 30 20 20 20 20           .10    
139d0 4d 65 6d 53 74 6f 72 65 20 20 20 20 20 20 30 20  MemStore      0 
139e0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
13a10 31 31 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20  11    Goto      
13a20 20 20 20 20 30 20 20 20 20 20 20 31 33 20 20 20      0      13   
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 20 20 20 20 20 20 20 20 20 20 0a 31 32 20 20 20            .12   
13a60 20 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 31   Next          1
13a70 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 20 20 20 20 20 0a 31 33 20 20 20 20 43 6c 6f 73       .13    Clos
13ab0 65 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20  e         1     
13ac0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ae0 20 20 20 20 20 20 20 20 20 20 20 0a 31 34 20 20             .14  
13af0 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20    ColumnName    
13b00 30 20 20 20 20 20 20 30 20 20 20 20 20 20 6f 6e  0      0      on
13b10 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b30 20 0a 31 35 20 20 20 20 43 6f 6c 75 6d 6e 4e 61   .15    ColumnNa
13b40 6d 65 20 20 20 20 31 20 20 20 20 20 20 30 20 20  me    1      0  
13b50 20 20 20 20 74 77 6f 20 20 20 20 20 20 20 20 20      two         
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 0a 31 36 20 20 20 20 49 6e         .16    In
13b80 74 65 67 65 72 20 20 20 20 20 20 20 30 20 20 20  teger       0   
13b90 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 37               .17
13bc0 20 20 20 20 4f 70 65 6e 52 65 61 64 20 20 20 20      OpenRead    
13bd0 20 20 30 20 20 20 20 20 20 33 20 20 20 20 20 20    0      3      
13be0 65 78 61 6d 70 20 20 20 20 20 20 20 20 20 20 20  examp           
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 20 0a 31 38 20 20 20 20 52 65 77 69 6e 64     .18    Rewind
13c10 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 32          0      2
13c20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
13c50 39 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20  9    Column     
13c60 20 20 20 30 20 20 20 20 20 20 31 20 20 20 20 20     0      1     
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 0a 32 30 20 20 20 20 4d 65 6d 4c 6f      .20    MemLo
13ca0 61 64 20 20 20 20 20 20 20 30 20 20 20 20 20 20  ad       0      
13cb0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cd0 20 20 20 20 20 20 20 20 20 20 0a 32 31 20 20 20            .21   
13ce0 20 45 71 20 20 20 20 20 20 20 20 20 20 20 20 31   Eq            1
13cf0 20 20 20 20 20 20 32 35 20 20 20 20 20 20 20 20        25        
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d20 20 20 20 20 20 0a 32 32 20 20 20 20 43 6f 6c 75       .22    Colu
13d30 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20 20 20  mn        0     
13d40 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d60 20 20 20 20 20 20 20 20 20 20 20 0a 32 33 20 20             .23  
13d70 20 20 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20    Column        
13d80 30 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  0      1        
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 0a 32 34 20 20 20 20 43 61 6c 6c 62 61 63 6b   .24    Callback
13dc0 20 20 20 20 20 20 32 20 20 20 20 20 20 30 20 20        2      0  
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13df0 20 20 20 20 20 20 20 0a 32 35 20 20 20 20 4e 65         .25    Ne
13e00 78 74 20 20 20 20 20 20 20 20 20 20 30 20 20 20  xt          0   
13e10 20 20 20 31 39 20 20 20 20 20 20 20 20 20 20 20     19           
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 0a 32 36 20 20 20 20 43 6c 6f 73 65 20 20    .26    Close  
13e50 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20         0      0 
13e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e80 20 20 20 20 20 20 20 20 0a 32 37 20 20 20 20 48          .27    H
13e90 61 6c 74 20 20 20 20 20 20 20 20 20 20 30 20 20  alt          0  
13ea0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d                .}
13ed0 0a 0a 70 75 74 73 20 7b 0a 3c 70 3e 54 68 65 20  ..puts {.<p>The 
13ee0 70 72 69 76 61 74 65 20 6d 65 6d 6f 72 79 20 63  private memory c
13ef0 65 6c 6c 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ell is initializ
13f00 65 64 20 74 6f 20 4e 55 4c 4c 20 62 79 20 74 68  ed to NULL by th
13f10 65 20 66 69 72 73 74 0a 74 77 6f 20 69 6e 73 74  e first.two inst
13f20 72 75 63 74 69 6f 6e 73 2e 20 20 49 6e 73 74 72  ructions.  Instr
13f30 75 63 74 69 6f 6e 73 20 32 20 74 68 72 6f 75 67  uctions 2 throug
13f40 68 20 31 33 20 69 6d 70 6c 65 6d 65 6e 74 20 74  h 13 implement t
13f50 68 65 20 69 6e 6e 65 72 0a 53 45 4c 45 43 54 20  he inner.SELECT 
13f60 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73  statement agains
13f70 74 20 74 68 65 20 65 78 61 6d 70 32 20 74 61 62  t the examp2 tab
13f80 6c 65 2e 20 20 4e 6f 74 69 63 65 20 74 68 61 74  le.  Notice that
13f90 20 69 6e 73 74 65 61 64 20 6f 66 0a 73 65 6e 64   instead of.send
13fa0 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 74  ing the result t
13fb0 6f 20 61 20 63 61 6c 6c 62 61 63 6b 20 6f 72 20  o a callback or 
13fc0 73 74 6f 72 69 6e 67 20 74 68 65 20 72 65 73 75  storing the resu
13fd0 6c 74 20 6f 6e 20 61 20 73 6f 72 74 65 72 2c 0a  lt on a sorter,.
13fe0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
13ff0 65 20 71 75 65 72 79 20 69 73 20 70 75 73 68 65  e query is pushe
14000 64 20 69 6e 74 6f 20 74 68 65 20 6d 65 6d 6f 72  d into the memor
14010 79 20 63 65 6c 6c 20 62 79 20 69 6e 73 74 72 75  y cell by instru
14020 63 74 69 6f 6e 0a 31 30 20 61 6e 64 20 74 68 65  ction.10 and the
14030 20 6c 6f 6f 70 20 69 73 20 61 62 61 6e 64 6f 6e   loop is abandon
14040 65 64 20 62 79 20 74 68 65 20 6a 75 6d 70 20 61  ed by the jump a
14050 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 31 31  t instruction 11
14060 2e 20 20 0a 54 68 65 20 6a 75 6d 70 20 61 74 20  .  .The jump at 
14070 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 31  instruction at 1
14080 31 20 69 73 20 76 65 73 74 69 67 69 61 6c 20 61  1 is vestigial a
14090 6e 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  nd never execute
140a0 73 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65 20 6f  s.</p>..<p>The o
140b0 75 74 65 72 20 53 45 4c 45 43 54 20 69 73 20 69  uter SELECT is i
140c0 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 69 6e  mplemented by in
140d0 73 74 72 75 63 74 69 6f 6e 73 20 31 34 20 74 68  structions 14 th
140e0 72 6f 75 67 68 20 32 35 2e 0a 49 6e 20 70 61 72  rough 25..In par
140f0 74 69 63 75 6c 61 72 2c 20 74 68 65 20 57 48 45  ticular, the WHE
14100 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 63  RE clause that c
14110 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 65 73 74  ontains the nest
14120 65 64 20 73 65 6c 65 63 74 0a 69 73 20 69 6d 70  ed select.is imp
14130 6c 65 6d 65 6e 74 65 64 20 62 79 20 69 6e 73 74  lemented by inst
14140 72 75 63 74 69 6f 6e 73 20 31 39 20 74 68 72 6f  ructions 19 thro
14150 75 67 68 20 32 31 2e 20 20 59 6f 75 20 63 61 6e  ugh 21.  You can
14160 20 73 65 65 20 74 68 61 74 0a 74 68 65 20 72 65   see that.the re
14170 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65  sult of the inne
14180 72 20 73 65 6c 65 63 74 20 69 73 20 6c 6f 61 64  r select is load
14190 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ed onto the stac
141a0 6b 20 62 79 20 69 6e 73 74 72 75 63 74 69 6f 6e  k by instruction
141b0 0a 32 30 20 61 6e 64 20 75 73 65 64 20 62 79 20  .20 and used by 
141c0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
141d0 6a 75 6d 70 20 61 74 20 32 31 2e 3c 2f 70 3e 0a  jump at 21.</p>.
141e0 0a 3c 70 3e 57 68 65 6e 20 74 68 65 20 72 65 73  .<p>When the res
141f0 75 6c 74 20 6f 66 20 61 20 73 75 62 2d 73 65 6c  ult of a sub-sel
14200 65 63 74 20 69 73 20 61 20 73 63 61 6c 61 72 2c  ect is a scalar,
14210 20 61 20 73 69 6e 67 6c 65 20 70 72 69 76 61 74   a single privat
14220 65 20 6d 65 6d 6f 72 79 0a 63 65 6c 6c 20 63 61  e memory.cell ca
14230 6e 20 62 65 20 75 73 65 64 2c 20 61 73 20 73 68  n be used, as sh
14240 6f 77 6e 20 69 6e 20 74 68 65 20 70 72 65 76 69  own in the previ
14250 6f 75 73 0a 65 78 61 6d 70 6c 65 2e 20 20 42 75  ous.example.  Bu
14260 74 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  t when the resul
14270 74 20 6f 66 20 61 20 73 75 62 2d 73 65 6c 65 63  t of a sub-selec
14280 74 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 73  t is a vector, s
14290 75 63 68 0a 61 73 20 77 68 65 6e 20 74 68 65 20  uch.as when the 
142a0 73 75 62 2d 73 65 6c 65 63 74 20 69 73 20 74 68  sub-select is th
142b0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65  e right-hand ope
142c0 72 61 6e 64 20 6f 66 20 49 4e 20 6f 72 20 4e 4f  rand of IN or NO
142d0 54 20 49 4e 2c 0a 61 20 64 69 66 66 65 72 65 6e  T IN,.a differen
142e0 74 20 61 70 70 72 6f 61 63 68 20 69 73 20 6e 65  t approach is ne
142f0 65 64 65 64 2e 20 20 49 6e 20 74 68 69 73 20 63  eded.  In this c
14300 61 73 65 2c 20 0a 74 68 65 20 72 65 73 75 6c 74  ase, .the result
14310 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
14320 63 74 20 69 73 0a 73 74 6f 72 65 64 20 69 6e 20  ct is.stored in 
14330 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
14340 65 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  e and the conten
14350 74 73 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  ts of that table
14360 0a 61 72 65 20 74 65 73 74 65 64 20 75 73 69 6e  .are tested usin
14370 67 20 74 68 65 20 46 6f 75 6e 64 20 6f 72 20 4e  g the Found or N
14380 6f 74 46 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  otFound operator
14390 73 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  s.  Consider thi
143a0 73 0a 65 78 61 6d 70 6c 65 3a 3c 2f 70 3e 0a 0a  s.example:</p>..
143b0 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
143c0 3e 0a 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  >.SELECT * FROM 
143d0 65 78 61 6d 70 0a 57 48 45 52 45 20 74 77 6f 20  examp.WHERE two 
143e0 49 4e 20 28 53 45 4c 45 43 54 20 74 68 72 65 65  IN (SELECT three
143f0 20 46 52 4f 4d 20 65 78 61 6d 70 32 29 3b 0a 3c   FROM examp2);.<
14400 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74  /pre></blockquot
14410 65 3e 0a 0a 3c 70 3e 54 68 65 20 63 6f 64 65 20  e>..<p>The code 
14420 67 65 6e 65 72 61 74 65 64 20 74 6f 20 69 6d 70  generated to imp
14430 6c 65 6d 65 6e 74 20 74 68 69 73 20 6c 61 73 74  lement this last
14440 20 71 75 65 72 79 20 69 73 20 61 73 20 66 6f 6c   query is as fol
14450 6c 6f 77 73 3a 3c 2f 70 3e 0a 7d 0a 0a 43 6f 64  lows:</p>.}..Cod
14460 65 20 7b 0a 61 64 64 72 20 20 6f 70 63 6f 64 65  e {.addr  opcode
14470 20 20 20 20 20 20 20 20 70 31 20 20 20 20 20 70          p1     p
14480 32 20 20 20 20 20 70 33 20 20 20 20 20 20 20 20  2     p3        
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 2d                .-
144b0 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
144c0 2d 20 20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20  -  -----  ----- 
144d0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144f0 2d 2d 2d 2d 0a 30 20 20 20 20 20 4f 70 65 6e 54  ----.0     OpenT
14500 65 6d 70 20 20 20 20 20 20 31 20 20 20 20 20 20  emp      1      
14510 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 20 20 20 20 20 20 20 20 20 20 0a 31 20 20 20 20            .1    
14540 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 30   Integer       0
14550 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 0a 32 20 20 20 20 20 4f 70 65 6e 52 65 61 64 20  .2     OpenRead 
14590 20 20 20 20 20 32 20 20 20 20 20 20 35 20 20 20       2      5   
145a0 20 20 20 65 78 61 6d 70 32 20 20 20 20 20 20 20     examp2       
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145c0 20 20 20 20 20 20 0a 33 20 20 20 20 20 56 65 72        .3     Ver
145d0 69 66 79 43 6f 6f 6b 69 65 20 20 30 20 20 20 20  ifyCookie  0    
145e0 20 20 39 30 39 20 20 20 20 20 20 20 20 20 20 20    909           
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 20 0a 34 20 20 20 20 20 52 65 77 69 6e 64 20 20   .4     Rewind  
14620 20 20 20 20 20 20 32 20 20 20 20 20 20 31 30 20        2      10 
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 20 20 20 20 20 0a 35 20 20 20 20 20 43 6f         .5     Co
14660 6c 75 6d 6e 20 20 20 20 20 20 20 20 32 20 20 20  lumn        2   
14670 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 36 20               .6 
146a0 20 20 20 20 49 73 4e 75 6c 6c 20 20 20 20 20 20      IsNull      
146b0 20 20 2d 31 20 20 20 20 20 39 20 20 20 20 20 20    -1     9      
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146e0 20 20 20 20 20 20 20 20 0a 37 20 20 20 20 20 53          .7     S
146f0 74 72 69 6e 67 20 20 20 20 20 20 20 20 30 20 20  tring        0  
14700 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 38                .8
14730 20 20 20 20 20 50 75 74 53 74 72 4b 65 79 20 20       PutStrKey  
14740 20 20 20 31 20 20 20 20 20 20 30 20 20 20 20 20     1      0     
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14770 20 20 20 20 0a 39 20 20 20 20 20 4e 65 78 74 20      .9     Next 
14780 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
14790 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
147c0 31 30 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20  10    Close     
147d0 20 20 20 20 32 20 20 20 20 20 20 30 20 20 20 20      2      0    
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 20 20 20 20 20 0a 31 31 20 20 20 20 43 6f 6c 75       .11    Colu
14810 6d 6e 4e 61 6d 65 20 20 20 20 30 20 20 20 20 20  mnName    0     
14820 20 30 20 20 20 20 20 20 6f 6e 65 20 20 20 20 20   0      one     
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 20 20 20 20 20 20 20 20 20 20 20 0a 31 32 20 20             .12  
14850 20 20 43 6f 6c 75 6d 6e 4e 61 6d 65 20 20 20 20    ColumnName    
14860 31 20 20 20 20 20 20 30 20 20 20 20 20 20 74 77  1      0      tw
14870 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 20 0a 31 33 20 20 20 20 49 6e 74 65 67 65 72 20   .13    Integer 
148a0 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148d0 20 20 20 20 20 20 20 0a 31 34 20 20 20 20 4f 70         .14    Op
148e0 65 6e 52 65 61 64 20 20 20 20 20 20 30 20 20 20  enRead      0   
148f0 20 20 20 33 20 20 20 20 20 20 65 78 61 6d 70 20     3      examp 
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 35               .15
14920 20 20 20 20 52 65 77 69 6e 64 20 20 20 20 20 20      Rewind      
14930 20 20 30 20 20 20 20 20 20 32 35 20 20 20 20 20    0      25     
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 20 20 20 20 20 20 0a 31 36 20 20 20 20 43          .16    C
14970 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20  olumn        0  
14980 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
149b0 37 20 20 20 20 4e 6f 74 4e 75 6c 6c 20 20 20 20  7    NotNull    
149c0 20 20 20 2d 31 20 20 20 20 20 32 30 20 20 20 20     -1     20    
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 20 0a 31 38 20 20 20 20 50 6f 70 20 20      .18    Pop  
14a00 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
14a10 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 20 20 20 20 20 20 20 20 0a 31 39 20 20 20            .19   
14a40 20 47 6f 74 6f 20 20 20 20 20 20 20 20 20 20 30   Goto          0
14a50 20 20 20 20 20 20 32 34 20 20 20 20 20 20 20 20        24        
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a80 20 20 20 20 20 0a 32 30 20 20 20 20 4e 6f 74 46       .20    NotF
14a90 6f 75 6e 64 20 20 20 20 20 20 31 20 20 20 20 20  ound      1     
14aa0 20 32 34 20 20 20 20 20 20 20 20 20 20 20 20 20   24             
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 0a 32 31 20 20 20 20 43 6f 6c 75 6d 6e 20 20 20  .21    Column   
14ae0 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20       0      0   
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 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 0a 32 32 20 20 20 20 43 6f 6c        .22    Col
14b20 75 6d 6e 20 20 20 20 20 20 20 20 30 20 20 20 20  umn        0    
14b30 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 33 20              .23 
14b60 20 20 20 43 61 6c 6c 62 61 63 6b 20 20 20 20 20     Callback     
14b70 20 32 20 20 20 20 20 20 30 20 20 20 20 20 20 20   2      0       
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 0a 32 34 20 20 20 20 4e 65 78 74 20 20 20    .24    Next   
14bb0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 31 36         0      16
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 35               .25
14bf0 20 20 20 20 43 6c 6f 73 65 20 20 20 20 20 20 20      Close       
14c00 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20 20    0      0      
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 20 0a 32 36 20 20 20 20 48 61 6c 74 20 20     .26    Halt  
14c40 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30          0      0
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c70 20 20 20 20 20 20 20 20 20 0a 7d 0a 0a 70 75 74           .}..put
14c80 73 20 7b 0a 3c 70 3e 54 68 65 20 74 72 61 6e 73  s {.<p>The trans
14c90 69 65 6e 74 20 74 61 62 6c 65 20 69 6e 20 77 68  ient table in wh
14ca0 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 73 20  ich the results 
14cb0 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 53 45 4c  of the inner SEL
14cc0 45 43 54 20 61 72 65 0a 73 74 6f 72 65 64 20 69  ECT are.stored i
14cd0 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
14ce0 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65   <a href="opcode
14cf0 2e 68 74 6d 6c 23 4f 70 65 6e 54 65 6d 70 22 3e  .html#OpenTemp">
14d00 4f 70 65 6e 54 65 6d 70 3c 2f 61 3e 20 0a 69 6e  OpenTemp</a> .in
14d10 73 74 72 75 63 74 69 6f 6e 20 61 74 20 30 2e 20  struction at 0. 
14d20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
14d30 75 73 65 64 20 66 6f 72 20 74 61 62 6c 65 73 20  used for tables 
14d40 74 68 61 74 20 65 78 69 73 74 20 66 6f 72 20 74  that exist for t
14d50 68 65 20 0a 64 75 72 61 74 69 6f 6e 20 6f 66 20  he .duration of 
14d60 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
14d70 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 20 20 54 68  tement only.  Th
14d80 65 20 74 72 61 6e 73 69 65 6e 74 20 63 75 72 73  e transient curs
14d90 6f 72 20 69 73 20 61 6c 77 61 79 73 20 0a 6f 70  or is always .op
14da0 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20  ened read/write 
14db0 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 69 6e  even if the main
14dc0 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
14dd0 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 74 72 61  d-only.  The tra
14de0 6e 73 69 65 6e 74 20 0a 74 61 62 6c 65 20 69 73  nsient .table is
14df0 20 64 65 6c 65 74 65 64 20 61 75 74 6f 6d 61 74   deleted automat
14e00 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 20  ically when the 
14e10 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
14e20 2e 20 20 54 68 65 20 50 32 20 76 61 6c 75 65 20  .  The P2 value 
14e30 0a 6f 66 20 31 20 6d 65 61 6e 73 20 74 68 65 20  .of 1 means the 
14e40 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
14e50 20 61 20 42 54 72 65 65 20 69 6e 64 65 78 2c 20   a BTree index, 
14e60 77 68 69 63 68 20 68 61 73 20 6e 6f 20 64 61 74  which has no dat
14e70 61 20 62 75 74 20 63 61 6e 20 0a 68 61 76 65 20  a but can .have 
14e80 61 6e 20 61 72 62 69 74 72 61 72 79 20 6b 65 79  an arbitrary key
14e90 2e 3c 2f 70 3e 0a 0a 3c 70 3e 54 68 65 20 69 6e  .</p>..<p>The in
14ea0 6e 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ner SELECT state
14eb0 6d 65 6e 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e  ment is implemen
14ec0 74 65 64 20 62 79 20 69 6e 73 74 72 75 63 74 69  ted by instructi
14ed0 6f 6e 73 20 31 20 74 68 72 6f 75 67 68 20 31 30  ons 1 through 10
14ee0 2e 0a 41 6c 6c 20 74 68 69 73 20 63 6f 64 65 20  ..All this code 
14ef0 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 61 6e 20  does is make an 
14f00 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 65 6d  entry in the tem
14f10 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f 72  porary table for
14f20 20 65 61 63 68 0a 72 6f 77 20 6f 66 20 74 68 65   each.row of the
14f30 20 65 78 61 6d 70 32 20 74 61 62 6c 65 20 77 69   examp2 table wi
14f40 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  th a non-NULL va
14f50 6c 75 65 20 66 6f 72 20 74 68 65 20 22 74 68 72  lue for the "thr
14f60 65 65 22 20 63 6f 6c 75 6d 6e 2e 20 20 0a 54 68  ee" column.  .Th
14f70 65 20 6b 65 79 20 66 6f 72 20 65 61 63 68 20 74  e key for each t
14f80 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 65  emporary table e
14f90 6e 74 72 79 20 69 73 20 74 68 65 20 22 74 68 72  ntry is the "thr
14fa0 65 65 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 65 78  ee" column of ex
14fb0 61 6d 70 32 20 0a 61 6e 64 20 74 68 65 20 64 61  amp2 .and the da
14fc0 74 61 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  ta is an empty s
14fd0 74 72 69 6e 67 20 73 69 6e 63 65 20 69 74 20 69  tring since it i
14fe0 73 20 6e 65 76 65 72 20 75 73 65 64 2e 3c 2f 70  s never used.</p
14ff0 3e 0a 0a 3c 70 3e 54 68 65 20 6f 75 74 65 72 20  >..<p>The outer 
15000 53 45 4c 45 43 54 20 69 73 20 69 6d 70 6c 65 6d  SELECT is implem
15010 65 6e 74 65 64 20 62 79 20 69 6e 73 74 72 75 63  ented by instruc
15020 74 69 6f 6e 73 20 31 31 20 74 68 72 6f 75 67 68  tions 11 through
15030 20 32 35 2e 20 20 49 6e 0a 70 61 72 74 69 63 75   25.  In.particu
15040 6c 61 72 2c 20 74 68 65 20 57 48 45 52 45 20 63  lar, the WHERE c
15050 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  lause containing
15060 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
15070 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a   is implemented.
15080 62 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  by instructions 
15090 61 74 20 31 36 2c 20 31 37 2c 20 61 6e 64 20 32  at 16, 17, and 2
150a0 30 2e 20 20 49 6e 73 74 72 75 63 74 69 6f 6e 20  0.  Instruction 
150b0 31 36 20 70 75 73 68 65 73 20 74 68 65 20 76 61  16 pushes the va
150c0 6c 75 65 20 6f 66 0a 74 68 65 20 22 74 77 6f 22  lue of.the "two"
150d0 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 74 68 65 20   column for the 
150e0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 6e 74 6f  current row onto
150f0 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64 20 69   the stack and i
15100 6e 73 74 72 75 63 74 69 6f 6e 20 31 37 0a 63 68  nstruction 17.ch
15110 65 63 6b 73 20 74 6f 20 73 65 65 20 74 68 61 74  ecks to see that
15120 20 69 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e   it is non-NULL.
15130 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63    If this is suc
15140 63 65 73 73 66 75 6c 2c 20 65 78 65 63 75 74 69  cessful, executi
15150 6f 6e 20 0a 6a 75 6d 70 73 20 74 6f 20 32 30 2c  on .jumps to 20,
15160 20 77 68 65 72 65 20 69 74 20 74 65 73 74 73 20   where it tests 
15170 74 6f 20 73 65 65 20 69 66 20 74 6f 70 20 6f 66  to see if top of
15180 20 74 68 65 20 73 74 61 63 6b 20 6d 61 74 63 68   the stack match
15190 65 73 20 61 6e 79 20 6b 65 79 20 0a 69 6e 20 74  es any key .in t
151a0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
151b0 6c 65 2e 20 20 54 68 65 20 72 65 73 74 20 6f 66  le.  The rest of
151c0 20 74 68 65 20 63 6f 64 65 20 69 73 20 74 68 65   the code is the
151d0 20 73 61 6d 65 20 61 73 20 77 68 61 74 20 68 61   same as what ha
151e0 73 20 0a 62 65 65 6e 20 73 68 6f 77 6e 20 62 65  s .been shown be
151f0 66 6f 72 65 2e 3c 2f 70 3e 0a 0a 3c 68 32 3e 43  fore.</p>..<h2>C
15200 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 53  ompound SELECT S
15210 74 61 74 65 6d 65 6e 74 73 3c 2f 68 32 3e 0a 0a  tatements</h2>..
15220 3c 70 3e 53 51 4c 69 74 65 20 61 6c 73 6f 20 61  <p>SQLite also a
15230 6c 6c 6f 77 73 20 74 77 6f 20 6f 72 20 6d 6f 72  llows two or mor
15240 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
15250 6e 74 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  nts to be joined
15260 20 61 73 0a 70 65 65 72 73 20 75 73 69 6e 67 20   as.peers using 
15270 6f 70 65 72 61 74 6f 72 73 20 55 4e 49 4f 4e 2c  operators UNION,
15280 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 49 4e 54 45   UNION ALL, INTE
15290 52 53 45 43 54 2c 20 61 6e 64 20 45 58 43 45 50  RSECT, and EXCEP
152a0 54 2e 20 20 54 68 65 73 65 0a 63 6f 6d 70 6f 75  T.  These.compou
152b0 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd select statem
152c0 65 6e 74 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ents are impleme
152d0 6e 74 65 64 20 75 73 69 6e 67 20 74 72 61 6e 73  nted using trans
152e0 69 65 6e 74 20 74 61 62 6c 65 73 2e 0a 54 68 65  ient tables..The
152f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
15300 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66  is slightly diff
15310 65 72 65 6e 74 20 66 6f 72 20 65 61 63 68 20 6f  erent for each o
15320 70 65 72 61 74 6f 72 2c 20 62 75 74 20 74 68 65  perator, but the
15330 0a 62 61 73 69 63 20 69 64 65 61 73 20 61 72 65  .basic ideas are
15340 20 74 68 65 20 73 61 6d 65 2e 20 20 46 6f 72 20   the same.  For 
15350 61 6e 20 65 78 61 6d 70 6c 65 20 77 65 20 77 69  an example we wi
15360 6c 6c 20 75 73 65 20 74 68 65 20 45 58 43 45 50  ll use the EXCEP
15370 54 0a 6f 70 65 72 61 74 6f 72 2e 3c 2f 70 3e 0a  T.operator.</p>.
15380 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72  .<blockquote><pr
15390 65 3e 0a 53 45 4c 45 43 54 20 74 77 6f 20 46 52  e>.SELECT two FR
153a0 4f 4d 20 65 78 61 6d 70 0a 45 58 43 45 50 54 0a  OM examp.EXCEPT.
153b0 53 45 4c 45 43 54 20 66 6f 75 72 20 46 52 4f 4d  SELECT four FROM
153c0 20 65 78 61 6d 70 32 3b 0a 3c 2f 70 72 65 3e 3c   examp2;.</pre><
153d0 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70  /blockquote>..<p
153e0 3e 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74  >The result of t
153f0 68 69 73 20 6c 61 73 74 20 65 78 61 6d 70 6c 65  his last example
15400 20 73 68 6f 75 6c 64 20 62 65 20 65 76 65 72 79   should be every
15410 20 75 6e 69 71 75 65 20 76 61 6c 75 65 0a 6f 66   unique value.of
15420 20 74 68 65 20 22 74 77 6f 22 20 63 6f 6c 75 6d   the "two" colum
15430 6e 20 69 6e 20 74 68 65 20 65 78 61 6d 70 20 74  n in the examp t
15440 61 62 6c 65 2c 20 65 78 63 65 70 74 20 61 6e 79  able, except any
15450 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 69   value that is.i
15460 6e 20 74 68 65 20 22 66 6f 75 72 22 20 63 6f 6c  n the "four" col
15470 75 6d 6e 20 6f 66 20 65 78 61 6d 70 32 20 69 73  umn of examp2 is
15480 20 72 65 6d 6f 76 65 64 2e 20 20 54 68 65 20 63   removed.  The c
15490 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
154a0 0a 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61  .this query is a
154b0 73 20 66 6f 6c 6c 6f 77 73 3a 3c 2f 70 3e 0a 7d  s follows:</p>.}
154c0 0a 0a 43 6f 64 65 20 7b 0a 61 64 64 72 20 20 6f  ..Code {.addr  o
154d0 70 63 6f 64 65 20 20 20 20 20 20 20 20 70 31 20  pcode        p1 
154e0 20 20 20 20 70 32 20 20 20 20 20 70 33 20 20 20      p2     p3   
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15510 20 20 20 0a 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d     .----  ------
15520 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 20 20 2d  ------  -----  -
15530 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
15540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 20 20 20 20 20  ---------.0     
15560 4f 70 65 6e 54 65 6d 70 20 20 20 20 20 20 30 20  OpenTemp      0 
15570 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
155a0 31 20 20 20 20 20 4b 65 79 41 73 44 61 74 61 20  1     KeyAsData 
155b0 20 20 20 20 30 20 20 20 20 20 20 31 20 20 20 20      0      1    
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155e0 20 20 20 20 20 20 20 20 20 20 0a 32 20 20 20 20            .2    
155f0 20 49 6e 74 65 67 65 72 20 20 20 20 20 20 20 30   Integer       0
15600 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15630 0a 33 20 20 20 20 20 4f 70 65 6e 52 65 61 64 20  .3     OpenRead 
15640 20 20 20 20 20 31 20 20 20 20 20 20 33 20 20 20       1      3   
15650 20 20 20 65 78 61 6d 70 20 20 20 20 20 20 20 20     examp        
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15670 20 20 20 20 20 20 0a 34 20 20 20 20 20 56 65 72        .4     Ver
15680 69 66 79 43 6f 6f 6b 69 65 20 20 30 20 20 20 20  ifyCookie  0    
15690 20 20 39 30 39 20 20 20 20 20 20 20 20 20 20 20    909           
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156c0 20 0a 35 20 20 20 20 20 52 65 77 69 6e 64 20 20   .5     Rewind  
156d0 20 20 20 20 20 20 31 20 20 20 20 20 20 31 31 20        1      11 
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0a 36 20 20 20 20 20 43 6f         .6     Co
15710 6c 75 6d 6e 20 20 20 20 20 20 20 20 31 20 20 20  lumn        1   
15720 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 37 20               .7 
15750 20 20 20 20 4d 61 6b 65 52 65 63 6f 72 64 20 20      MakeRecord  
15760 20 20 31 20 20 20 20 20 20 30 20 20 20 20 20 20    1      0      
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15790 20 20 20 0a 38 20 20 20 20 20 53 74 72 69 6e 67     .8     String
157a0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 30          0      0
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157d0 20 20 20 20 20 20 20 20 20 0a 39 20 20 20 20 20           .9     
157e0 50 75 74 53 74 72 4b 65 79 20 20 20 20 20 30 20  PutStrKey     0 
157f0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
15820 31 30 20 20 20 20 4e 65 78 74 20 20 20 20 20 20  10    Next      
15830 20 20 20 20 31 20 20 20 20 20 20 36 20 20 20 20      1      6    
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15860 20 20 20 20 20 20 20 20 20 20 0a 31 31 20 20 20            .11   
15870 20 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20 31   Close         1
15880 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 0a 31 32 20 20 20 20 49 6e 74 65 67 65 72 20 20  .12    Integer  
158c0 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20       0      0   
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 20 20 20 20 0a 31 33 20 20 20 20 4f 70 65        .13    Ope
15900 6e 52 65 61 64 20 20 20 20 20 20 32 20 20 20 20  nRead      2    
15910 20 20 35 20 20 20 20 20 20 65 78 61 6d 70 32 20    5      examp2 
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 20 20 20 20 20 20 20 20 20 20 20 20 0a 31 34 20              .14 
15940 20 20 20 52 65 77 69 6e 64 20 20 20 20 20 20 20     Rewind       
15950 20 32 20 20 20 20 20 20 32 30 20 20 20 20 20 20   2      20      
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 0a 31 35 20 20 20 20 43 6f 6c 75 6d 6e 20    .15    Column 
15990 20 20 20 20 20 20 20 32 20 20 20 20 20 20 31 20         2      1 
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159c0 20 20 20 20 20 20 20 20 0a 31 36 20 20 20 20 4d          .16    M
159d0 61 6b 65 52 65 63 6f 72 64 20 20 20 20 31 20 20  akeRecord    1  
159e0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 31                .1
15a10 37 20 20 20 20 4e 6f 74 46 6f 75 6e 64 20 20 20  7    NotFound   
15a20 20 20 20 30 20 20 20 20 20 20 31 39 20 20 20 20     0      19    
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a50 20 20 20 20 20 20 20 20 20 0a 31 38 20 20 20 20           .18    
15a60 44 65 6c 65 74 65 20 20 20 20 20 20 20 20 30 20  Delete        0 
15a70 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
15aa0 31 39 20 20 20 20 4e 65 78 74 20 20 20 20 20 20  19    Next      
15ab0 20 20 20 20 32 20 20 20 20 20 20 31 35 20 20 20      2      15   
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ae0 20 20 20 20 20 20 20 20 20 20 0a 32 30 20 20 20            .20   
15af0 20 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20 32   Close         2
15b00 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b30 0a 32 31 20 20 20 20 43 6f 6c 75 6d 6e 4e 61 6d  .21    ColumnNam
15b40 65 20 20 20 20 30 20 20 20 20 20 20 30 20 20 20  e    0      0   
15b50 20 20 20 66 6f 75 72 20 20 20 20 20 20 20 20 20     four         
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 20 20 20 20 20 20 0a 32 32 20 20 20 20 52 65 77        .22    Rew
15b80 69 6e 64 20 20 20 20 20 20 20 20 30 20 20 20 20  ind        0    
15b90 20 20 32 36 20 20 20 20 20 20 20 20 20 20 20 20    26            
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bc0 20 0a 32 33 20 20 20 20 43 6f 6c 75 6d 6e 20 20   .23    Column  
15bd0 20 20 20 20 20 20 30 20 20 20 20 20 20 30 20 20        0      0  
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0a 32 34 20 20 20 20 43 61         .24    Ca
15c10 6c 6c 62 61 63 6b 20 20 20 20 20 20 31 20 20 20  llback      1   
15c20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32 35               .25
15c50 20 20 20 20 4e 65 78 74 20 20 20 20 20 20 20 20      Next        
15c60 20 20 30 20 20 20 20 20 20 32 33 20 20 20 20 20    0      23     
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 20 20 20 20 20 0a 32 36 20 20 20 20 43          .26    C
15ca0 6c 6f 73 65 20 20 20 20 20 20 20 20 20 30 20 20  lose         0  
15cb0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 32                .2
15ce0 37 20 20 20 20 48 61 6c 74 20 20 20 20 20 20 20  7    Halt       
15cf0 20 20 20 30 20 20 20 20 20 20 30 20 20 20 20 20     0      0     
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 20 0a 7d 0a 0a 70 75 74 73 20 7b 0a 3c      .}..puts {.<
15d30 70 3e 54 68 65 20 74 72 61 6e 73 69 65 6e 74 20  p>The transient 
15d40 74 61 62 6c 65 20 69 6e 20 77 68 69 63 68 20 74  table in which t
15d50 68 65 20 72 65 73 75 6c 74 20 69 73 20 62 75 69  he result is bui
15d60 6c 74 20 69 73 20 63 72 65 61 74 65 64 20 62 79  lt is created by
15d70 0a 69 6e 73 74 72 75 63 74 69 6f 6e 20 30 2e 20  .instruction 0. 
15d80 20 54 68 72 65 65 20 6c 6f 6f 70 73 20 74 68 65   Three loops the
15d90 6e 20 66 6f 6c 6c 6f 77 2e 20 20 54 68 65 20 6c  n follow.  The l
15da0 6f 6f 70 20 61 74 20 69 6e 73 74 72 75 63 74 69  oop at instructi
15db0 6f 6e 73 0a 35 20 74 68 72 6f 75 67 68 20 31 30  ons.5 through 10
15dc0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
15dd0 66 69 72 73 74 20 53 45 4c 45 43 54 20 73 74 61  first SELECT sta
15de0 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 73 65 63  tement.  The sec
15df0 6f 6e 64 0a 53 45 4c 45 43 54 20 73 74 61 74 65  ond.SELECT state
15e00 6d 65 6e 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e  ment is implemen
15e10 74 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20  ted by the loop 
15e20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  at instructions 
15e30 31 34 20 74 68 72 6f 75 67 68 0a 31 39 2e 20 20  14 through.19.  
15e40 46 69 6e 61 6c 6c 79 2c 20 61 20 6c 6f 6f 70 20  Finally, a loop 
15e50 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  at instructions 
15e60 32 32 20 74 68 72 6f 75 67 68 20 32 35 20 72 65  22 through 25 re
15e70 61 64 73 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ads the transien
15e80 74 0a 74 61 62 6c 65 20 61 6e 64 20 69 6e 76 6f  t.table and invo
15e90 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
15ea0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72   once for each r
15eb0 6f 77 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ow in the result
15ec0 2e 3c 2f 70 3e 0a 0a 3c 70 3e 49 6e 73 74 72 75  .</p>..<p>Instru
15ed0 63 74 69 6f 6e 20 31 20 69 73 20 6f 66 20 70 61  ction 1 is of pa
15ee0 72 74 69 63 75 6c 61 72 20 69 6d 70 6f 72 74 61  rticular importa
15ef0 6e 63 65 20 69 6e 20 74 68 69 73 20 65 78 61 6d  nce in this exam
15f00 70 6c 65 2e 20 20 4e 6f 72 6d 61 6c 6c 79 2c 0a  ple.  Normally,.
15f10 74 68 65 20 43 6f 6c 75 6d 6e 20 69 6e 73 74 72  the Column instr
15f20 75 63 74 69 6f 6e 20 65 78 74 72 61 63 74 73 20  uction extracts 
15f30 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 63  the value of a c
15f40 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 6c 61 72  olumn from a lar
15f50 67 65 72 0a 72 65 63 6f 72 64 20 69 6e 20 74 68  ger.record in th
15f60 65 20 64 61 74 61 20 6f 66 20 61 6e 20 53 51 4c  e data of an SQL
15f70 69 74 65 20 66 69 6c 65 20 65 6e 74 72 79 2e 20  ite file entry. 
15f80 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 31 20 73   Instruction 1 s
15f90 65 74 73 20 61 20 66 6c 61 67 20 6f 6e 0a 74 68  ets a flag on.th
15fa0 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
15fb0 65 20 73 6f 20 74 68 61 74 20 43 6f 6c 75 6d 6e  e so that Column
15fc0 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 20 74 72   will instead tr
15fd0 65 61 74 20 74 68 65 20 6b 65 79 20 6f 66 20 74  eat the key of t
15fe0 68 65 0a 53 51 4c 69 74 65 20 66 69 6c 65 20 65  he.SQLite file e
15ff0 6e 74 72 79 20 61 73 20 69 66 20 69 74 20 77 65  ntry as if it we
16000 72 65 20 64 61 74 61 20 61 6e 64 20 65 78 74 72  re data and extr
16010 61 63 74 20 63 6f 6c 75 6d 6e 20 69 6e 66 6f 72  act column infor
16020 6d 61 74 69 6f 6e 20 66 72 6f 6d 0a 74 68 65 20  mation from.the 
16030 6b 65 79 2e 3c 2f 70 3e 0a 0a 3c 70 3e 48 65 72  key.</p>..<p>Her
16040 65 20 69 73 20 77 68 61 74 20 69 73 20 67 6f 69  e is what is goi
16050 6e 67 20 74 6f 20 68 61 70 70 65 6e 3a 20 20 54  ng to happen:  T
16060 68 65 20 66 69 72 73 74 20 53 45 4c 45 43 54 20  he first SELECT 
16070 73 74 61 74 65 6d 65 6e 74 0a 77 69 6c 6c 20 63  statement.will c
16080 6f 6e 73 74 72 75 63 74 20 72 6f 77 73 20 6f 66  onstruct rows of
16090 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20   the result and 
160a0 73 61 76 65 20 65 61 63 68 20 72 6f 77 20 61 73  save each row as
160b0 20 74 68 65 20 6b 65 79 20 6f 66 0a 61 6e 20 65   the key of.an e
160c0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 61 6e  ntry in the tran
160d0 73 69 65 6e 74 20 74 61 62 6c 65 2e 20 20 54 68  sient table.  Th
160e0 65 20 64 61 74 61 20 66 6f 72 20 65 61 63 68 20  e data for each 
160f0 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 74 72 61  entry in the.tra
16100 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 69 73 20  nsient table is 
16110 61 20 6e 65 76 65 72 20 75 73 65 64 20 73 6f 20  a never used so 
16120 77 65 20 66 69 6c 6c 20 69 74 20 69 6e 20 77 69  we fill it in wi
16130 74 68 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  th an empty stri
16140 6e 67 2e 0a 54 68 65 20 73 65 63 6f 6e 64 20 53  ng..The second S
16150 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
16160 61 6c 73 6f 20 63 6f 6e 73 74 72 75 63 74 73 20  also constructs 
16170 72 6f 77 73 2c 20 62 75 74 20 74 68 65 20 72 6f  rows, but the ro
16180 77 73 0a 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ws.constructed b
16190 79 20 74 68 65 20 73 65 63 6f 6e 64 20 53 45 4c  y the second SEL
161a0 45 43 54 20 61 72 65 20 72 65 6d 6f 76 65 64 20  ECT are removed 
161b0 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 69 65  from the transie
161c0 6e 74 20 74 61 62 6c 65 2e 0a 54 68 61 74 20 69  nt table..That i
161d0 73 20 77 68 79 20 77 65 20 77 61 6e 74 20 74 68  s why we want th
161e0 65 20 72 6f 77 73 20 74 6f 20 62 65 20 73 74 6f  e rows to be sto
161f0 72 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 6f  red in the key o
16200 66 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  f the SQLite fil
16210 65 0a 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e.instead of in 
16220 74 68 65 20 64 61 74 61 20 2d 2d 20 73 6f 20 74  the data -- so t
16230 68 65 79 20 63 61 6e 20 62 65 20 65 61 73 69 6c  hey can be easil
16240 79 20 6c 6f 63 61 74 65 64 20 61 6e 64 20 64 65  y located and de
16250 6c 65 74 65 64 2e 3c 2f 70 3e 0a 0a 3c 70 3e 4c  leted.</p>..<p>L
16260 65 74 27 73 20 6c 6f 6f 6b 20 6d 6f 72 65 20 63  et's look more c
16270 6c 6f 73 65 6c 79 20 61 74 20 77 68 61 74 20 69  losely at what i
16280 73 20 68 61 70 70 65 6e 69 6e 67 20 68 65 72 65  s happening here
16290 2e 20 20 54 68 65 20 66 69 72 73 74 0a 53 45 4c  .  The first.SEL
162a0 45 43 54 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ECT is implement
162b0 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61  ed by the loop a
162c0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 35  t instructions 5
162d0 20 74 68 72 6f 75 67 68 20 31 30 2e 0a 49 6e 73   through 10..Ins
162e0 74 72 75 63 74 69 6f 6e 20 35 20 69 6e 74 69 61  truction 5 intia
162f0 6c 69 7a 65 73 20 74 68 65 20 6c 6f 6f 70 20 62  lizes the loop b
16300 79 20 72 65 77 69 6e 64 69 6e 67 20 69 74 73 20  y rewinding its 
16310 63 75 72 73 6f 72 2e 0a 49 6e 73 74 72 75 63 74  cursor..Instruct
16320 69 6f 6e 20 36 20 65 78 74 72 61 63 74 73 20 74  ion 6 extracts t
16330 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
16340 22 74 77 6f 22 20 63 6f 6c 75 6d 6e 20 66 72 6f  "two" column fro
16350 6d 20 22 65 78 61 6d 70 22 0a 61 6e 64 20 69 6e  m "examp".and in
16360 73 74 72 75 63 74 69 6f 6e 20 37 20 63 6f 6e 76  struction 7 conv
16370 65 72 74 73 20 74 68 69 73 20 69 6e 74 6f 20 61  erts this into a
16380 20 72 6f 77 2e 20 20 49 6e 73 74 72 75 63 74 69   row.  Instructi
16390 6f 6e 20 38 20 70 75 73 68 65 73 0a 61 6e 20 65  on 8 pushes.an e
163a0 6d 70 74 79 20 73 74 72 69 6e 67 20 6f 6e 74 6f  mpty string onto
163b0 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 69 6e   the stack.  Fin
163c0 61 6c 6c 79 2c 20 69 6e 73 74 72 75 63 74 69 6f  ally, instructio
163d0 6e 20 39 20 77 72 69 74 65 73 20 74 68 65 0a 72  n 9 writes the.r
163e0 6f 77 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ow into the temp
163f0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 42 75  orary table.  Bu
16400 74 20 72 65 6d 65 6d 62 65 72 2c 20 74 68 65 20  t remember, the 
16410 50 75 74 53 74 72 4b 65 79 20 6f 70 63 6f 64 65  PutStrKey opcode
16420 20 75 73 65 73 0a 74 68 65 20 74 6f 70 20 6f 66   uses.the top of
16430 20 74 68 65 20 73 74 61 63 6b 20 61 73 20 74 68   the stack as th
16440 65 20 72 65 63 6f 72 64 20 64 61 74 61 20 61 6e  e record data an
16450 64 20 74 68 65 20 6e 65 78 74 20 6f 6e 20 73 74  d the next on st
16460 61 63 6b 20 61 73 20 74 68 65 0a 6b 65 79 2e 20  ack as the.key. 
16470 20 46 6f 72 20 61 6e 20 49 4e 53 45 52 54 20 73   For an INSERT s
16480 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 72 6f  tatement, the ro
16490 77 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  w generated by t
164a0 68 65 0a 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  he.MakeRecord op
164b0 63 6f 64 65 20 69 73 20 74 68 65 20 72 65 63 6f  code is the reco
164c0 72 64 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  rd data and the 
164d0 72 65 63 6f 72 64 20 6b 65 79 20 69 73 20 61 6e  record key is an
164e0 20 69 6e 74 65 67 65 72 0a 63 72 65 61 74 65 64   integer.created
164f0 20 62 79 20 74 68 65 20 4e 65 77 52 65 63 6e 6f   by the NewRecno
16500 20 6f 70 63 6f 64 65 2e 20 20 42 75 74 20 68 65   opcode.  But he
16510 72 65 20 74 68 65 20 72 6f 6c 65 73 20 61 72 65  re the roles are
16520 20 72 65 76 65 72 73 65 64 20 61 6e 64 0a 74 68   reversed and.th
16530 65 20 72 6f 77 20 63 72 65 61 74 65 64 20 62 79  e row created by
16540 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 73 20 74   MakeRecord is t
16550 68 65 20 72 65 63 6f 72 64 20 6b 65 79 20 61 6e  he record key an
16560 64 20 74 68 65 20 72 65 63 6f 72 64 20 64 61 74  d the record dat
16570 61 20 69 73 0a 6a 75 73 74 20 61 6e 20 65 6d 70  a is.just an emp
16580 74 79 20 73 74 72 69 6e 67 2e 3c 2f 70 3e 0a 0a  ty string.</p>..
16590 3c 70 3e 54 68 65 20 73 65 63 6f 6e 64 20 53 45  <p>The second SE
165a0 4c 45 43 54 20 69 73 20 69 6d 70 6c 65 6d 65 6e  LECT is implemen
165b0 74 65 64 20 62 79 20 69 6e 73 74 72 75 63 74 69  ted by instructi
165c0 6f 6e 73 20 31 34 20 74 68 72 6f 75 67 68 20 31  ons 14 through 1
165d0 39 2e 0a 49 6e 73 74 72 75 63 74 69 6f 6e 20 31  9..Instruction 1
165e0 34 20 69 6e 74 69 61 6c 69 7a 65 73 20 74 68 65  4 intializes the
165f0 20 6c 6f 6f 70 20 62 79 20 72 65 77 69 6e 64 69   loop by rewindi
16600 6e 67 20 69 74 73 20 63 75 72 73 6f 72 2e 0a 41  ng its cursor..A
16610 20 6e 65 77 20 72 65 73 75 6c 74 20 72 6f 77 20   new result row 
16620 69 73 20 63 72 65 61 74 65 64 20 66 72 6f 6d 20  is created from 
16630 74 68 65 20 22 66 6f 75 72 22 20 63 6f 6c 75 6d  the "four" colum
16640 6e 20 6f 66 20 74 61 62 6c 65 20 22 65 78 61 6d  n of table "exam
16650 70 32 22 0a 62 79 20 69 6e 73 74 72 75 63 74 69  p2".by instructi
16660 6f 6e 73 20 31 35 20 61 6e 64 20 31 36 2e 20 20  ons 15 and 16.  
16670 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 20 75  But instead of u
16680 73 69 6e 67 20 50 75 74 53 74 72 4b 65 79 20 74  sing PutStrKey t
16690 6f 20 77 72 69 74 65 20 74 68 69 73 0a 6e 65 77  o write this.new
166a0 20 72 6f 77 20 69 6e 74 6f 20 74 68 65 20 74 65   row into the te
166b0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 77  mporary table, w
166c0 65 20 69 6e 73 74 65 61 64 20 63 61 6c 6c 20 44  e instead call D
166d0 65 6c 65 74 65 20 74 6f 20 72 65 6d 6f 76 65 0a  elete to remove.
166e0 69 74 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70  it from the temp
166f0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 69  orary table if i
16700 74 20 65 78 69 73 74 73 2e 3c 2f 70 3e 0a 0a 3c  t exists.</p>..<
16710 70 3e 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  p>The result of 
16720 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
16730 65 63 74 20 69 73 20 73 65 6e 74 20 74 6f 20 74  ect is sent to t
16740 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
16750 69 6e 65 0a 62 79 20 74 68 65 20 6c 6f 6f 70 20  ine.by the loop 
16760 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  at instructions 
16770 32 32 20 74 68 72 6f 75 67 68 20 32 35 2e 20 20  22 through 25.  
16780 54 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  There is nothing
16790 20 6e 65 77 0a 6f 72 20 72 65 6d 61 72 6b 61 62   new.or remarkab
167a0 6c 65 20 61 62 6f 75 74 20 74 68 69 73 20 6c 6f  le about this lo
167b0 6f 70 2c 20 65 78 63 65 70 74 20 66 6f 72 20 74  op, except for t
167c0 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
167d0 20 43 6f 6c 75 6d 6e 20 0a 69 6e 73 74 72 75 63   Column .instruc
167e0 74 69 6f 6e 20 61 74 20 32 33 20 77 69 6c 6c 20  tion at 23 will 
167f0 62 65 20 65 78 74 72 61 63 74 69 6e 67 20 61 20  be extracting a 
16800 63 6f 6c 75 6d 6e 20 6f 75 74 20 6f 66 20 74 68  column out of th
16810 65 20 72 65 63 6f 72 64 20 6b 65 79 0a 72 61 74  e record key.rat
16820 68 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 63  her than the rec
16830 6f 72 64 20 64 61 74 61 2e 3c 2f 70 3e 0a 0a 3c  ord data.</p>..<
16840 68 32 3e 53 75 6d 6d 61 72 79 3c 2f 68 32 3e 0a  h2>Summary</h2>.
16850 0a 3c 70 3e 54 68 69 73 20 61 72 74 69 63 6c 65  .<p>This article
16860 20 68 61 73 20 72 65 76 69 65 77 65 64 20 61 6c   has reviewed al
16870 6c 20 6f 66 20 74 68 65 20 6d 61 6a 6f 72 20 74  l of the major t
16880 65 63 68 6e 69 71 75 65 73 20 75 73 65 64 20 62  echniques used b
16890 79 0a 53 51 4c 69 74 65 27 73 20 56 44 42 45 20  y.SQLite's VDBE 
168a0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 53 51 4c  to implement SQL
168b0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 57 68   statements.  Wh
168c0 61 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  at has not been 
168d0 73 68 6f 77 6e 0a 69 73 20 74 68 61 74 20 6d 6f  shown.is that mo
168e0 73 74 20 6f 66 20 74 68 65 73 65 20 74 65 63 68  st of these tech
168f0 6e 69 71 75 65 73 20 63 61 6e 20 62 65 20 75 73  niques can be us
16900 65 64 20 69 6e 20 63 6f 6d 62 69 6e 61 74 69 6f  ed in combinatio
16910 6e 20 74 6f 0a 67 65 6e 65 72 61 74 65 20 63 6f  n to.generate co
16920 64 65 20 66 6f 72 20 61 6e 20 61 70 70 72 6f 70  de for an approp
16930 72 69 61 74 65 6c 79 20 63 6f 6d 70 6c 65 78 20  riately complex 
16940 71 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74 2e  query statement.
16950 20 20 46 6f 72 0a 65 78 61 6d 70 6c 65 2c 20 77    For.example, w
16960 65 20 68 61 76 65 20 73 68 6f 77 6e 20 68 6f 77  e have shown how
16970 20 73 6f 72 74 69 6e 67 20 69 73 20 61 63 63 6f   sorting is acco
16980 6d 70 6c 69 73 68 65 64 20 6f 6e 20 61 20 73 69  mplished on a si
16990 6d 70 6c 65 20 71 75 65 72 79 0a 61 6e 64 20 77  mple query.and w
169a0 65 20 68 61 76 65 20 73 68 6f 77 6e 20 68 6f 77  e have shown how
169b0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
169c0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
169d0 20 42 75 74 20 77 65 20 64 69 64 0a 6e 6f 74 20   But we did.not 
169e0 67 69 76 65 20 61 6e 20 65 78 61 6d 70 6c 65 20  give an example 
169f0 6f 66 20 73 6f 72 74 69 6e 67 20 69 6e 20 61 20  of sorting in a 
16a00 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
16a10 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
16a20 0a 73 6f 72 74 69 6e 67 20 61 20 63 6f 6d 70 6f  .sorting a compo
16a30 75 6e 64 20 71 75 65 72 79 20 64 6f 65 73 20 6e  und query does n
16a40 6f 74 20 69 6e 74 72 6f 64 75 63 65 20 61 6e 79  ot introduce any
16a50 20 6e 65 77 20 63 6f 6e 63 65 70 74 73 3a 20 69   new concepts: i
16a60 74 0a 6d 65 72 65 6c 79 20 63 6f 6d 62 69 6e 65  t.merely combine
16a70 73 20 74 77 6f 20 70 72 65 76 69 6f 75 73 20 69  s two previous i
16a80 64 65 61 73 20 28 73 6f 72 74 69 6e 67 20 61 6e  deas (sorting an
16a90 64 20 63 6f 6d 70 6f 75 6e 64 69 6e 67 29 0a 69  d compounding).i
16aa0 6e 20 74 68 65 20 73 61 6d 65 20 56 44 42 45 20  n the same VDBE 
16ab0 70 72 6f 67 72 61 6d 2e 3c 2f 70 3e 0a 0a 3c 70  program.</p>..<p
16ac0 3e 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20  >For additional 
16ad0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 68  information on h
16ae0 6f 77 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ow the SQLite li
16af0 62 72 61 72 79 0a 66 75 6e 63 74 69 6f 6e 73 2c  brary.functions,
16b00 20 74 68 65 20 72 65 61 64 65 72 20 69 73 20 64   the reader is d
16b10 69 72 65 63 74 65 64 20 74 6f 20 6c 6f 6f 6b 20  irected to look 
16b20 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 73 6f  at the SQLite so
16b30 75 72 63 65 0a 63 6f 64 65 20 64 69 72 65 63 74  urce.code direct
16b40 6c 79 2e 20 20 49 66 20 79 6f 75 20 75 6e 64 65  ly.  If you unde
16b50 72 73 74 61 6e 64 20 74 68 65 20 6d 61 74 65 72  rstand the mater
16b60 69 61 6c 20 69 6e 20 74 68 69 73 20 61 72 74 69  ial in this arti
16b70 63 6c 65 2c 0a 79 6f 75 20 73 68 6f 75 6c 64 20  cle,.you should 
16b80 6e 6f 74 20 68 61 76 65 20 6d 75 63 68 20 64 69  not have much di
16b90 66 66 69 63 75 6c 74 79 20 69 6e 20 66 6f 6c 6c  fficulty in foll
16ba0 6f 77 69 6e 67 20 74 68 65 20 73 6f 75 72 63 65  owing the source
16bb0 73 2e 0a 53 65 72 69 6f 75 73 20 73 74 75 64 65  s..Serious stude
16bc0 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 72  nts of the inter
16bd0 6e 61 6c 73 20 6f 66 20 53 51 4c 69 74 65 20 77  nals of SQLite w
16be0 69 6c 6c 20 70 72 6f 62 61 62 6c 79 0a 61 6c 73  ill probably.als
16bf0 6f 20 77 68 61 74 20 74 6f 20 6d 61 6b 65 20 61  o what to make a
16c00 20 63 61 72 65 66 75 6c 20 73 74 75 64 79 20 6f   careful study o
16c10 66 20 74 68 65 20 56 44 42 45 20 6f 70 63 6f 64  f the VDBE opcod
16c20 65 73 0a 61 73 20 64 6f 63 75 6d 65 6e 74 65 64  es.as documented
16c30 20 3c 61 20 68 72 65 66 3d 22 6f 70 63 6f 64 65   <a href="opcode
16c40 2e 68 74 6d 6c 22 3e 68 65 72 65 3c 2f 61 3e 2e  .html">here</a>.
16c50 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 0a 6f 70    Most of the.op
16c60 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74 61 74 69  code documentati
16c70 6f 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  on is extracted 
16c80 66 72 6f 6d 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  from comments in
16c90 20 74 68 65 20 73 6f 75 72 63 65 0a 63 6f 64 65   the source.code
16ca0 20 75 73 69 6e 67 20 61 20 73 63 72 69 70 74 20   using a script 
16cb0 73 6f 20 79 6f 75 20 63 61 6e 20 61 6c 73 6f 20  so you can also 
16cc0 67 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  get information 
16cd0 61 62 6f 75 74 20 74 68 65 0a 76 61 72 69 6f 75  about the.variou
16ce0 73 20 6f 70 63 6f 64 65 73 20 64 69 72 65 63 74  s opcodes direct
16cf0 6c 79 20 66 72 6f 6d 20 74 68 65 20 3c 62 3e 76  ly from the <b>v
16d00 64 62 65 2e 63 3c 2f 62 3e 20 73 6f 75 72 63 65  dbe.c</b> source
16d10 20 66 69 6c 65 2e 0a 49 66 20 79 6f 75 20 68 61   file..If you ha
16d20 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
16d30 72 65 61 64 20 74 68 69 73 20 66 61 72 2c 20 79  read this far, y
16d40 6f 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6c  ou should have l
16d50 69 74 74 6c 65 0a 64 69 66 66 69 63 75 6c 74 79  ittle.difficulty
16d60 20 75 6e 64 65 72 73 74 61 6e 64 69 6e 67 20 74   understanding t
16d70 68 65 20 72 65 73 74 2e 3c 2f 70 3e 0a 0a 3c 70  he rest.</p>..<p
16d80 3e 49 66 20 79 6f 75 20 66 69 6e 64 20 65 72 72  >If you find err
16d90 6f 72 73 20 69 6e 20 65 69 74 68 65 72 20 74 68  ors in either th
16da0 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  e documentation 
16db0 6f 72 20 74 68 65 20 63 6f 64 65 2c 0a 66 65 65  or the code,.fee
16dc0 6c 20 66 72 65 65 20 74 6f 20 66 69 78 20 74 68  l free to fix th
16dd0 65 6d 20 61 6e 64 2f 6f 72 20 63 6f 6e 74 61 63  em and/or contac
16de0 74 20 74 68 65 20 61 75 74 68 6f 72 20 61 74 0a  t the author at.
16df0 3c 61 20 68 72 65 66 3d 22 6d 61 69 6c 74 6f 3a  <a href="mailto:
16e00 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 22 3e 64  drh@hwaci.com">d
16e10 72 68 40 68 77 61 63 69 2e 63 6f 6d 3c 2f 61 3e  rh@hwaci.com</a>
16e20 2e 20 20 59 6f 75 72 20 62 75 67 20 66 69 78 65  .  Your bug fixe
16e30 73 20 6f 72 0a 73 75 67 67 65 73 74 69 6f 6e 73  s or.suggestions
16e40 20 61 72 65 20 61 6c 77 61 79 73 20 77 65 6c 63   are always welc
16e50 6f 6d 65 64 2e 3c 2f 70 3e 0a 7d 0a 66 6f 6f 74  omed.</p>.}.foot
16e60 65 72 20 24 72 63 73 69 64 0a                    er $rcsid.