/ Hex Artifact Content
Login

Artifact 670264f8b8ddbc4277adf85ab945a59a3aaef871:


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 64 65 66  tream..*/.#ifdef
03c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
03d0: 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61  t sqlite3_vdbe_a
03e0: 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b 0a  ddop_trace = 0;.
03f0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
0400: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
0410: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
0420: 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  ine..*/.Vdbe *sq
0430: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
0440: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
0450: 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73  Vdbe *p;.  p = s
0460: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
0470: 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20 69  eof(Vdbe) );.  i
0480: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
0490: 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62   0;.  p->db = db
04a0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
04b0: 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64  e ){.    db->pVd
04c0: 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  be->pPrev = p;. 
04d0: 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20   }.  p->pNext = 
04e0: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e  db->pVdbe;.  p->
04f0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d  pPrev = 0;.  db-
0500: 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d  >pVdbe = p;.  p-
0510: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
0520: 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
0530: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn p;.}../*.** T
0540: 75 72 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f  urn tracing on o
0550: 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71  r off.*/.void sq
0560: 6c 69 74 65 33 56 64 62 65 54 72 61 63 65 28 56  lite3VdbeTrace(V
0570: 64 62 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72  dbe *p, FILE *tr
0580: 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65  ace){.  p->trace
0590: 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a   = trace;.}../*.
05a0: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
05b0: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
05c0: 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
05d0: 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65   at least N.** e
05e0: 6c 65 6d 65 6e 74 73 2e 20 49 66 20 74 68 65 20  lements. If the 
05f0: 56 64 62 65 20 69 73 20 69 6e 20 56 44 42 45 5f  Vdbe is in VDBE_
0600: 4d 41 47 49 43 5f 52 55 4e 20 73 74 61 74 65 2c  MAGIC_RUN state,
0610: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 56 64 62   then.** the Vdb
0620: 65 2e 61 4f 70 20 61 72 72 61 79 20 77 69 6c 6c  e.aOp array will
0630: 20 62 65 20 73 69 7a 65 64 20 74 6f 20 63 6f 6e   be sized to con
0640: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 4e 20 0a  tain exactly N .
0650: 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  ** elements..*/.
0660: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 69  static void resi
0670: 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  zeOpArray(Vdbe *
0680: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28  p, int N){.  if(
0690: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
06a0: 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
06b0: 20 61 73 73 65 72 74 28 20 4e 3d 3d 70 2d 3e 6e   assert( N==p->n
06c0: 4f 70 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70  Op );.    p->nOp
06d0: 41 6c 6c 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70  Alloc = N;.    p
06e0: 2d 3e 61 4f 70 20 3d 20 73 71 6c 69 74 65 52 65  ->aOp = sqliteRe
06f0: 61 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 4e 2a  alloc(p->aOp, N*
0700: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 7d  sizeof(Op));.  }
0710: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 41  else if( p->nOpA
0720: 6c 6c 6f 63 3c 4e 20 29 7b 0a 20 20 20 20 69 6e  lloc<N ){.    in
0730: 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70 2d 3e 6e  t oldSize = p->n
0740: 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e  OpAlloc;.    p->
0750: 6e 4f 70 41 6c 6c 6f 63 20 3d 20 4e 2b 31 30 30  nOpAlloc = N+100
0760: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 73  ;.    p->aOp = s
0770: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 2d 3e  qliteRealloc(p->
0780: 61 4f 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  aOp, p->nOpAlloc
0790: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
07a0: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
07b0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 2d        memset(&p-
07c0: 3e 61 4f 70 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30  >aOp[oldSize], 0
07d0: 2c 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2d 6f  , (p->nOpAlloc-o
07e0: 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f  ldSize)*sizeof(O
07f0: 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  p));.    }.  }.}
0800: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
0810: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  w instruction to
0820: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73   the list of ins
0830: 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e  tructions curren
0840: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  t in the.** VDBE
0850: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  .  Return the ad
0860: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77  dress of the new
0870: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
0880: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a  .** Parameters:.
0890: 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20  **.**    p      
08a0: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
08b0: 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a   to the VDBE.**.
08c0: 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20 20  **    op        
08d0: 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65        The opcode
08e0: 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75   for this instru
08f0: 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ction.**.**    p
0900: 31 2c 20 70 32 20 20 20 20 20 20 20 20 20 20 46  1, p2          F
0910: 69 72 73 74 20 74 77 6f 20 6f 66 20 74 68 65 20  irst two of the 
0920: 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65 20 6f  three possible o
0930: 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 55  perands..**.** U
0940: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0950: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0960: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0970: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0980: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0990: 62 65 43 68 61 6e 67 65 50 33 28 29 20 66 75 6e  beChangeP3() fun
09a0: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
09b0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
09c0: 20 50 33 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P3.** operand..
09d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
09e0: 62 65 41 64 64 4f 70 28 56 64 62 65 20 2a 70 2c  beAddOp(Vdbe *p,
09f0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
0a00: 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e 74 20   int p2){.  int 
0a10: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  i;.  VdbeOp *pOp
0a20: 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b  ;..  i = p->nOp;
0a30: 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 61  .  p->nOp++;.  a
0a40: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
0a50: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
0a60: 20 29 3b 0a 20 20 72 65 73 69 7a 65 4f 70 41 72   );.  resizeOpAr
0a70: 72 61 79 28 70 2c 20 69 2b 31 29 3b 0a 20 20 69  ray(p, i+1);.  i
0a80: 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 7b 0a  f( p->aOp==0 ){.
0a90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
0aa0: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
0ab0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0ac0: 6f 64 65 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d  ode = op;.  pOp-
0ad0: 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d  >p1 = p1;.  pOp-
0ae0: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d  >p2 = p2;.  pOp-
0af0: 3e 70 33 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p3 = 0;.  pOp->
0b00: 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55  p3type = P3_NOTU
0b10: 53 45 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65  SED;.  p->expire
0b20: 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
0b30: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
0b40: 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64   sqlite3_vdbe_ad
0b50: 64 6f 70 5f 74 72 61 63 65 20 29 20 73 71 6c 69  dop_trace ) sqli
0b60: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
0b70: 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
0b80: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
0b90: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n i;.}../*.** Ad
0ba0: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
0bb0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 33   includes the p3
0bc0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73   value..*/.int s
0bd0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 56 64  qlite3VdbeOp3(Vd
0be0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0bf0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 63  nt p1, int p2, c
0c00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 69  onst char *zP3,i
0c10: 6e 74 20 70 33 74 79 70 65 29 7b 0a 20 20 69 6e  nt p3type){.  in
0c20: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
0c30: 56 64 62 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c  VdbeAddOp(p, op,
0c40: 20 70 31 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69   p1, p2);.  sqli
0c50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
0c60: 70 2c 20 61 64 64 72 2c 20 7a 50 33 2c 20 70 33  p, addr, zP3, p3
0c70: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
0c80: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
0c90: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
0ca0: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
0cb0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
0cc0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
0cd0: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
0ce0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
0cf0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
0d00: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
0d10: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
0d20: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
0d30: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
0d40: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
0d50: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
0d60: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
0d70: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
0d80: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
0d90: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
0da0: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
0db0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
0dc0: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
0dd0: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
0de0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
0df0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
0e00: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
0e10: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
0e20: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
0e30: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
0e40: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
0e50: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
0e60: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
0e70: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
0e80: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
0e90: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
0ea0: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
0eb0: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
0ec0: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
0ed0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
0ee0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
0ef0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
0f00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0f10: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
0f20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
0f30: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
0f40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
0f50: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
0f60: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69  _INIT );.  if( i
0f70: 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63  >=p->nLabelAlloc
0f80: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65   ){.    p->nLabe
0f90: 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62  lAlloc = p->nLab
0fa0: 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a  elAlloc*2 + 10;.
0fb0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
0fc0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
0fd0: 2d 3e 61 4c 61 62 65 6c 2c 20 70 2d 3e 6e 4c 61  ->aLabel, p->nLa
0fe0: 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  belAlloc*sizeof(
0ff0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1000: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1010: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1020: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1030: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
1050: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
1060: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
1070: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
1080: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
1090: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
10a0: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
10b0: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
10c0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
10d0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
10e0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
10f0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1100: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1110: 62 65 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  bel(Vdbe *p, int
1120: 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d   x){.  int j = -
1130: 31 2d 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1-x;.  assert( p
1140: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1150: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
1160: 73 65 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c  sert( j>=0 && j<
1170: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
1180: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
1190: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
11a0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d   = p->nOp;.  }.}
11b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ../*.** Return n
11c0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 70 63 6f 64  on-zero if opcod
11d0: 65 20 27 6f 70 27 20 69 73 20 67 75 61 72 65 6e  e 'op' is guaren
11e0: 74 65 65 64 20 6e 6f 74 20 74 6f 20 70 75 73 68  teed not to push
11f0: 20 6d 6f 72 65 20 76 61 6c 75 65 73 0a 2a 2a 20   more values.** 
1200: 6f 6e 74 6f 20 74 68 65 20 56 44 42 45 20 73 74  onto the VDBE st
1210: 61 63 6b 20 74 68 61 6e 20 69 74 20 70 6f 70 73  ack than it pops
1220: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
1230: 69 6e 74 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68  int opcodeNoPush
1240: 28 75 38 20 6f 70 29 7b 0a 20 20 2f 2a 20 54 68  (u8 op){.  /* Th
1250: 65 20 31 30 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  e 10 NOPUSH_MASK
1260: 5f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  _n constants are
1270: 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
1280: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20  automatically.  
1290: 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 68 65 61  ** generated hea
12a0: 64 65 72 20 66 69 6c 65 20 6f 70 63 6f 64 65 73  der file opcodes
12b0: 2e 68 2e 20 45 61 63 68 20 69 73 20 61 20 31 36  .h. Each is a 16
12c0: 2d 62 69 74 20 62 69 74 6d 61 73 6b 2c 20 6f 6e  -bit bitmask, on
12d0: 65 0a 20 20 2a 2a 20 62 69 74 20 63 6f 72 72 65  e.  ** bit corre
12e0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 61 63 68  sponding to each
12f0: 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e   opcode implemen
1300: 74 65 64 20 62 79 20 74 68 65 20 76 69 72 74 75  ted by the virtu
1310: 61 6c 0a 20 20 2a 2a 20 6d 61 63 68 69 6e 65 20  al.  ** machine 
1320: 69 6e 20 76 64 62 65 2e 63 2e 20 54 68 65 20 62  in vdbe.c. The b
1330: 69 74 20 69 73 20 74 72 75 65 20 69 66 20 74 68  it is true if th
1340: 65 20 77 6f 72 64 20 22 6e 6f 2d 70 75 73 68 22  e word "no-push"
1350: 20 61 70 70 65 61 72 73 0a 20 20 2a 2a 20 69 6e   appears.  ** in
1360: 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68   a comment on th
1370: 65 20 73 61 6d 65 20 6c 69 6e 65 20 61 73 20 74  e same line as t
1380: 68 65 20 22 63 61 73 65 20 4f 50 5f 58 58 58 3a  he "case OP_XXX:
1390: 22 20 69 6e 20 0a 20 20 2a 2a 20 73 71 6c 69 74  " in .  ** sqlit
13a0: 65 33 56 64 62 65 45 78 65 63 28 29 20 69 6e 20  e3VdbeExec() in 
13b0: 76 64 62 65 2e 63 2e 0a 20 20 2a 2a 0a 20 20 2a  vdbe.c..  **.  *
13c0: 2a 20 49 66 20 74 68 65 20 62 69 74 20 69 73 20  * If the bit is 
13d0: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63  true, then the c
13e0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70 63  orresponding opc
13f0: 6f 64 65 20 69 73 20 67 75 61 72 65 6e 74 65 65  ode is guarentee
1400: 64 20 6e 6f 74 0a 20 20 2a 2a 20 74 6f 20 67 72  d not.  ** to gr
1410: 6f 77 20 74 68 65 20 73 74 61 63 6b 20 77 68 65  ow the stack whe
1420: 6e 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64  n it is executed
1430: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
1440: 6d 61 79 20 67 72 6f 77 20 74 68 65 0a 20 20 2a  may grow the.  *
1450: 2a 20 73 74 61 63 6b 20 62 79 20 61 74 20 6d 6f  * stack by at mo
1460: 73 74 20 6f 6e 65 20 65 6e 74 72 79 2e 0a 20 20  st one entry..  
1470: 2a 2a 0a 20 20 2a 2a 20 4e 4f 50 55 53 48 5f 4d  **.  ** NOPUSH_M
1480: 41 53 4b 5f 30 20 63 6f 72 72 65 73 70 6f 6e 64  ASK_0 correspond
1490: 73 20 74 6f 20 6f 70 63 6f 64 65 73 20 30 20 74  s to opcodes 0 t
14a0: 6f 20 31 35 2e 20 4e 4f 50 55 53 48 5f 4d 41 53  o 15. NOPUSH_MAS
14b0: 4b 5f 31 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a  K_1 contains.  *
14c0: 2a 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 6f 70  * one bit for op
14d0: 63 6f 64 65 73 20 31 36 20 74 6f 20 33 31 2c 20  codes 16 to 31, 
14e0: 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20 2a 2a 0a  and so on..  **.
14f0: 20 20 2a 2a 20 31 36 2d 62 69 74 20 62 69 74 6d    ** 16-bit bitm
1500: 61 73 6b 73 20 28 72 61 74 68 65 72 20 74 68 61  asks (rather tha
1510: 6e 20 33 32 2d 62 69 74 29 20 61 72 65 20 73 70  n 32-bit) are sp
1520: 65 63 69 66 69 65 64 20 69 6e 20 6f 70 63 6f 64  ecified in opcod
1530: 65 73 2e 68 20 0a 20 20 2a 2a 20 62 65 63 61 75  es.h .  ** becau
1540: 73 65 20 74 68 65 20 66 69 6c 65 20 69 73 20 67  se the file is g
1550: 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 61  enerated by an a
1560: 77 6b 20 70 72 6f 67 72 61 6d 2e 20 41 77 6b 20  wk program. Awk 
1570: 6d 61 6e 69 70 75 6c 61 74 65 73 0a 20 20 2a 2a  manipulates.  **
1580: 20 61 6c 6c 20 6e 75 6d 62 65 72 73 20 61 73 20   all numbers as 
1590: 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61  floating-point a
15a0: 6e 64 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  nd we don't want
15b0: 20 74 6f 20 72 69 73 6b 20 61 20 72 6f 75 6e 64   to risk a round
15c0: 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 20 69  ing.  ** error i
15d0: 66 20 73 6f 6d 65 6f 6e 65 20 62 75 69 6c 64 73  f someone builds
15e0: 20 77 69 74 68 20 61 6e 20 61 77 6b 20 74 68 61   with an awk tha
15f0: 74 20 75 73 65 73 20 28 66 6f 72 20 65 78 61 6d  t uses (for exam
1600: 70 6c 65 29 20 33 32 2d 62 69 74 20 0a 20 20 2a  ple) 32-bit .  *
1610: 2a 20 49 45 45 45 20 66 6c 6f 61 74 73 2e 0a 20  * IEEE floats.. 
1620: 20 2a 2f 20 0a 20 20 73 74 61 74 69 63 20 63 6f   */ .  static co
1630: 6e 73 74 20 75 33 32 20 6d 61 73 6b 73 5b 35 5d  nst u32 masks[5]
1640: 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55 53 48 5f   = {.    NOPUSH_
1650: 4d 41 53 4b 5f 30 20 2b 20 28 4e 4f 50 55 53 48  MASK_0 + (NOPUSH
1660: 5f 4d 41 53 4b 5f 31 3c 3c 31 36 29 2c 0a 20 20  _MASK_1<<16),.  
1670: 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 32 20    NOPUSH_MASK_2 
1680: 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33  + (NOPUSH_MASK_3
1690: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
16a0: 48 5f 4d 41 53 4b 5f 34 20 2b 20 28 4e 4f 50 55  H_MASK_4 + (NOPU
16b0: 53 48 5f 4d 41 53 4b 5f 35 3c 3c 31 36 29 2c 0a  SH_MASK_5<<16),.
16c0: 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f      NOPUSH_MASK_
16d0: 36 20 2b 20 28 4e 4f 50 55 53 48 5f 4d 41 53 4b  6 + (NOPUSH_MASK
16e0: 5f 37 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50  _7<<16),.    NOP
16f0: 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20 28 4e 4f  USH_MASK_8 + (NO
1700: 50 55 53 48 5f 4d 41 53 4b 5f 39 3c 3c 31 36 29  PUSH_MASK_9<<16)
1710: 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 28  .  };.  return (
1720: 6d 61 73 6b 73 5b 6f 70 3e 3e 35 5d 20 26 20 28  masks[op>>5] & (
1730: 31 3c 3c 28 6f 70 26 30 78 31 46 29 29 29 3b 0a  1<<(op&0x1F)));.
1740: 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
1750: 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  G.int sqlite3Vdb
1760: 65 4f 70 63 6f 64 65 4e 6f 50 75 73 68 28 75 38  eOpcodeNoPush(u8
1770: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f   op){.  return o
1780: 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f 70 29 3b  pcodeNoPush(op);
1790: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17a0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
17b0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
17c0: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
17d0: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
17e0: 65 2e 0a 2a 2a 20 45 61 63 68 20 73 75 63 68 20  e..** Each such 
17f0: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
1800: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 20 6c  .  Resolve the l
1810: 61 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20  abel by setting 
1820: 74 68 65 20 50 32 0a 2a 2a 20 76 61 6c 75 65 20  the P2.** value 
1830: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e  to its correct n
1840: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  on-zero value..*
1850: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1860: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
1870: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
1880: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
1890: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72  erted..**.** Var
18a0: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41  iable *pMaxFuncA
18b0: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  rgs is set to th
18c0: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  e maximum value 
18d0: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65  of any P2 argume
18e0: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f  nt .** to an OP_
18f0: 46 75 6e 63 74 69 6f 6e 20 6f 72 20 4f 50 5f 41  Function or OP_A
1900: 67 67 53 74 65 70 20 6f 70 63 6f 64 65 2e 20 54  ggStep opcode. T
1910: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a  his is used by .
1920: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  ** sqlite3VdbeMa
1930: 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a  keReady() to siz
1940: 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  e the Vdbe.apArg
1950: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  [] array..**.** 
1960: 54 68 65 20 69 6e 74 65 67 65 72 20 2a 70 4d 61  The integer *pMa
1970: 78 53 74 61 63 6b 20 69 73 20 73 65 74 20 74 6f  xStack is set to
1980: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
1990: 62 65 72 20 6f 66 20 76 64 62 65 20 73 74 61 63  ber of vdbe stac
19a0: 6b 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61  k.** entries tha
19b0: 74 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  t static analysi
19c0: 73 20 72 65 76 65 61 6c 73 20 74 68 69 73 20 70  s reveals this p
19d0: 72 6f 67 72 61 6d 20 6d 69 67 68 74 20 6e 65 65  rogram might nee
19e0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
19f0: 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
1a00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  the following op
1a10: 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20  timization:  It 
1a20: 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20 48 61 6c  scans for.** Hal
1a30: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 77  t instructions w
1a40: 68 65 72 65 20 50 31 3d 3d 53 51 4c 49 54 45 5f  here P1==SQLITE_
1a50: 43 4f 4e 53 54 52 41 49 4e 54 20 6f 72 20 50 32  CONSTRAINT or P2
1a60: 3d 3d 4f 45 5f 41 62 6f 72 74 20 6f 72 20 66 6f  ==OE_Abort or fo
1a70: 72 0a 2a 2a 20 49 64 78 49 6e 73 65 72 74 20 69  r.** IdxInsert i
1a80: 6e 73 74 72 75 63 74 69 6f 6e 73 20 77 68 65 72  nstructions wher
1a90: 65 20 50 32 21 3d 30 2e 20 20 49 66 20 6e 6f 20  e P2!=0.  If no 
1aa0: 73 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  such instruction
1ab0: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
1ac0: 65 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d 65  en every Stateme
1ad0: 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
1ae0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e  s changed to a N
1af0: 6f 6f 70 2e 20 20 49 6e 0a 2a 2a 20 74 68 69 73  oop.  In.** this
1b00: 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 20 63   way, we avoid c
1b10: 72 65 61 74 69 6e 67 20 74 68 65 20 73 74 61 74  reating the stat
1b20: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  ement journal fi
1b30: 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79  le unnecessarily
1b40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b50: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
1b60: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
1b70: 4d 61 78 46 75 6e 63 41 72 67 73 2c 20 69 6e 74  MaxFuncArgs, int
1b80: 20 2a 70 4d 61 78 53 74 61 63 6b 29 7b 0a 20 20   *pMaxStack){.  
1b90: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
1ba0: 78 41 72 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74  xArgs = 0;.  int
1bb0: 20 6e 4d 61 78 53 74 61 63 6b 20 3d 20 70 2d 3e   nMaxStack = p->
1bc0: 6e 4f 70 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  nOp;.  Op *pOp;.
1bd0: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
1be0: 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74  p->aLabel;.  int
1bf0: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
1c00: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e  llback = 0;.  in
1c10: 74 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65  t hasStatementBe
1c20: 67 69 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  gin = 0;.  for(p
1c30: 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e  Op=p->aOp, i=p->
1c40: 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  nOp-1; i>=0; i--
1c50: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38  , pOp++){.    u8
1c60: 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f   opcode = pOp->o
1c70: 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28 20  pcode;..    if( 
1c80: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
1c90: 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ion || opcode==O
1ca0: 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20 20  P_AggStep ){.   
1cb0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
1cc0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
1cd0: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
1ce0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1cf0: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20  de==OP_Halt ){. 
1d00: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
1d10: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
1d20: 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  INT && pOp->p2==
1d30: 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
1d40: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
1d50: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
1d60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1d70: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
1d80: 49 64 78 49 6e 73 65 72 74 20 29 7b 0a 20 20 20  IdxInsert ){.   
1d90: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29     if( pOp->p2 )
1da0: 7b 0a 20 20 20 20 20 20 20 20 64 6f 65 73 53 74  {.        doesSt
1db0: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
1dc0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1dd0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
1de0: 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20  e==OP_Statement 
1df0: 29 7b 0a 20 20 20 20 20 20 68 61 73 53 74 61 74  ){.      hasStat
1e00: 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a  ementBegin = 1;.
1e10: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f      }..    if( o
1e20: 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f 70 63 6f  pcodeNoPush(opco
1e30: 64 65 29 20 29 7b 0a 20 20 20 20 20 20 6e 4d 61  de) ){.      nMa
1e40: 78 53 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d 0a  xStack--;.    }.
1e50: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  .    if( pOp->p2
1e60: 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  >=0 ) continue;.
1e70: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
1e80: 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c  Op->p2<p->nLabel
1e90: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20   );.    pOp->p2 
1ea0: 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d  = aLabel[-1-pOp-
1eb0: 3e 70 32 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  >p2];.  }.  sqli
1ec0: 74 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c  teFree(p->aLabel
1ed0: 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  );.  p->aLabel =
1ee0: 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63   0;..  *pMaxFunc
1ef0: 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b  Args = nMaxArgs;
1f00: 0a 20 20 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20  .  *pMaxStack = 
1f10: 6e 4d 61 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a  nMaxStack;..  /*
1f20: 20 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c   If we never rol
1f30: 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
1f40: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
1f50: 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  hen statement.  
1f60: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
1f70: 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20  are not needed. 
1f80: 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79   So change every
1f90: 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20   OP_Statement.  
1fa0: 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61  ** opcode into a
1fb0: 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73  n OP_Noop.  This
1fc0: 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f   avoid a call to
1fd0: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
1fe0: 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77  clusive().  ** w
1ff0: 68 69 63 68 20 63 61 6e 20 62 65 20 65 78 70 65  hich can be expe
2000: 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c  nsive on some pl
2010: 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20  atforms..  */.  
2020: 69 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74  if( hasStatement
2030: 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74  Begin && !doesSt
2040: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
2050: 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70  ){.    for(pOp=p
2060: 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d  ->aOp, i=p->nOp-
2070: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
2080: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
2090: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
20a0: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
20b0: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
20c0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
20d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
20e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
20f0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
2100: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2110: 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  n to be inserted
2120: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2130: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2140: 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  Vdbe *p){.  asse
2150: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
2160: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2170: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70  .  return p->nOp
2180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2190: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
21a0: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
21b0: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
21c0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
21d0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
21e0: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
21f0: 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  added..*/.int sq
2200: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
2210: 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  st(Vdbe *p, int 
2220: 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20  nOp, VdbeOpList 
2230: 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69  const *aOp){.  i
2240: 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72  nt addr;.  asser
2250: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2260: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2270: 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28    resizeOpArray(
2280: 70 2c 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 29  p, p->nOp + nOp)
2290: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
22a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
22b0: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
22c0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p->nOp;.  if( nO
22d0: 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  p>0 ){.    int i
22e0: 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74  ;.    VdbeOpList
22f0: 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f   const *pIn = aO
2300: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
2310: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b  i<nOp; i++, pIn+
2320: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32  +){.      int p2
2330: 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20   = pIn->p2;.    
2340: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d    VdbeOp *pOut =
2350: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
2360: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70  ;.      pOut->op
2370: 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f  code = pIn->opco
2380: 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  de;.      pOut->
2390: 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20  p1 = pIn->p1;.  
23a0: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70      pOut->p2 = p
23b0: 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44  2<0 ? addr + ADD
23c0: 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20  R(p2) : p2;.    
23d0: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
23e0: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
23f0: 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e  ->p3type = pIn->
2400: 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43 20 3a  p3 ? P3_STATIC :
2410: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66   P3_NOTUSED;.#if
2420: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2430: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2440: 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72  e3_vdbe_addop_tr
2450: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
2460: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
2470: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
2480: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
2490: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
24a0: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
24b0: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
24c0: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
24d0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
24e0: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
24f0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2500: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
2510: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
2520: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
2530: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
2540: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
2550: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
2560: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
2570: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
2580: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
2590: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
25a0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
25b0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
25c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
25d0: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
25e0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
25f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
2600: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2610: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
2620: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
2630: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
2640: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
2650: 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c  p[addr].p1 = val
2660: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
2670: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
2680: 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  of the P2 operan
2690: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
26a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
26b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
26c0: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74   useful for sett
26d0: 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69  ing a jump desti
26e0: 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nation..*/.void 
26f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2700: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP2(Vdbe *p, int
2710: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2720: 0a 20 20 61 73 73 65 72 74 28 20 76 61 6c 3e 3d  .  assert( val>=
2730: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2740: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2750: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2760: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
2770: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
2780: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
2790: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
27a0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
27b0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
27c0: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70  lue of the P3 op
27d0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
27e0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
27f0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
2800: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
2810: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
2820: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
2830: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
2840: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
2850: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
2860: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
2870: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
2880: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
2890: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
28a0: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
28b0: 33 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  3 operand is dyn
28c0: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
28d0: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
28e0: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
28f0: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
2900: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2910: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  iteMalloc()..** 
2920: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
2930: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
2940: 20 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61 6e   of zP3 up to an
2950: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
2960: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
2970: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
2980: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
2990: 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  of zP3..**.** If
29a0: 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 69   n==P3_KEYINFO i
29b0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 33  t means that zP3
29c0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
29d0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
29e0: 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20  ture..** A copy 
29f0: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b  is made of the K
2a00: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
2a10: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
2a20: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
2a30: 6c 69 74 65 4d 61 6c 6c 6f 63 2c 20 74 6f 20 62  liteMalloc, to b
2a40: 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65  e freed when the
2a50: 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a   Vdbe is finaliz
2a60: 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45 59  ed..** n==P3_KEY
2a70: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64  INFO_HANDOFF ind
2a80: 69 63 61 74 65 73 20 74 68 61 74 20 7a 50 33 20  icates that zP3 
2a90: 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49  points to a KeyI
2aa0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  nfo structure.**
2ab0: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
2ac0: 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  y that the calle
2ad0: 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66  r has obtained f
2ae0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
2af0: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
2b00: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
2b10: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
2b20: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
2b30: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
2b40: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
2b50: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
2b60: 6c 75 65 73 20 6f 66 20 6e 20 28 50 33 5f 53 54  lues of n (P3_ST
2b70: 41 54 49 43 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  ATIC, P3_COLLSEQ
2b80: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
2b90: 74 68 61 74 20 7a 50 33 20 70 6f 69 6e 74 73 0a  that zP3 points.
2ba0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
2bb0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
2bc0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2bd0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
2be0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
2bf0: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
2c00: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
2c10: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
2c20: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
2c30: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
2c40: 65 20 50 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P3 on the most
2c50: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
2c60: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
2c70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2c80: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
2c90: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
2ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 20  onst char *zP3, 
2cb0: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
2cc0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
2cd0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2ce0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2cf0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  p==0 || p->aOp==
2d00: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  0 ){.    if( n==
2d10: 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 6e 3d  P3_DYNAMIC || n=
2d20: 3d 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P3_KEYINFO_HAND
2d30: 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OFF ){.      sql
2d40: 69 74 65 46 72 65 65 28 28 76 6f 69 64 2a 29 7a  iteFree((void*)z
2d50: 50 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  P3);.    }.    i
2d60: 66 28 20 6e 3d 3d 50 33 5f 4d 45 4d 20 29 7b 0a  f( n==P3_MEM ){.
2d70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
2d80: 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f  ueFree((sqlite3_
2d90: 76 61 6c 75 65 20 2a 29 7a 50 33 29 3b 0a 20 20  value *)zP3);.  
2da0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
2db0: 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30    }.  if( addr<0
2dc0: 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70   || addr>=p->nOp
2dd0: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
2de0: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69  ->nOp - 1;.    i
2df0: 66 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75  f( addr<0 ) retu
2e00: 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20  rn;.  }.  pOp = 
2e10: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
2e20: 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 26 26 20   if( pOp->p3 && 
2e30: 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f  pOp->p3type==P3_
2e40: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 73  DYNAMIC ){.    s
2e50: 71 6c 69 74 65 46 72 65 65 28 70 4f 70 2d 3e 70  qliteFree(pOp->p
2e60: 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20  3);.    pOp->p3 
2e70: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 0;.  }.  if( z
2e80: 50 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70  P3==0 ){.    pOp
2e90: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 70 4f  ->p3 = 0;.    pO
2ea0: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e  p->p3type = P3_N
2eb0: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
2ec0: 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  if( n==P3_KEYINF
2ed0: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
2ee0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
2ef0: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
2f00: 65 3b 0a 0a 20 20 20 20 2f 2a 20 4b 65 79 49 6e  e;..    /* KeyIn
2f10: 66 6f 20 73 74 72 75 63 74 75 72 65 73 20 74 68  fo structures th
2f20: 61 74 20 69 6e 63 6c 75 64 65 20 61 6e 20 4b 65  at include an Ke
2f30: 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yInfo.aSortOrder
2f40: 20 61 72 65 20 61 6c 77 61 79 73 0a 20 20 20 20   are always.    
2f50: 2a 2a 20 73 65 6e 74 20 69 6e 20 75 73 69 6e 67  ** sent in using
2f60: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
2f70: 4f 46 46 2e 20 20 54 68 65 20 4b 65 79 49 6e 66  OFF.  The KeyInf
2f80: 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 61 72 72  o.aSortOrder arr
2f90: 61 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  ay.    ** is not
2fa0: 20 64 75 70 6c 69 63 61 74 65 64 20 77 68 65 6e   duplicated when
2fb0: 20 50 33 5f 4b 45 59 49 4e 46 4f 20 69 73 20 75   P3_KEYINFO is u
2fc0: 73 65 64 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 61  sed. */.    /* a
2fd0: 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
2fe0: 3e 61 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 29  >aSortOrder==0 )
2ff0: 3b 20 2a 2f 0a 20 20 20 20 6e 46 69 65 6c 64 20  ; */.    nField 
3000: 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 33  = ((KeyInfo*)zP3
3010: 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e  )->nField;.    n
3020: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
3030: 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65  KeyInfo) + (nFie
3040: 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65  ld-1)*sizeof(pKe
3050: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29  yInfo->aColl[0])
3060: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
3070: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
3080: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 70  ( nByte );.    p
3090: 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29  Op->p3 = (char*)
30a0: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66  pKeyInfo;.    if
30b0: 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
30c0: 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49      memcpy(pKeyI
30d0: 6e 66 6f 2c 20 7a 50 33 2c 20 6e 42 79 74 65 29  nfo, zP3, nByte)
30e0: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74  ;.      pOp->p3t
30f0: 79 70 65 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f  ype = P3_KEYINFO
3100: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3110: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
3120: 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P3_NOTUSED;.   
3130: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
3140: 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  ==P3_KEYINFO_HAN
3150: 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d  DOFF ){.    pOp-
3160: 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33  >p3 = (char*)zP3
3170: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
3180: 65 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a  e = P3_KEYINFO;.
3190: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
31a0: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  ){.    pOp->p3 =
31b0: 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20   (char*)zP3;.   
31c0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 6e   pOp->p3type = n
31d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
31e0: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74  f( n==0 ) n = st
31f0: 72 6c 65 6e 28 7a 50 33 29 3b 0a 20 20 20 20 70  rlen(zP3);.    p
3200: 4f 70 2d 3e 70 33 20 3d 20 73 71 6c 69 74 65 53  Op->p3 = sqliteS
3210: 74 72 4e 44 75 70 28 7a 50 33 2c 20 6e 29 3b 0a  trNDup(zP3, n);.
3220: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
3230: 3d 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P3_DYNAMIC;.  
3240: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
3250: 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  BUG./*.** Replac
3260: 65 20 74 68 65 20 50 33 20 66 69 65 6c 64 20 6f  e the P3 field o
3270: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
3280: 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  tly coded instru
3290: 63 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 63 6f  ction with.** co
32a0: 6d 6d 65 6e 74 20 74 65 78 74 2e 0a 2a 2f 0a 76  mment text..*/.v
32b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
32c0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
32d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
32e0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
32f0: 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72  list ap;.  asser
3300: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
3310: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
3320: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
3330: 6e 4f 70 2d 31 5d 2e 70 33 3d 3d 30 20 29 3b 0a  nOp-1].p3==0 );.
3340: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
3350: 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74  Format);.  sqlit
3360: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 70  e3VdbeChangeP3(p
3370: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 4d 50  , -1, sqlite3VMP
3380: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
3390: 70 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  p), P3_DYNAMIC);
33a0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d  .  va_end(ap);.}
33b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
33c0: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
33d0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
33e0: 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  ress..*/.VdbeOp 
33f0: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
3400: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
3410: 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ddr){.  assert( 
3420: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3430: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
3440: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
3450: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
3460: 0a 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f  .  return &p->aO
3470: 70 5b 61 64 64 72 5d 3b 0a 7d 0a 0a 23 69 66 20  p[addr];.}..#if 
3480: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3490: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c  OMIT_EXPLAIN) ||
34a0: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
34b0: 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69  ) \.     || defi
34c0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
34d0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
34e0: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
34f0: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
3500: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
3510: 20 74 68 65 20 50 33 20 70 61 72 61 6d 65 74 65   the P3 paramete
3520: 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e  r for an opcode.
3530: 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f  .** Use zTemp fo
3540: 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74  r any required t
3550: 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
3560: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
3570: 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 33   char *displayP3
3580: 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a  (Op *pOp, char *
3590: 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70  zTemp, int nTemp
35a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a  ){.  char *zP3;.
35b0: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
35c0: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
35d0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 29 7b 0a   pOp->p3type ){.
35e0: 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49      case P3_KEYI
35f0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
3600: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
3610: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
3620: 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e   (KeyInfo*)pOp->
3630: 70 33 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  p3;.      sprint
3640: 66 28 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66  f(zTemp, "keyinf
3650: 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  o(%d", pKeyInfo-
3660: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
3670: 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70  i = strlen(zTemp
3680: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
3690: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ; j<pKeyInfo->nF
36a0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
36b0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
36c0: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
36d0: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
36e0: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
36f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
3700: 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e  strlen(pColl->zN
3710: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
3720: 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20  if( i+n>nTemp-6 
3730: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
3740: 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  trcpy(&zTemp[i],
3750: 22 2c 2e 2e 2e 22 29 3b 0a 20 20 20 20 20 20 20  ",...");.       
3760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3780: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
3790: 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ,';.          if
37a0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
37b0: 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e  tOrder && pKeyIn
37c0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  fo->aSortOrder[j
37d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
37e0: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d   zTemp[i++] = '-
37f0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
3800: 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28           strcpy(
3810: 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c  &zTemp[i], pColl
3820: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
3830: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20      i += n;.    
3840: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b      }else if( i+
3850: 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  4<nTemp-6 ){.   
3860: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
3870: 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 29 3b  Temp[i],",nil");
3880: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
3890: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
38a0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70     }.      zTemp
38b0: 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [i++] = ')';.   
38c0: 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b     zTemp[i] = 0;
38d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
38e0: 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20  <nTemp );.      
38f0: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP3 = zTemp;.   
3900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3910: 20 20 20 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c      case P3_COLL
3920: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
3930: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
3940: 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d 3e 70 33 3b  ollSeq*)pOp->p3;
3950: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
3960: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
3970: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
3980: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 50 33  Name);.      zP3
3990: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
39a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
39b0: 20 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46   case P3_FUNCDEF
39c0: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
39d0: 66 20 2a 70 44 65 66 20 3d 20 28 46 75 6e 63 44  f *pDef = (FuncD
39e0: 65 66 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  ef*)pOp->p3;.   
39f0: 20 20 20 63 68 61 72 20 7a 4e 75 6d 5b 33 30 5d     char zNum[30]
3a00: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
3a10: 7a 54 65 6d 70 2c 20 22 25 2e 2a 73 22 2c 20 6e  zTemp, "%.*s", n
3a20: 54 65 6d 70 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  Temp, pDef->zNam
3a30: 65 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  e);.      sprint
3a40: 66 28 7a 4e 75 6d 2c 22 28 25 64 29 22 2c 20 70  f(zNum,"(%d)", p
3a50: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
3a60: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 54 65    if( strlen(zTe
3a70: 6d 70 29 2b 73 74 72 6c 65 6e 28 7a 4e 75 6d 29  mp)+strlen(zNum)
3a80: 2b 31 3c 3d 6e 54 65 6d 70 20 29 7b 0a 20 20 20  +1<=nTemp ){.   
3a90: 20 20 20 20 20 73 74 72 63 61 74 28 7a 54 65 6d       strcat(zTem
3aa0: 70 2c 20 7a 4e 75 6d 29 3b 0a 20 20 20 20 20 20  p, zNum);.      
3ab0: 7d 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54  }.      zP3 = zT
3ac0: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  emp;.      break
3ad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
3ae0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33  ult: {.      zP3
3af0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
3b00: 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20    if( zP3==0 || 
3b10: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
3b20: 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Noop ){.        
3b30: 7a 50 33 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  zP3 = "";.      
3b40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3b50: 74 75 72 6e 20 7a 50 33 3b 0a 7d 0a 23 65 6e 64  turn zP3;.}.#end
3b60: 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  if...#if defined
3b70: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
3b80: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
3b90: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
3ba0: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
3bb0: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
3bc0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
3bd0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
3be0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3bf0: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
3c00: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
3c10: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
3c20: 7a 50 33 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP3;.  char zPtr
3c30: 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  [50];.  static c
3c40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
3c50: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
3c60: 20 25 34 64 20 25 34 64 20 25 73 5c 6e 22 3b 0a   %4d %4d %s\n";.
3c70: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
3c80: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
3c90: 20 7a 50 33 20 3d 20 64 69 73 70 6c 61 79 50 33   zP3 = displayP3
3ca0: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
3cb0: 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72  of(zPtr));.  fpr
3cc0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
3cd0: 61 74 31 2c 0a 20 20 20 20 20 20 70 63 2c 20 73  at1,.      pc, s
3ce0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
3cf0: 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 2c 20  s[pOp->opcode], 
3d00: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
3d10: 2c 20 7a 50 33 29 3b 0a 20 20 66 66 6c 75 73 68  , zP3);.  fflush
3d20: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
3d30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
3d40: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
3d50: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
3d60: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
3d70: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
3d80: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
3d90: 70 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  p ){.    while( 
3da0: 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  N-->0 ){.      s
3db0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
3dc0: 65 61 73 65 28 70 2b 2b 29 3b 0a 20 20 20 20 7d  ease(p++);.    }
3dd0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
3de0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
3df0: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
3e00: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
3e10: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
3e20: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
3e30: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
3e40: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
3e50: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
3e60: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
3e70: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
3e80: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
3e90: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
3ea0: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
3eb0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
3ec0: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
3ed0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
3ee0: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f  nt "EXPLAIN"..*/
3ef0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3f00: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
3f30: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
3f40: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
3f50: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
3f60: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
3f70: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
3f80: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
3f90: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
3fa0: 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  N ) return SQLIT
3fb0: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65  E_MISUSE;.  asse
3fc0: 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53  rt( db->magic==S
3fd0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
3fe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3ff0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
4000: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
4010: 42 55 53 59 20 29 3b 0a 0a 20 20 2f 2a 20 45 76  BUSY );..  /* Ev
4020: 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f  en though this o
4030: 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70  pcode does not p
4040: 75 74 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e  ut dynamic strin
4050: 67 73 20 6f 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  gs onto the.  **
4060: 20 74 68 65 20 73 74 61 63 6b 2c 20 74 68 65 79   the stack, they
4070: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
4080: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
4090: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
40a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
40b0: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
40c0: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
40d0: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
40e0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 54 6f 73  */.  if( p->pTos
40f0: 3d 3d 26 70 2d 3e 61 53 74 61 63 6b 5b 34 5d 20  ==&p->aStack[4] 
4100: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
4110: 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b  mArray(p->aStack
4120: 2c 20 35 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72  , 5);.  }.  p->r
4130: 65 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b 0a 0a  esOnStack = 0;..
4140: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
4150: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
4160: 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e   i<p->nOp && p->
4170: 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d  explain==2 && p-
4180: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
4190: 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20  OP_Explain );.  
41a0: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b  if( i>=p->nOp ){
41b0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
41c0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
41d0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
41e0: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66 6c  }else if( db->fl
41f0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74  ags & SQLITE_Int
4200: 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 64 62  errupt ){.    db
4210: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4220: 54 45 5f 49 6e 74 65 72 72 75 70 74 3b 0a 20 20  TE_Interrupt;.  
4230: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
4240: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
4250: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
4260: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
4270: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
4280: 4d 73 67 2c 20 73 71 6c 69 74 65 33 45 72 72 53  Msg, sqlite3ErrS
4290: 74 72 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72  tr(p->rc), (char
42a0: 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)0);.  }else{. 
42b0: 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d     Op *pOp = &p-
42c0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d  >aOp[i];.    Mem
42d0: 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 53 74 61   *pMem = p->aSta
42e0: 63 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ck;.    pMem->fl
42f0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
4300: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
4310: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
4320: 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 69 3b      pMem->i = i;
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
4360: 65 72 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  er */.    pMem++
4370: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
4380: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
4390: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
43a0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  ;.    pMem->z = 
43b0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
43c0: 65 73 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b  es[pOp->opcode];
43d0: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
43e0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72     pMem->n = str
43f0: 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  len(pMem->z);.  
4400: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
4410: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
4420: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
4430: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 70 4d 65  TE_UTF8;.    pMe
4440: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
4450: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
4460: 0a 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 70  .    pMem->i = p
4470: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
44a0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
44b0: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
44c0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
44d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
44e0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d  t;.    pMem->i =
44f0: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
4520: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
4530: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
4540: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
4550: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
4560: 53 68 6f 72 74 7c 4d 45 4d 5f 53 74 72 7c 4d 45  Short|MEM_Str|ME
4570: 4d 5f 54 65 72 6d 3b 20 20 20 2f 2a 20 50 33 20  M_Term;   /* P3 
4580: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  */.    pMem->z =
4590: 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20   displayP3(pOp, 
45a0: 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20 73 69  pMem->zShort, si
45b0: 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72  zeof(pMem->zShor
45c0: 74 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  t));.    pMem->t
45d0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
45e0: 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  T;.    pMem->enc
45f0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
4600: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
4610: 6d 6e 20 3d 20 35 20 2d 20 32 2a 28 70 2d 3e 65  mn = 5 - 2*(p->e
4620: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
4630: 2d 3e 70 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20  ->pTos = pMem;. 
4640: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
4650: 45 5f 4f 4b 3b 0a 20 20 20 20 70 2d 3e 72 65 73  E_OK;.    p->res
4660: 4f 6e 53 74 61 63 6b 20 3d 20 31 3b 0a 20 20 20  OnStack = 1;.   
4670: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
4680: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4690: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
46a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
46b0: 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  IN */../*.** Pri
46c0: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
46d0: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
46e0: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
46f0: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
4700: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
4710: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 64 65  (Vdbe *p){.#ifde
4720: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
4730: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
4740: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
4750: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
4760: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
4770: 26 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a  &p->aOp[nOp-1];.
4780: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
4790: 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f  e==OP_Noop && pO
47a0: 70 2d 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20  p->p3!=0 ){.    
47b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
47c0: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 77 68 69  pOp->p3;.    whi
47d0: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38  le( isspace(*(u8
47e0: 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  *)z) ) z++;.    
47f0: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
4800: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 23 65  ]\n", z);.  }.#e
4810: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
4820: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
4830: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
4840: 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76  ution.  This inv
4850: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
4860: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
4870: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
4880: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
4890: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
48a0: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
48b0: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
48c0: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
48d0: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
48e0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
48f0: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
4900: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
4910: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
4920: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56   way to move a V
4930: 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  DBE from VDBE_MA
4940: 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56  GIC_INIT to.** V
4950: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a  DBE_MAGIC_RUN..*
4960: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4970: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
4980: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
49a0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69   The VDBE */.  i
49b0: 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20  nt nVar,        
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
49d0: 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73   Number of '?' s
49e0: 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ee in the SQL st
49f0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
4a00: 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20   nMem,          
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4a20: 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
4a30: 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  cells to allocat
4a40: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  e */.  int nCurs
4a50: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
4a60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4a70: 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  of cursors to al
4a80: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
4a90: 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20 20 20  isExplain       
4aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4ab0: 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41 49  ue if the EXPLAI
4ac0: 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72  N keywords is pr
4ad0: 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  esent */.){.  in
4ae0: 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t n;..  assert( 
4af0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
4b00: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
4b10: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
4b20: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
4b30: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
4b40: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
4b50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
4b60: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
4b70: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
4b80: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
4b90: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
4ba0: 74 65 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69  ter. This.   * i
4bb0: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
4bc0: 6c 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72  ll to resizeOpAr
4bd0: 72 61 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20  ray() below may 
4be0: 73 68 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20  shrink the.   * 
4bf0: 70 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74  p->aOp[] array t
4c00: 6f 20 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66  o save memory if
4c10: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20   called when in 
4c20: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a  VDBE_MAGIC_RUN .
4c30: 20 20 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a     * state..   *
4c40: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
4c50: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
4c60: 20 20 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74    /* No instruct
4c70: 69 6f 6e 20 65 76 65 72 20 70 75 73 68 65 73 20  ion ever pushes 
4c80: 6d 6f 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67  more than a sing
4c90: 6c 65 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20  le element onto 
4ca0: 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20  the.  ** stack. 
4cb0: 20 41 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e   And the stack n
4cc0: 65 76 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75  ever grows on su
4cd0: 63 63 65 73 73 69 76 65 20 65 78 65 63 75 74 69  ccessive executi
4ce0: 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ons of the.  ** 
4cf0: 73 61 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74  same loop.  So t
4d00: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
4d10: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
4d20: 69 73 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e  is an upper boun
4d30: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61  d.  ** on the ma
4d40: 78 69 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74  ximum stack dept
4d50: 68 20 72 65 71 75 69 72 65 64 2e 20 20 28 41 64  h required.  (Ad
4d60: 64 65 64 20 6c 61 74 65 72 3a 29 20 20 54 68 65  ded later:)  The
4d70: 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 50 32 56  .  ** resolveP2V
4d80: 61 6c 75 65 73 28 29 20 63 61 6c 6c 20 63 6f 6d  alues() call com
4d90: 70 75 74 65 73 20 61 20 74 69 67 68 74 65 72 20  putes a tighter 
4da0: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  upper bound on t
4db0: 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20 73 69  he.  ** stack si
4dc0: 7a 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c  ze..  **.  ** Al
4dd0: 6c 6f 63 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65  location all the
4de0: 20 73 74 61 63 6b 20 73 70 61 63 65 20 77 65 20   stack space we 
4df0: 77 69 6c 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a  will ever need..
4e00: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53    */.  if( p->aS
4e10: 74 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69  tack==0 ){.    i
4e20: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 2f  nt nArg;       /
4e30: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
4e40: 20 6f 66 20 61 72 67 73 20 70 61 73 73 65 64 20   of args passed 
4e50: 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74 69  to a user functi
4e60: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
4e70: 53 74 61 63 6b 3b 20 20 20 20 20 2f 2a 20 4d 61  Stack;     /* Ma
4e80: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
4e90: 73 74 61 63 6b 20 65 6e 74 72 69 65 73 20 72 65  stack entries re
4ea0: 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 72 65  quired */.    re
4eb0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
4ec0: 20 26 6e 41 72 67 2c 20 26 6e 53 74 61 63 6b 29   &nArg, &nStack)
4ed0: 3b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72  ;.    resizeOpAr
4ee0: 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ray(p, p->nOp);.
4ef0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72      assert( nVar
4f00: 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  >=0 );.    asser
4f10: 74 28 20 6e 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70  t( nStack<p->nOp
4f20: 20 29 3b 0a 20 20 20 20 6e 53 74 61 63 6b 20 3d   );.    nStack =
4f30: 20 69 73 45 78 70 6c 61 69 6e 20 3f 20 31 30 20   isExplain ? 10 
4f40: 3a 20 6e 53 74 61 63 6b 3b 0a 20 20 20 20 70 2d  : nStack;.    p-
4f50: 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65  >aStack = sqlite
4f60: 4d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  Malloc(.        
4f70: 6e 53 74 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d  nStack*sizeof(p-
4f80: 3e 61 53 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f  >aStack[0])    /
4f90: 2a 20 61 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20  * aStack */.    
4fa0: 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28    + nArg*sizeof(
4fb0: 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20  Mem*)           
4fc0: 20 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20     /* apArg */. 
4fd0: 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65       + nVar*size
4fe0: 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20  of(Mem)         
4ff0: 20 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f        /* aVar */
5000: 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69  .      + nVar*si
5010: 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20  zeof(char*)     
5020: 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72          /* azVar
5030: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d   */.      + nMem
5040: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20  *sizeof(Mem)    
5050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
5060: 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43  em */.      + nC
5070: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72  ursor*sizeof(Cur
5080: 73 6f 72 2a 29 20 20 20 20 20 20 20 20 2f 2a 20  sor*)        /* 
5090: 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a  apCsr */.    );.
50a0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
50b0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
50c0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20  {.      p->aMem 
50d0: 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74  = &p->aStack[nSt
50e0: 61 63 6b 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ack];.      p->n
50f0: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20  Mem = nMem;.    
5100: 20 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e    p->aVar = &p->
5110: 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20  aMem[nMem];.    
5120: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72    p->nVar = nVar
5130: 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72  ;.      p->okVar
5140: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
5150: 70 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70  pArg = (Mem**)&p
5160: 2d 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20  ->aVar[nVar];.  
5170: 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28      p->azVar = (
5180: 63 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67  char**)&p->apArg
5190: 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d  [nArg];.      p-
51a0: 3e 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f 72  >apCsr = (Cursor
51b0: 2a 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61  **)&p->azVar[nVa
51c0: 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75  r];.      p->nCu
51d0: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
51e0: 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e        for(n=0; n
51f0: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
5200: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
5210: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
5220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5230: 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e    }.  for(n=0; n
5240: 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a  <p->nMem; n++){.
5250: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66      p->aMem[n].f
5260: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
5270: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
5280: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
5290: 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  (p->db->flags & 
52a0: 53 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69  SQLITE_VdbeListi
52b0: 6e 67 29 21 3d 30 0a 20 20 20 20 7c 7c 20 73 71  ng)!=0.    || sq
52c0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
52d0: 73 28 22 76 64 62 65 5f 65 78 70 6c 61 69 6e 22  s("vdbe_explain"
52e0: 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ).  ){.    int i
52f0: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 56 44  ;.    printf("VD
5300: 42 45 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69  BE Program Listi
5310: 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ng:\n");.    sql
5320: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
5330: 28 70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  (p);.    for(i=0
5340: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
5350: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5360: 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75  dbePrintOp(stdou
5370: 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
5380: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
5390: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
53a0: 45 78 69 73 74 73 28 22 76 64 62 65 5f 74 72 61  Exists("vdbe_tra
53b0: 63 65 22 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74  ce") ){.    p->t
53c0: 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20  race = stdout;. 
53d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70   }.#endif.  p->p
53e0: 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b  Tos = &p->aStack
53f0: 5b 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20  [-1];.  p->pc = 
5400: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
5410: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e  LITE_OK;.  p->un
5420: 69 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70  iqueCnt = 0;.  p
5430: 2d 3e 72 65 74 75 72 6e 44 65 70 74 68 20 3d 20  ->returnDepth = 
5440: 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  0;.  p->errorAct
5450: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
5460: 20 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20    p->popStack = 
5470: 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e   0;.  p->explain
5480: 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20   |= isExplain;. 
5490: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
54a0: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
54b0: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 23 69  >nChange = 0;.#i
54c0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
54d0: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  E.  {.    int i;
54e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
54f0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
5500: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
5510: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
5520: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
5530: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
5540: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  dif.}../*.** Clo
5550: 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e 64 20  se a cursor and 
5560: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
5570: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
5580: 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a 2a  ursor happens.**
5590: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
55a0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
55b0: 65 43 75 72 73 6f 72 28 43 75 72 73 6f 72 20 2a  eCursor(Cursor *
55c0: 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
55d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
55e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
55f0: 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
5600: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
5610: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75  eCursor(pCx->pCu
5620: 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rsor);.  }.  if(
5630: 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pCx->pBt ){.   
5640: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
5650: 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20  se(pCx->pBt);.  
5660: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
5670: 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 73 71  Cx->pData);.  sq
5680: 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e 61 54  liteFree(pCx->aT
5690: 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ype);.  sqliteFr
56a0: 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee(pCx);.}../*.*
56b0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
56c0: 6f 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ors.*/.static vo
56d0: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
56e0: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
56f0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
5700: 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pCsr==0 ) return
5710: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5720: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
5730: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5740: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 61 70  FreeCursor(p->ap
5750: 43 73 72 5b 69 5d 29 3b 0a 20 20 20 20 70 2d 3e  Csr[i]);.    p->
5760: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
5770: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  }.}../*.** Clean
5780: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
5790: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a   execution..**.*
57a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
57b0: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
57c0: 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73  y close any curs
57d0: 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f  ors, lists, and/
57e0: 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68  or.** sorters th
57f0: 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65  at were left ope
5800: 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65  n.  It also dele
5810: 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  tes the values o
5820: 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69  f.** variables i
5830: 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72  n the aVar[] arr
5840: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
5850: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
5860: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
5870: 69 66 28 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b  if( p->aStack ){
5880: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
5890: 72 72 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20  rray(p->aStack, 
58a0: 31 20 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20 70  1 + (p->pTos - p
58b0: 2d 3e 61 53 74 61 63 6b 29 29 3b 0a 20 20 20 20  ->aStack));.    
58c0: 70 2d 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53  p->pTos = &p->aS
58d0: 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20 20  tack[-1];.  }.  
58e0: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
58f0: 70 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  p);.  releaseMem
5900: 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70  Array(p->aMem, p
5910: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ->nMem);.  sqlit
5920: 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28  e3VdbeFifoClear(
5930: 26 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20 69 66  &p->sFifo);.  if
5940: 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  ( p->contextStac
5950: 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  k ){.    for(i=0
5960: 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ; i<p->contextSt
5970: 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20  ackTop; i++){.  
5980: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
5990: 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63 6f 6e  ifoClear(&p->con
59a0: 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73 46 69  textStack[i].sFi
59b0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  fo);.    }.    s
59c0: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 63 6f 6e  qliteFree(p->con
59d0: 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a  textStack);.  }.
59e0: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
59f0: 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74  k = 0;.  p->cont
5a00: 65 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20  extStackDepth = 
5a10: 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53  0;.  p->contextS
5a20: 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73  tackTop = 0;.  s
5a30: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72  qliteFree(p->zEr
5a40: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
5a50: 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Msg = 0;.}../*.*
5a60: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
5a70: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
5a80: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
5a90: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
5aa0: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
5ab0: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
5ac0: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
5ad0: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
5ae0: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
5af0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
5b00: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
5b10: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
5b20: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
5b30: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
5b40: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
5b50: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
5b60: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
5b70: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
5b80: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
5b90: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
5ba0: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
5bb0: 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 30  t n;.  assert( 0
5bc0: 3d 3d 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  ==p->nResColumn 
5bd0: 29 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  );.  p->nResColu
5be0: 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b  mn = nResColumn;
5bf0: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
5c00: 6e 2a 32 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  n*2;.  p->aColNa
5c10: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
5c20: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  (Mem*)sqliteMall
5c30: 6f 63 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  oc( sizeof(Mem)*
5c40: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
5c50: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
5c60: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  rn;.  while( n--
5c70: 20 3e 20 30 20 29 7b 0a 20 20 20 20 28 70 43 6f   > 0 ){.    (pCo
5c80: 6c 4e 61 6d 65 2b 2b 29 2d 3e 66 6c 61 67 73 20  lName++)->flags 
5c90: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a  = MEM_Null;.  }.
5ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5cb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
5cc0: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
5cd0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
5ce0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
5cf0: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
5d00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
5d10: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
5d20: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
5d30: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
5d40: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
5d50: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
5d60: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
5d70: 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f 53 54 41 54  ** If N==P3_STAT
5d80: 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61  IC  it means tha
5d90: 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69  t zName is a poi
5da0: 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61  nter to a consta
5db0: 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72  nt static.** str
5dc0: 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a  ing and we can j
5dd0: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
5de0: 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73 20 50  nter. If it is P
5df0: 33 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  3_DYNAMIC, then 
5e00: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
5e10: 73 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  s freed using sq
5e20: 6c 69 74 65 46 72 65 65 28 29 20 77 68 65 6e 20  liteFree() when 
5e30: 74 68 65 20 76 64 62 65 20 69 73 20 66 69 6e 69  the vdbe is fini
5e40: 73 68 65 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e  shed with.** it.
5e50: 20 4f 74 68 65 72 77 69 73 65 2c 20 4e 20 62 79   Otherwise, N by
5e60: 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65  tes of zName are
5e70: 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20   copied..*/.int 
5e80: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
5e90: 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c 20 69  lName(Vdbe *p, i
5ea0: 6e 74 20 69 64 78 2c 20 63 6f 6e 73 74 20 63 68  nt idx, const ch
5eb0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e  ar *zName, int N
5ec0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
5ed0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
5ee0: 61 73 73 65 72 74 28 20 69 64 78 3c 28 32 2a 70  assert( idx<(2*p
5ef0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 29 20 29 3b  ->nResColumn) );
5f00: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
5f10: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
5f20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5f30: 45 4d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  EM;.  assert( p-
5f40: 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a  >aColName!=0 );.
5f50: 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70    pColName = &(p
5f60: 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 5d 29  ->aColName[idx])
5f70: 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 59  ;.  if( N==P3_DY
5f80: 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53  NAMIC || N==P3_S
5f90: 54 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20  TATIC ){.    rc 
5fa0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
5fb0: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
5fc0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
5fd0: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
5fe0: 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
5ff0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
6000: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
6010: 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
6020: 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   N, SQLITE_UTF8,
6030: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
6040: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
6050: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d  =SQLITE_OK && N=
6060: 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  =P3_DYNAMIC ){. 
6070: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
6080: 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e  gs = (pColName->
6090: 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74  flags&(~MEM_Stat
60a0: 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20  ic))|MEM_Dyn;.  
60b0: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c    pColName->xDel
60c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
60d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
60e0: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
60f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
6100: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
6110: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
6120: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
6130: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
6140: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
6150: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
6160: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
6170: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
6180: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
6190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
61a0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
61b0: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
61c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
61d0: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
61e0: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
61f0: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
6200: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
6210: 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20  nTrans = 0;  /* 
6220: 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61  Number of databa
6230: 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69  ses with an acti
6240: 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ve write-transac
6250: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
6260: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6270: 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  int needXcommit 
6280: 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
6290: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
62a0: 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
62b0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
62c0: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
62d0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
62e0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
62f0: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
6300: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
6310: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
6320: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
6330: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
6340: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
6350: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
6360: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
6370: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
6380: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
6390: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
63a0: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  k ){.    int rc;
63b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65  .    sqlite3Safe
63c0: 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72  tyOff(db);.    r
63d0: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
63e0: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
63f0: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  mitArg);.    sql
6400: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
6410: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
6420: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6430: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
6440: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6450: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
6460: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
6470: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
6480: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
6490: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
64a0: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
64b0: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
64c0: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
64d0: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
64e0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
64f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
6500: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
6510: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
6520: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
6530: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
6540: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
6550: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
6560: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
6570: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  .  In that case 
6580: 77 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73  we do.  ** not s
6590: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
65a0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
65b0: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d  , so use the sim
65c0: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20  ple case then.  
65d0: 2a 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ** too..  */.  i
65e0: 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c  f( 0==strlen(sql
65f0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
6600: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
6610: 70 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c  pBt)) || nTrans<
6620: 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =1 ){.    for(i=
6630: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
6640: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
6650: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
6660: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
6670: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
6680: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
6690: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
66a0: 72 65 65 53 79 6e 63 28 70 42 74 2c 20 30 29 3b  reeSync(pBt, 0);
66b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
66c0: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
66d0: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
66e0: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
66f0: 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 20 2a  ssfully synced *
6700: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
6710: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6720: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
6730: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
6740: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
6750: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
6760: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 20          if( pBt 
6770: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6780: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
6790: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
67a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
67b0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
67c0: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
67d0: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
67e0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
67f0: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
6800: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
6810: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6820: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
6830: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
6840: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
6850: 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23  atomicly..  */.#
6860: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6870: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
6880: 7b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  {.    int needSy
6890: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
68a0: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
68b0: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
68c0: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
68d0: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
68e0: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
68f0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
6900: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
6910: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
6920: 20 4f 73 46 69 6c 65 20 6d 61 73 74 65 72 3b 0a   OsFile master;.
6930: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
6940: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6950: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
6960: 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
6970: 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71  random;.      sq
6980: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
6990: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
69a0: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
69b0: 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64  f(random), &rand
69c0: 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74  om);.      zMast
69d0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
69e0: 6e 74 66 28 22 25 73 2d 6d 6a 25 30 38 58 22 2c  ntf("%s-mj%08X",
69f0: 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64   zMainFile, rand
6a00: 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a  om&0x7fffffff);.
6a10: 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74        if( !zMast
6a20: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  er ){.        re
6a30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6a40: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
6a50: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 4f 73  while( sqlite3Os
6a60: 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74  FileExists(zMast
6a70: 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  er) );..    /* O
6a80: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
6a90: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 6d  ournal. */.    m
6aa0: 65 6d 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30  emset(&master, 0
6ab0: 2c 20 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29  , sizeof(master)
6ac0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
6ad0: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
6ae0: 76 65 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73  ve(zMaster, &mas
6af0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ter, 0);.    if(
6b00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6b10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
6b20: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
6b30: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6b40: 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
6b50: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
6b60: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
6b70: 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
6b80: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
6b90: 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
6ba0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6bb0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6bc0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
6bd0: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
6be0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
6bf0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
6c00: 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
6c10: 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
6c20: 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
6c30: 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
6c40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6c50: 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
6c60: 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
6c70: 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
6c80: 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
6c90: 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
6ca0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6cb0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
6cc0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
6cd0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
6ce0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  t;.      if( i==
6cf0: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  1 ) continue;   
6d00: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45  /* Ignore the TE
6d10: 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  MP database */. 
6d20: 20 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20       if( pBt && 
6d30: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
6d40: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
6d50: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
6d60: 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
6d70: 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
6d80: 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
6d90: 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d     if( zFile[0]=
6da0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =0 ) continue;  
6db0: 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72  /* Ignore :memor
6dc0: 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
6dd0: 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65          if( !nee
6de0: 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65  dSync && !sqlite
6df0: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
6e00: 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ed(pBt) ){.     
6e10: 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
6e20: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
6e30: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6e40: 33 4f 73 57 72 69 74 65 28 26 6d 61 73 74 65 72  3OsWrite(&master
6e50: 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28  , zFile, strlen(
6e60: 7a 46 69 6c 65 29 2b 31 29 3b 0a 20 20 20 20 20  zFile)+1);.     
6e70: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6e80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6e90: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
6ea0: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (&master);.     
6eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
6ec0: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  lete(zMaster);. 
6ed0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
6ee0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
6ef0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
6f00: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6f10: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20     }.    }...   
6f20: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
6f30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
6f40: 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74  . Before doing t
6f50: 68 69 73 2c 20 6f 70 65 6e 20 74 68 65 20 64 69  his, open the di
6f60: 72 65 63 74 6f 72 79 0a 20 20 20 20 2a 2a 20 74  rectory.    ** t
6f70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6f80: 6c 20 66 69 6c 65 20 69 73 20 73 74 6f 72 65 20  l file is store 
6f90: 69 6e 20 73 6f 20 74 68 61 74 20 69 74 20 67 65  in so that it ge
6fa0: 74 73 20 73 79 6e 63 65 64 20 74 6f 6f 2e 0a 20  ts synced too.. 
6fb0: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46     */.    zMainF
6fc0: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
6fd0: 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d  eeGetDirname(db-
6fe0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
6ff0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7000: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 4d  OpenDirectory(zM
7010: 61 69 6e 46 69 6c 65 2c 20 26 6d 61 73 74 65 72  ainFile, &master
7020: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
7030: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
7040: 20 20 20 20 20 20 28 6e 65 65 64 53 79 6e 63 20        (needSync 
7050: 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f 73  && (rc=sqlite3Os
7060: 53 79 6e 63 28 26 6d 61 73 74 65 72 2c 30 29 29  Sync(&master,0))
7070: 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  !=SQLITE_OK) ){.
7080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
7090: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
70a0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
70b0: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  lete(zMaster);. 
70c0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
70d0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
70e0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
70f0: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
7100: 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
7110: 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
7120: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
7130: 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
7140: 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
7150: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
7160: 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
7170: 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
7180: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
7190: 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
71a0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
71b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
71c0: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
71d0: 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
71e0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
71f0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
7200: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
7210: 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  ),.    ** then t
7220: 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
7230: 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72   that the master
7240: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
7250: 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 72 70  ll be.    ** orp
7260: 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61  haned. But we ca
7270: 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 20  nnot delete it, 
7280: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
7290: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  er journal.    *
72a0: 2a 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20  * file name was 
72b0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
72c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
72d0: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
72e0: 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 65 64 2e  .    ** occured.
72f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
7300: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
7310: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
7320: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
7330: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
7340: 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74  if( pBt && sqlit
7350: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
7360: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
7370: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
7380: 65 65 53 79 6e 63 28 70 42 74 2c 20 7a 4d 61 73  eeSync(pBt, zMas
7390: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ter);.        if
73a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
73b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
73c0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73  ite3OsClose(&mas
73d0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
73e0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
73f0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
7400: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
7410: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7420: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
7430: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 0a  lose(&master);..
7440: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
7450: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7460: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
7470: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
7480: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
7490: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
74a0: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
74b0: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
74c0: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
74d0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
74e0: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
74f0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
7500: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7510: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
7520: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
7530: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
7540: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
7550: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
7560: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  er = 0;.    rc =
7570: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 44 69   sqlite3OsSyncDi
7580: 72 65 63 74 6f 72 79 28 7a 4d 61 69 6e 46 69 6c  rectory(zMainFil
7590: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
75a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
75b0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 6f     /* This is no
75c0: 74 20 67 6f 6f 64 2e 20 54 68 65 20 6d 61 73 74  t good. The mast
75d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
75e0: 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
75f0: 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  , but.      ** t
7600: 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
7610: 63 20 66 61 69 6c 65 64 2e 20 54 68 65 72 65 20  c failed. There 
7620: 69 73 20 6e 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  is no completely
7630: 20 73 61 66 65 20 63 6f 75 72 73 65 20 6f 66 0a   safe course of.
7640: 20 20 20 20 20 20 2a 2a 20 61 63 74 69 6f 6e 20        ** action 
7650: 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 65 20 69  from here. The i
7660: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
7670: 6c 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  ls contain the n
7680: 61 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ame of the.     
7690: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
76a0: 61 6c 20 66 69 6c 65 2c 20 62 75 74 20 74 68 65  al file, but the
76b0: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 6f 66 20  re is no way of 
76c0: 6b 6e 6f 77 69 6e 67 20 69 66 20 74 68 61 74 0a  knowing if that.
76d0: 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20        ** master 
76e0: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 6e  journal exists n
76f0: 6f 77 20 6f 72 20 69 66 20 69 74 20 77 69 6c 6c  ow or if it will
7700: 20 65 78 69 73 74 20 61 66 74 65 72 20 74 68 65   exist after the
7710: 20 6f 70 65 72 61 74 69 6e 67 0a 20 20 20 20 20   operating.     
7720: 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68   ** system crash
7730: 20 74 68 61 74 20 6d 61 79 20 66 6f 6c 6c 6f 77   that may follow
7740: 20 74 68 65 20 66 73 79 6e 63 28 29 20 66 61 69   the fsync() fai
7750: 6c 75 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lure..      */. 
7760: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
7770: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
7780: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
7790: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
77a0: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
77b0: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
77c0: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
77d0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
77e0: 6f 6d 6d 69 74 28 29 20 61 72 65 20 6f 6e 6c 79  ommit() are only
77f0: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
7800: 6e 64 20 64 65 6c 65 74 69 6e 67 0a 20 20 20 20  nd deleting.    
7810: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ** journals. If 
7820: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
7830: 72 6f 6e 67 20 77 68 69 6c 65 20 74 68 69 73 20  rong while this 
7840: 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
7850: 64 6f 6e 27 74 0a 20 20 20 20 2a 2a 20 72 65 61  don't.    ** rea
7860: 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
7870: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 74  tegrity of the t
7880: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
7890: 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
78a0: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 73 6f 6d  ,.    ** but som
78b0: 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
78c0: 6f 75 72 6e 61 6c 73 20 6d 61 79 20 62 65 20 6c  ournals may be l
78d0: 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
78e0: 75 72 6e 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a  urning an.    **
78f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
7900: 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
7910: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
7920: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
7930: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
7940: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
7950: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
7960: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
7970: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
7980: 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
7990: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
79a0: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
79b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
79c0: 65 76 65 72 79 20 61 63 74 69 76 65 20 56 4d 20  every active VM 
79d0: 6f 74 68 65 72 20 74 68 61 6e 20 70 56 64 62 65  other than pVdbe
79e0: 20 61 6e 64 20 63 68 61 6e 67 65 20 69 74 73 20   and change its 
79f0: 73 74 61 74 75 73 20 74 6f 0a 2a 2a 20 61 62 6f  status to.** abo
7a00: 72 74 65 64 2e 20 20 54 68 69 73 20 68 61 70 70  rted.  This happ
7a10: 65 6e 73 20 77 68 65 6e 20 6f 6e 65 20 56 4d 20  ens when one VM 
7a20: 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
7a30: 6b 20 64 75 65 20 74 6f 20 61 6e 0a 2a 2a 20 4f  k due to an.** O
7a40: 4e 20 43 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c 42  N CONFLICT ROLLB
7a50: 41 43 4b 20 63 6c 61 75 73 65 20 28 66 6f 72 20  ACK clause (for 
7a60: 65 78 61 6d 70 6c 65 29 2e 20 20 54 68 65 20 6f  example).  The o
7a70: 74 68 65 72 20 56 4d 73 20 6d 75 73 74 20 62 65  ther VMs must be
7a80: 0a 2a 2a 20 61 62 6f 72 74 65 64 20 73 6f 20 74  .** aborted so t
7a90: 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  hat they do not 
7aa0: 68 61 76 65 20 64 61 74 61 20 72 6f 6c 6c 65 64  have data rolled
7ab0: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 6e   out from undern
7ac0: 65 61 74 68 0a 2a 2a 20 74 68 65 6d 20 6c 65 61  eath.** them lea
7ad0: 64 69 6e 67 20 74 6f 20 61 20 73 65 67 66 61 75  ding to a segfau
7ae0: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lt..*/.static vo
7af0: 69 64 20 61 62 6f 72 74 4f 74 68 65 72 41 63 74  id abortOtherAct
7b00: 69 76 65 56 64 62 65 73 28 56 64 62 65 20 2a 70  iveVdbes(Vdbe *p
7b10: 56 64 62 65 29 7b 0a 20 20 56 64 62 65 20 2a 70  Vdbe){.  Vdbe *p
7b20: 4f 74 68 65 72 3b 0a 20 20 66 6f 72 28 70 4f 74  Other;.  for(pOt
7b30: 68 65 72 3d 70 56 64 62 65 2d 3e 64 62 2d 3e 70  her=pVdbe->db->p
7b40: 56 64 62 65 3b 20 70 4f 74 68 65 72 3b 20 70 4f  Vdbe; pOther; pO
7b50: 74 68 65 72 3d 70 4f 74 68 65 72 2d 3e 70 4e 65  ther=pOther->pNe
7b60: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 74  xt){.    if( pOt
7b70: 68 65 72 3d 3d 70 56 64 62 65 20 29 20 63 6f 6e  her==pVdbe ) con
7b80: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
7b90: 4f 74 68 65 72 2d 3e 6d 61 67 69 63 21 3d 56 44  Other->magic!=VD
7ba0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
7bb0: 70 4f 74 68 65 72 2d 3e 70 63 3c 30 20 29 20 63  pOther->pc<0 ) c
7bc0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 63 6c 6f  ontinue;.    clo
7bd0: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 4f 74  seAllCursors(pOt
7be0: 68 65 72 29 3b 0a 20 20 20 20 70 4f 74 68 65 72  her);.    pOther
7bf0: 2d 3e 61 62 6f 72 74 65 64 20 3d 20 31 3b 0a 20  ->aborted = 1;. 
7c00: 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69   }.}../* .** Thi
7c10: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
7c20: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
7c30: 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  3.activeVdbeCnt 
7c40: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
7c50: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
7c60: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
7c70: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
7c80: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
7c90: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
7ca0: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
7cb0: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
7cc0: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
7cd0: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
7ce0: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
7cf0: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
7d00: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
7d10: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
7d20: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
7d30: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
7d40: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
7d50: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
7d60: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
7d70: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
7d80: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
7d90: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
7da0: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
7db0: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
7dc0: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
7dd0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
7de0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
7df0: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
7e00: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
7e10: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
7e20: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
7e30: 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63  ert( cnt==db->ac
7e40: 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  tiveVdbeCnt );.}
7e50: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
7e60: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
7e70: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
7e80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7e90: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
7ea0: 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
7eb0: 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
7ec0: 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
7ed0: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
7ee0: 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
7ef0: 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
7f00: 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
7f10: 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
7f20: 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
7f30: 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
7f40: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
7f50: 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
7f60: 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
7f70: 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
7f80: 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
7f90: 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
7fa0: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 0a 2a  TE_MAGIC_HALT..*
7fb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
7fc0: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
7fd0: 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
7fe0: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
7ff0: 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
8000: 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
8010: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
8020: 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
8030: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
8040: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
8050: 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
8060: 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
8070: 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
8080: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
8090: 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  lt(Vdbe *p){.  s
80a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
80b0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
80c0: 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65  nt (*xFunc)(Btre
80d0: 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a  e *pBt) = 0;  /*
80e0: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
80f0: 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20  l on each btree 
8100: 62 61 63 6b 65 6e 64 20 2a 2f 0a 0a 20 20 69 66  backend */..  if
8110: 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
8120: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20  _MAGIC_RUN ){.  
8130: 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 68 61 6c    /* Already hal
8140: 74 65 64 2e 20 20 4e 6f 74 68 69 6e 67 20 74 6f  ted.  Nothing to
8150: 20 64 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65   do. */.    asse
8160: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
8170: 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 3b  BE_MAGIC_HALT );
8180: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8190: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 6c 6f  TE_OK;.  }.  clo
81a0: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
81b0: 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
81c0: 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28  beCnt(db);.  if(
81d0: 20 70 2d 3e 70 63 3c 30 20 29 7b 0a 20 20 20 20   p->pc<0 ){.    
81e0: 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
81f0: 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
8200: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
8210: 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a  ever started */.
8220: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
8230: 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62  autoCommit && db
8240: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d  ->activeVdbeCnt=
8250: 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =1 ){.    if( p-
8260: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
8270: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
8280: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
8290: 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
82a0: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
82b0: 75 65 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  ue, there are no
82c0: 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 71 75   other active qu
82d0: 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 75  eries.      ** u
82e0: 73 69 6e 67 20 74 68 69 73 20 68 61 6e 64 6c 65  sing this handle
82f0: 20 61 6e 64 20 74 68 65 20 76 64 62 65 20 70 72   and the vdbe pr
8300: 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73  ogram was succes
8310: 73 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 0a 20  sful or hit an. 
8320: 20 20 20 20 20 2a 2a 20 27 4f 52 20 46 41 49 4c       ** 'OR FAIL
8330: 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68  ' constraint. Th
8340: 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
8350: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  t is required.. 
8360: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
8370: 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69  t rc = vdbeCommi
8380: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  t(db);.      if(
8390: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
83a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
83b0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
83c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
83d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
83e0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
83f0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 78 46 75   rc;.        xFu
8400: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
8410: 65 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20  eRollback;.     
8420: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8430: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
8440: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
8450: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
8460: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
8470: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
8480: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
8490: 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 78 46  Fail ){.      xF
84a0: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
84b0: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20  eeCommitStmt;.  
84c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
84d0: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
84e0: 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 78 46  bort ){.      xF
84f0: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
8500: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a  eeRollbackStmt;.
8510: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8520: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
8530: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 3b 0a 20  BtreeRollback;. 
8540: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
8550: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  mit = 1;.      a
8560: 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
8570: 64 62 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20  dbes(p);.    }. 
8580: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 78 46 75 6e   }..  /* If xFun
8590: 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  c is not NULL, t
85a0: 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66  hen it is one of
85b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
85c0: 6c 62 61 63 6b 2c 0a 20 20 2a 2a 20 73 71 6c 69  lback,.  ** sqli
85d0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
85e0: 53 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 42  Stmt or sqlite3B
85f0: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20  treeCommitStmt. 
8600: 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 0a  Call it once on.
8610: 20 20 2a 2a 20 65 61 63 68 20 62 61 63 6b 65 6e    ** each backen
8620: 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
8630: 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 72 65  ccurs and the re
8640: 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69  turn code is sti
8650: 6c 6c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  ll.  ** SQLITE_O
8660: 4b 2c 20 73 65 74 20 74 68 65 20 72 65 74 75 72  K, set the retur
8670: 6e 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65  n code to the ne
8680: 77 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20  w error value.. 
8690: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 78   */.  for(i=0; x
86a0: 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44  Func && i<db->nD
86b0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e  b; i++){ .    in
86c0: 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20  t rc;.    Btree 
86d0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
86e0: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
86f0: 42 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Bt ){.      rc =
8700: 20 78 46 75 6e 63 28 70 42 74 29 3b 0a 20 20 20   xFunc(pBt);.   
8710: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
8720: 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
8730: 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = rc;.    }.  }.
8740: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61  .  /* If this wa
8750: 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
8760: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 2c 20 73  ATE or DELETE, s
8770: 65 74 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  et the change co
8780: 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20  unter. */.  if( 
8790: 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26  p->changeCntOn &
87a0: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
87b0: 20 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c 20    if( !xFunc || 
87c0: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
87d0: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b  reeCommitStmt ){
87e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
87f0: 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
8800: 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
8810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8820: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
8830: 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
8840: 20 7d 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67   }.    p->nChang
8850: 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
8860: 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d   Rollback or com
8870: 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63  mit any schema c
8880: 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75  hanges that occu
8890: 72 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  rred. */.  if( p
88a0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
88b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f  ){.    sqlite3Ro
88c0: 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68  llbackInternalCh
88d0: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 7d 65 6c  anges(db);.  }el
88e0: 73 65 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  se if( db->flags
88f0: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
8900: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73  Changes ){.    s
8910: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
8920: 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b  rnalChanges(db);
8930: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
8940: 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
8950: 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
8960: 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
8970: 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
8980: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
8990: 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65  {.    db->active
89a0: 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20  VdbeCnt--;.  }. 
89b0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
89c0: 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
89d0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
89e0: 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e  t(db);..  return
89f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8a00: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
8a10: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
8a20: 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
8a30: 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
8a40: 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
8a50: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
8a60: 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
8a70: 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
8a80: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
8a90: 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
8aa0: 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
8ab0: 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
8ac0: 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
8ad0: 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
8ae0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
8af0: 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
8b00: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
8b10: 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
8b20: 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
8b30: 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
8b40: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
8b50: 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
8b60: 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
8b70: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
8b80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
8b90: 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
8ba0: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
8bb0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
8bc0: 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  & p->magic!=VDBE
8bd0: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
8be0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
8bf0: 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4d 49  p->db, SQLITE_MI
8c00: 53 55 53 45 2c 20 30 29 3b 0a 20 20 20 20 72 65  SUSE, 0);.    re
8c10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
8c20: 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  SE;.  }..  /* If
8c30: 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
8c40: 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
8c50: 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
8c60: 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
8c70: 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
8c80: 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
8c90: 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
8ca0: 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
8cb0: 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
8cc0: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
8cd0: 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
8ce0: 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e   VDBE has be run
8cf0: 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
8d00: 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
8d10: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
8d20: 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
8d30: 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
8d40: 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
8d50: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
8d60: 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
8d70: 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
8d80: 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
8d90: 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
8da0: 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
8db0: 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
8dc0: 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
8dd0: 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
8de0: 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
8df0: 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
8e00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
8e10: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  pc>=0 ){.    if(
8e20: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
8e30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8e40: 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20  r(p->db, p->rc, 
8e50: 22 25 73 22 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  "%s", p->zErrMsg
8e60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
8e70: 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  ree(p->zErrMsg);
8e80: 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  .      p->zErrMs
8e90: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
8ea0: 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
8eb0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8ec0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30  (p->db, p->rc, 0
8ed0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8ee0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8ef0: 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f  (p->db, SQLITE_O
8f00: 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  K, 0);.    }.  }
8f10: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
8f20: 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
8f30: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
8f40: 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
8f50: 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
8f60: 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
8f70: 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
8f80: 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
8f90: 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
8fa0: 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
8fb0: 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
8fc0: 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
8fd0: 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
8fe0: 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
8ff0: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
9000: 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62  lite3Error(p->db
9010: 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 7d  , p->rc, 0);.  }
9020: 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
9030: 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
9040: 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
9050: 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
9060: 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
9070: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
9080: 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
9090: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
90a0: 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61 53  ( p->pTos<&p->aS
90b0: 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a 70  tack[p->pc<0?0:p
90c0: 2d 3e 70 63 5d 20 7c 7c 20 73 71 6c 69 74 65 33  ->pc] || sqlite3
90d0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3d 3d  _malloc_failed==
90e0: 31 20 29 3b 0a 23 69 66 64 65 66 20 56 44 42 45  1 );.#ifdef VDBE
90f0: 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
9100: 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
9110: 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
9120: 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
9130: 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
9140: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
9150: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
9160: 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
9170: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
9180: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
9190: 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
91a0: 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
91b0: 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
91c0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
91d0: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  "\n");.      for
91e0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
91f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
9200: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20  rintf(out, "%6d 
9210: 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a  %10lld %8lld ",.
9220: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
9230: 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
9240: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
9250: 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
9260: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
9270: 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
9280: 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
9290: 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
92a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
92b0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74  3VdbePrintOp(out
92c0: 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
92d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
92e0: 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
92f0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
9300: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
9310: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d  MAGIC_INIT;.  p-
9320: 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20  >aborted = 0;.  
9330: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9340: 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20 20 20 20  E_SCHEMA ){.    
9350: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
9360: 72 6e 61 6c 53 63 68 65 6d 61 28 70 2d 3e 64 62  rnalSchema(p->db
9370: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
9380: 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 20 0a 2f 2a  rn p->rc;.}. ./*
9390: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
93a0: 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
93b0: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
93c0: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
93d0: 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
93e0: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
93f0: 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
9400: 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
9410: 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
9420: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
9430: 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
9440: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
9450: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
9460: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
9470: 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
9480: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
9490: 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
94a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
94b0: 65 74 28 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69  et(p);.  }else i
94c0: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
94d0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a  E_MAGIC_INIT ){.
94e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
94f0: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
9500: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
9510: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
9520: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  c;.}../*.** Call
9530: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
9540: 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61  for each auxdata
9550: 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46   entry in pVdbeF
9560: 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a  unc for which.**
9570: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
9580: 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69  ng bit in mask i
9590: 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74  s clear.  Auxdat
95a0: 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64  a entries beyond
95b0: 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79   31.** are alway
95c0: 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f  s destroyed.  To
95d0: 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78   destroy all aux
95e0: 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61  data entries, ca
95f0: 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
9600: 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e  ne with mask==0.
9610: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9620: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
9630: 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62  a(VdbeFunc *pVdb
9640: 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29  eFunc, int mask)
9650: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
9660: 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e  (i=0; i<pVdbeFun
9670: 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20  c->nAux; i++){. 
9680: 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74     struct AuxDat
9690: 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65  a *pAux = &pVdbe
96a0: 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a  Func->apAux[i];.
96b0: 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c      if( (i>31 ||
96c0: 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29   !(mask&(1<<i)))
96d0: 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
96e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
96f0: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
9700: 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
9710: 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
9720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
9730: 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
9740: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9750: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
9760: 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
9770: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
9780: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
9790: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
97a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61  ) return;.  Clea
97b0: 6e 75 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  nup(p);.  if( p-
97c0: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
97d0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
97e0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
97f0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
9800: 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ->db->pVdbe==p )
9810: 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64  ;.    p->db->pVd
9820: 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  be = p->pNext;. 
9830: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78   }.  if( p->pNex
9840: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
9850: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
9860: 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rev;.  }.  if( p
9870: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72  ->aOp ){.    for
9880: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
9890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a  i++){.      Op *
98a0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
98b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  ;.      if( pOp-
98c0: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41  >p3type==P3_DYNA
98d0: 4d 49 43 20 7c 7c 20 70 4f 70 2d 3e 70 33 74 79  MIC || pOp->p3ty
98e0: 70 65 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 29  pe==P3_KEYINFO )
98f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9900: 46 72 65 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 20  Free(pOp->p3);. 
9910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9920: 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33   pOp->p3type==P3
9930: 5f 56 44 42 45 46 55 4e 43 20 29 7b 0a 20 20 20  _VDBEFUNC ){.   
9940: 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70       VdbeFunc *p
9950: 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65  VdbeFunc = (Vdbe
9960: 46 75 6e 63 20 2a 29 70 4f 70 2d 3e 70 33 3b 0a  Func *)pOp->p3;.
9970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9980: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
9990: 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a  (pVdbeFunc, 0);.
99a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
99b0: 65 65 28 70 56 64 62 65 46 75 6e 63 29 3b 0a 20  ee(pVdbeFunc);. 
99c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
99d0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33   pOp->p3type==P3
99e0: 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  _MEM ){.        
99f0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
9a00: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
9a10: 29 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20  )pOp->p3);.     
9a20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
9a30: 69 74 65 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b  iteFree(p->aOp);
9a40: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65  .  }.  releaseMe
9a50: 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
9a60: 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69  p->nVar);.  sqli
9a70: 74 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c  teFree(p->aLabel
9a80: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
9a90: 70 2d 3e 61 53 74 61 63 6b 29 3b 0a 20 20 72 65  p->aStack);.  re
9aa0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
9ab0: 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
9ac0: 65 73 43 6f 6c 75 6d 6e 2a 32 29 3b 0a 20 20 73  esColumn*2);.  s
9ad0: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43 6f  qliteFree(p->aCo
9ae0: 6c 4e 61 6d 65 29 3b 0a 20 20 70 2d 3e 6d 61 67  lName);.  p->mag
9af0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
9b00: 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 46 72  DEAD;.  sqliteFr
9b10: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
9b20: 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
9b30: 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
9b40: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
9b50: 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
9b60: 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
9b70: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
9b80: 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20  or code.  If no 
9b90: 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e  MoveTo is pendin
9ba0: 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  g, this.** routi
9bb0: 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20  ne does nothing 
9bc0: 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  and returns SQLI
9bd0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
9be0: 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
9bf0: 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29  oveto(Cursor *p)
9c00: 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72  {.  if( p->defer
9c10: 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
9c20: 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 20 20   int res, rc;.  
9c30: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
9c40: 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
9c50: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
9c60: 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
9c70: 20 69 66 28 20 70 2d 3e 69 73 54 61 62 6c 65 20   if( p->isTable 
9c80: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
9c90: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
9ca0: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
9cb0: 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
9cc0: 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   &res);.    }els
9cd0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
9ce0: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
9cf0: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 28 63 68 61  (p->pCursor,(cha
9d00: 72 2a 29 26 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  r*)&p->movetoTar
9d10: 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 20 73 69 7a 65 6f 66 28 69 36 34 29 2c 26     sizeof(i64),&
9d40: 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  res);.    }.    
9d50: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
9d60: 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63  rc;.    *p->pInc
9d70: 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rKey = 0;.    p-
9d80: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79  >lastRowid = key
9d90: 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54  ToInt(p->movetoT
9da0: 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72  arget);.    p->r
9db0: 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65  owidIsValid = re
9dc0: 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72 65  s==0;.    if( re
9dd0: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  s<0 ){.      rc 
9de0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
9df0: 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26  xt(p->pCursor, &
9e00: 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  res);.      if( 
9e10: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9e20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9e30: 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
9e40: 3b 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65  ;.    p->deferre
9e50: 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
9e60: 20 70 2d 3e 63 61 63 68 65 56 61 6c 69 64 20 3d   p->cacheValid =
9e70: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
9e80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9e90: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
9ea0: 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
9eb0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
9ec0: 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
9ed0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
9ee0: 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
9ef0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 52 65  ite3VdbeSerialRe
9f00: 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ad().** sqlite3V
9f10: 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
9f20: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
9f30: 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a  ialWrite().**.**
9f40: 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65   encapsulate the
9f50: 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61   code that seria
9f60: 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72  lizes values for
9f70: 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69   storage in SQLi
9f80: 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69  te.** data and i
9f90: 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61  ndex records. Ea
9fa0: 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  ch serialized va
9fb0: 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  lue consists of 
9fc0: 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70  a.** 'serial-typ
9fd0: 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66  e' and a blob of
9fe0: 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61   data. The seria
9ff0: 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62  l type is an 8-b
a000: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20  yte unsigned.** 
a010: 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20  integer, stored 
a020: 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a  as a varint..**.
a030: 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20  ** In an SQLite 
a040: 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68  index record, th
a050: 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
a060: 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79   stored directly
a070: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62   before.** the b
a080: 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74  lob of data that
a090: 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20   it corresponds 
a0a0: 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72  to. In a table r
a0b0: 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61  ecord, all seria
a0c0: 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73  l.** types are s
a0d0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
a0e0: 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
a0f0: 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20  , and the blobs 
a100: 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68  of data at.** th
a110: 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65  e end. Hence the
a120: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c  se functions all
a130: 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  ow the caller to
a140: 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73   handle the.** s
a150: 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64  erial-type and d
a160: 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74  ata blob seperat
a170: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ely..**.** The f
a180: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
a190: 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72  escribes the var
a1a0: 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61  ious storage cla
a1b0: 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a  sses for data:.*
a1c0: 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79  *.**   serial ty
a1d0: 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20  pe        bytes 
a1e0: 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70  of data      typ
a1f0: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
a200: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
a210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
a220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
a230: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
a240: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
a250: 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20          NULL.** 
a260: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
a270: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
a280: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
a290: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32  nteger.**      2
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2b0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
a2c0: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
a2d0: 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
a300: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
a310: 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
a320: 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20           4      
a330: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
a340: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20  eger.**      5  
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
a370: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
a380: 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  *      6        
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
a3a0: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
a3b0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
a3c0: 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20   7              
a3d0: 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
a3e0: 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a      IEEE float.*
a3f0: 2a 20 20 20 20 20 38 2d 31 31 20 20 20 20 20 20  *     8-11      
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
a420: 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
a430: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
a440: 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
a450: 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
a460: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
a470: 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
a480: 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
a490: 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  .**.*/../*.** Re
a4a0: 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
a4b0: 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
a4c0: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
a4d0: 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
a4e0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
a4f0: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e  Mem *pMem){.  in
a500: 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
a510: 66 6c 61 67 73 3b 0a 0a 20 20 69 66 28 20 66 6c  flags;..  if( fl
a520: 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
a530: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a540: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
a550: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
a560: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
a570: 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
a580: 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
a590: 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
a5a0: 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
a5b0: 29 30 78 30 30 30 30 31 30 30 30 29 3c 3c 33 32  )0x00001000)<<32
a5c0: 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
a5d0: 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 75 36   pMem->i;.    u6
a5e0: 34 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a  4 u = i<0 ? -i :
a5f0: 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31   i;.    if( u<=1
a600: 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
a610: 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
a620: 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
a630: 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
a640: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
a650: 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
a660: 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
a670: 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
a680: 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
a690: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
a6a0: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
a6b0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
a6c0: 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 7;.  }.  if( 
a6d0: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
a6e0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4d 65  .    int n = pMe
a6f0: 6d 2d 3e 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  m->n;.    assert
a700: 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 72 65  ( n>=0 );.    re
a710: 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 33  turn ((n*2) + 13
a720: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  );.  }.  if( fla
a730: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
a740: 20 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d     return (pMem-
a750: 3e 6e 2a 32 20 2b 20 31 32 29 3b 0a 20 20 7d 0a  >n*2 + 12);.  }.
a760: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
a770: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
a780: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
a790: 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
a7a0: 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
a7b0: 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
a7c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
a7d0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
a7e0: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
a7f0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
a800: 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
a810: 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
a820: 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
a830: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
a840: 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b  t u8 aSize[] = {
a850: 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
a860: 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
a870: 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72  , 0 };.    retur
a880: 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74  n aSize[serial_t
a890: 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ype];.  }.}../*.
a8a0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
a8b0: 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
a8c0: 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
a8d0: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
a8e0: 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
a8f0: 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
a900: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
a910: 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
a920: 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
a930: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
a940: 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
a950: 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
a960: 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75  3VdbeSerialPut(u
a970: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
a980: 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  f, Mem *pMem){. 
a990: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
a9a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
a9b0: 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 29 3b 0a  rialType(pMem);.
a9c0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    int len;..  /*
a9d0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 73   NULL */.  if( s
a9e0: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b  erial_type==0 ){
a9f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
aa00: 20 7d 0a 20 0a 20 20 2f 2a 20 49 6e 74 65 67 65   }. .  /* Intege
aa10: 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
aa20: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
aa30: 3d 37 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b  =7 ){.    u64 v;
aa40: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
aa50: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
aa60: 3d 37 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =7 ){.      v = 
aa70: 2a 28 75 36 34 2a 29 26 70 4d 65 6d 2d 3e 72 3b  *(u64*)&pMem->r;
aa80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
aa90: 20 20 76 20 3d 20 2a 28 75 36 34 2a 29 26 70 4d    v = *(u64*)&pM
aaa0: 65 6d 2d 3e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  em->i;.    }.   
aab0: 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
aac0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
aad0: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
aae0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d  ;.    while( i--
aaf0: 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d   ){.      buf[i]
ab00: 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20   = (v&0xFF);.   
ab10: 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
ab20: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
ab30: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 53 74  ;.  }.  .  /* St
ab40: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
ab50: 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
ab60: 5f 74 79 70 65 3e 3d 31 32 20 29 3b 0a 20 20 6c  _type>=12 );.  l
ab70: 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  en = sqlite3Vdbe
ab80: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
ab90: 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 6d 65  rial_type);.  me
aba0: 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
abb0: 7a 2c 20 6c 65 6e 29 3b 0a 20 20 72 65 74 75 72  z, len);.  retur
abc0: 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n len;.}../*.** 
abd0: 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
abe0: 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
abf0: 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
ac00: 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
ac10: 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
ac20: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
ac30: 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
ac40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
ac50: 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e  tes read..*/ .in
ac60: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t sqlite3VdbeSer
ac70: 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
ac80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
ac90: 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
aca0: 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
acb0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
acc0: 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
acd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
ace0: 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
acf0: 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
ad00: 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
ad10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
ad20: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
ad30: 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
ad40: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  ){.  switch( ser
ad50: 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
ad60: 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 52 65  case 8:    /* Re
ad70: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
ad80: 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
ad90: 65 20 39 3a 20 20 20 20 2f 2a 20 52 65 73 65 72  e 9:    /* Reser
ada0: 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
adb0: 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
adc0: 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
add0: 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
ade0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
adf0: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
ae00: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
ae10: 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
ae20: 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  * NULL */.      
ae30: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
ae40: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
ae50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ae60: 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79  ase 1: { /* 1-by
ae70: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
ae80: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
ae90: 3e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  >i = (signed cha
aea0: 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
aeb0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
aec0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
aed0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
aee0: 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
aef0: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
af00: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
af10: 6d 2d 3e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  m->i = (((signed
af20: 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
af30: 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
af40: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
af50: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
af60: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
af70: 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
af80: 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
af90: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
afa0: 4d 65 6d 2d 3e 69 20 3d 20 28 28 28 73 69 67 6e  Mem->i = (((sign
afb0: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
afc0: 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <16) | (buf[1]<<
afd0: 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20  8) | buf[2];.   
afe0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
aff0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
b000: 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
b010: 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
b020: 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
b030: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
b040: 70 4d 65 6d 2d 3e 69 20 3d 20 28 62 75 66 5b 30  pMem->i = (buf[0
b050: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
b060: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
b070: 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
b080: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
b090: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
b0a0: 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
b0b0: 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
b0c0: 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
b0d0: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
b0e0: 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e   u64 x = (((sign
b0f0: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
b100: 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
b110: 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66      u32 y = (buf
b120: 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [2]<<24) | (buf[
b130: 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34  3]<<16) | (buf[4
b140: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a  ]<<8) | buf[5];.
b150: 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
b160: 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65  ) | y;.      pMe
b170: 6d 2d 3e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  m->i = *(i64*)&x
b180: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
b190: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
b1a0: 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
b1b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
b1c0: 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
b1d0: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
b1e0: 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
b1f0: 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
b200: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  int */.      u64
b210: 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b   x;.      u32 y;
b220: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
b230: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
b240: 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
b250: 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
b260: 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
b270: 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  same.      ** by
b280: 74 65 20 6f 72 64 65 72 2e 20 20 54 68 65 20 62  te order.  The b
b290: 79 74 65 20 6f 72 64 65 72 20 64 69 66 66 65 72  yte order differ
b2a0: 73 20 6f 6e 20 73 6f 6d 65 20 28 62 72 6f 6b 65  s on some (broke
b2b0: 6e 29 20 61 72 63 68 69 74 65 63 74 75 72 65 73  n) architectures
b2c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b2d0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
b2e0: 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
b2f0: 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
b300: 20 20 20 20 61 73 73 65 72 74 28 20 31 2e 30 3d      assert( 1.0=
b310: 3d 2a 28 64 6f 75 62 6c 65 2a 29 26 74 31 20 29  =*(double*)&t1 )
b320: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
b330: 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  x = (buf[0]<<24)
b340: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
b350: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
b360: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20  buf[3];.      y 
b370: 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c  = (buf[4]<<24) |
b380: 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20   (buf[5]<<16) | 
b390: 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75  (buf[6]<<8) | bu
b3a0: 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[7];.      x = 
b3b0: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
b3c0: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
b3d0: 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
b3e0: 20 70 4d 65 6d 2d 3e 69 20 3d 20 2a 28 69 36 34   pMem->i = *(i64
b3f0: 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d  *)&x;.        pM
b400: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
b410: 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Int;.      }else
b420: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
b430: 72 20 3d 20 2a 28 64 6f 75 62 6c 65 2a 29 26 78  r = *(double*)&x
b440: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
b450: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c  flags = MEM_Real
b460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b470: 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a  return 8;.    }.
b480: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
b490: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28       int len = (
b4a0: 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
b4b0: 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  2;.      pMem->z
b4c0: 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
b4d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
b4e0: 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  len;.      pMem-
b4f0: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
b500: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
b510: 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  &0x01 ){.       
b520: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
b530: 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68  EM_Str | MEM_Eph
b540: 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  em;.      }else{
b550: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
b560: 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20  lags = MEM_Blob 
b570: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
b580: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
b590: 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  n len;.    }.  }
b5a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b5b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b5c0: 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
b5d0: 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
b5e0: 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
b5f0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 0a 2a   specified by .*
b600: 2a 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  * {nKey1, pKey1}
b610: 20 61 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65   and {nKey2, pKe
b620: 79 32 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20 61  y2}, returning a
b630: 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
b640: 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
b650: 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31  nteger if {nKey1
b660: 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73  , pKey1} is less
b670: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
b680: 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
b690: 68 61 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79  han {nKey2, pKey
b6a0: 32 7d 2e 20 20 42 6f 74 68 20 4b 65 79 31 20 61  2}.  Both Key1 a
b6b0: 6e 64 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20  nd Key2 must be 
b6c0: 62 79 74 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20  byte strings.** 
b6d0: 63 6f 6d 70 6f 73 65 64 20 62 79 20 74 68 65 20  composed by the 
b6e0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
b6f0: 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
b700: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b710: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
b720: 65 28 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44  e(.  void *userD
b730: 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ata,.  int nKey1
b740: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
b750: 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79  ey1, .  int nKey
b760: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
b770: 4b 65 79 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66  Key2.){.  KeyInf
b780: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b  o *pKeyInfo = (K
b790: 65 79 49 6e 66 6f 2a 29 75 73 65 72 44 61 74 61  eyInfo*)userData
b7a0: 3b 0a 20 20 75 33 32 20 64 31 2c 20 64 32 3b 20  ;.  u32 d1, d2; 
b7b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
b7c0: 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
b7d0: 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
b7e0: 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
b7f0: 31 2c 20 69 64 78 32 3b 20 20 20 20 20 20 2f 2a  1, idx2;      /*
b800: 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
b810: 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
b820: 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
b830: 75 33 32 20 73 7a 48 64 72 31 2c 20 73 7a 48 64  u32 szHdr1, szHd
b840: 72 32 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  r2;  /* Number o
b850: 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
b860: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
b870: 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
b880: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
b890: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
b8a0: 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
b8b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
b8c0: 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e  r *)pKey1;.  con
b8d0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
b8e0: 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74   *aKey2 = (const
b8f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b900: 29 70 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d  )pKey2;..  Mem m
b910: 65 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b  em1;.  Mem mem2;
b920: 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
b930: 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
b940: 65 6d 32 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em2.enc = pKeyIn
b950: 66 6f 2d 3e 65 6e 63 3b 0a 20 20 0a 20 20 69 64  fo->enc;.  .  id
b960: 78 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  x1 = sqlite3GetV
b970: 61 72 69 6e 74 33 32 28 70 4b 65 79 31 2c 20 26  arint32(pKey1, &
b980: 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20  szHdr1);.  d1 = 
b990: 73 7a 48 64 72 31 3b 0a 20 20 69 64 78 32 20 3d  szHdr1;.  idx2 =
b9a0: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
b9b0: 74 33 32 28 70 4b 65 79 32 2c 20 26 73 7a 48 64  t32(pKey2, &szHd
b9c0: 72 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64  r2);.  d2 = szHd
b9d0: 72 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70  r2;.  nField = p
b9e0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
b9f0: 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73  .  while( idx1<s
ba00: 7a 48 64 72 31 20 26 26 20 69 64 78 32 3c 73 7a  zHdr1 && idx2<sz
ba10: 48 64 72 32 20 29 7b 0a 20 20 20 20 75 33 32 20  Hdr2 ){.    u32 
ba20: 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20  serial_type1;.  
ba30: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
ba40: 65 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e2;..    /* Read
ba50: 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
ba60: 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
ba70: 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
ba80: 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
ba90: 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
baa0: 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
bab0: 31 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79 70 65  1], &serial_type
bac0: 31 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d  1);.    if( d1>=
bad0: 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65 33  nKey1 && sqlite3
bae0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
baf0: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
bb00: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
bb10: 64 78 32 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  dx2 += sqlite3Ge
bb20: 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 32  tVarint32(&aKey2
bb30: 5b 69 64 78 32 5d 2c 20 26 73 65 72 69 61 6c 5f  [idx2], &serial_
bb40: 74 79 70 65 32 29 3b 0a 20 20 20 20 69 66 28 20  type2);.    if( 
bb50: 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c  d2>=nKey2 && sql
bb60: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
bb70: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
bb80: 65 32 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e2)>0 ) break;..
bb90: 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68      /* Assert th
bba0: 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
bbb0: 67 68 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  gh space left in
bbc0: 20 65 61 63 68 20 6b 65 79 20 66 6f 72 20 74 68   each key for th
bbd0: 65 20 62 6c 6f 62 20 6f 66 0a 20 20 20 20 2a 2a  e blob of.    **
bbe0: 20 64 61 74 61 20 74 6f 20 67 6f 20 77 69 74 68   data to go with
bbf0: 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
bc00: 20 6a 75 73 74 20 72 65 61 64 2e 20 54 68 69 73   just read. This
bc10: 20 61 73 73 65 72 74 20 6d 61 79 20 66 61 69 6c   assert may fail
bc20: 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   if.    ** the f
bc30: 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ile is corrupted
bc40: 2e 20 20 54 68 65 6e 20 72 65 61 64 20 74 68 65  .  Then read the
bc50: 20 76 61 6c 75 65 20 66 72 6f 6d 20 65 61 63 68   value from each
bc60: 20 6b 65 79 20 69 6e 74 6f 20 6d 65 6d 31 0a 20   key into mem1. 
bc70: 20 20 20 2a 2a 20 61 6e 64 20 6d 65 6d 32 20 72     ** and mem2 r
bc80: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 20  espectively..   
bc90: 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
bca0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
bcb0: 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
bcc0: 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
bcd0: 6d 31 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73  m1);.    d2 += s
bce0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
bcf0: 47 65 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20  Get(&aKey2[d2], 
bd00: 73 65 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d  serial_type2, &m
bd10: 65 6d 32 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  em2);..    rc = 
bd20: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
bd30: 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20  e(&mem1, &mem2, 
bd40: 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
bd50: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
bd60: 30 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31  0);.    if( mem1
bd70: 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  .flags & MEM_Dyn
bd80: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
bd90: 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b  mRelease(&mem1);
bda0: 0a 20 20 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c  .    if( mem2.fl
bdb0: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20  ags & MEM_Dyn ) 
bdc0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
bdd0: 6c 65 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20  lease(&mem2);.  
bde0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
bdf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
be00: 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  }.    i++;.  }..
be10: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
be20: 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
be30: 66 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20  fields, but all 
be40: 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
be50: 20 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a   that point.  **
be60: 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20   were equal. If 
be70: 74 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67  the incrKey flag
be80: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
be90: 68 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73  he second key is
bea0: 0a 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73  .  ** treated as
beb0: 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20   larger..  */.  
bec0: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
bed0: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69   if( pKeyInfo->i
bee0: 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ncrKey ){.      
bef0: 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  rc = -1;.    }el
bf00: 73 65 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20  se if( d1<nKey1 
bf10: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  ){.      rc = 1;
bf20: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64  .    }else if( d
bf30: 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 20  2<nKey2 ){.     
bf40: 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a   rc = -1;.    }.
bf50: 20 20 7d 0a 0a 20 20 69 66 28 20 70 4b 65 79 49    }..  if( pKeyI
bf60: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
bf70: 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  && i<pKeyInfo->n
bf80: 46 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66  Field && pKeyInf
bf90: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
bfa0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63   ){.    rc = -rc
bfb0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
bfc0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
bfd0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
bfe0: 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70  index entry comp
bff0: 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  osed using the O
c000: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
c010: 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74  ode..** The last
c020: 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72   entry in this r
c030: 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
c040: 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 63  an integer (spec
c050: 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69  ifically.** an i
c060: 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20  nteger rowid).  
c070: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
c080: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
c090: 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74  of bytes in.** t
c0a0: 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  hat integer..*/.
c0b0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
c0c0: 64 78 52 6f 77 69 64 4c 65 6e 28 69 6e 74 20 6e  dxRowidLen(int n
c0d0: 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  Key, const u8 *a
c0e0: 4b 65 79 29 7b 0a 20 20 75 33 32 20 73 7a 48 64  Key){.  u32 szHd
c0f0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
c100: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
c110: 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
c120: 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
c130: 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
c140: 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  id */..  sqlite3
c150: 47 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  GetVarint32(aKey
c160: 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c  , &szHdr);.  sql
c170: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
c180: 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d 2c 20  &aKey[szHdr-1], 
c190: 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 72  &typeRowid);.  r
c1a0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
c1b0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
c1c0: 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20 20 0a  ypeRowid);.}.  .
c1d0: 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
c1e0: 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
c1f0: 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
c200: 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
c210: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
c220: 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
c230: 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
c240: 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
c250: 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
c260: 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
c270: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
c280: 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
c290: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
c2a0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
c2b0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
c2c0: 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
c2d0: 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
c2e0: 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
c2f0: 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  y;.  int rc;.  u
c300: 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
c310: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
c320: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
c330: 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
c340: 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
c350: 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
c360: 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
c370: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
c380: 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
c390: 2c 20 76 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  , v;..  sqlite3B
c3a0: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
c3b0: 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
c3c0: 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
c3d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c3e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
c3f0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
c400: 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
c410: 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b  (pCur, 0, nCellK
c420: 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
c430: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
c440: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c  rn rc;.  }.  sql
c450: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
c460: 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20  m.z, &szHdr);.  
c470: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
c480: 33 32 28 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  32(&m.z[szHdr-1]
c490: 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  , &typeRowid);. 
c4a0: 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
c4b0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
c4c0: 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
c4d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
c4e0: 72 69 61 6c 47 65 74 28 26 6d 2e 7a 5b 6d 2e 6e  rialGet(&m.z[m.n
c4f0: 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
c500: 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
c510: 6f 77 69 64 20 3d 20 76 2e 69 3b 0a 20 20 73 71  owid = v.i;.  sq
c520: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
c530: 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
c540: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c550: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
c560: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
c570: 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
c580: 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
c590: 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
c5a0: 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
c5b0: 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74 68   pKey (of length
c5c0: 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20 69   nKey).  Write i
c5d0: 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62  nto *pRes a numb
c5e0: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65  er.** that is ne
c5f0: 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
c600: 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20   positive if pC 
c610: 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
c620: 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72  ual to,.** or gr
c630: 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79 2e  eater than pKey.
c640: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
c650: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
c660: 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69 74  *.** pKey is eit
c670: 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
c680: 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
c690: 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
c6a0: 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
c6b0: 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
c6c0: 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
c6d0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c6e0: 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
c6f0: 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
c700: 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  well..*/.int sql
c710: 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
c720: 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72 20  mpare(.  Cursor 
c730: 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
c740: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
c750: 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  or to compare ag
c760: 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ainst */.  int n
c770: 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  Key, const u8 *p
c780: 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65  Key,   /* The ke
c790: 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  y to compare */.
c7a0: 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c7c0: 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
c7d0: 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
c7e0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
c7f0: 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63  ellKey;.  int rc
c800: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
c810: 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
c820: 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64  ;.  int lenRowid
c830: 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71  ;.  Mem m;..  sq
c840: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
c850: 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
c860: 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
c870: 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65  ey<=0 ){.    *re
c880: 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
c890: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
c8a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
c8b0: 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
c8c0: 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
c8d0: 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
c8e0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
c8f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
c900: 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
c910: 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
c920: 64 4c 65 6e 28 6d 2e 6e 2c 20 6d 2e 7a 29 3b 0a  dLen(m.n, m.z);.
c930: 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
c940: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
c950: 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  e(pC->pKeyInfo, 
c960: 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e  m.n-lenRowid, m.
c970: 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  z, nKey, pKey);.
c980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
c990: 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
c9a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
c9c0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
c9d0: 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
c9e0: 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
c9f0: 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
ca00: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
ca10: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
ca20: 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
ca30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
ca40: 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
ca50: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
ca60: 68 61 6e 67 65 29 7b 0a 20 20 64 62 2d 3e 6e 43  hange){.  db->nC
ca70: 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
ca80: 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
ca90: 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
caa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
cab0: 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
cac0: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
cad0: 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
cae0: 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
caf0: 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
cb00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
cb10: 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
cb20: 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
cb30: 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
cb40: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
cb50: 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
cb60: 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
cb70: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
cb80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
cb90: 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
cba0: 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
cbb0: 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
cbc0: 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
cbd0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
cbe0: 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
cbf0: 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
cc00: 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
cc10: 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
cc20: 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
cc30: 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
cc40: 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
cc50: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
cc60: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
cc70: 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
cc80: 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
cc90: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
cca0: 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
ccb0: 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
ccc0: 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
ccd0: 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
cce0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ccf0: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
cd00: 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
cd10: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
cd20: 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
cd30: 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
cd40: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
cd50: 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
cd60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
cd70: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
cd80: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
cd90: 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
cda0: 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
cdb0: 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
cdc0: 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a           urn v->db;.}.