/ Hex Artifact Content
Login

Artifact f07ea8a5c3f4b2bb7505f21753ea966d2f04d4d0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
02d0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02e0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02f0: 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  .h".../*.** When
0300: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 63   debugging the c
0310: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
0320: 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75   a symbolic debu
0330: 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a  gger, one can.**
0340: 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33   set the sqlite3
0350: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
0360: 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f  e to 1 and all o
0370: 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70  pcodes will be p
0380: 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65  rinted.** as the
0390: 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  y are added to t
03a0: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73  he instruction s
03b0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 6e 64 65  tream..*/.#ifnde
03c0: 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
03d0: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
03e0: 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  trace = 0;.#endi
03f0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  f.../*.** Create
0400: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64   a new virtual d
0410: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a  atabase engine..
0420: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
0430: 56 64 62 65 43 72 65 61 74 65 28 73 71 6c 69 74  VdbeCreate(sqlit
0440: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
0450: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
0460: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 56  Malloc( sizeof(V
0470: 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  dbe) );.  if( p=
0480: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0490: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69   p->db = db;.  i
04a0: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
04b0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70      db->pVdbe->p
04c0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
04d0: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
04e0: 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76  Vdbe;.  p->pPrev
04f0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62   = 0;.  db->pVdb
0500: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = p;.  p->magi
0510: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
0520: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  NIT;.  return p;
0530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74  .}../*.** Turn t
0540: 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66  racing on or off
0550: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0560: 56 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a  VdbeTrace(Vdbe *
0570: 70 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b  p, FILE *trace){
0580: 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72  .  p->trace = tr
0590: 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ace;.}../*.** Re
05a0: 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 4f  size the Vdbe.aO
05b0: 70 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20  p array so that 
05c0: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  it contains at l
05d0: 65 61 73 74 20 4e 0a 2a 2a 20 65 6c 65 6d 65 6e  east N.** elemen
05e0: 74 73 2e 20 49 66 20 74 68 65 20 56 64 62 65 20  ts. If the Vdbe 
05f0: 69 73 20 69 6e 20 56 44 42 45 5f 4d 41 47 49 43  is in VDBE_MAGIC
0600: 5f 52 55 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  _RUN state, then
0610: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 61 4f 70  .** the Vdbe.aOp
0620: 20 61 72 72 61 79 20 77 69 6c 6c 20 62 65 20 73   array will be s
0630: 69 7a 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ized to contain 
0640: 65 78 61 63 74 6c 79 20 4e 20 0a 2a 2a 20 65 6c  exactly N .** el
0650: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
0660: 63 20 76 6f 69 64 20 72 65 73 69 7a 65 4f 70 41  c void resizeOpA
0670: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
0680: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6d  t N){.  if( p->m
0690: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
06a0: 5f 52 55 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  _RUN ){.    asse
06b0: 72 74 28 20 4e 3d 3d 70 2d 3e 6e 4f 70 20 29 3b  rt( N==p->nOp );
06c0: 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  .    p->nOpAlloc
06d0: 20 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61 4f 70   = N;.    p->aOp
06e0: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
06f0: 28 70 2d 3e 61 4f 70 2c 20 4e 2a 73 69 7a 65 6f  (p->aOp, N*sizeo
0700: 66 28 4f 70 29 29 3b 0a 20 20 7d 65 6c 73 65 20  f(Op));.  }else 
0710: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0720: 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64  N ){.    int old
0730: 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c  Size = p->nOpAll
0740: 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c  oc;.    p->nOpAl
0750: 6c 6f 63 20 3d 20 4e 2b 31 30 30 3b 0a 20 20 20  loc = N+100;.   
0760: 20 70 2d 3e 61 4f 70 20 3d 20 73 71 6c 69 74 65   p->aOp = sqlite
0770: 52 65 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20  Realloc(p->aOp, 
0780: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 73 69 7a 65  p->nOpAlloc*size
0790: 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 69 66 28  of(Op));.    if(
07a0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 20   p->aOp ){.     
07b0: 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70 5b   memset(&p->aOp[
07c0: 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 70 2d  oldSize], 0, (p-
07d0: 3e 6e 4f 70 41 6c 6c 6f 63 2d 6f 6c 64 53 69 7a  >nOpAlloc-oldSiz
07e0: 65 29 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  e)*sizeof(Op));.
07f0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0800: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73  ** Add a new ins
0810: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
0820: 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74  list of instruct
0830: 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20  ions current in 
0840: 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65  the.** VDBE.  Re
0850: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
0860: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
0870: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50  ruction..**.** P
0880: 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a  arameters:.**.**
0890: 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20      p           
08a0: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74      Pointer to t
08b0: 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20  he VDBE.**.**   
08c0: 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20   op             
08d0: 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   The opcode for 
08e0: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
08f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32  .**.**    p1, p2
0900: 20 20 20 20 20 20 20 20 20 20 46 69 72 73 74 20            First 
0910: 74 77 6f 20 6f 66 20 74 68 65 20 74 68 72 65 65  two of the three
0920: 20 70 6f 73 73 69 62 6c 65 20 6f 70 65 72 61 6e   possible operan
0930: 64 73 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ds..**.** Use th
0940: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  e sqlite3VdbeRes
0950: 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63  olveLabel() func
0960: 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61  tion to fix an a
0970: 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68  ddress and.** th
0980: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
0990: 6e 67 65 50 33 28 29 20 66 75 6e 63 74 69 6f 6e  ngeP3() function
09a0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
09b0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 0a 2a  alue of the P3.*
09c0: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e  * operand..*/.in
09d0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
09e0: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
09f0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
0a00: 70 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p2){.  int i;.  
0a10: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
0a20: 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d  i = p->nOp;.  p-
0a30: 3e 6e 4f 70 2b 2b 3b 0a 20 20 61 73 73 65 72 74  >nOp++;.  assert
0a40: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
0a50: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
0a60: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70   resizeOpArray(p
0a70: 2c 20 69 2b 31 29 3b 0a 20 20 69 66 28 20 70 2d  , i+1);.  if( p-
0a80: 3e 61 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72  >aOp==0 ){.    r
0a90: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
0aa0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
0ab0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
0ac0: 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d   op;.  pOp->p1 =
0ad0: 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d   p1;.  pOp->p2 =
0ae0: 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d   p2;.  pOp->p3 =
0af0: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 33 74 79 70   0;.  pOp->p3typ
0b00: 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a  e = P3_NOTUSED;.
0b10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0b20: 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65  BUG.  if( sqlite
0b30: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
0b40: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
0b50: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
0b60: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
0b70: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
0b80: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
0b90: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
0ba0: 65 73 20 74 68 65 20 70 33 20 76 61 6c 75 65 2e  es the p3 value.
0bb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
0bc0: 64 62 65 4f 70 33 28 56 64 62 65 20 2a 70 2c 20  dbeOp3(Vdbe *p, 
0bd0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
0be0: 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20 63 68  int p2, const ch
0bf0: 61 72 20 2a 7a 50 33 2c 69 6e 74 20 70 33 74 79  ar *zP3,int p3ty
0c00: 70 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20  pe){.  int addr 
0c10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
0c20: 4f 70 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  Op(p, op, p1, p2
0c30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0c40: 43 68 61 6e 67 65 50 33 28 70 2c 20 61 64 64 72  ChangeP3(p, addr
0c50: 2c 20 7a 50 33 2c 20 70 33 74 79 70 65 29 3b 0a  , zP3, p3type);.
0c60: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
0c70: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
0c80: 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61   new symbolic la
0c90: 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72  bel for an instr
0ca0: 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  uction that has 
0cb0: 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64  yet to be.** cod
0cc0: 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69  ed.  The symboli
0cd0: 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c  c label is reall
0ce0: 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76  y just a negativ
0cf0: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a  e number.  The.*
0d00: 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75  * label can be u
0d10: 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61  sed as the P2 va
0d20: 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  lue of an operat
0d30: 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65  ion.  Later, whe
0d40: 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  n.** the label i
0d50: 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20  s resolved to a 
0d60: 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73  specific address
0d70: 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20  , the VDBE will 
0d80: 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  scan.** through 
0d90: 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69  its operation li
0da0: 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c  st and change al
0db0: 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77  l values of P2 w
0dc0: 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68  hich match.** th
0dd0: 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65  e label into the
0de0: 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73   resolved addres
0df0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  s..**.** The VDB
0e00: 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50  E knows that a P
0e10: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
0e20: 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c  el because label
0e30: 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20  s are.** always 
0e40: 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20  negative and P2 
0e50: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
0e60: 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67  se to be non-neg
0e70: 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  ative..** Hence,
0e80: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
0e90: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
0ea0: 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20  that has yet to 
0eb0: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a  be resolved..**.
0ec0: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
0ed0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ned if a malloc(
0ee0: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  ) fails..*/.int 
0ef0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
0f00: 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  abel(Vdbe *p){. 
0f10: 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d   int i;.  i = p-
0f20: 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73  >nLabel++;.  ass
0f30: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
0f40: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
0f50: 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c  ;.  if( i>=p->nL
0f60: 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  abelAlloc ){.   
0f70: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20   p->nLabelAlloc 
0f80: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63  = p->nLabelAlloc
0f90: 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 70 2d 3e  *2 + 10;.    p->
0fa0: 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 52  aLabel = sqliteR
0fb0: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 61 62 65  ealloc( p->aLabe
0fc0: 6c 2c 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f  l, p->nLabelAllo
0fd0: 63 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  c*sizeof(p->aLab
0fe0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  el[0]));.  }.  i
0ff0: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
1000: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d      p->aLabel[i]
1010: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
1020: 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a  urn -1-i;.}../*.
1030: 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c  ** Resolve label
1040: 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61   "x" to be the a
1050: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
1060: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
1070: 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64  o.** be inserted
1080: 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  .  The parameter
1090: 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62   "x" must have b
10a0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
10b0: 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c  m.** a prior cal
10c0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
10d0: 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a  MakeLabel()..*/.
10e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
10f0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62  ResolveLabel(Vdb
1100: 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20  e *p, int x){.  
1110: 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20  int j = -1-x;.  
1120: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
1130: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1140: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  T );.  assert( j
1150: 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62  >=0 && j<p->nLab
1160: 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  el );.  if( p->a
1170: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
1180: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e  aLabel[j] = p->n
1190: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
11a0: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
11b0: 20 69 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20   if opcode 'op' 
11c0: 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f  is guarenteed no
11d0: 74 20 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76  t to push more v
11e0: 61 6c 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68  alues.** onto th
11f0: 65 20 56 44 42 45 20 73 74 61 63 6b 20 74 68 61  e VDBE stack tha
1200: 6e 20 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a  n it pops off..*
1210: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63  /.static int opc
1220: 6f 64 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29  odeNoPush(u8 op)
1230: 7b 0a 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f  {.  /* The 10 NO
1240: 50 55 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73  PUSH_MASK_n cons
1250: 74 61 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65  tants are define
1260: 64 20 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74  d in the automat
1270: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65  ically.  ** gene
1280: 72 61 74 65 64 20 68 65 61 64 65 72 20 66 69 6c  rated header fil
1290: 65 20 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63  e opcodes.h. Eac
12a0: 68 20 69 73 20 61 20 31 36 2d 62 69 74 20 62 69  h is a 16-bit bi
12b0: 74 6d 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20  tmask, one.  ** 
12c0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
12d0: 67 20 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65  g to each opcode
12e0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
12f0: 74 68 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  the virtual.  **
1300: 20 6d 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65   machine in vdbe
1310: 2e 63 2e 20 54 68 65 20 62 69 74 20 69 73 20 74  .c. The bit is t
1320: 72 75 65 20 69 66 20 74 68 65 20 77 6f 72 64 20  rue if the word 
1330: 22 6e 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72  "no-push" appear
1340: 73 0a 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d  s.  ** in a comm
1350: 65 6e 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ent on the same 
1360: 6c 69 6e 65 20 61 73 20 74 68 65 20 22 63 61 73  line as the "cas
1370: 65 20 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20  e OP_XXX:" in . 
1380: 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45   ** sqlite3VdbeE
1390: 78 65 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e  xec() in vdbe.c.
13a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
13b0: 65 20 62 69 74 20 69 73 20 74 72 75 65 2c 20 74  e bit is true, t
13c0: 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hen the correspo
13d0: 6e 64 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20  nding opcode is 
13e0: 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20  guarenteed not. 
13f0: 20 2a 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20   ** to grow the 
1400: 73 74 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73  stack when it is
1410: 20 65 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72   executed. Other
1420: 77 69 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f  wise, it may gro
1430: 77 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b  w the.  ** stack
1440: 20 62 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20   by at most one 
1450: 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  entry..  **.  **
1460: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63   NOPUSH_MASK_0 c
1470: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70  orresponds to op
1480: 63 6f 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e  codes 0 to 15. N
1490: 4f 50 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e  OPUSH_MASK_1 con
14a0: 74 61 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62  tains.  ** one b
14b0: 69 74 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31  it for opcodes 1
14c0: 36 20 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20  6 to 31, and so 
14d0: 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36  on..  **.  ** 16
14e0: 2d 62 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72  -bit bitmasks (r
14f0: 61 74 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69  ather than 32-bi
1500: 74 29 20 61 72 65 20 73 70 65 63 69 66 69 65 64  t) are specified
1510: 20 69 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20   in opcodes.h . 
1520: 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20   ** because the 
1530: 66 69 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65  file is generate
1540: 64 20 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67  d by an awk prog
1550: 72 61 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c  ram. Awk manipul
1560: 61 74 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75  ates.  ** all nu
1570: 6d 62 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e  mbers as floatin
1580: 67 2d 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64  g-point and we d
1590: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73  on't want to ris
15a0: 6b 20 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a  k a rounding.  *
15b0: 2a 20 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f  * error if someo
15c0: 6e 65 20 62 75 69 6c 64 73 20 77 69 74 68 20 61  ne builds with a
15d0: 6e 20 61 77 6b 20 74 68 61 74 20 75 73 65 73 20  n awk that uses 
15e0: 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32  (for example) 32
15f0: 2d 62 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20  -bit .  ** IEEE 
1600: 66 6c 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20  floats..  */ .  
1610: 73 74 61 74 69 63 20 75 33 32 20 6d 61 73 6b 73  static u32 masks
1620: 5b 35 5d 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55  [5] = {.    NOPU
1630: 53 48 5f 4d 41 53 4b 5f 30 20 2b 20 28 4e 4f 50  SH_MASK_0 + (NOP
1640: 55 53 48 5f 4d 41 53 4b 5f 31 3c 3c 31 36 29 2c  USH_MASK_1<<16),
1650: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1660: 5f 32 20 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53  _2 + (NOPUSH_MAS
1670: 4b 5f 33 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f  K_3<<16),.    NO
1680: 50 55 53 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 4e  PUSH_MASK_4 + (N
1690: 4f 50 55 53 48 5f 4d 41 53 4b 5f 35 3c 3c 31 36  OPUSH_MASK_5<<16
16a0: 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41  ),.    NOPUSH_MA
16b0: 53 4b 5f 36 20 2b 20 28 4e 4f 50 55 53 48 5f 4d  SK_6 + (NOPUSH_M
16c0: 41 53 4b 5f 37 3c 3c 31 36 29 2c 0a 20 20 20 20  ASK_7<<16),.    
16d0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20  NOPUSH_MASK_8 + 
16e0: 28 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 3c 3c  (NOPUSH_MASK_9<<
16f0: 31 36 29 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72  16).  };.  retur
1700: 6e 20 28 6d 61 73 6b 73 5b 6f 70 3e 3e 35 5d 20  n (masks[op>>5] 
1710: 26 20 28 31 3c 3c 28 6f 70 26 30 78 31 46 29 29  & (1<<(op&0x1F))
1720: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  );.}..#ifndef ND
1730: 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
1740: 56 64 62 65 4f 70 63 6f 64 65 4e 6f 50 75 73 68  VdbeOpcodeNoPush
1750: 28 75 38 20 6f 70 29 7b 0a 20 20 72 65 74 75 72  (u8 op){.  retur
1760: 6e 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f  n opcodeNoPush(o
1770: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  p);.}.#endif../*
1780: 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  .** Loop through
1790: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f   the program loo
17a0: 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75  king for P2 valu
17b0: 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61  es that are nega
17c0: 74 69 76 65 2e 0a 2a 2a 20 45 61 63 68 20 73 75  tive..** Each su
17d0: 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  ch value is a la
17e0: 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68  bel.  Resolve th
17f0: 65 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  e label by setti
1800: 6e 67 20 74 68 65 20 50 32 0a 2a 2a 20 76 61 6c  ng the P2.** val
1810: 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  ue to its correc
1820: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  t non-zero value
1830: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1840: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
1850: 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70  nce after all op
1860: 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20  codes have been 
1870: 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  inserted..**.** 
1880: 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75  Variable *pMaxFu
1890: 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f  ncArgs is set to
18a0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c   the maximum val
18b0: 75 65 20 6f 66 20 61 6e 79 20 50 31 20 61 72 67  ue of any P1 arg
18c0: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20  ument .** to an 
18d0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 72 20 50  OP_Function or P
18e0: 32 20 74 6f 20 61 6e 20 4f 50 5f 41 67 67 46 75  2 to an OP_AggFu
18f0: 6e 63 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20  nc opcode. This 
1900: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73  is used by .** s
1910: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1920: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68  ady() to size th
1930: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
1940: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rray..**.** The 
1950: 69 6e 74 65 67 65 72 20 2a 70 4d 61 78 53 74 61  integer *pMaxSta
1960: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ck is set to the
1970: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
1980: 6f 66 20 76 64 62 65 20 73 74 61 63 6b 0a 2a 2a  of vdbe stack.**
1990: 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 73 74   entries that st
19a0: 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 72 65  atic analysis re
19b0: 76 65 61 6c 73 20 74 68 69 73 20 70 72 6f 67 72  veals this progr
19c0: 61 6d 20 6d 69 67 68 74 20 6e 65 65 64 2e 0a 2a  am might need..*
19d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
19e0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64  solveP2Values(Vd
19f0: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78  be *p, int *pMax
1a00: 46 75 6e 63 41 72 67 73 2c 20 69 6e 74 20 2a 70  FuncArgs, int *p
1a10: 4d 61 78 53 74 61 63 6b 29 7b 0a 20 20 69 6e 74  MaxStack){.  int
1a20: 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72   i;.  int nMaxAr
1a30: 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4d  gs = 0;.  int nM
1a40: 61 78 53 74 61 63 6b 20 3d 20 70 2d 3e 6e 4f 70  axStack = p->nOp
1a50: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
1a60: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
1a70: 61 4c 61 62 65 6c 3b 0a 20 20 66 6f 72 28 70 4f  aLabel;.  for(pO
1a80: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e  p=p->aOp, i=p->n
1a90: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Op-1; i>=0; i--,
1aa0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20   pOp++){.    u8 
1ab0: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
1ac0: 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  code;..    /* To
1ad0: 64 6f 3a 20 4d 61 79 62 65 20 4f 50 5f 41 67 67  do: Maybe OP_Agg
1ae0: 46 75 6e 63 20 73 68 6f 75 6c 64 20 63 68 61 6e  Func should chan
1af0: 67 65 20 74 6f 20 75 73 65 20 50 31 20 69 6e 20  ge to use P1 in 
1b00: 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 2a 20  the same.     * 
1b10: 77 61 79 20 61 73 20 4f 50 5f 46 75 6e 63 74 69  way as OP_Functi
1b20: 6f 6e 2e 20 0a 20 20 20 20 20 2a 2f 0a 20 20 20  on. .     */.   
1b30: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
1b40: 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  Function ){.    
1b50: 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3e 6e 4d    if( pOp->p1>nM
1b60: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
1b70: 73 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20  s = pOp->p1;.   
1b80: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
1b90: 65 3d 3d 4f 50 5f 41 67 67 46 75 6e 63 20 29 7b  e==OP_AggFunc ){
1ba0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
1bb0: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
1bc0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
1bd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1be0: 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f 70   opcodeNoPush(op
1bf0: 63 6f 64 65 29 20 29 7b 0a 20 20 20 20 20 20 6e  code) ){.      n
1c00: 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a 20 20 20 20  MaxStack--;.    
1c10: 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  }..    if( pOp->
1c20: 70 32 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p2>=0 ) continue
1c30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2d 31  ;.    assert( -1
1c40: 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62  -pOp->p2<p->nLab
1c50: 65 6c 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  el );.    pOp->p
1c60: 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f  2 = aLabel[-1-pO
1c70: 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a 20 20 73 71  p->p2];.  }.  sq
1c80: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c 61 62  liteFree(p->aLab
1c90: 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c  el);.  p->aLabel
1ca0: 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75   = 0;..  *pMaxFu
1cb0: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
1cc0: 73 3b 0a 20 20 2a 70 4d 61 78 53 74 61 63 6b 20  s;.  *pMaxStack 
1cd0: 3d 20 6e 4d 61 78 53 74 61 63 6b 3b 0a 7d 0a 0a  = nMaxStack;.}..
1ce0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1cf0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
1d00: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
1d10: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
1d20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1d30: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
1d40: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
1d50: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1d60: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1d70: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
1d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
1d90: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
1da0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
1db0: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
1dc0: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
1dd0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
1de0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
1df0: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
1e00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
1e10: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
1e20: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
1e30: 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e  onst *aOp){.  in
1e40: 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74  t addr;.  assert
1e50: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1e60: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1e70: 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70   resizeOpArray(p
1e80: 2c 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 29 3b  , p->nOp + nOp);
1e90: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30  .  if( p->aOp==0
1ea0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1eb0: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70  ;.  }.  addr = p
1ec0: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70  ->nOp;.  if( nOp
1ed0: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  >0 ){.    int i;
1ee0: 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20  .    VdbeOpList 
1ef0: 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70  const *pIn = aOp
1f00: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1f10: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b  <nOp; i++, pIn++
1f20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20  ){.      int p2 
1f30: 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20  = pIn->p2;.     
1f40: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20   VdbeOp *pOut = 
1f50: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b  &p->aOp[i+addr];
1f60: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  .      pOut->opc
1f70: 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64  ode = pIn->opcod
1f80: 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  e;.      pOut->p
1f90: 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20  1 = pIn->p1;.   
1fa0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
1fb0: 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44 52  <0 ? addr + ADDR
1fc0: 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20 20  (p2) : p2;.     
1fd0: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d   pOut->p3 = pIn-
1fe0: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  >p3;.      pOut-
1ff0: 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e 70  >p3type = pIn->p
2000: 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20 3a 20  3 ? P3_STATIC : 
2010: 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64  P3_NOTUSED;.#ifd
2020: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2030: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2040: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
2050: 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ce ){.        sq
2060: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
2070: 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e  (0, i+addr, &p->
2080: 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20  aOp[i+addr]);.  
2090: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20a0: 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d   }.    p->nOp +=
20b0: 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75   nOp;.  }.  retu
20c0: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
20d0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
20e0: 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65  ue of the P1 ope
20f0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
2100: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
2110: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2120: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
2130: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
2140: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
2150: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
2160: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
2170: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
2180: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
2190: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
21a0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
21b0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
21c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21d0: 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P1(Vdbe *p, int 
21e0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
21f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
2200: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
2210: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26  NIT );.  if( p &
2220: 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e  & addr>=0 && p->
2230: 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61  nOp>addr && p->a
2240: 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  Op ){.    p->aOp
2250: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
2260: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
2270: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
2280: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
2290: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
22a0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
22b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
22c0: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
22d0: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
22e0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
22f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2300: 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P2(Vdbe *p, int 
2310: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
2320: 20 20 61 73 73 65 72 74 28 20 76 61 6c 3e 3d 30    assert( val>=0
2330: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2340: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2350: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
2360: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
2370: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
2380: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->aOp ){.    p-
2390: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20  >aOp[addr].p2 = 
23a0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
23b0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
23c0: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
23d0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
23e0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
23f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2400: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
2410: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
2420: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
2430: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
2440: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
2450: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
2460: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
2470: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
2480: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
2490: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
24a0: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33  n>=0 then the P3
24b0: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
24c0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
24d0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
24e0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
24f0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
2500: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
2510: 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41  teMalloc()..** A
2520: 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d   value of n==0 m
2530: 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20  eans copy bytes 
2540: 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61 6e 64  of zP3 up to and
2550: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a   including the.*
2560: 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74  * first null byt
2570: 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20  e.  If n>0 then 
2580: 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f  copy n+1 bytes o
2590: 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f zP3..**.** If 
25a0: 6e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20 69 74  n==P3_STATIC  it
25b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 33 20   means that zP3 
25c0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
25d0: 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69  a constant stati
25e0: 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20  c.** string and 
25f0: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
2600: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 20 6e   the pointer.  n
2610: 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20 6d 65 61  ==P3_POINTER mea
2620: 6e 73 20 7a 50 33 20 69 73 0a 2a 2a 20 61 20 70  ns zP3 is.** a p
2630: 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 6f  ointer to some o
2640: 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e  bject other than
2650: 20 61 20 73 74 72 69 6e 67 2e 20 20 6e 3d 3d 50   a string.  n==P
2660: 33 5f 43 4f 4c 4c 53 45 51 20 61 6e 64 0a 2a 2a  3_COLLSEQ and.**
2670: 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 6d   n==P3_KEYINFO m
2680: 65 61 6e 20 74 68 61 74 20 7a 50 33 20 69 73 20  ean that zP3 is 
2690: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 43  a pointer to a C
26a0: 6f 6c 6c 53 65 71 20 6f 72 20 4b 65 79 49 6e 66  ollSeq or KeyInf
26b0: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
26c0: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
26d0: 6f 66 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  of KeyInfo struc
26e0: 74 75 72 65 73 20 69 6e 74 6f 20 6d 65 6d 6f 72  tures into memor
26f0: 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  y obtained.** fr
2700: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e  om sqliteMalloc.
2710: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30  .**.** If addr<0
2720: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 33 20   then change P3 
2730: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
2740: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
2750: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
2760: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
2770: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
2780: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
2790: 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e 74 20 6e  char *zP3, int n
27a0: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
27b0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
27c0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
27d0: 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  T );.  if( p==0 
27e0: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 7b 0a  || p->aOp==0 ){.
27f0: 20 20 20 20 69 66 28 20 6e 3d 3d 50 33 5f 44 59      if( n==P3_DY
2800: 4e 41 4d 49 43 20 7c 7c 20 6e 3d 3d 50 33 5f 4b  NAMIC || n==P3_K
2810: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29  EYINFO_HANDOFF )
2820: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
2830: 65 65 28 28 76 6f 69 64 2a 29 7a 50 33 29 3b 0a  ee((void*)zP3);.
2840: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2850: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72  ;.  }.  if( addr
2860: 3c 30 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e  <0 || addr>=p->n
2870: 4f 70 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  Op ){.    addr =
2880: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20   p->nOp - 1;.   
2890: 20 69 66 28 20 61 64 64 72 3c 30 20 29 20 72 65   if( addr<0 ) re
28a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20  turn;.  }.  pOp 
28b0: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
28c0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 26  .  if( pOp->p3 &
28d0: 26 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50  & pOp->p3type==P
28e0: 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  3_DYNAMIC ){.   
28f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f 70 2d   sqliteFree(pOp-
2900: 3e 70 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  >p3);.    pOp->p
2910: 33 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  3 = 0;.  }.  if(
2920: 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70   zP3==0 ){.    p
2930: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20  Op->p3 = 0;.    
2940: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
2950: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73  _NOTUSED;.  }els
2960: 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49  e if( n==P3_KEYI
2970: 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  NFO ){.    KeyIn
2980: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
2990: 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42    int nField, nB
29a0: 79 74 65 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20  yte;.    nField 
29b0: 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 33  = ((KeyInfo*)zP3
29c0: 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e  )->nField;.    n
29d0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
29e0: 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65  KeyInfo) + (nFie
29f0: 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65  ld-1)*sizeof(pKe
2a00: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29  yInfo->aColl[0])
2a10: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
2a20: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
2a30: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 70  ( nByte );.    p
2a40: 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29  Op->p3 = (char*)
2a50: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66  pKeyInfo;.    if
2a60: 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
2a70: 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49      memcpy(pKeyI
2a80: 6e 66 6f 2c 20 7a 50 33 2c 20 6e 42 79 74 65 29  nfo, zP3, nByte)
2a90: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74  ;.      pOp->p3t
2aa0: 79 70 65 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f  ype = P3_KEYINFO
2ab0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ac0: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
2ad0: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P3_NOTUSED;.   
2ae0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
2af0: 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  ==P3_KEYINFO_HAN
2b00: 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d  DOFF ){.    pOp-
2b10: 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33  >p3 = (char*)zP3
2b20: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
2b30: 65 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a  e = P3_KEYINFO;.
2b40: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
2b50: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  ){.    pOp->p3 =
2b60: 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20   (char*)zP3;.   
2b70: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 6e   pOp->p3type = n
2b80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2b90: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74  f( n==0 ) n = st
2ba0: 72 6c 65 6e 28 7a 50 33 29 3b 0a 20 20 20 20 70  rlen(zP3);.    p
2bb0: 4f 70 2d 3e 70 33 20 3d 20 73 71 6c 69 74 65 53  Op->p3 = sqliteS
2bc0: 74 72 4e 44 75 70 28 7a 50 33 2c 20 6e 29 3b 0a  trNDup(zP3, n);.
2bd0: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
2be0: 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P3_DYNAMIC;.  
2bf0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
2c00: 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  BUG./*.** Replac
2c10: 65 20 74 68 65 20 50 33 20 66 69 65 6c 64 20 6f  e the P3 field o
2c20: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
2c30: 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  tly coded instru
2c40: 63 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 63 6f  ction with.** co
2c50: 6d 6d 65 6e 74 20 74 65 78 74 2e 0a 2a 2f 0a 76  mment text..*/.v
2c60: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
2c70: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
2c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2c90: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
2ca0: 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72  list ap;.  asser
2cb0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
2cc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
2cd0: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
2ce0: 6e 4f 70 2d 31 5d 2e 70 33 3d 3d 30 20 29 3b 0a  nOp-1].p3==0 );.
2cf0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
2d00: 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74  Format);.  sqlit
2d10: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 70  e3VdbeChangeP3(p
2d20: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 4d 50  , -1, sqlite3VMP
2d30: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
2d40: 70 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  p), P3_DYNAMIC);
2d50: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d  .  va_end(ap);.}
2d60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
2d70: 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64  f the P3 operand
2d80: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
2d90: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 70  d instruction ap
2da0: 70 65 61 72 73 0a 2a 2a 20 74 6f 20 62 65 20 61  pears.** to be a
2db0: 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 74   quoted string t
2dc0: 6f 6b 65 6e 2c 20 74 68 65 6e 20 74 68 69 73 20  oken, then this 
2dd0: 70 72 6f 63 65 64 75 72 65 20 72 65 6d 6f 76 65  procedure remove
2de0: 73 20 0a 2a 2a 20 74 68 65 20 71 75 6f 74 65 73  s .** the quotes
2df0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 6f 74  ..**.** The quot
2e00: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 63 61 6e  ing operator can
2e10: 20 62 65 20 65 69 74 68 65 72 20 61 20 67 72 61   be either a gra
2e20: 76 65 20 61 73 63 65 6e 74 20 28 41 53 43 49 49  ve ascent (ASCII
2e30: 20 30 78 32 37 29 0a 2a 2a 20 6f 72 20 61 20 64   0x27).** or a d
2e40: 6f 75 62 6c 65 20 71 75 6f 74 65 20 63 68 61 72  ouble quote char
2e50: 61 63 74 65 72 20 28 41 53 43 49 49 20 30 78 32  acter (ASCII 0x2
2e60: 32 29 2e 20 20 54 77 6f 20 71 75 6f 74 65 73 20  2).  Two quotes 
2e70: 69 6e 20 61 20 72 6f 77 0a 2a 2a 20 72 65 73 6f  in a row.** reso
2e80: 6c 76 65 20 74 6f 20 62 65 20 61 20 73 69 6e 67  lve to be a sing
2e90: 6c 65 20 61 63 74 75 61 6c 20 71 75 6f 74 65 20  le actual quote 
2ea0: 63 68 61 72 61 63 74 65 72 20 77 69 74 68 69 6e  character within
2eb0: 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a   the string..*/.
2ec0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2ed0: 44 65 71 75 6f 74 65 50 33 28 56 64 62 65 20 2a  DequoteP3(Vdbe *
2ee0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
2ef0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72  Op *pOp;.  asser
2f00: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2f10: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2f20: 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20    if( p->aOp==0 
2f30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2f40: 61 64 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d  addr<0 || addr>=
2f50: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 64  p->nOp ){.    ad
2f60: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
2f70: 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20  .    if( addr<0 
2f80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
2f90: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
2fa0: 64 72 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  dr];.  if( pOp->
2fb0: 70 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 33  p3==0 || pOp->p3
2fc0: 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  [0]==0 ) return;
2fd0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 74 79  .  if( pOp->p3ty
2fe0: 70 65 3d 3d 50 33 5f 53 54 41 54 49 43 20 29 7b  pe==P3_STATIC ){
2ff0: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73  .    pOp->p3 = s
3000: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 70 2d  qliteStrDup(pOp-
3010: 3e 70 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  >p3);.    pOp->p
3020: 33 74 79 70 65 20 3d 20 50 33 5f 44 59 4e 41 4d  3type = P3_DYNAM
3030: 49 43 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  IC;.  }.  assert
3040: 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50  ( pOp->p3type==P
3050: 33 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 73  3_DYNAMIC );.  s
3060: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 4f  qlite3Dequote(pO
3070: 70 2d 3e 70 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->p3);.}../*.**
3080: 20 53 65 61 72 63 68 20 74 68 65 20 63 75 72 72   Search the curr
3090: 65 6e 74 20 70 72 6f 67 72 61 6d 20 73 74 61 72  ent program star
30a0: 74 69 6e 67 20 61 74 20 69 6e 73 74 72 75 63 74  ting at instruct
30b0: 69 6f 6e 20 61 64 64 72 20 66 6f 72 20 74 68 65  ion addr for the
30c0: 20 67 69 76 65 6e 0a 2a 2a 20 6f 70 63 6f 64 65   given.** opcode
30d0: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 2e 20 20   and P2 value.  
30e0: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
30f0: 73 73 20 70 6c 75 73 20 31 20 69 66 20 66 6f 75  ss plus 1 if fou
3100: 6e 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 0a  nd and 0 if not.
3110: 2a 2a 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ** found..*/.int
3120: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
3130: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
3140: 61 64 64 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  addr, int op, in
3150: 74 20 70 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t p2){.  int i;.
3160: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3170: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3180: 4e 49 54 20 29 3b 0a 20 20 66 6f 72 28 69 3d 61  NIT );.  for(i=a
3190: 64 64 72 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  ddr; i<p->nOp; i
31a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
31b0: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  aOp[i].opcode==o
31c0: 70 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70  p && p->aOp[i].p
31d0: 32 3d 3d 70 32 20 29 20 72 65 74 75 72 6e 20 69  2==p2 ) return i
31e0: 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +1;.  }.  return
31f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
3200: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
3210: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
3220: 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ss..*/.VdbeOp *s
3230: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
3240: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3250: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  r){.  assert( p-
3260: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
3270: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
3280: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20  ert( addr>=0 && 
3290: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
32a0: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
32b0: 61 64 64 72 5d 3b 0a 7d 0a 0a 23 69 66 20 21 64  addr];.}..#if !d
32c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
32d0: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21  IT_EXPLAIN) || !
32e0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
32f0: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  \.     || define
3300: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
3310: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
3320: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43  E_DEBUG)./*.** C
3330: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
3340: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
3350: 68 65 20 50 33 20 70 61 72 61 6d 65 74 65 72 20  he P3 parameter 
3360: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
3370: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
3380: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
3390: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
33a0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
33b0: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 33 28 4f  har *displayP3(O
33c0: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
33d0: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
33e0: 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20  .  char *zP3;.  
33f0: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
3400: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
3410: 4f 70 2d 3e 70 33 74 79 70 65 20 29 7b 0a 20 20  Op->p3type ){.  
3420: 20 20 63 61 73 65 20 50 33 5f 50 4f 49 4e 54 45    case P3_POINTE
3430: 52 3a 20 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  R: {.      sprin
3440: 74 66 28 7a 54 65 6d 70 2c 20 22 70 74 72 28 25  tf(zTemp, "ptr(%
3450: 23 78 29 22 2c 20 28 69 6e 74 29 70 4f 70 2d 3e  #x)", (int)pOp->
3460: 70 33 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d  p3);.      zP3 =
3470: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72   zTemp;.      br
3480: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3490: 61 73 65 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20  ase P3_KEYINFO: 
34a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
34b0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
34c0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79  *pKeyInfo = (Key
34d0: 49 6e 66 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20  Info*)pOp->p3;. 
34e0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65       sprintf(zTe
34f0: 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22  mp, "keyinfo(%d"
3500: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
3510: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
3520: 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20  trlen(zTemp);.  
3530: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3540: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
3550: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
3560: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
3570: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
3580: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
3590: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
35a0: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
35b0: 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  n(pColl->zName);
35c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
35d0: 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +n>nTemp-6 ){.  
35e0: 20 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79            strcpy
35f0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
3600: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
3610: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
3620: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65   }.          zTe
3630: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  mp[i++] = ',';. 
3640: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65           if( pKe
3650: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
3660: 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  r && pKeyInfo->a
3670: 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a  SortOrder[j] ){.
3680: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
3690: 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20  p[i++] = '-';.  
36a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36b0: 20 20 20 20 73 74 72 63 70 79 28 26 7a 54 65 6d      strcpy(&zTem
36c0: 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p[i], pColl->zNa
36d0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  me);.          i
36e0: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
36f0: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
3700: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
3710: 20 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b    strcpy(&zTemp[
3720: 69 5d 2c 22 2c 6e 69 6c 22 29 3b 0a 20 20 20 20  i],",nil");.    
3730: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
3740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3750: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
3760: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
3770: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
3780: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
3790: 70 20 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d  p );.      zP3 =
37a0: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72   zTemp;.      br
37b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
37c0: 61 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20  ase P3_COLLSEQ: 
37d0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
37e0: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
37f0: 71 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20  q*)pOp->p3;.    
3800: 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c    sprintf(zTemp,
3810: 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29   "collseq(%.20s)
3820: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
3830: 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54  ;.      zP3 = zT
3840: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  emp;.      break
3850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3860: 20 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P3_FUNCDEF: {. 
3870: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
3880: 65 66 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 70  ef = (FuncDef*)p
3890: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 63 68  Op->p3;.      ch
38a0: 61 72 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20  ar zNum[30];.   
38b0: 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70     sprintf(zTemp
38c0: 2c 20 22 25 2e 2a 73 22 2c 20 6e 54 65 6d 70 2c  , "%.*s", nTemp,
38d0: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pDef->zName);. 
38e0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 75       sprintf(zNu
38f0: 6d 2c 22 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  m,"(%d)", pDef->
3900: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28  nArg);.      if(
3910: 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 2b 73   strlen(zTemp)+s
3920: 74 72 6c 65 6e 28 7a 4e 75 6d 29 2b 31 3c 3d 6e  trlen(zNum)+1<=n
3930: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
3940: 73 74 72 63 61 74 28 7a 54 65 6d 70 2c 20 7a 4e  strcat(zTemp, zN
3950: 75 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  um);.      }.   
3960: 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a     zP3 = zTemp;.
3970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3980: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
3990: 7b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 70 4f  {.      zP3 = pO
39a0: 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 69 66 28  p->p3;.      if(
39b0: 20 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e   zP3==0 || pOp->
39c0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20  opcode==OP_Noop 
39d0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 33 20 3d  ){.        zP3 =
39e0: 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   "";.      }.   
39f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3a00: 7a 50 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  zP3;.}.#endif...
3a10: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
3a20: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
3a30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
3a40: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
3a50: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
3a60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3a70: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
3a80: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
3a90: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
3aa0: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
3ab0: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
3ac0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a  ){.  char *zP3;.
3ad0: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
3ae0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
3af0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d  char *zFormat1 =
3b00: 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20   "%4d %-13s %4d 
3b10: 25 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  %4d %s\n";.  if(
3b20: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
3b30: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20  = stdout;.  zP3 
3b40: 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c  = displayP3(pOp,
3b50: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
3b60: 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  tr));.  fprintf(
3b70: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a  pOut, zFormat1,.
3b80: 20 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74 65        pc, sqlite
3b90: 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70  3OpcodeNames[pOp
3ba0: 2d 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e  ->opcode], pOp->
3bb0: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33  p1, pOp->p2, zP3
3bc0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
3bd0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
3be0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
3bf0: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
3c00: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
3c10: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
3c20: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
3c30: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a   N){.  if( p ){.
3c40: 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30      while( N-->0
3c50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3c60: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
3c70: 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  p++);.    }.  }.
3c80: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3c90: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
3ca0: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
3cb0: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
3cc0: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
3cd0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
3ce0: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
3cf0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
3d00: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
3d10: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
3d20: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
3d30: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
3d40: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
3d50: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
3d60: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
3d70: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
3d80: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
3d90: 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20  XPLAIN"..*/.int 
3da0: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
3db0: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3dd0: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
3de0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
3df0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
3e00: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
3e10: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
3e20: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
3e30: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
3e40: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72  BE_MAGIC_RUN ) r
3e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
3e60: 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64  USE;.  assert( d
3e70: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
3e80: 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20  _MAGIC_BUSY );. 
3e90: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
3ea0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
3eb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
3ec0: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
3ed0: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
3ee0: 20 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79   does not put dy
3ef0: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e  namic strings on
3f00: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
3f10: 73 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20  stack, they may 
3f20: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
3f30: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
3f40: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
3f50: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
3f60: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
3f70: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
3f80: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
3f90: 69 66 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d  if( p->pTos==&p-
3fa0: 3e 61 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20  >aStack[4] ){.  
3fb0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
3fc0: 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20 35 29 3b  y(p->aStack, 5);
3fd0: 0a 20 20 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e 53  .  }.  p->resOnS
3fe0: 74 61 63 6b 20 3d 20 30 3b 0a 0a 0a 20 20 69 20  tack = 0;...  i 
3ff0: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 69 66 28  = p->pc++;.  if(
4000: 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20   i>=p->nOp ){.  
4010: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
4020: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
4030: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
4040: 73 65 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  se if( db->flags
4050: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 72   & SQLITE_Interr
4060: 75 70 74 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66  upt ){.    db->f
4070: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
4080: 49 6e 74 65 72 72 75 70 74 3b 0a 20 20 20 20 70  Interrupt;.    p
4090: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
40a0: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
40b0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
40c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
40d0: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
40e0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
40f0: 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29 30  p->rc), (char*)0
4100: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4110: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
4120: 70 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70  p[i];.    Mem *p
4130: 4d 65 6d 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b  Mem = p->aStack;
4140: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
4150: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
4160: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
4170: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
4180: 20 70 4d 65 6d 2d 3e 69 20 3d 20 69 3b 20 20 20   pMem->i = i;   
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
41b0: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
41c0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
41d0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
41e0: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
41f0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
4200: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c     pMem->z = sql
4210: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b  ite3OpcodeNames[
4220: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f  pOp->opcode];  /
4230: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
4240: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e  pMem->n = strlen
4250: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70  (pMem->z);.    p
4260: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
4270: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65  TE_TEXT;.    pMe
4280: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
4290: 55 54 46 38 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  UTF8;.    pMem++
42a0: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
42b0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
42c0: 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d    pMem->i = pOp-
42d0: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42f0: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P1 */.    pMem-
4300: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
4310: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
4320: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
4330: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
4340: 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f      pMem->i = pO
4350: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P2 */.    pMe
4380: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
4390: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
43a0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
43b0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 68 6f  >flags = MEM_Sho
43c0: 72 74 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  rt|MEM_Str|MEM_T
43d0: 65 72 6d 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a  erm;   /* P3 */.
43e0: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69      pMem->z = di
43f0: 73 70 6c 61 79 50 33 28 70 4f 70 2c 20 70 4d 65  splayP3(pOp, pMe
4400: 6d 2d 3e 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f  m->zShort, sizeo
4410: 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29  f(pMem->zShort))
4420: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  ;.    pMem->type
4430: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
4440: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
4450: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20  SQLITE_UTF8;..  
4460: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
4470: 3d 20 35 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73  = 5;.    p->pTos
4480: 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e   = pMem;.    p->
4490: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
44a0: 20 20 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63      p->resOnStac
44b0: 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  k = 1;.    rc = 
44c0: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
44d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
44e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
44f0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
4500: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
4510: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
4520: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
4530: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
4540: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4550: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
4560: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
4570: 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 6e  TE_DEBUG.  int n
4580: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
4590: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
45a0: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
45b0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
45c0: 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20  p[nOp-1];.  if( 
45d0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
45e0: 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70 33 21  Noop && pOp->p3!
45f0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
4600: 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
4610: 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  3;.    while( is
4620: 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20 29  space(*(u8*)z) )
4630: 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66   z++;.    printf
4640: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
4650: 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  z);.  }.#endif.}
4660: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
4670: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
4680: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e  e for execution.
4690: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
46a0: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
46b0: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61  s allocating sta
46c0: 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69  ck space and ini
46d0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72  tializing the pr
46e0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a  ogram counter..*
46f0: 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45  * After the VDBE
4700: 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c   has be prepped,
4710: 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75   it can be execu
4720: 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f  ted by one or mo
4730: 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  re.** calls to s
4740: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
4750: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  .  .**.** This i
4760: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
4770: 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72  o move a VDBE fr
4780: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  om VDBE_MAGIC_IN
4790: 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  IT to.** VDBE_MA
47a0: 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64  GIC_RUN..*/.void
47b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
47c0: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
47d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
47e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
47f0: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  DBE */.  int nVa
4800: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
4810: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4820: 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20  r of '?' see in 
4830: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
4840: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c  t */.  int nMem,
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4870: 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
4880: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
4890: 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20   int nCursor,   
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
48c0: 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  sors to allocate
48d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 67 67 2c 20   */.  int nAgg, 
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4900: 66 20 61 67 67 72 65 67 61 74 65 20 63 6f 6e 74  f aggregate cont
4910: 65 78 74 73 20 72 65 71 75 69 72 65 64 20 2a 2f  exts required */
4920: 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e  .  int isExplain
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4940: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
4950: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
4960: 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  s is present */.
4970: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61  ){.  int n;..  a
4980: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4990: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
49a0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
49b0: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
49c0: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
49d0: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
49e0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
49f0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
4a00: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
4a10: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
4a20: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
4a30: 74 68 61 6e 20 6c 61 74 65 72 2e 20 54 68 69 73  than later. This
4a40: 0a 20 20 20 2a 20 69 73 20 62 65 63 61 75 73 65  .   * is because
4a50: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73   the call to res
4a60: 69 7a 65 4f 70 41 72 72 61 79 28 29 20 62 65 6c  izeOpArray() bel
4a70: 6f 77 20 6d 61 79 20 73 68 72 69 6e 6b 20 74 68  ow may shrink th
4a80: 65 0a 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20  e.   * p->aOp[] 
4a90: 61 72 72 61 79 20 74 6f 20 73 61 76 65 20 6d 65  array to save me
4aa0: 6d 6f 72 79 20 69 66 20 63 61 6c 6c 65 64 20 77  mory if called w
4ab0: 68 65 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47 49  hen in VDBE_MAGI
4ac0: 43 5f 52 55 4e 20 0a 20 20 20 2a 20 73 74 61 74  C_RUN .   * stat
4ad0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61  e..   */.  p->ma
4ae0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
4af0: 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69  _RUN;..  /* No i
4b00: 6e 73 74 72 75 63 74 69 6f 6e 20 65 76 65 72 20  nstruction ever 
4b10: 70 75 73 68 65 73 20 6d 6f 72 65 20 74 68 61 6e  pushes more than
4b20: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
4b30: 74 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  t onto the.  ** 
4b40: 73 74 61 63 6b 2e 20 20 41 6e 64 20 74 68 65 20  stack.  And the 
4b50: 73 74 61 63 6b 20 6e 65 76 65 72 20 67 72 6f 77  stack never grow
4b60: 73 20 6f 6e 20 73 75 63 63 65 73 73 69 76 65 20  s on successive 
4b70: 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68  executions of th
4b80: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70  e.  ** same loop
4b90: 2e 20 20 53 6f 20 74 68 65 20 74 6f 74 61 6c 20  .  So the total 
4ba0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 72 75  number of instru
4bb0: 63 74 69 6f 6e 73 20 69 73 20 61 6e 20 75 70 70  ctions is an upp
4bc0: 65 72 20 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e  er bound.  ** on
4bd0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 61   the maximum sta
4be0: 63 6b 20 64 65 70 74 68 20 72 65 71 75 69 72 65  ck depth require
4bf0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c  d..  **.  ** All
4c00: 6f 63 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65 20  ocation all the 
4c10: 73 74 61 63 6b 20 73 70 61 63 65 20 77 65 20 77  stack space we w
4c20: 69 6c 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a 20  ill ever need.. 
4c30: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53 74   */.  if( p->aSt
4c40: 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ack==0 ){.    in
4c50: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 2f 2a  t nArg;       /*
4c60: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
4c70: 6f 66 20 61 72 67 73 20 70 61 73 73 65 64 20 74  of args passed t
4c80: 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  o a user functio
4c90: 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  n. */.    int nS
4ca0: 74 61 63 6b 3b 20 20 20 20 20 2f 2a 20 4d 61 78  tack;     /* Max
4cb0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
4cc0: 74 61 63 6b 20 65 6e 74 72 69 65 73 20 72 65 71  tack entries req
4cd0: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 72 65 73  uired */.    res
4ce0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
4cf0: 26 6e 41 72 67 2c 20 26 6e 53 74 61 63 6b 29 3b  &nArg, &nStack);
4d00: 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72  .    resizeOpArr
4d10: 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20  ay(p, p->nOp);. 
4d20: 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e     assert( nVar>
4d30: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
4d40: 28 20 6e 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20  ( nStack<p->nOp 
4d50: 29 3b 0a 20 20 20 20 6e 53 74 61 63 6b 20 3d 20  );.    nStack = 
4d60: 69 73 45 78 70 6c 61 69 6e 20 3f 20 31 30 20 3a  isExplain ? 10 :
4d70: 20 6e 53 74 61 63 6b 3b 0a 20 20 20 20 70 2d 3e   nStack;.    p->
4d80: 61 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 4d  aStack = sqliteM
4d90: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 6e  alloc(.        n
4da0: 53 74 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e  Stack*sizeof(p->
4db0: 61 53 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f 2a  aStack[0])    /*
4dc0: 20 61 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20   aStack */.     
4dd0: 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d   + nArg*sizeof(M
4de0: 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  em*)            
4df0: 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20    /* apArg */.  
4e00: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
4e10: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
4e20: 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a       /* aVar */.
4e30: 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a        + nVar*siz
4e40: 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20 20  eof(char*)      
4e50: 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20         /* azVar 
4e60: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d 2a  */.      + nMem*
4e70: 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20  sizeof(Mem)     
4e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
4e90: 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75  m */.      + nCu
4ea0: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73  rsor*sizeof(Curs
4eb0: 6f 72 2a 29 20 20 20 20 20 20 20 20 2f 2a 20 61  or*)        /* a
4ec0: 70 43 73 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20  pCsr */.      + 
4ed0: 6e 41 67 67 2a 73 69 7a 65 6f 66 28 41 67 67 29  nAgg*sizeof(Agg)
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4ef0: 2a 20 41 67 67 72 65 67 61 74 65 20 63 6f 6e 74  * Aggregate cont
4f00: 65 78 74 73 20 2a 2f 0a 20 20 20 20 29 3b 0a 20  exts */.    );. 
4f10: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f     if( !sqlite3_
4f20: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b  malloc_failed ){
4f30: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d  .      p->aMem =
4f40: 20 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61   &p->aStack[nSta
4f50: 63 6b 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  ck];.      p->nM
4f60: 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20  em = nMem;.     
4f70: 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61   p->aVar = &p->a
4f80: 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20  Mem[nMem];.     
4f90: 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b   p->nVar = nVar;
4fa0: 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20  .      p->okVar 
4fb0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  = 0;.      p->ap
4fc0: 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d  Arg = (Mem**)&p-
4fd0: 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20  >aVar[nVar];.   
4fe0: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63     p->azVar = (c
4ff0: 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b  har**)&p->apArg[
5000: 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  nArg];.      p->
5010: 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a  apCsr = (Cursor*
5020: 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72  *)&p->azVar[nVar
5030: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 67  ];.      if( nAg
5040: 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
5050: 2d 3e 6e 41 67 67 20 3d 20 6e 41 67 67 3b 0a 20  ->nAgg = nAgg;. 
5060: 20 20 20 20 20 20 20 70 2d 3e 61 70 41 67 67 20         p->apAgg 
5070: 3d 20 28 41 67 67 2a 29 26 70 2d 3e 61 70 43 73  = (Agg*)&p->apCs
5080: 72 5b 6e 43 75 72 73 6f 72 5d 3b 0a 20 20 20 20  r[nCursor];.    
5090: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75    }.      p->nCu
50a0: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
50b0: 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e        for(n=0; n
50c0: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
50d0: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
50e0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
50f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5100: 20 20 7d 0a 20 20 70 2d 3e 70 41 67 67 20 3d 20    }.  p->pAgg = 
5110: 70 2d 3e 61 70 41 67 67 3b 0a 20 20 66 6f 72 28  p->apAgg;.  for(
5120: 6e 3d 30 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20  n=0; n<p->nMem; 
5130: 6e 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65  n++){.    p->aMe
5140: 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  m[n].flags = MEM
5150: 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 0a 23 69 66 64  _Null;.  }..#ifd
5160: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5170: 20 20 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c    if( (p->db->fl
5180: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
5190: 65 4c 69 73 74 69 6e 67 29 21 3d 30 0a 20 20 20  eListing)!=0.   
51a0: 20 7c 7c 20 73 71 6c 69 74 65 33 4f 73 46 69 6c   || sqlite3OsFil
51b0: 65 45 78 69 73 74 73 28 22 76 64 62 65 5f 65 78  eExists("vdbe_ex
51c0: 70 6c 61 69 6e 22 29 0a 20 20 29 7b 0a 20 20 20  plain").  ){.   
51d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 72 69 6e   int i;.    prin
51e0: 74 66 28 22 56 44 42 45 20 50 72 6f 67 72 61 6d  tf("VDBE Program
51f0: 20 4c 69 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20   Listing:\n");. 
5200: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
5210: 69 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 66  intSql(p);.    f
5220: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
5230: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
5240: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
5250: 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  (stdout, i, &p->
5260: 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  aOp[i]);.    }. 
5270: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
5280: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 22 76 64  OsFileExists("vd
5290: 62 65 5f 74 72 61 63 65 22 29 20 29 7b 0a 20 20  be_trace") ){.  
52a0: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 73 74 64    p->trace = std
52b0: 6f 75 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  out;.  }.#endif.
52c0: 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e    p->pTos = &p->
52d0: 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 70 2d  aStack[-1];.  p-
52e0: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
52f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5300: 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20   p->uniqueCnt = 
5310: 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44 65  0;.  p->returnDe
5320: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72  pth = 0;.  p->er
5330: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
5340: 62 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f 70 53 74  bort;.  p->popSt
5350: 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65  ack =  0;.  p->e
5360: 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c  xplain |= isExpl
5370: 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ain;.  p->magic 
5380: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
5390: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
53a0: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
53b0: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
53c0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
53d0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
53e0: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70  +){.      p->aOp
53f0: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
5400: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
5410: 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  les = 0;.    }. 
5420: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a   }.#endif.}.../*
5430: 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65  .** Remove any e
5440: 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 72 65 6d  lements that rem
5450: 61 69 6e 20 6f 6e 20 74 68 65 20 73 6f 72 74 65  ain on the sorte
5460: 72 20 66 6f 72 20 74 68 65 20 56 44 42 45 20 67  r for the VDBE g
5470: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
5480: 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 52  lite3VdbeSorterR
5490: 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
54a0: 20 77 68 69 6c 65 28 20 70 2d 3e 70 53 6f 72 74   while( p->pSort
54b0: 20 29 7b 0a 20 20 20 20 53 6f 72 74 65 72 20 2a   ){.    Sorter *
54c0: 70 53 6f 72 74 65 72 20 3d 20 70 2d 3e 70 53 6f  pSorter = p->pSo
54d0: 72 74 3b 0a 20 20 20 20 70 2d 3e 70 53 6f 72 74  rt;.    p->pSort
54e0: 20 3d 20 70 53 6f 72 74 65 72 2d 3e 70 4e 65 78   = pSorter->pNex
54f0: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  t;.    sqliteFre
5500: 65 28 70 53 6f 72 74 65 72 2d 3e 7a 4b 65 79 29  e(pSorter->zKey)
5510: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5520: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 53 6f  eMemRelease(&pSo
5530: 72 74 65 72 2d 3e 64 61 74 61 29 3b 0a 20 20 20  rter->data);.   
5540: 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 6f 72   sqliteFree(pSor
5550: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
5560: 2a 2a 20 46 72 65 65 20 61 6c 6c 20 72 65 73 6f  ** Free all reso
5570: 75 72 63 65 73 20 61 6c 6c 6f 63 69 61 74 65 64  urces allociated
5580: 20 77 69 74 68 20 41 67 67 45 6c 65 6d 20 70 45   with AggElem pE
5590: 6c 65 6d 2c 20 61 6e 20 65 6c 65 6d 65 6e 74 20  lem, an element 
55a0: 6f 66 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  of.** aggregate 
55b0: 70 41 67 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pAgg..*/.static 
55c0: 76 6f 69 64 20 66 72 65 65 41 67 67 45 6c 65 6d  void freeAggElem
55d0: 28 41 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d 2c  (AggElem *pElem,
55e0: 20 41 67 67 20 2a 70 41 67 67 29 7b 0a 20 20 69   Agg *pAgg){.  i
55f0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5600: 20 69 3c 70 41 67 67 2d 3e 6e 4d 65 6d 3b 20 69   i<pAgg->nMem; i
5610: 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  ++){.    Mem *pM
5620: 65 6d 20 3d 20 26 70 45 6c 65 6d 2d 3e 61 4d 65  em = &pElem->aMe
5630: 6d 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 41  m[i];.    if( pA
5640: 67 67 2d 3e 61 70 46 75 6e 63 20 26 26 20 70 41  gg->apFunc && pA
5650: 67 67 2d 3e 61 70 46 75 6e 63 5b 69 5d 20 26 26  gg->apFunc[i] &&
5660: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
5670: 4d 45 4d 5f 41 67 67 43 74 78 29 21 3d 30 20 29  MEM_AggCtx)!=0 )
5680: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
5690: 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 20  context ctx;.   
56a0: 20 20 20 63 74 78 2e 70 46 75 6e 63 20 3d 20 70     ctx.pFunc = p
56b0: 41 67 67 2d 3e 61 70 46 75 6e 63 5b 69 5d 3b 0a  Agg->apFunc[i];.
56c0: 20 20 20 20 20 20 63 74 78 2e 73 2e 66 6c 61 67        ctx.s.flag
56d0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
56e0: 20 20 20 20 63 74 78 2e 70 41 67 67 20 3d 20 70      ctx.pAgg = p
56f0: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 63 74  Mem->z;.      ct
5700: 78 2e 63 6e 74 20 3d 20 70 4d 65 6d 2d 3e 69 3b  x.cnt = pMem->i;
5710: 0a 20 20 20 20 20 20 63 74 78 2e 69 73 45 72 72  .      ctx.isErr
5720: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 2a  or = 0;.      (*
5730: 63 74 78 2e 70 46 75 6e 63 2d 3e 78 46 69 6e 61  ctx.pFunc->xFina
5740: 6c 69 7a 65 29 28 26 63 74 78 29 3b 0a 20 20 20  lize)(&ctx);.   
5750: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 63 74 78     pMem->z = ctx
5760: 2e 70 41 67 67 3b 0a 20 20 20 20 20 20 69 66 28  .pAgg;.      if(
5770: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 26 26 20 70   pMem->z!=0 && p
5780: 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d 2d 3e 7a 53  Mem->z!=pMem->zS
5790: 68 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  hort ){.        
57a0: 73 71 6c 69 74 65 46 72 65 65 28 70 4d 65 6d 2d  sqliteFree(pMem-
57b0: 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >z);.      }.   
57c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
57d0: 6d 52 65 6c 65 61 73 65 28 26 63 74 78 2e 73 29  mRelease(&ctx.s)
57e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
57f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
5800: 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
5810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
5820: 74 65 46 72 65 65 28 70 45 6c 65 6d 29 3b 0a 7d  teFree(pElem);.}
5830: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 61 6e  ../*.** Reset an
5840: 20 41 67 67 20 73 74 72 75 63 74 75 72 65 2e 20   Agg structure. 
5850: 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 74 73 20   Delete all its 
5860: 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  contents..**.** 
5870: 46 6f 72 20 69 6e 73 74 61 6c 6c 61 62 6c 65 20  For installable 
5880: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
5890: 6f 6e 73 2c 20 69 66 20 74 68 65 20 73 74 65 70  ons, if the step
58a0: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
58b0: 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 6d 61  en.** called, ma
58c0: 6b 65 20 73 75 72 65 20 74 68 65 20 66 69 6e 61  ke sure the fina
58d0: 6c 69 7a 65 72 20 66 75 6e 63 74 69 6f 6e 20 68  lizer function h
58e0: 61 73 20 61 6c 73 6f 20 62 65 65 6e 20 63 61 6c  as also been cal
58f0: 6c 65 64 2e 20 20 54 68 65 0a 2a 2a 20 66 69 6e  led.  The.** fin
5900: 61 6c 69 7a 65 72 20 6d 69 67 68 74 20 6e 65 65  alizer might nee
5910: 64 20 74 6f 20 66 72 65 65 20 6d 65 6d 6f 72 79  d to free memory
5920: 20 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61   that was alloca
5930: 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  ted as part of i
5940: 74 73 0a 2a 2a 20 70 72 69 76 61 74 65 20 63 6f  ts.** private co
5950: 6e 74 65 78 74 2e 20 20 49 66 20 74 68 65 20 66  ntext.  If the f
5960: 69 6e 61 6c 69 7a 65 72 20 68 61 73 20 6e 6f 74  inalizer has not
5970: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
5980: 2c 20 63 61 6c 6c 20 69 74 0a 2a 2a 20 6e 6f 77  , call it.** now
5990: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 62 20 69 73  ..**.** If db is
59a0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
59b0: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
59c0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 56 64 62 65   from sqliteVdbe
59d0: 52 65 73 65 74 28 29 2e 20 49 6e 0a 2a 2a 20 74  Reset(). In.** t
59e0: 68 69 73 20 63 61 73 65 20 63 6c 65 61 6e 20 75  his case clean u
59f0: 70 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  p all references
5a00: 20 74 6f 20 74 68 65 20 74 65 6d 70 2d 74 61 62   to the temp-tab
5a10: 6c 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61  le used for.** a
5a20: 67 67 72 65 67 61 74 65 73 20 28 69 66 20 69 74  ggregates (if it
5a30: 20 77 61 73 20 65 76 65 72 20 6f 70 65 6e 65 64   was ever opened
5a40: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 62 20 69  )..**.** If db i
5a50: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
5a60: 20 74 68 69 73 20 69 73 20 62 65 69 6e 67 20 63   this is being c
5a70: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 20  alled from with 
5a80: 61 6e 20 4f 50 5f 41 67 67 52 65 73 65 74 0a 2a  an OP_AggReset.*
5a90: 2a 20 6f 70 63 6f 64 65 2e 20 4f 70 65 6e 20 74  * opcode. Open t
5aa0: 68 65 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69  he temp-table, i
5ab0: 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
5ac0: 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
5ad0: 20 61 6e 64 0a 2a 2a 20 64 65 6c 65 74 65 20 74   and.** delete t
5ae0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
5af0: 68 65 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f  he table used fo
5b00: 72 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  r aggregate info
5b10: 72 6d 61 74 69 6f 6e 2c 20 72 65 61 64 79 0a 2a  rmation, ready.*
5b20: 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 72  * for the next r
5b30: 6f 75 6e 64 20 6f 66 20 61 67 67 72 65 67 61 74  ound of aggregat
5b40: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f  e processing..*/
5b50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
5b60: 41 67 67 52 65 73 65 74 28 73 71 6c 69 74 65 33  AggReset(sqlite3
5b70: 20 2a 64 62 2c 20 41 67 67 20 2a 70 41 67 67 2c   *db, Agg *pAgg,
5b80: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
5b90: 66 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  fo){.  int rc = 
5ba0: 30 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  0;.  BtCursor *p
5bb0: 43 73 72 3b 0a 0a 20 20 69 66 28 20 21 70 41 67  Csr;..  if( !pAg
5bc0: 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
5bd0: 45 5f 4f 4b 3b 0a 20 20 70 43 73 72 20 3d 20 70  E_OK;.  pCsr = p
5be0: 41 67 67 2d 3e 70 43 73 72 3b 0a 20 20 61 73 73  Agg->pCsr;.  ass
5bf0: 65 72 74 28 20 28 70 43 73 72 20 26 26 20 70 41  ert( (pCsr && pA
5c00: 67 67 2d 3e 6e 54 61 62 3e 30 29 20 7c 7c 20 28  gg->nTab>0) || (
5c10: 21 70 43 73 72 20 26 26 20 70 41 67 67 2d 3e 6e  !pCsr && pAgg->n
5c20: 54 61 62 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  Tab==0).        
5c30: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
5c40: 6f 63 5f 66 61 69 6c 65 64 20 29 3b 0a 0a 20 20  oc_failed );..  
5c50: 2f 2a 20 49 66 20 70 43 73 72 20 69 73 20 6e 6f  /* If pCsr is no
5c60: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
5c70: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
5c80: 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
5c90: 61 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 6f 70  ation.  ** is op
5ca0: 65 6e 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  en. Loop through
5cb0: 20 69 74 20 61 6e 64 20 66 72 65 65 20 74 68 65   it and free the
5cc0: 20 41 67 67 45 6c 65 6d 2a 20 73 74 72 75 63 74   AggElem* struct
5cd0: 75 72 65 20 70 6f 69 6e 74 65 64 20 61 74 0a 20  ure pointed at. 
5ce0: 20 2a 2a 20 62 79 20 65 61 63 68 20 65 6e 74 72   ** by each entr
5cf0: 79 2e 20 49 66 20 74 68 65 20 66 69 6e 61 6c 69  y. If the finali
5d00: 7a 65 72 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  zer has not been
5d10: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 6e 20 41   called for an A
5d20: 67 67 45 6c 65 6d 2c 0a 20 20 2a 2a 20 64 6f 20  ggElem,.  ** do 
5d30: 74 68 61 74 20 74 6f 6f 2e 20 46 69 6e 61 6c 6c  that too. Finall
5d40: 79 2c 20 63 6c 65 61 72 20 74 68 65 20 62 74 72  y, clear the btr
5d50: 65 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  ee table itself.
5d60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 73 72  .  */.  if( pCsr
5d70: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   ){.    int res;
5d80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
5d90: 67 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20  g->pBtree );.   
5da0: 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e 6e   assert( pAgg->n
5db0: 54 61 62 3e 30 20 29 3b 0a 0a 20 20 20 20 72 63  Tab>0 );..    rc
5dc0: 3d 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72  =sqlite3BtreeFir
5dd0: 73 74 28 70 43 73 72 2c 20 26 72 65 73 29 3b 0a  st(pCsr, &res);.
5de0: 20 20 20 20 77 68 69 6c 65 28 20 72 65 73 3d 3d      while( res==
5df0: 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
5e00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 41 67 67 45  OK ){.      AggE
5e10: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 20 20  lem *pElem;.    
5e20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5e30: 72 65 65 44 61 74 61 28 70 43 73 72 2c 20 30 2c  reeData(pCsr, 0,
5e40: 20 73 69 7a 65 6f 66 28 41 67 67 45 6c 65 6d 2a   sizeof(AggElem*
5e50: 29 2c 20 28 63 68 61 72 20 2a 29 26 70 45 6c 65  ), (char *)&pEle
5e60: 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  m);.      if( rc
5e70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5e80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
5e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ea0: 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e 61 70  assert( pAgg->ap
5eb0: 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  Func!=0 );.     
5ec0: 20 66 72 65 65 41 67 67 45 6c 65 6d 28 70 45 6c   freeAggElem(pEl
5ed0: 65 6d 2c 20 70 41 67 67 29 3b 0a 20 20 20 20 20  em, pAgg);.     
5ee0: 20 72 63 3d 73 71 6c 69 74 65 33 42 74 72 65 65   rc=sqlite3Btree
5ef0: 4e 65 78 74 28 70 43 73 72 2c 20 26 72 65 73 29  Next(pCsr, &res)
5f00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5f10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
5f20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
5f30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
5f40: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
5f50: 72 73 6f 72 28 70 43 73 72 29 3b 0a 20 20 20 20  rsor(pCsr);.    
5f60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
5f70: 72 54 61 62 6c 65 28 70 41 67 67 2d 3e 70 42 74  rTable(pAgg->pBt
5f80: 72 65 65 2c 20 70 41 67 67 2d 3e 6e 54 61 62 29  ree, pAgg->nTab)
5f90: 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
5fa0: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6d 61  /* The cursor ma
5fb0: 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 62 65  y not be open be
5fc0: 63 61 75 73 65 20 74 68 65 20 61 67 67 72 65 67  cause the aggreg
5fd0: 61 74 6f 72 20 77 61 73 20 6e 65 76 65 72 20 75  ator was never u
5fe0: 73 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69  sed,.    ** or i
5ff0: 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
6000: 69 74 20 77 61 73 20 75 73 65 64 20 62 75 74 20  it was used but 
6010: 74 68 65 72 65 20 77 61 73 20 6e 6f 20 47 52 4f  there was no GRO
6020: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
6030: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 41 67    */.    if( pAg
6040: 67 2d 3e 70 43 75 72 72 65 6e 74 20 29 7b 0a 20  g->pCurrent ){. 
6050: 20 20 20 20 20 66 72 65 65 41 67 67 45 6c 65 6d       freeAggElem
6060: 28 70 41 67 67 2d 3e 70 43 75 72 72 65 6e 74 2c  (pAgg->pCurrent,
6070: 20 70 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20   pAgg);.    }.  
6080: 7d 0a 0a 20 20 2f 2a 20 49 66 20 64 62 20 69 73  }..  /* If db is
6090: 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 77 65   not NULL and we
60a0: 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 6e   have not yet an
60b0: 64 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65  d we have not ye
60c0: 74 20 6f 70 65 6e 65 64 0a 20 20 2a 2a 20 74 68  t opened.  ** th
60d0: 65 20 74 65 6d 70 6f 72 61 72 79 20 62 74 72 65  e temporary btre
60e0: 65 20 74 68 65 6e 20 64 6f 20 73 6f 20 61 6e 64  e then do so and
60f0: 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
6100: 65 20 74 6f 20 73 74 6f 72 65 20 61 67 67 72 65  e to store aggre
6110: 67 61 74 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d  gate.  ** inform
6120: 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ation..  **.  **
6130: 20 49 66 20 64 62 20 69 73 20 4e 55 4c 4c 2c 20   If db is NULL, 
6140: 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 74  then close the t
6150: 65 6d 70 6f 72 61 72 79 20 62 74 72 65 65 20 69  emporary btree i
6160: 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a 20 20  f it is open..  
6170: 2a 2f 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  */.  if( db ){. 
6180: 20 20 20 69 66 28 20 21 70 41 67 67 2d 3e 70 42     if( !pAgg->pB
6190: 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tree ){.      as
61a0: 73 65 72 74 28 20 70 41 67 67 2d 3e 6e 54 61 62  sert( pAgg->nTab
61b0: 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
61c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
61d0: 59 44 42 0a 20 20 20 20 20 20 72 63 20 3d 20 73  YDB.      rc = s
61e0: 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f  qlite3BtreeFacto
61f0: 72 79 28 64 62 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ry(db, ":memory:
6200: 22 2c 20 30 2c 20 54 45 4d 50 5f 50 41 47 45 53  ", 0, TEMP_PAGES
6210: 2c 20 26 70 41 67 67 2d 3e 70 42 74 72 65 65 29  , &pAgg->pBtree)
6220: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
6230: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
6240: 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c  actory(db, 0, 0,
6250: 20 54 45 4d 50 5f 50 41 47 45 53 2c 20 26 70 41   TEMP_PAGES, &pA
6260: 67 67 2d 3e 70 42 74 72 65 65 29 3b 0a 23 65 6e  gg->pBtree);.#en
6270: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
6280: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6290: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
62a0: 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
62b0: 54 72 61 6e 73 28 70 41 67 67 2d 3e 70 42 74 72  Trans(pAgg->pBtr
62c0: 65 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63  ee, 1);.      rc
62d0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
62e0: 72 65 61 74 65 54 61 62 6c 65 28 70 41 67 67 2d  reateTable(pAgg-
62f0: 3e 70 42 74 72 65 65 2c 20 26 70 41 67 67 2d 3e  >pBtree, &pAgg->
6300: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
6310: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6320: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
6330: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
6340: 20 70 41 67 67 2d 3e 6e 54 61 62 21 3d 30 20 29   pAgg->nTab!=0 )
6350: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
6360: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70  te3BtreeCursor(p
6370: 41 67 67 2d 3e 70 42 74 72 65 65 2c 20 70 41 67  Agg->pBtree, pAg
6380: 67 2d 3e 6e 54 61 62 2c 20 31 2c 0a 20 20 20 20  g->nTab, 1,.    
6390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
63a0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 2c 20 70 4b  ecordCompare, pK
63b0: 65 79 49 6e 66 6f 2c 20 26 70 41 67 67 2d 3e 70  eyInfo, &pAgg->p
63c0: 43 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Csr);.    if( rc
63d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
63e0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65  turn rc;.  }else
63f0: 7b 0a 20 20 20 20 69 66 28 20 70 41 67 67 2d 3e  {.    if( pAgg->
6400: 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20  pBtree ){.      
6410: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
6420: 65 28 70 41 67 67 2d 3e 70 42 74 72 65 65 29 3b  e(pAgg->pBtree);
6430: 0a 20 20 20 20 20 20 70 41 67 67 2d 3e 70 42 74  .      pAgg->pBt
6440: 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ree = 0;.      p
6450: 41 67 67 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20  Agg->nTab = 0;. 
6460: 20 20 20 7d 0a 20 20 20 20 70 41 67 67 2d 3e 70     }.    pAgg->p
6470: 43 73 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Csr = 0;.  }..  
6480: 69 66 28 20 70 41 67 67 2d 3e 61 70 46 75 6e 63  if( pAgg->apFunc
6490: 20 29 7b 20 0a 20 20 20 20 73 71 6c 69 74 65 46   ){ .    sqliteF
64a0: 72 65 65 28 70 41 67 67 2d 3e 61 70 46 75 6e 63  ree(pAgg->apFunc
64b0: 29 3b 0a 20 20 20 20 70 41 67 67 2d 3e 61 70 46  );.    pAgg->apF
64c0: 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  unc = 0;.  }.  p
64d0: 41 67 67 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20  Agg->pCurrent = 
64e0: 30 3b 0a 20 20 70 41 67 67 2d 3e 6e 4d 65 6d 20  0;.  pAgg->nMem 
64f0: 3d 20 30 3b 0a 20 20 70 41 67 67 2d 3e 73 65 61  = 0;.  pAgg->sea
6500: 72 63 68 69 6e 67 20 3d 20 30 3b 0a 20 20 72 65  rching = 0;.  re
6510: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6520: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  }.../*.** Delete
6530: 20 61 20 6b 65 79 6c 69 73 74 0a 2a 2f 0a 76 6f   a keylist.*/.vo
6540: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65  id sqlite3VdbeKe
6550: 79 6c 69 73 74 46 72 65 65 28 4b 65 79 6c 69 73  ylistFree(Keylis
6560: 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20  t *p){.  while( 
6570: 70 20 29 7b 0a 20 20 20 20 4b 65 79 6c 69 73 74  p ){.    Keylist
6580: 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65   *pNext = p->pNe
6590: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  xt;.    sqliteFr
65a0: 65 65 28 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  ee(p);.    p = p
65b0: 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Next;.  }.}../*.
65c0: 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
65d0: 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  r and release al
65e0: 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  l the resources 
65f0: 74 68 61 74 20 63 75 72 73 6f 72 20 68 61 70 70  that cursor happ
6600: 65 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a  ens.** to hold..
6610: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6620: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 43 75  dbeFreeCursor(Cu
6630: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
6640: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
6650: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
6660: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29  ( pCx->pCursor )
6670: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
6680: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
6690: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  x->pCursor);.  }
66a0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
66b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
66c0: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
66d0: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
66e0: 46 72 65 65 28 70 43 78 2d 3e 70 44 61 74 61 29  Free(pCx->pData)
66f0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
6700: 43 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73 71  Cx->aType);.  sq
6710: 6c 69 74 65 46 72 65 65 28 70 43 78 29 3b 0a 7d  liteFree(pCx);.}
6720: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
6730: 6c 20 63 75 72 73 6f 72 73 0a 2a 2f 0a 73 74 61  l cursors.*/.sta
6740: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
6750: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
6760: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
6770: 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20  ( p->apCsr==0 ) 
6780: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
6790: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
67a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
67b0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
67c0: 28 70 2d 3e 61 70 43 73 72 5b 69 5d 29 3b 0a 20  (p->apCsr[i]);. 
67d0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
67e0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
67f0: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
6800: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
6810: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6820: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tine will automa
6830: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e  tically close an
6840: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73  y cursors, lists
6850: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74  , and/or.** sort
6860: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65  ers that were le
6870: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73  ft open.  It als
6880: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61  o deletes the va
6890: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61  lues of.** varia
68a0: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72  bles in the aVar
68b0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
68c0: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
68d0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
68e0: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74   i;.  if( p->aSt
68f0: 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  ack ){.    relea
6900: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53  seMemArray(p->aS
6910: 74 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54  tack, 1 + (p->pT
6920: 6f 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29  os - p->aStack))
6930: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
6940: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a  &p->aStack[-1];.
6950: 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
6960: 72 73 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c 65  rsors(p);.  rele
6970: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
6980: 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  Mem, p->nMem);. 
6990: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
69a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
69b0: 4b 65 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 70  KeylistFree(p->p
69c0: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 4c  List);.    p->pL
69d0: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ist = 0;.  }.  i
69e0: 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  f( p->contextSta
69f0: 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ck ){.    for(i=
6a00: 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74 53  0; i<p->contextS
6a10: 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20  tackTop; i++){. 
6a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6a30: 4b 65 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 63  KeylistFree(p->c
6a40: 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e 70  ontextStack[i].p
6a50: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
6a60: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 63   sqliteFree(p->c
6a70: 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20  ontextStack);.  
6a80: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  }.  sqlite3VdbeS
6a90: 6f 72 74 65 72 52 65 73 65 74 28 70 29 3b 0a 20  orterReset(p);. 
6aa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
6ab0: 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Agg; i++){.    s
6ac0: 71 6c 69 74 65 33 56 64 62 65 41 67 67 52 65 73  qlite3VdbeAggRes
6ad0: 65 74 28 30 2c 20 26 70 2d 3e 61 70 41 67 67 5b  et(0, &p->apAgg[
6ae0: 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 2d  i], 0);.  }.  p-
6af0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20  >contextStack = 
6b00: 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53  0;.  p->contextS
6b10: 74 61 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20  tackDepth = 0;. 
6b20: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
6b30: 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Top = 0;.  sqlit
6b40: 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67  eFree(p->zErrMsg
6b50: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
6b60: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
6b70: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
6b80: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
6b90: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
6ba0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c  rned by this SQL
6bb0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  .** statement. T
6bc0: 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61  his is now set a
6bd0: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
6be0: 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69  rather than duri
6bf0: 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  ng.** execution 
6c00: 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  of the vdbe prog
6c10: 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69  ram so that sqli
6c20: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
6c30: 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c  () can.** be cal
6c40: 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74  led on an SQL st
6c50: 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73  atement before s
6c60: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a  qlite3_step()..*
6c70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6c80: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62  beSetNumCols(Vdb
6c90: 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f  e *p, int nResCo
6ca0: 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43  lumn){.  Mem *pC
6cb0: 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b  olName;.  int n;
6cc0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 2d  .  assert( 0==p-
6cd0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
6ce0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
6cf0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 6e   nResColumn;.  n
6d00: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 32 3b   = nResColumn*2;
6d10: 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d  .  p->aColName =
6d20: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d   pColName = (Mem
6d30: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  *)sqliteMalloc( 
6d40: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
6d50: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
6d60: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
6d70: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
6d80: 20 29 7b 0a 20 20 20 20 28 70 43 6f 6c 4e 61 6d   ){.    (pColNam
6d90: 65 2b 2b 29 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  e++)->flags = ME
6da0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  M_Null;.  }.}../
6db0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
6dc0: 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
6dd0: 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
6de0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
6df0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
6e00: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
6e10: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
6e20: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
6e30: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
6e40: 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
6e50: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
6e60: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
6e70: 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  mCols()..**.** I
6e80: 66 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20  f N==P3_STATIC  
6e90: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e  it means that zN
6ea0: 61 6d 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ame is a pointer
6eb0: 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73   to a constant s
6ec0: 74 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20  tatic.** string 
6ed0: 61 6e 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20  and we can just 
6ee0: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
6ef0: 2e 20 49 66 20 69 74 20 69 73 20 50 33 5f 44 59  . If it is P3_DY
6f00: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20  NAMIC, then .** 
6f10: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 66 72  the string is fr
6f20: 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  eed using sqlite
6f30: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
6f40: 76 64 62 65 20 69 73 20 66 69 6e 69 73 68 65 64  vdbe is finished
6f50: 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68   with.** it. Oth
6f60: 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65 73 20  erwise, N bytes 
6f70: 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70  of zName are cop
6f80: 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
6f90: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
6fa0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
6fb0: 64 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dx, const char *
6fc0: 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a 20  zName, int N){. 
6fd0: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
6fe0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
6ff0: 72 74 28 20 69 64 78 3c 28 32 2a 70 2d 3e 6e 52  rt( idx<(2*p->nR
7000: 65 73 43 6f 6c 75 6d 6e 29 20 29 3b 0a 20 20 69  esColumn) );.  i
7010: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
7020: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
7030: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
7040: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
7050: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
7060: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
7070: 6f 6c 4e 61 6d 65 5b 69 64 78 5d 29 3b 0a 20 20  olName[idx]);.  
7080: 69 66 28 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49  if( N==P3_DYNAMI
7090: 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54 41 54 49  C || N==P3_STATI
70a0: 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  C ){.    rc = sq
70b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
70c0: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
70d0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
70e0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
70f0: 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
7100: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
7110: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
7120: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20  Name, zName, N, 
7130: 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49  SQLITE_UTF8,SQLI
7140: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
7150: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
7160: 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 33 5f  ITE_OK && N==P3_
7170: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70  DYNAMIC ){.    p
7180: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d  ColName->flags =
7190: 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
71a0: 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29 29  s&(~MEM_Static))
71b0: 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 70 43  |MEM_Dyn;.    pC
71c0: 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d 20 30  olName->xDel = 0
71d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
71e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65  c;.}../*.** A re
71f0: 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
7200: 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d  saction may or m
7210: 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65  ay not be active
7220: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
7230: 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20  dle.** db. If a 
7240: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
7250: 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74  ctive, commit it
7260: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a  . If there is a.
7270: 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
7280: 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f  tion spanning mo
7290: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
72a0: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
72b0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73  routine.** takes
72c0: 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73   care of the mas
72d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63  ter journal tric
72e0: 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  kery..*/.static 
72f0: 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73  int vdbeCommit(s
7300: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
7310: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
7320: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
7330: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
7340: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
7350: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
7360: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
7370: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
7380: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
7390: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
73a0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
73b0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
73c0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
73d0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
73e0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
73f0: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
7400: 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
7410: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21   1;.      if( i!
7420: 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20  =1 ) nTrans++;. 
7430: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
7440: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
7450: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
7460: 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
7470: 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
7480: 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
7490: 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
74a0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
74b0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
74c0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66   sqlite3SafetyOf
74d0: 66 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  f(db);.    rc = 
74e0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
74f0: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
7500: 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
7510: 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20  SafetyOn(db);.  
7520: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
7530: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7540: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
7550: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
7560: 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
7570: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
7580: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
7590: 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
75a0: 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
75b0: 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
75c0: 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
75d0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
75e0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
75f0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
7600: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
7610: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
7620: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
7630: 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
7640: 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
7650: 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
7660: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
7670: 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49   is :memory:.  I
7680: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64  n that case we d
7690: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75 70 70 6f  o.  ** not suppo
76a0: 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
76b0: 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
76c0: 20 75 73 65 20 74 68 65 20 73 69 6d 70 6c 65 20   use the simple 
76d0: 63 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a 20 74  case then.  ** t
76e0: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
76f0: 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74 65 33  ==strlen(sqlite3
7700: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
7710: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
7720: 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29  ) || nTrans<=1 )
7730: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
7740: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7750: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7760: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
7770: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
7780: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
7790: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
77a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
77b0: 79 6e 63 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  ync(pBt, 0);.   
77c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
77d0: 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
77e0: 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
77f0: 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
7800: 6c 6c 79 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20  lly synced */.  
7810: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7820: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  _OK ){.      for
7830: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
7840: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42   i++){.        B
7850: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
7860: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
7870: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
7880: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7890: 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29  BtreeCommit(pBt)
78a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
78b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
78c0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
78d0: 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
78e0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
78f0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
7900: 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
7910: 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
7920: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
7930: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
7940: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
7950: 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
7960: 69 63 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  icly..  */.  els
7970: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  e{.    char *zMa
7980: 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
7990: 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
79a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
79b0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
79c0: 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
79d0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
79e0: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
79f0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 4f 73 46 69  ].pBt);.    OsFi
7a00: 6c 65 20 6d 61 73 74 65 72 3b 0a 0a 20 20 20 20  le master;..    
7a10: 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
7a20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
7a30: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  name */.    do {
7a40: 0a 20 20 20 20 20 20 75 33 32 20 72 61 6e 64 6f  .      u32 rando
7a50: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  m;.      sqliteF
7a60: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
7a70: 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f      sqlite3Rando
7a80: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e  mness(sizeof(ran
7a90: 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a  dom), &random);.
7aa0: 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20        zMaster = 
7ab0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
7ac0: 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69  %s-mj%08X", zMai
7ad0: 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78  nFile, random&0x
7ae0: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  7fffffff);.     
7af0: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b   if( !zMaster ){
7b00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7b10: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7b20: 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
7b30: 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
7b40: 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 20 29  xists(zMaster) )
7b50: 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  ;..    /* Open t
7b60: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7b70: 6c 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  l. */.    memset
7b80: 28 26 6d 61 73 74 65 72 2c 20 30 2c 20 73 69 7a  (&master, 0, siz
7b90: 65 6f 66 28 6d 61 73 74 65 72 29 29 3b 0a 20 20  eof(master));.  
7ba0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7bb0: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 4d  OpenExclusive(zM
7bc0: 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 2c 20  aster, &master, 
7bd0: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
7be0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7bf0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
7c00: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
7c10: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
7c20: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
7c30: 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
7c40: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
7c50: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7c60: 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
7c70: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
7c80: 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
7c90: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
7ca0: 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
7cb0: 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
7cc0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
7cd0: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
7ce0: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
7cf0: 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
7d00: 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
7d10: 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
7d20: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
7d30: 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
7d40: 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
7d50: 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
7d60: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
7d70: 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
7d80: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
7d90: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
7da0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
7db0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
7dc0: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63      if( i==1 ) c
7dd0: 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67  ontinue;   /* Ig
7de0: 6e 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  nore the TEMP da
7df0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
7e00: 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74  if( pBt && sqlit
7e10: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
7e20: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
7e30: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
7e40: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
7e50: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
7e60: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
7e70: 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20  ( zFile[0]==0 ) 
7e80: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
7e90: 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61  nore :memory: da
7ea0: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
7eb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7ec0: 73 57 72 69 74 65 28 26 6d 61 73 74 65 72 2c 20  sWrite(&master, 
7ed0: 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46  zFile, strlen(zF
7ee0: 69 6c 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 20  ile)+1);.       
7ef0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7f00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
7f10: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
7f20: 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  master);.       
7f30: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
7f40: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  te(zMaster);.   
7f50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
7f60: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
7f70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
7f80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7f90: 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f   }.    }...    /
7fa0: 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
7fb0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
7fc0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
7fd0: 73 2c 20 6f 70 65 6e 20 74 68 65 20 64 69 72 65  s, open the dire
7fe0: 63 74 6f 72 79 0a 20 20 20 20 2a 2a 20 74 68 65  ctory.    ** the
7ff0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8000: 66 69 6c 65 20 69 73 20 73 74 6f 72 65 20 69 6e  file is store in
8010: 20 73 6f 20 74 68 61 74 20 69 74 20 67 65 74 73   so that it gets
8020: 20 73 79 6e 63 65 64 20 74 6f 6f 2e 0a 20 20 20   synced too..   
8030: 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c   */.    zMainFil
8040: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
8050: 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61  GetDirname(db->a
8060: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
8070: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
8080: 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 4d 61 69  enDirectory(zMai
8090: 6e 46 69 6c 65 2c 20 26 6d 61 73 74 65 72 29 3b  nFile, &master);
80a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
80b0: 49 54 45 5f 4f 4b 20 7c 7c 20 28 72 63 20 3d 20  ITE_OK || (rc = 
80c0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 6d  sqlite3OsSync(&m
80d0: 61 73 74 65 72 29 29 21 3d 53 51 4c 49 54 45 5f  aster))!=SQLITE_
80e0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
80f0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
8100: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
8110: 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74  e3OsDelete(zMast
8120: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
8130: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
8140: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8150: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
8160: 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
8170: 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
8180: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
8190: 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
81a0: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
81b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
81c0: 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
81d0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
81e0: 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
81f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
8200: 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
8210: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8220: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
8230: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
8240: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
8250: 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
8260: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
8270: 65 53 79 6e 63 28 29 2c 0a 20 20 20 20 2a 2a 20  eSync(),.    ** 
8280: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
8290: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
82a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
82b0: 69 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ile will be.    
82c0: 2a 2a 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  ** orphaned. But
82d0: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
82e0: 65 20 69 74 2c 20 69 6e 20 63 61 73 65 20 74 68  e it, in case th
82f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8300: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  .    ** file nam
8310: 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
8320: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
8330: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
8340: 61 69 6c 75 72 65 0a 20 20 20 20 2a 2a 20 6f 63  ailure.    ** oc
8350: 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cured..    */.  
8360: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
8370: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
8380: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8390: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
83a0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 26 26        if( pBt &&
83b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
83c0: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
83d0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
83e0: 74 65 33 42 74 72 65 65 53 79 6e 63 28 70 42 74  te3BtreeSync(pBt
83f0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
8400: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
8410: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
8420: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8430: 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(&master);.    
8440: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
8450: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
8460: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
8470: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8480: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
8490: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
84a0: 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 6c  er);..    /* Del
84b0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
84c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
84d0: 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
84e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
84f0: 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
8500: 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
8510: 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
8520: 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
8530: 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
8540: 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
8550: 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
8560: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
8570: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
8580: 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
8590: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
85a0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   );.    sqliteFr
85b0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
85c0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
85d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
85e0: 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28 7a 4d  SyncDirectory(zM
85f0: 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
8600: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8610: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
8620: 20 69 73 20 6e 6f 74 20 67 6f 6f 64 2e 20 54 68   is not good. Th
8630: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8640: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 64   file has been d
8650: 65 6c 65 74 65 64 2c 20 62 75 74 0a 20 20 20 20  eleted, but.    
8660: 20 20 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f    ** the directo
8670: 72 79 20 73 79 6e 63 20 66 61 69 6c 65 64 2e 20  ry sync failed. 
8680: 54 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6d 70  There is no comp
8690: 6c 65 74 65 6c 79 20 73 61 66 65 20 63 6f 75 72  letely safe cour
86a0: 73 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  se of.      ** a
86b0: 63 74 69 6f 6e 20 66 72 6f 6d 20 68 65 72 65 2e  ction from here.
86c0: 20 54 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   The individual 
86d0: 6a 6f 75 72 6e 61 6c 73 20 63 6f 6e 74 61 69 6e  journals contain
86e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
86f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  .      ** master
8700: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 62   journal file, b
8710: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
8720: 61 79 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 69 66  ay of knowing if
8730: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6d   that.      ** m
8740: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
8750: 69 73 74 73 20 6e 6f 77 20 6f 72 20 69 66 20 69  ists now or if i
8760: 74 20 77 69 6c 6c 20 65 78 69 73 74 20 61 66 74  t will exist aft
8770: 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  er the operating
8780: 0a 20 20 20 20 20 20 2a 2a 20 73 79 73 74 65 6d  .      ** system
8790: 20 63 72 61 73 68 20 74 68 61 74 20 6d 61 79 20   crash that may 
87a0: 66 6f 6c 6c 6f 77 20 74 68 65 20 66 73 79 6e 63  follow the fsync
87b0: 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 20 20  () failure..    
87c0: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
87d0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
87e0: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
87f0: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
8800: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
8810: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
8820: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
8830: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
8840: 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 61 72  BtreeCommit() ar
8850: 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
8860: 69 6c 65 73 20 61 6e 64 20 64 65 6c 65 74 69 6e  iles and deletin
8870: 67 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  g.    ** journal
8880: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
8890: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
88a0: 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
88b0: 6e 67 20 77 65 20 64 6f 6e 27 74 0a 20 20 20 20  ng we don't.    
88c0: 2a 2a 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  ** really care. 
88d0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
88e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
88f0: 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72   is already guar
8900: 61 6e 74 65 65 64 2c 0a 20 20 20 20 2a 2a 20 62  anteed,.    ** b
8910: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
8920: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 20 6d 61  old' journals ma
8930: 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e  y be lying aroun
8940: 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 0a  d. Returning an.
8950: 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
8960: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
8970: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
8980: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
8990: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
89a0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
89b0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
89c0: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
89d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
89e0: 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b  treeCommit(pBt);
89f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8a00: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
8a10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 65  .}../*.** Find e
8a20: 76 65 72 79 20 61 63 74 69 76 65 20 56 4d 20 6f  very active VM o
8a30: 74 68 65 72 20 74 68 61 6e 20 70 56 64 62 65 20  ther than pVdbe 
8a40: 61 6e 64 20 63 68 61 6e 67 65 20 69 74 73 20 73  and change its s
8a50: 74 61 74 75 73 20 74 6f 0a 2a 2a 20 61 62 6f 72  tatus to.** abor
8a60: 74 65 64 2e 20 20 54 68 69 73 20 68 61 70 70 65  ted.  This happe
8a70: 6e 73 20 77 68 65 6e 20 6f 6e 65 20 56 4d 20 63  ns when one VM c
8a80: 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
8a90: 20 64 75 65 20 74 6f 20 61 6e 0a 2a 2a 20 4f 4e   due to an.** ON
8aa0: 20 43 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41   CONFLICT ROLLBA
8ab0: 43 4b 20 63 6c 61 75 73 65 20 28 66 6f 72 20 65  CK clause (for e
8ac0: 78 61 6d 70 6c 65 29 2e 20 20 54 68 65 20 6f 74  xample).  The ot
8ad0: 68 65 72 20 56 4d 73 20 6d 75 73 74 20 62 65 0a  her VMs must be.
8ae0: 2a 2a 20 61 62 6f 72 74 65 64 20 73 6f 20 74 68  ** aborted so th
8af0: 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 68  at they do not h
8b00: 61 76 65 20 64 61 74 61 20 72 6f 6c 6c 65 64 20  ave data rolled 
8b10: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 6e 65  out from underne
8b20: 61 74 68 0a 2a 2a 20 74 68 65 6d 20 6c 65 61 64  ath.** them lead
8b30: 69 6e 67 20 74 6f 20 61 20 73 65 67 66 61 75 6c  ing to a segfaul
8b40: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
8b50: 64 20 61 62 6f 72 74 4f 74 68 65 72 41 63 74 69  d abortOtherActi
8b60: 76 65 56 64 62 65 73 28 56 64 62 65 20 2a 70 56  veVdbes(Vdbe *pV
8b70: 64 62 65 29 7b 0a 20 20 56 64 62 65 20 2a 70 4f  dbe){.  Vdbe *pO
8b80: 74 68 65 72 3b 0a 20 20 66 6f 72 28 70 4f 74 68  ther;.  for(pOth
8b90: 65 72 3d 70 56 64 62 65 2d 3e 64 62 2d 3e 70 56  er=pVdbe->db->pV
8ba0: 64 62 65 3b 20 70 4f 74 68 65 72 3b 20 70 4f 74  dbe; pOther; pOt
8bb0: 68 65 72 3d 70 4f 74 68 65 72 2d 3e 70 4e 65 78  her=pOther->pNex
8bc0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 74 68  t){.    if( pOth
8bd0: 65 72 3d 3d 70 56 64 62 65 20 29 20 63 6f 6e 74  er==pVdbe ) cont
8be0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f  inue;.    if( pO
8bf0: 74 68 65 72 2d 3e 6d 61 67 69 63 21 3d 56 44 42  ther->magic!=VDB
8c00: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
8c10: 4f 74 68 65 72 2d 3e 70 63 3c 30 20 29 20 63 6f  Other->pc<0 ) co
8c20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 63 6c 6f 73  ntinue;.    clos
8c30: 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 4f 74 68  eAllCursors(pOth
8c40: 65 72 29 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d  er);.    pOther-
8c50: 3e 61 62 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20  >aborted = 1;.  
8c60: 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  }.}../* .** This
8c70: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
8c80: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
8c90: 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63  .activeVdbeCnt c
8ca0: 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
8cb0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
8cc0: 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
8cd0: 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
8ce0: 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
8cf0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
8d00: 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
8d10: 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
8d20: 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
8d30: 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
8d40: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
8d50: 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
8d60: 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
8d70: 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
8d80: 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
8d90: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
8da0: 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
8db0: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
8dc0: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
8dd0: 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
8de0: 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
8df0: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
8e00: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
8e10: 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
8e20: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
8e30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  .    if( p->magi
8e40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
8e50: 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  N && p->pc>=0 ){
8e60: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
8e70: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
8e80: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
8e90: 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74  rt( cnt==db->act
8ea0: 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a  iveVdbeCnt );.}.
8eb0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68  #else.#define ch
8ec0: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
8ed0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
8ee0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8ef0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
8f00: 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
8f10: 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
8f20: 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
8f30: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
8f40: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
8f50: 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
8f60: 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
8f70: 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
8f80: 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
8f90: 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
8fa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8fb0: 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
8fc0: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
8fd0: 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
8fe0: 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
8ff0: 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
9000: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 0a 2a 2a  E_MAGIC_HALT..**
9010: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
9020: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
9030: 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
9040: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
9050: 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
9060: 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
9070: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
9080: 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
9090: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
90a0: 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
90b0: 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
90c0: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
90d0: 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
90e0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
90f0: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
9100: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
9110: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
9120: 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65  t (*xFunc)(Btree
9130: 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20   *pBt) = 0;  /* 
9140: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
9150: 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20 62   on each btree b
9160: 61 63 6b 65 6e 64 20 2a 2f 0a 0a 20 20 69 66 28  ackend */..  if(
9170: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
9180: 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
9190: 20 2f 2a 20 41 6c 72 65 61 64 79 20 68 61 6c 74   /* Already halt
91a0: 65 64 2e 20 20 4e 6f 74 68 69 6e 67 20 74 6f 20  ed.  Nothing to 
91b0: 64 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  do. */.    asser
91c0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
91d0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 3b 0a  E_MAGIC_HALT );.
91e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
91f0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  E_OK;.  }.  clos
9200: 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
9210: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
9220: 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
9230: 70 2d 3e 70 63 3c 30 20 29 7b 0a 20 20 20 20 2f  p->pc<0 ){.    /
9240: 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
9250: 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
9260: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
9270: 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  ver started */. 
9280: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 61   }else if( db->a
9290: 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d  utoCommit && db-
92a0: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d 3d  >activeVdbeCnt==
92b0: 31 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  1 ){.    if( p->
92c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
92d0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
92e0: 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
92f0: 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
9300: 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
9310: 65 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  e, there are no 
9320: 6f 74 68 65 72 20 61 63 74 69 76 65 20 71 75 65  other active que
9330: 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ries.      ** us
9340: 69 6e 67 20 74 68 69 73 20 68 61 6e 64 6c 65 20  ing this handle 
9350: 61 6e 64 20 74 68 65 20 76 64 62 65 20 70 72 6f  and the vdbe pro
9360: 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
9370: 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 0a 20 20  ful or hit an.  
9380: 20 20 20 20 2a 2a 20 27 4f 52 20 46 41 49 4c 27      ** 'OR FAIL'
9390: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69   constraint. Thi
93a0: 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
93b0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
93c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
93d0: 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
93e0: 28 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  (db);.      if( 
93f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
9400: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9410: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
9420: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
9430: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9440: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
9450: 72 63 3b 0a 20 20 20 20 20 20 20 20 78 46 75 6e  rc;.        xFun
9460: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
9470: 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20  Rollback;.      
9480: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
9490: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
94a0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 3b  e3BtreeRollback;
94b0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
94c0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
94d0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65  QLITE_OK || p->e
94e0: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
94f0: 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 78 46 75  ail ){.      xFu
9500: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
9510: 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20  eCommitStmt;.   
9520: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
9530: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
9540: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 78 46 75  ort ){.      xFu
9550: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
9560: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
9570: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9580: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
9590: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20  treeRollback;.  
95a0: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
95b0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 62  it = 1;.      ab
95c0: 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64  ortOtherActiveVd
95d0: 62 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  bes(p);.    }.  
95e0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 78 46 75 6e 63  }..  /* If xFunc
95f0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
9600: 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20  en it is one of 
9610: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
9620: 62 61 63 6b 2c 0a 20 20 2a 2a 20 73 71 6c 69 74  back,.  ** sqlit
9630: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
9640: 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 42 74  tmt or sqlite3Bt
9650: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43  reeCommitStmt. C
9660: 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 0a 20  all it once on. 
9670: 20 2a 2a 20 65 61 63 68 20 62 61 63 6b 65 6e 64   ** each backend
9680: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
9690: 63 75 72 73 20 61 6e 64 20 74 68 65 20 72 65 74  curs and the ret
96a0: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c  urn code is stil
96b0: 6c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  l.  ** SQLITE_OK
96c0: 2c 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e  , set the return
96d0: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77   code to the new
96e0: 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20   error value..  
96f0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 78 46  */.  for(i=0; xF
9700: 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  unc && i<db->nDb
9710: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74  ; i++){ .    int
9720: 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a   rc;.    Btree *
9730: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
9740: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
9750: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
9760: 78 46 75 6e 63 28 70 42 74 29 3b 0a 20 20 20 20  xFunc(pBt);.    
9770: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
9780: 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
9790: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
97a0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
97b0: 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
97c0: 54 45 20 6f 72 20 44 45 4c 45 54 45 2c 20 73 65  TE or DELETE, se
97d0: 74 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  t the change cou
97e0: 6e 74 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  nter. */.  if( p
97f0: 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26  ->changeCntOn &&
9800: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
9810: 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c 20 78   if( !xFunc || x
9820: 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72  Func==sqlite3Btr
9830: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a  eeCommitStmt ){.
9840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9850: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
9860: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
9870: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
9880: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
9890: 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
98a0: 7d 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65  }.    p->nChange
98b0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
98c0: 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  Rollback or comm
98d0: 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68  it any schema ch
98e0: 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72  anges that occur
98f0: 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  red. */.  if( p-
9900: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
9910: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c  {.    sqlite3Rol
9920: 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61  lbackInternalCha
9930: 6e 67 65 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73  nges(db);.  }els
9940: 65 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20  e if( db->flags 
9950: 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  & SQLITE_InternC
9960: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
9970: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
9980: 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
9990: 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76    }..  /* We hav
99a0: 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68  e successfully h
99b0: 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  alted and closed
99c0: 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64   the VM.  Record
99d0: 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
99e0: 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
99f0: 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56  .    db->activeV
9a00: 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20  dbeCnt--;.  }.  
9a10: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
9a20: 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
9a30: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
9a40: 28 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  (db);..  return 
9a50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
9a60: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
9a70: 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
9a80: 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
9a90: 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
9aa0: 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
9ab0: 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
9ac0: 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
9ad0: 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
9ae0: 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
9af0: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
9b00: 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
9b10: 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
9b20: 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
9b30: 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
9b40: 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
9b50: 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
9b60: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
9b70: 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
9b80: 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
9b90: 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
9ba0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
9bb0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
9bc0: 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
9bd0: 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
9be0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
9bf0: 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
9c00: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
9c10: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26  DBE_MAGIC_RUN &&
9c20: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
9c30: 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
9c40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70    sqlite3Error(p
9c50: 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4d 49 53  ->db, SQLITE_MIS
9c60: 55 53 45 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  USE, 0);.    ret
9c70: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
9c80: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  E;.  }..  /* If 
9c90: 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
9ca0: 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
9cb0: 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
9cc0: 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
9cd0: 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
9ce0: 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
9cf0: 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
9d00: 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
9d10: 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
9d20: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
9d30: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9d40: 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
9d50: 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
9d60: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
9d70: 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
9d80: 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
9d90: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
9da0: 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
9db0: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
9dc0: 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
9dd0: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
9de0: 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
9df0: 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
9e00: 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
9e10: 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
9e20: 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
9e30: 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
9e40: 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
9e50: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
9e60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
9e70: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=0 ){.    if( 
9e80: 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
9e90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9ea0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 22  (p->db, p->rc, "
9eb0: 25 73 22 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  %s", p->zErrMsg)
9ec0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
9ed0: 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  ee(p->zErrMsg);.
9ee0: 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
9ef0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
9f00: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
9f10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
9f20: 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  p->db, p->rc, 0)
9f30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9f40: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
9f50: 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  p->db, SQLITE_OK
9f60: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
9f70: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
9f80: 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
9f90: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
9fa0: 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
9fb0: 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
9fc0: 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
9fd0: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
9fe0: 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
9ff0: 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
a000: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
a010: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
a020: 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
a030: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
a040: 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
a050: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
a060: 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c  ite3Error(p->db,
a070: 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 7d 0a   p->rc, 0);.  }.
a080: 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
a090: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
a0a0: 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
a0b0: 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
a0c0: 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
a0d0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
a0e0: 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
a0f0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
a100: 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61 53 74   p->pTos<&p->aSt
a110: 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d  ack[p->pc<0?0:p-
a120: 3e 70 63 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f  >pc] || sqlite3_
a130: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3d 3d 31  malloc_failed==1
a140: 20 29 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   );.#ifdef VDBE_
a150: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
a160: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
a170: 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
a180: 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
a190: 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
a1a0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
a1b0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
a1c0: 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
a1d0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
a1e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
a1f0: 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
a200: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
a210: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a220: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
a230: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
a240: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
a250: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
a260: 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25  intf(out, "%6d %
a270: 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20  10lld %8lld ",. 
a280: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
a290: 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
a2a0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
a2b0: 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
a2c0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
a2d0: 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
a2e0: 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
a2f0: 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
a300: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a310: 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
a320: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
a330: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
a340: 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
a350: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
a360: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
a370: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e  AGIC_INIT;.  p->
a380: 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  aborted = 0;.  i
a390: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
a3a0: 5f 53 43 48 45 4d 41 20 29 7b 0a 20 20 20 20 73  _SCHEMA ){.    s
a3b0: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
a3c0: 6e 61 6c 53 63 68 65 6d 61 28 70 2d 3e 64 62 2c  nalSchema(p->db,
a3d0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
a3e0: 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 20 0a 2f 2a 0a  n p->rc;.}. ./*.
a3f0: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
a400: 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
a410: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
a420: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
a430: 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
a440: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
a450: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
a460: 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
a470: 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
a480: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
a490: 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
a4a0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
a4b0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
a4c0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
a4d0: 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
a4e0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
a4f0: 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
a500: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
a510: 74 28 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  t(p);.  }else if
a520: 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
a530: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20  _MAGIC_INIT ){. 
a540: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a550: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73  _MISUSE;.  }.  s
a560: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
a570: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
a580: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
a590: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
a5a0: 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20  or each auxdata 
a5b0: 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75  entry in pVdbeFu
a5c0: 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20  nc for which.** 
a5d0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
a5e0: 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73  g bit in mask is
a5f0: 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61   clear.  Auxdata
a600: 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20   entries beyond 
a610: 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73  31.** are always
a620: 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20   destroyed.  To 
a630: 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64  destroy all auxd
a640: 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c  ata entries, cal
a650: 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
a660: 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a  e with mask==0..
a670: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
a680: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
a690: 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65  (VdbeFunc *pVdbe
a6a0: 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b  Func, int mask){
a6b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
a6c0: 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63  i=0; i<pVdbeFunc
a6d0: 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAux; i++){.  
a6e0: 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61    struct AuxData
a6f0: 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46   *pAux = &pVdbeF
a700: 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20  unc->apAux[i];. 
a710: 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20     if( (i>31 || 
a720: 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20  !(mask&(1<<i))) 
a730: 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b  && pAux->pAux ){
a740: 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
a750: 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >xDelete ){.    
a760: 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
a770: 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  e(pAux->pAux);. 
a780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75       }.      pAu
a790: 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  x->pAux = 0;.   
a7a0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a7b0: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
a7c0: 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
a7d0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
a7e0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
a7f0: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
a800: 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e   return;.  Clean
a810: 75 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  up(p);.  if( p->
a820: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
a830: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
a840: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
a850: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
a860: 3e 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b  >db->pVdbe==p );
a870: 0a 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62  .    p->db->pVdb
a880: 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
a890: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
a8a0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
a8b0: 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
a8c0: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ev;.  }.  if( p-
a8d0: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72 28  >aOp ){.    for(
a8e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
a8f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a 70  ++){.      Op *p
a900: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
a910: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
a920: 70 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41 4d  p3type==P3_DYNAM
a930: 49 43 20 7c 7c 20 70 4f 70 2d 3e 70 33 74 79 70  IC || pOp->p3typ
a940: 65 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 29 7b  e==P3_KEYINFO ){
a950: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
a960: 72 65 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  ree(pOp->p3);.  
a970: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a980: 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f  pOp->p3type==P3_
a990: 56 44 42 45 46 55 4e 43 20 29 7b 0a 20 20 20 20  VDBEFUNC ){.    
a9a0: 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56      VdbeFunc *pV
a9b0: 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46  dbeFunc = (VdbeF
a9c0: 75 6e 63 20 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20  unc *)pOp->p3;. 
a9d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a9e0: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
a9f0: 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20  pVdbeFunc, 0);. 
aa00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
aa10: 65 28 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  e(pVdbeFunc);.  
aa20: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
aa30: 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f  pOp->p3type==P3_
aa40: 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MEM ){.        s
aa50: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
aa60: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
aa70: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20  pOp->p3);.      
aa80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
aa90: 74 65 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a  teFree(p->aOp);.
aaa0: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
aab0: 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
aac0: 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74  ->nVar);.  sqlit
aad0: 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29  eFree(p->aLabel)
aae0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
aaf0: 2d 3e 61 53 74 61 63 6b 29 3b 0a 20 20 72 65 6c  ->aStack);.  rel
ab00: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
ab10: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
ab20: 73 43 6f 6c 75 6d 6e 2a 32 29 3b 0a 20 20 73 71  sColumn*2);.  sq
ab30: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43 6f 6c  liteFree(p->aCol
ab40: 4e 61 6d 65 29 3b 0a 20 20 70 2d 3e 6d 61 67 69  Name);.  p->magi
ab50: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
ab60: 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  EAD;.  sqliteFre
ab70: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e(p);.}../*.** I
ab80: 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
ab90: 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
aba0: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
abb0: 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
abc0: 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
abd0: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
abe0: 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d  r code.  If no M
abf0: 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67  oveTo is pending
ac00: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
ac10: 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61  e does nothing a
ac20: 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
ac30: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
ac40: 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
ac50: 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b  veto(Cursor *p){
ac60: 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
ac70: 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
ac80: 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 20 20 20  int res, rc;.   
ac90: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
aca0: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
acb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
acc0: 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 69  >intKey );.    i
acd0: 66 28 20 70 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  f( p->intKey ){.
ace0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
acf0: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d  e3BtreeMoveto(p-
ad00: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  >pCursor, 0, p->
ad10: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 26 72  movetoTarget, &r
ad20: 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
ad30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ad40: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d  e3BtreeMoveto(p-
ad50: 3e 70 43 75 72 73 6f 72 2c 28 63 68 61 72 2a 29  >pCursor,(char*)
ad60: 26 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  &p->movetoTarget
ad70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 73 69 7a 65 6f 66 28 69 36 34 29 2c 26 72 65 73  sizeof(i64),&res
ada0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
adb0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
adc0: 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65  .    *p->pIncrKe
add0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61  y = 0;.    p->la
ade0: 73 74 52 65 63 6e 6f 20 3d 20 6b 65 79 54 6f 49  stRecno = keyToI
adf0: 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  nt(p->movetoTarg
ae00: 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 65 63 6e  et);.    p->recn
ae10: 6f 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d  oIsValid = res==
ae20: 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  0;.    if( res<0
ae30: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
ae40: 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
ae50: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  p->pCursor, &res
ae60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
ae70: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
ae80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
ae90: 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  earch_count++;. 
aea0: 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f     p->deferredMo
aeb0: 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  veto = 0;.    p-
aec0: 3e 63 61 63 68 65 56 61 6c 69 64 20 3d 20 30 3b  >cacheValid = 0;
aed0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
aee0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
aef0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
af00: 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
af10: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
af20: 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69  alType().** sqli
af30: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
af40: 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  eLen().** sqlite
af50: 33 56 64 62 65 53 65 72 69 61 6c 52 65 61 64 28  3VdbeSerialRead(
af60: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
af70: 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
af80: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
af90: 57 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  Write().**.** en
afa0: 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
afb0: 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
afc0: 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
afd0: 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
afe0: 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
aff0: 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
b000: 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
b010: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
b020: 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
b030: 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
b040: 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
b050: 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
b060: 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
b070: 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
b080: 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
b090: 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
b0a0: 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
b0b0: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
b0c0: 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
b0d0: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
b0e0: 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
b0f0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
b100: 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
b110: 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
b120: 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
b130: 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
b140: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
b150: 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
b160: 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
b170: 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
b180: 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
b190: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
b1a0: 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
b1b0: 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
b1c0: 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79   blob seperately
b1d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
b1e0: 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
b1f0: 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
b200: 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
b210: 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
b220: 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
b230: 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
b240: 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
b250: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
b260: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
b270: 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
b280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
b290: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
b2a0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
b2b0: 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
b2c0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
b2d0: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
b2e0: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
b2f0: 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
b320: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
b330: 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
b340: 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
b350: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
b360: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
b370: 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
b380: 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
b390: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
b3a0: 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
b3d0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
b3e0: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
b3f0: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
b400: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
b410: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
b440: 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
b450: 20 20 20 38 2d 31 31 20 20 20 20 20 20 20 20 20     8-11         
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
b480: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
b490: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
b4a0: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
b4b0: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
b4c0: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
b4d0: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
b4e0: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
b4f0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
b500: 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
b510: 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
b520: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
b530: 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
b540: 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
b550: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 66   *pMem){.  int f
b560: 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
b570: 67 73 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73  gs;..  if( flags
b580: 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
b590: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
b5a0: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
b5b0: 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
b5c0: 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
b5d0: 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
b5e0: 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
b5f0: 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
b600: 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
b610: 30 30 30 31 30 30 30 30 29 3c 3c 33 32 29 2d 31  00010000)<<32)-1
b620: 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
b630: 65 6d 2d 3e 69 3b 0a 20 20 20 20 75 36 34 20 75  em->i;.    u64 u
b640: 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b   = i<0 ? -i : i;
b650: 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
b660: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
b670: 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
b680: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
b690: 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
b6a0: 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
b6b0: 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
b6c0: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
b6d0: 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
b6e0: 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
b6f0: 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
b700: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
b710: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
b720: 37 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  7;.  }.  if( fla
b730: 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
b740: 20 20 69 6e 74 20 6e 20 3d 20 70 4d 65 6d 2d 3e    int n = pMem->
b750: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  n;.    assert( n
b760: 3e 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  >=0 );.    retur
b770: 6e 20 28 28 6e 2a 32 29 20 2b 20 31 33 29 3b 0a  n ((n*2) + 13);.
b780: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
b790: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
b7a0: 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a  return (pMem->n*
b7b0: 32 20 2b 20 31 32 29 3b 0a 20 20 7d 0a 20 20 72  2 + 12);.  }.  r
b7c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
b7d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
b7e0: 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
b7f0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b800: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
b810: 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e  rial-type..*/.in
b820: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t sqlite3VdbeSer
b830: 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
b840: 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
b850: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
b860: 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  12 ){.    return
b870: 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
b880: 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
b890: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
b8a0: 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c  8 aSize[] = { 0,
b8b0: 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20   1, 2, 3, 4, 6, 
b8c0: 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30  8, 8, 0, 0, 0, 0
b8d0: 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   };.    return a
b8e0: 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65  Size[serial_type
b8f0: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ];.  }.}../*.** 
b900: 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
b910: 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
b920: 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
b930: 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
b940: 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
b950: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
b960: 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
b970: 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
b980: 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
b990: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
b9a0: 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
b9b0: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
b9c0: 62 65 53 65 72 69 61 6c 50 75 74 28 75 6e 73 69  beSerialPut(unsi
b9d0: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
b9e0: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 75 33  Mem *pMem){.  u3
b9f0: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
ba00: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
ba10: 6c 54 79 70 65 28 70 4d 65 6d 29 3b 0a 20 20 69  lType(pMem);.  i
ba20: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 4e 55  nt len;..  /* NU
ba30: 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  LL */.  if( seri
ba40: 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
ba50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ba60: 20 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61   .  /* Integer a
ba70: 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
ba80: 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
ba90: 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
baa0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28    int i;.    if(
bab0: 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
bac0: 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 2a 28 75  ){.      v = *(u
bad0: 36 34 2a 29 26 70 4d 65 6d 2d 3e 72 3b 0a 20 20  64*)&pMem->r;.  
bae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
baf0: 20 3d 20 2a 28 75 36 34 2a 29 26 70 4d 65 6d 2d   = *(u64*)&pMem-
bb00: 3e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  >i;.    }.    le
bb10: 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56  n = i = sqlite3V
bb20: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
bb30: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
bb40: 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b     while( i-- ){
bb50: 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20  .      buf[i] = 
bb60: 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
bb70: 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20  v >>= 8;.    }. 
bb80: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
bb90: 20 7d 0a 20 20 0a 20 20 2f 2a 20 53 74 72 69 6e   }.  .  /* Strin
bba0: 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 61  g or blob */.  a
bbb0: 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
bbc0: 70 65 3e 3d 31 32 20 29 3b 0a 20 20 6c 65 6e 20  pe>=12 );.  len 
bbd0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
bbe0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
bbf0: 6c 5f 74 79 70 65 29 3b 0a 20 20 6d 65 6d 63 70  l_type);.  memcp
bc00: 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
bc10: 6c 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 6c  len);.  return l
bc20: 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  en;.}../*.** Des
bc30: 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
bc40: 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
bc50: 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
bc60: 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
bc70: 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
bc80: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
bc90: 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
bca0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
bcb0: 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73   read..*/ .int s
bcc0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
bcd0: 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
bce0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
bcf0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
bd00: 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
bd10: 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
bd20: 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
bd30: 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
bd40: 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
bd50: 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
bd60: 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
bd70: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
bd80: 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
bd90: 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
bda0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 69 66    int len;..  if
bdb0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
bdc0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 55 4c 4c 20   ){.    /* NULL 
bdd0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  */.    pMem->fla
bde0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
bdf0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
be00: 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  .  len = sqlite3
be10: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
be20: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
be30: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
be40: 65 3c 3d 37 20 29 7b 0a 20 20 20 20 2f 2a 20 49  e<=7 ){.    /* I
be50: 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
be60: 2a 2f 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  */.    if( seria
be70: 6c 5f 74 79 70 65 3c 3d 34 20 29 7b 0a 20 20 20  l_type<=4 ){.   
be80: 20 20 20 2f 2a 20 33 32 2d 62 69 74 20 69 6e 74     /* 32-bit int
be90: 65 67 65 72 20 74 79 70 65 2e 20 20 54 68 69 73  eger type.  This
bea0: 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20 61   is handled by a
beb0: 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 66 6f   special case fo
bec0: 72 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 66 6f  r.      ** perfo
bed0: 72 6d 61 6e 63 65 20 72 65 61 73 6f 6e 73 2e 20  rmance reasons. 
bee0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 76 20 3d  */.      int v =
bef0: 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 69   buf[0];.      i
bf00: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nt n;.      if( 
bf10: 76 26 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20  v&0x80 ){.      
bf20: 20 20 76 20 7c 3d 20 2d 32 35 36 3b 0a 20 20 20    v |= -256;.   
bf30: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e     }.      for(n
bf40: 3d 31 3b 20 6e 3c 6c 65 6e 3b 20 6e 2b 2b 29 7b  =1; n<len; n++){
bf50: 0a 20 20 20 20 20 20 20 20 76 20 3d 20 28 76 3c  .        v = (v<
bf60: 3c 38 29 20 7c 20 62 75 66 5b 6e 5d 3b 0a 20 20  <8) | buf[n];.  
bf70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
bf80: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
bf90: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69  t;.      pMem->i
bfa0: 20 3d 20 76 3b 0a 20 20 20 20 20 20 72 65 74 75   = v;.      retu
bfb0: 72 6e 20 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn n;.    }else{
bfc0: 0a 20 20 20 20 20 20 75 36 34 20 76 20 3d 20 30  .      u64 v = 0
bfd0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 0a  ;.      int n;..
bfe0: 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d        if( buf[0]
bff0: 26 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20  &0x80 ){.       
c000: 20 76 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d   v = -1;.      }
c010: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  .      for(n=0; 
c020: 6e 3c 6c 65 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20  n<len; n++){.   
c030: 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 38 29 20       v = (v<<8) 
c040: 7c 20 62 75 66 5b 6e 5d 3b 0a 20 20 20 20 20 20  | buf[n];.      
c050: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  }.      if( seri
c060: 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
c070: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c080: 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  s = MEM_Real;.  
c090: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 72 20 3d 20        pMem->r = 
c0a0: 2a 28 64 6f 75 62 6c 65 2a 29 26 76 3b 0a 20 20  *(double*)&v;.  
c0b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c0c0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c0d0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
c0e0: 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 2a 28 69 36    pMem->i = *(i6
c0f0: 34 2a 29 26 76 3b 0a 20 20 20 20 20 20 7d 0a 20  4*)&v;.      }. 
c100: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
c110: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
c120: 6c 6f 62 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  lob */.    asser
c130: 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  t( serial_type>=
c140: 31 32 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  12 );.    pMem->
c150: 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
c160: 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c  .    pMem->n = l
c170: 65 6e 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 78 44  en;.    pMem->xD
c180: 65 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  el = 0;.    if( 
c190: 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31  serial_type&0x01
c1a0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
c1b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
c1c0: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
c1d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4d   }else{.      pM
c1e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c1f0: 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d  Blob | MEM_Ephem
c200: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
c210: 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a  turn len;.}../*.
c220: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c230: 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
c240: 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
c250: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 20 73 70  index records sp
c260: 65 63 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b  ecified by .** {
c270: 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
c280: 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d  d {nKey2, pKey2}
c290: 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20 6e 65  , returning a ne
c2a0: 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
c2b0: 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
c2c0: 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70  ger if {nKey1, p
c2d0: 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68  Key1} is less th
c2e0: 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
c2f0: 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
c300: 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e   {nKey2, pKey2}.
c310: 20 20 42 6f 74 68 20 4b 65 79 31 20 61 6e 64 20    Both Key1 and 
c320: 4b 65 79 32 20 6d 75 73 74 20 62 65 20 62 79 74  Key2 must be byt
c330: 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d  e strings.** com
c340: 70 6f 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f  posed by the OP_
c350: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
c360: 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a  e of the VDBE..*
c370: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
c380: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
c390: 20 20 76 6f 69 64 20 2a 75 73 65 72 44 61 74 61    void *userData
c3a0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
c3b0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
c3c0: 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  , .  int nKey2, 
c3d0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
c3e0: 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  2.){.  KeyInfo *
c3f0: 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49  pKeyInfo = (KeyI
c400: 6e 66 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a 20  nfo*)userData;. 
c410: 20 75 33 32 20 64 31 2c 20 64 32 3b 20 20 20 20   u32 d1, d2;    
c420: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
c430: 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
c440: 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
c450: 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 2c 20   */.  u32 idx1, 
c460: 69 64 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66  idx2;      /* Of
c470: 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
c480: 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
c490: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
c4a0: 20 73 7a 48 64 72 31 2c 20 73 7a 48 64 72 32 3b   szHdr1, szHdr2;
c4b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
c4c0: 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
c4d0: 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
c4e0: 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69   int nField;.  i
c4f0: 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
c500: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
c510: 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
c520: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c530: 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20  )pKey1;.  const 
c540: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
c550: 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key2 = (const un
c560: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
c570: 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31  ey2;..  Mem mem1
c580: 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20  ;.  Mem mem2;.  
c590: 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
c5a0: 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32  nfo->enc;.  mem2
c5b0: 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
c5c0: 3e 65 6e 63 3b 0a 20 20 0a 20 20 69 64 78 31 20  >enc;.  .  idx1 
c5d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
c5e0: 6e 74 33 32 28 70 4b 65 79 31 2c 20 26 73 7a 48  nt32(pKey1, &szH
c5f0: 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48  dr1);.  d1 = szH
c600: 64 72 31 3b 0a 20 20 69 64 78 32 20 3d 20 73 71  dr1;.  idx2 = sq
c610: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
c620: 28 70 4b 65 79 32 2c 20 26 73 7a 48 64 72 32 29  (pKey2, &szHdr2)
c630: 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64 72 32 3b  ;.  d2 = szHdr2;
c640: 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
c650: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
c660: 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
c670: 72 31 20 26 26 20 69 64 78 32 3c 73 7a 48 64 72  r1 && idx2<szHdr
c680: 32 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  2 ){.    u32 ser
c690: 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20 20 75  ial_type1;.    u
c6a0: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 32 3b  32 serial_type2;
c6b0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
c6c0: 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
c6d0: 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
c6e0: 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
c6f0: 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
c700: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
c710: 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
c720: 20 26 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3b   &serial_type1);
c730: 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65  .    if( d1>=nKe
c740: 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y1 && sqlite3Vdb
c750: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
c760: 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29  erial_type1)>0 )
c770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 64 78 32   break;.    idx2
c780: 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61   += sqlite3GetVa
c790: 72 69 6e 74 33 32 28 26 61 4b 65 79 32 5b 69 64  rint32(&aKey2[id
c7a0: 78 32 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79 70  x2], &serial_typ
c7b0: 65 32 29 3b 0a 20 20 20 20 69 66 28 20 64 32 3e  e2);.    if( d2>
c7c0: 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c 69 74 65  =nKey2 && sqlite
c7d0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
c7e0: 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 32 29  en(serial_type2)
c7f0: 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  >0 ) break;..   
c800: 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
c810: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
c820: 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 65 61  space left in ea
c830: 63 68 20 6b 65 79 20 66 6f 72 20 74 68 65 20 62  ch key for the b
c840: 6c 6f 62 20 6f 66 0a 20 20 20 20 2a 2a 20 64 61  lob of.    ** da
c850: 74 61 20 74 6f 20 67 6f 20 77 69 74 68 20 74 68  ta to go with th
c860: 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6a 75  e serial type ju
c870: 73 74 20 72 65 61 64 2e 20 54 68 69 73 20 61 73  st read. This as
c880: 73 65 72 74 20 6d 61 79 20 66 61 69 6c 20 69 66  sert may fail if
c890: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
c8a0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 20   is corrupted.  
c8b0: 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 76 61  Then read the va
c8c0: 6c 75 65 20 66 72 6f 6d 20 65 61 63 68 20 6b 65  lue from each ke
c8d0: 79 20 69 6e 74 6f 20 6d 65 6d 31 0a 20 20 20 20  y into mem1.    
c8e0: 2a 2a 20 61 6e 64 20 6d 65 6d 32 20 72 65 73 70  ** and mem2 resp
c8f0: 65 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f  ectively..    */
c900: 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
c910: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
c920: 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
c930: 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
c940: 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71 6c 69  ;.    d2 += sqli
c950: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
c960: 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65 72  (&aKey2[d2], ser
c970: 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32  ial_type2, &mem2
c980: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  );..    rc = sql
c990: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
c9a0: 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e  mem1, &mem2, i<n
c9b0: 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f  Field ? pKeyInfo
c9c0: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b  ->aColl[i] : 0);
c9d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c9e0: 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
c9f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ca00: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
ca10: 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  m2);.    if( rc!
ca20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
ca30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  k;.    }.    i++
ca40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20  ;.  }..  /* One 
ca50: 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
ca60: 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20 62  out of fields, b
ca70: 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ut all the field
ca80: 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
ca90: 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71 75  nt.  ** were equ
caa0: 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72 4b  al. If the incrK
cab0: 65 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ey flag is true,
cac0: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
cad0: 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72 65   key is.  ** tre
cae0: 61 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e 0a  ated as larger..
caf0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30    */.  if( rc==0
cb00: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   ){.    if( pKey
cb10: 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29 7b  Info->incrKey ){
cb20: 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a  .      rc = -1;.
cb30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 31      }else if( d1
cb40: 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  <nKey1 ){.      
cb50: 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
cb60: 65 20 69 66 28 20 64 32 3c 6e 4b 65 79 32 20 29  e if( d2<nKey2 )
cb70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
cb80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
cb90: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
cba0: 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79  tOrder && i<pKey
cbb0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 26 26 20  Info->nField && 
cbc0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
cbd0: 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72  rder[i] ){.    r
cbe0: 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20  c = -rc;.  }..  
cbf0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cc00: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
cc10: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   is an index ent
cc20: 72 79 20 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e  ry composed usin
cc30: 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
cc40: 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54  ord opcode..** T
cc50: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
cc60: 20 74 68 69 73 20 72 65 63 6f 72 64 20 73 68 6f   this record sho
cc70: 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65  uld be an intege
cc80: 72 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 0a  r (specifically.
cc90: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f  ** an integer ro
cca0: 77 69 64 29 2e 20 20 54 68 69 73 20 72 6f 75 74  wid).  This rout
ccb0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
ccc0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
ccd0: 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65 67  in.** that integ
cce0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
ccf0: 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65  e3VdbeIdxRowidLe
cd00: 6e 28 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73  n(int nKey, cons
cd10: 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75  t u8 *aKey){.  u
cd20: 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
cd30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
cd40: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
cd50: 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
cd60: 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
cd70: 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20  the rowid */..  
cd80: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
cd90: 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29  32(aKey, &szHdr)
cda0: 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61  ;.  sqlite3GetVa
cdb0: 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48  rint32(&aKey[szH
cdc0: 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69  dr-1], &typeRowi
cdd0: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  d);.  return sql
cde0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
cdf0: 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
ce00: 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43  ;.}.  ../*.** pC
ce10: 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
ce20: 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
ce30: 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
ce40: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
ce50: 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
ce60: 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
ce70: 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
ce80: 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
ce90: 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
cea0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
ceb0: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
cec0: 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
ced0: 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
cee0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cef0: 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74 43  VdbeIdxRowid(BtC
cf00: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
cf10: 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
cf20: 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20  nCellKey;.  int 
cf30: 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
cf40: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cf50: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
cf60: 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
cf70: 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
cf80: 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
cf90: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
cfa0: 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
cfb0: 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
cfc0: 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73    Mem m, v;..  s
cfd0: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
cfe0: 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
cff0: 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
d000: 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  Key<=0 ){.    re
d010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d020: 55 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  UPT;.  }.  rc = 
d030: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
d040: 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
d050: 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d   nCellKey, 1, &m
d060: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
d070: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d080: 7d 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61  }.  sqlite3GetVa
d090: 72 69 6e 74 33 32 28 6d 2e 7a 2c 20 26 73 7a 48  rint32(m.z, &szH
d0a0: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65  dr);.  sqlite3Ge
d0b0: 74 56 61 72 69 6e 74 33 32 28 26 6d 2e 7a 5b 73  tVarint32(&m.z[s
d0c0: 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f  zHdr-1], &typeRo
d0d0: 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64  wid);.  lenRowid
d0e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
d0f0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65  rialTypeLen(type
d100: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
d110: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
d120: 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
d130: 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
d140: 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
d150: 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  i;.  sqlite3Vdbe
d160: 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
d170: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d180: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  OK;.}../*.** Com
d190: 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20  pare the key of 
d1a0: 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
d1b0: 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
d1c0: 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e  s point to again
d1d0: 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
d1e0: 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f 66  ring in pKey (of
d1f0: 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20   length nKey).  
d200: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
d210: 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
d220: 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
d230: 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
d240: 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
d250: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
d260: 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
d270: 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e 20  n pKey.  Return 
d280: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
d290: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79  cess..**.** pKey
d2a0: 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
d2b0: 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
d2c0: 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
d2d0: 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
d2e0: 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
d2f0: 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
d300: 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
d310: 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
d320: 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
d330: 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  red as well..*/.
d340: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
d350: 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
d360: 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
d370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d380: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d  he cursor to com
d390: 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
d3a0: 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
d3b0: 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  t u8 *pKey,   /*
d3c0: 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f 6d 70   The key to comp
d3d0: 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  are */.  int *re
d3e0: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
d3f0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d400: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
d410: 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
d420: 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
d430: 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
d440: 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e  sor *pCur = pC->
d450: 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c  pCursor;.  int l
d460: 65 6e 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d  enRowid;.  Mem m
d470: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
d480: 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
d490: 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
d4a0: 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
d4b0: 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
d4c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d4d0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OK;.  }.  rc = s
d4e0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
d4f0: 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
d500: 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  or, 0, nCellKey,
d510: 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
d520: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
d530: 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77  rc;.  }.  lenRow
d540: 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  id = sqlite3Vdbe
d550: 49 64 78 52 6f 77 69 64 4c 65 6e 28 6d 2e 6e 2c  IdxRowidLen(m.n,
d560: 20 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20   m.z);.  *res = 
d570: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
d580: 64 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65  dCompare(pC->pKe
d590: 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f  yInfo, m.n-lenRo
d5a0: 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20  wid, m.z, nKey, 
d5b0: 70 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  pKey);.  sqlite3
d5c0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
d5d0: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
d5e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d5f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
d600: 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
d610: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
d620: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
d630: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
d640: 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
d650: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
d660: 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
d670: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
d680: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
d690: 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
d6a0: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
d6b0: 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
d6c0: 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
d6d0: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
d6e0: 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
d6f0: 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
d700: 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
d710: 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
d720: 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
d730: 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
d740: 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
d750: 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
d760: 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
d770: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
d780: 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
d790: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
d7a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
d7b0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d7c0: 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
d7d0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
d7e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
d7f0: 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
d800: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
d810: 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
d820: 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
d830: 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
d840: 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
d850: 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
d860: 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
d870: 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
d880: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
d890: 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
d8a0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
d8b0: 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
d8c0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
d8d0: 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
d8e0: 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
d8f0: 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
d900: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
d910: 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
d920: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
d930: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
d940: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
d950: 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
d960: 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
d970: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
d980: 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
d990: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
d9a0: 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
d9b0: 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
d9c0: 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
d9d0: 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
d9e0: 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
d9f0: 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
da00: 3b 0a 7d 0a                                      ;.}.