/ Hex Artifact Content
Login

Artifact 6b2e54ac0b8ea95411029efff5404eb68d12d28c:


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 31 20 61 72 67 75 6d 65  of any P1 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 50 32 20 74  Function or P2 t
1900: 6f 20 61 6e 20 4f 50 5f 41 67 67 46 75 6e 63 20  o an OP_AggFunc 
1910: 6f 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  opcode. This is 
1920: 75 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69  used by .** sqli
1930: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
1940: 28 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56  () to size the V
1950: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
1960: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  y..**.** The int
1970: 65 67 65 72 20 2a 70 4d 61 78 53 74 61 63 6b 20  eger *pMaxStack 
1980: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61  is set to the ma
1990: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
19a0: 76 64 62 65 20 73 74 61 63 6b 0a 2a 2a 20 65 6e  vdbe stack.** en
19b0: 74 72 69 65 73 20 74 68 61 74 20 73 74 61 74 69  tries that stati
19c0: 63 20 61 6e 61 6c 79 73 69 73 20 72 65 76 65 61  c analysis revea
19d0: 6c 73 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20  ls this program 
19e0: 6d 69 67 68 74 20 6e 65 65 64 2e 0a 2a 2a 0a 2a  might need..**.*
19f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1a00: 6c 73 6f 20 64 6f 65 73 20 74 68 65 20 66 6f 6c  lso does the fol
1a10: 6c 6f 77 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74  lowing optimizat
1a20: 69 6f 6e 3a 20 20 49 74 20 73 63 61 6e 73 20 66  ion:  It scans f
1a30: 6f 72 0a 2a 2a 20 48 61 6c 74 20 69 6e 73 74 72  or.** Halt instr
1a40: 75 63 74 69 6f 6e 73 20 77 68 65 72 65 20 50 31  uctions where P1
1a50: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
1a60: 49 4e 54 20 6f 72 20 50 32 3d 3d 4f 45 5f 41 62  INT or P2==OE_Ab
1a70: 6f 72 74 20 6f 72 20 66 6f 72 0a 2a 2a 20 49 64  ort or for.** Id
1a80: 78 49 6e 73 65 72 74 20 69 6e 73 74 72 75 63 74  xInsert instruct
1a90: 69 6f 6e 73 20 77 68 65 72 65 20 50 32 21 3d 30  ions where P2!=0
1aa0: 2e 20 20 49 66 20 6e 6f 20 73 75 63 68 20 69 6e  .  If no such in
1ab0: 73 74 72 75 63 74 69 6f 6e 20 69 73 0a 2a 2a 20  struction is.** 
1ac0: 66 6f 75 6e 64 2c 20 74 68 65 6e 20 65 76 65 72  found, then ever
1ad0: 79 20 53 74 61 74 65 6d 65 6e 74 20 69 6e 73 74  y Statement inst
1ae0: 72 75 63 74 69 6f 6e 20 69 73 20 63 68 61 6e 67  ruction is chang
1af0: 65 64 20 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49  ed to a Noop.  I
1b00: 6e 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 77  n.** this way, w
1b10: 65 20 61 76 6f 69 64 20 63 72 65 61 74 69 6e 67  e avoid creating
1b20: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1b30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65  ournal file unne
1b40: 63 65 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74  cessarily..*/.st
1b50: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
1b60: 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a  eP2Values(Vdbe *
1b70: 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63  p, int *pMaxFunc
1b80: 41 72 67 73 2c 20 69 6e 74 20 2a 70 4d 61 78 53  Args, int *pMaxS
1b90: 74 61 63 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  tack){.  int i;.
1ba0: 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d    int nMaxArgs =
1bb0: 20 30 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 53 74   0;.  int nMaxSt
1bc0: 61 63 6b 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  ack = p->nOp;.  
1bd0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a  Op *pOp;.  int *
1be0: 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62  aLabel = p->aLab
1bf0: 65 6c 3b 0a 20 20 69 6e 74 20 64 6f 65 73 53 74  el;.  int doesSt
1c00: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
1c10: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 53 74  = 0;.  int hasSt
1c20: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 30  atementBegin = 0
1c30: 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61  ;.  for(pOp=p->a
1c40: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
1c50: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
1c60: 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65  ){.    u8 opcode
1c70: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
1c80: 0a 20 20 20 20 2f 2a 20 54 6f 64 6f 3a 20 4d 61  .    /* Todo: Ma
1c90: 79 62 65 20 4f 50 5f 41 67 67 46 75 6e 63 20 73  ybe OP_AggFunc s
1ca0: 68 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 6f 20  hould change to 
1cb0: 75 73 65 20 50 31 20 69 6e 20 74 68 65 20 73 61  use P1 in the sa
1cc0: 6d 65 0a 20 20 20 20 20 2a 20 77 61 79 20 61 73  me.     * way as
1cd0: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 20 0a 20   OP_Function. . 
1ce0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
1cf0: 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69  pcode==OP_Functi
1d00: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  on ){.      if( 
1d10: 70 4f 70 2d 3e 70 31 3e 6e 4d 61 78 41 72 67 73  pOp->p1>nMaxArgs
1d20: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
1d30: 70 2d 3e 70 31 3b 0a 20 20 20 20 7d 65 6c 73 65  p->p1;.    }else
1d40: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
1d50: 41 67 67 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  AggFunc ){.     
1d60: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
1d70: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
1d80: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
1d90: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1da0: 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20  ==OP_Halt ){.   
1db0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d     if( pOp->p1==
1dc0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1dd0: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
1de0: 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
1df0: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
1e00: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
1e10: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1e20: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  f( opcode==OP_Id
1e30: 78 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20  xInsert ){.     
1e40: 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29 7b 0a   if( pOp->p2 ){.
1e50: 20 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74          doesStat
1e60: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1e70: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1e80: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1e90: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
1ea0: 0a 20 20 20 20 20 20 68 61 73 53 74 61 74 65 6d  .      hasStatem
1eb0: 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20  entBegin = 1;.  
1ec0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 70 63    }..    if( opc
1ed0: 6f 64 65 4e 6f 50 75 73 68 28 6f 70 63 6f 64 65  odeNoPush(opcode
1ee0: 29 20 29 7b 0a 20 20 20 20 20 20 6e 4d 61 78 53  ) ){.      nMaxS
1ef0: 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20  tack--;.    }.. 
1f00: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 3d     if( pOp->p2>=
1f10: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1f20: 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70    assert( -1-pOp
1f30: 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  ->p2<p->nLabel )
1f40: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20  ;.    pOp->p2 = 
1f50: 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70  aLabel[-1-pOp->p
1f60: 32 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  2];.  }.  sqlite
1f70: 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b  Free(p->aLabel);
1f80: 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  .  p->aLabel = 0
1f90: 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  ;..  *pMaxFuncAr
1fa0: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
1fb0: 20 2a 70 4d 61 78 53 74 61 63 6b 20 3d 20 6e 4d   *pMaxStack = nM
1fc0: 61 78 53 74 61 63 6b 3b 0a 0a 20 20 2f 2a 20 49  axStack;..  /* I
1fd0: 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62  f we never rollb
1fe0: 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ack a statement 
1ff0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2000: 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  n statement.  **
2010: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
2020: 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53  e not needed.  S
2030: 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f  o change every O
2040: 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  P_Statement.  **
2050: 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20   opcode into an 
2060: 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61  OP_Noop.  This a
2070: 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73  void a call to s
2080: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
2090: 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68 69  usive().  ** whi
20a0: 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73  ch can be expens
20b0: 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61 74  ive on some plat
20c0: 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  forms..  */.  if
20d0: 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65  ( hasStatementBe
20e0: 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61 74  gin && !doesStat
20f0: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29 7b  ementRollback ){
2100: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e  .    for(pOp=p->
2110: 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b  aOp, i=p->nOp-1;
2120: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b   i>=0; i--, pOp+
2130: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  +){.      if( pO
2140: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74  p->opcode==OP_St
2150: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
2160: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
2170: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
2180: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2190: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21a0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
21b0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
21c0: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
21d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
21e0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
21f0: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
2200: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
2210: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2220: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
2230: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
2240: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
2250: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
2260: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
2270: 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   Return the.** a
2280: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69  ddress of the fi
2290: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64  rst operation ad
22a0: 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ded..*/.int sqli
22b0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
22c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f  (Vdbe *p, int nO
22d0: 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f  p, VdbeOpList co
22e0: 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74  nst *aOp){.  int
22f0: 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28   addr;.  assert(
2300: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2310: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2320: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
2330: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 29 3b 0a   p->nOp + nOp);.
2340: 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20    if( p->aOp==0 
2350: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2360: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
2370: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e  >nOp;.  if( nOp>
2380: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
2390: 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63      VdbeOpList c
23a0: 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b  onst *pIn = aOp;
23b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23c0: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29  nOp; i++, pIn++)
23d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  {.      int p2 =
23e0: 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pIn->p2;.      
23f0: 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26  VdbeOp *pOut = &
2400: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a  p->aOp[i+addr];.
2410: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f        pOut->opco
2420: 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65  de = pIn->opcode
2430: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31  ;.      pOut->p1
2440: 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20   = pIn->p1;.    
2450: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3c    pOut->p2 = p2<
2460: 30 20 3f 20 61 64 64 72 20 2b 20 41 44 44 52 28  0 ? addr + ADDR(
2470: 70 32 29 20 3a 20 70 32 3b 0a 20 20 20 20 20 20  p2) : p2;.      
2480: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
2490: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
24a0: 70 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e 70 33  p3type = pIn->p3
24b0: 20 3f 20 50 33 5f 53 54 41 54 49 43 20 3a 20 50   ? P3_STATIC : P
24c0: 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65  3_NOTUSED;.#ifde
24d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
24e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
24f0: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63  _vdbe_addop_trac
2500: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
2510: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
2520: 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61  0, i+addr, &p->a
2530: 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20  Op[i+addr]);.   
2540: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2550: 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20  }.    p->nOp += 
2560: 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nOp;.  }.  retur
2570: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
2580: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
2590: 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72  e of the P1 oper
25a0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
25b0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
25c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25d0: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
25e0: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
25f0: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
2600: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
2610: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
2620: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
2630: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
2640: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
2650: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
2660: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
2670: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2680: 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  1(Vdbe *p, int a
2690: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
26a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
26b0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
26c0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
26d0: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
26e0: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
26f0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
2700: 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a  addr].p1 = val;.
2710: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2720: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2730: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
2740: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
2750: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
2760: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2770: 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e  seful for settin
2780: 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  g a jump destina
2790: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
27a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
27b0: 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  2(Vdbe *p, int a
27c0: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
27d0: 20 61 73 73 65 72 74 28 20 76 61 6c 3e 3d 30 20   assert( val>=0 
27e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
27f0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2800: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2810: 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20  p && addr>=0 && 
2820: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70  p->nOp>addr && p
2830: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->aOp ){.    p->
2840: 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76  aOp[addr].p2 = v
2850: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
2860: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
2870: 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72  e of the P3 oper
2880: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
2890: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
28a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
28b0: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
28c0: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
28d0: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
28e0: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
28f0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
2900: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
2910: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
2920: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
2930: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
2940: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
2950: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33 20  >=0 then the P3 
2960: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
2970: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
2980: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
2990: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
29a0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
29b0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
29c0: 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20  eMalloc()..** A 
29d0: 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65  value of n==0 me
29e0: 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f  ans copy bytes o
29f0: 66 20 7a 50 33 20 75 70 20 74 6f 20 61 6e 64 20  f zP3 up to and 
2a00: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a  including the.**
2a10: 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65   first null byte
2a20: 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63  .  If n>0 then c
2a30: 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66  opy n+1 bytes of
2a40: 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e   zP3..**.** If n
2a50: 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 69 74 20  ==P3_KEYINFO it 
2a60: 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 33 20 69  means that zP3 i
2a70: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2a80: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
2a90: 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73  re..** A copy is
2aa0: 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79   made of the Key
2ab0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
2ac0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
2ad0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
2ae0: 74 65 4d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  teMalloc, to be 
2af0: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
2b00: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
2b10: 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e  ..** n==P3_KEYIN
2b20: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
2b30: 61 74 65 73 20 74 68 61 74 20 7a 50 33 20 70 6f  ates that zP3 po
2b40: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
2b50: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
2b60: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
2b70: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
2b80: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
2b90: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e 20  m sqliteMalloc. 
2ba0: 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73  The .** caller s
2bb0: 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74  hould not free t
2bc0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  he allocation, i
2bd0: 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
2be0: 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73  when the Vdbe is
2bf0: 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a  .** finalized..*
2c00: 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75  * .** Other valu
2c10: 65 73 20 6f 66 20 6e 20 28 50 33 5f 53 54 41 54  es of n (P3_STAT
2c20: 49 43 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 20 65  IC, P3_COLLSEQ e
2c30: 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68  tc.) indicate th
2c40: 61 74 20 7a 50 33 20 70 6f 69 6e 74 73 0a 2a 2a  at zP3 points.**
2c50: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20   to a string or 
2c60: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
2c70: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2c80: 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69  exist for the li
2c90: 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  fetime of.** the
2ca0: 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20   Vdbe. In these 
2cb0: 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73  cases we can jus
2cc0: 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  t copy the point
2cd0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64  er..**.** If add
2ce0: 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20  r<0 then change 
2cf0: 50 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P3 on the most r
2d00: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
2d10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2d20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2d30: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
2d40: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e  p, int addr, con
2d50: 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e  st char *zP3, in
2d60: 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b  t n){.  Op *pOp;
2d70: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
2d80: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2d90: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d  INIT );.  if( p=
2da0: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  =0 || p->aOp==0 
2db0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50 33  ){.    if( n==P3
2dc0: 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 6e 3d 3d 50  _DYNAMIC || n==P
2dd0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
2de0: 46 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  F ){.      sqlit
2df0: 65 46 72 65 65 28 28 76 6f 69 64 2a 29 7a 50 33  eFree((void*)zP3
2e00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2e10: 20 6e 3d 3d 50 33 5f 4d 45 4d 20 29 7b 0a 20 20   n==P3_MEM ){.  
2e20: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
2e30: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
2e40: 6c 75 65 20 2a 29 7a 50 33 29 3b 0a 20 20 20 20  lue *)zP3);.    
2e50: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
2e60: 7d 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 7c  }.  if( addr<0 |
2e70: 7c 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29  | addr>=p->nOp )
2e80: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
2e90: 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28  nOp - 1;.    if(
2ea0: 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e   addr<0 ) return
2eb0: 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70  ;.  }.  pOp = &p
2ec0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69  ->aOp[addr];.  i
2ed0: 66 28 20 70 4f 70 2d 3e 70 33 20 26 26 20 70 4f  f( pOp->p3 && pO
2ee0: 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 44 59  p->p3type==P3_DY
2ef0: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 73 71 6c  NAMIC ){.    sql
2f00: 69 74 65 46 72 65 65 28 70 4f 70 2d 3e 70 33 29  iteFree(pOp->p3)
2f10: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20  ;.    pOp->p3 = 
2f20: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50 33  0;.  }.  if( zP3
2f30: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
2f40: 70 33 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  p3 = 0;.    pOp-
2f50: 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54  >p3type = P3_NOT
2f60: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  USED;.  }else if
2f70: 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20  ( n==P3_KEYINFO 
2f80: 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
2f90: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e  pKeyInfo;.    in
2fa0: 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b  t nField, nByte;
2fb0: 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28  .    nField = ((
2fc0: 4b 65 79 49 6e 66 6f 2a 29 7a 50 33 29 2d 3e 6e  KeyInfo*)zP3)->n
2fd0: 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65  Field;.    nByte
2fe0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49   = sizeof(*pKeyI
2ff0: 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31  nfo) + (nField-1
3000: 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66  )*sizeof(pKeyInf
3010: 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 3b 0a 20 20  o->aColl[0]);.  
3020: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
3030: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42  iteMallocRaw( nB
3040: 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  yte );.    pOp->
3050: 70 33 20 3d 20 28 63 68 61 72 2a 29 70 4b 65 79  p3 = (char*)pKey
3060: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
3070: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
3080: 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c  memcpy(pKeyInfo,
3090: 20 7a 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20 20   zP3, nByte);.  
30a0: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20      pOp->p3type 
30b0: 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P3_KEYINFO;.  
30c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
30d0: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f  Op->p3type = P3_
30e0: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
30f0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33   }else if( n==P3
3100: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3110: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20   ){.    pOp->p3 
3120: 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20 20  = (char*)zP3;.  
3130: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20    pOp->p3type = 
3140: 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65  P3_KEYINFO;.  }e
3150: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
3160: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68     pOp->p3 = (ch
3170: 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70  ar*)zP3;.    pOp
3180: 2d 3e 70 33 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p3type = n;.  
3190: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
31a0: 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e  ==0 ) n = strlen
31b0: 28 7a 50 33 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP3);.    pOp->
31c0: 70 33 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  p3 = sqliteStrND
31d0: 75 70 28 7a 50 33 2c 20 6e 29 3b 0a 20 20 20 20  up(zP3, n);.    
31e0: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
31f0: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
3200: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3210: 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
3220: 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20 74 68  e P3 field of th
3230: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
3240: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
3250: 6e 20 77 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65 6e  n with.** commen
3260: 74 20 74 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20  t text..*/.void 
3270: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65  sqlite3VdbeComme
3280: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
3290: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
32a0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
32b0: 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70   ap;.  assert( p
32c0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
32d0: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
32e0: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
32f0: 31 5d 2e 70 33 3d 3d 30 20 29 3b 0a 20 20 76 61  1].p3==0 );.  va
3300: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
3310: 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  at);.  sqlite3Vd
3320: 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20 2d 31  beChangeP3(p, -1
3330: 2c 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  , sqlite3VMPrint
3340: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c 20  f(zFormat, ap), 
3350: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 76  P3_DYNAMIC);.  v
3360: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e  a_end(ap);.}.#en
3370: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  dif../*.** Searc
3380: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  h the current pr
3390: 6f 67 72 61 6d 20 73 74 61 72 74 69 6e 67 20 61  ogram starting a
33a0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  t instruction ad
33b0: 64 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  dr for the given
33c0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20 50  .** opcode and P
33d0: 32 20 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e  2 value.  Return
33e0: 20 74 68 65 20 61 64 64 72 65 73 73 20 70 6c 75   the address plu
33f0: 73 20 31 20 69 66 20 66 6f 75 6e 64 20 61 6e 64  s 1 if found and
3400: 20 30 20 69 66 20 6e 6f 74 0a 2a 2a 20 66 6f 75   0 if not.** fou
3410: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
3420: 65 33 56 64 62 65 46 69 6e 64 4f 70 28 56 64 62  e3VdbeFindOp(Vdb
3430: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3440: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 32 29 7b  int op, int p2){
3450: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
3460: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
3470: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
3480: 0a 20 20 66 6f 72 28 69 3d 61 64 64 72 3b 20 69  .  for(i=addr; i
3490: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
34a0: 20 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b 69 5d     if( p->aOp[i]
34b0: 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 26 26 20 70  .opcode==op && p
34c0: 2d 3e 61 4f 70 5b 69 5d 2e 70 32 3d 3d 70 32 20  ->aOp[i].p2==p2 
34d0: 29 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20  ) return i+1;.  
34e0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
34f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3500: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67  e opcode for a g
3510: 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2f  iven address..*/
3520: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
3530: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
3540: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
3550: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
3560: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
3570: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  T );.  assert( a
3580: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
3590: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74 75 72  ->nOp );.  retur
35a0: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
35b0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
35c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
35d0: 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65  LAIN) || !define
35e0: 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20  d(NDEBUG) \.    
35f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
3600: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
3610: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
3620: 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  G)./*.** Compute
3630: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
3640: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 33 20  escribes the P3 
3650: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
3660: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
3670: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
3680: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
3690: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
36a0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
36b0: 69 73 70 6c 61 79 50 33 28 4f 70 20 2a 70 4f 70  isplayP3(Op *pOp
36c0: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
36d0: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
36e0: 72 20 2a 7a 50 33 3b 0a 20 20 61 73 73 65 72 74  r *zP3;.  assert
36f0: 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20  ( nTemp>=20 );. 
3700: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 33   switch( pOp->p3
3710: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
3720: 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P3_KEYINFO: {. 
3730: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
3740: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
3750: 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66  eyInfo = (KeyInf
3760: 6f 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20  o*)pOp->p3;.    
3770: 20 20 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c    sprintf(zTemp,
3780: 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70   "keyinfo(%d", p
3790: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
37a0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c  ;.      i = strl
37b0: 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  en(zTemp);.     
37c0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
37d0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
37e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
37f0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
3800: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
3810: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
3820: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
3830: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
3840: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
3850: 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e          if( i+n>
3860: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
3870: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
3880: 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 29 3b  Temp[i],",...");
3890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
38a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
38b0: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
38c0: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
38d0: 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
38e0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
38f0: 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
3900: 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20  tOrder[j] ){.   
3910: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
3920: 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  ++] = '-';.     
3930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3940: 20 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69   strcpy(&zTemp[i
3950: 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ], pColl->zName)
3960: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
3970: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   n;.        }els
3980: 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d  e if( i+4<nTemp-
3990: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  6 ){.          s
39a0: 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  trcpy(&zTemp[i],
39b0: 22 2c 6e 69 6c 22 29 3b 0a 20 20 20 20 20 20 20  ",nil");.       
39c0: 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20     i += 4;.     
39d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
39e0: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
39f0: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
3a00: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
3a10: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
3a20: 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54  ;.      zP3 = zT
3a30: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  emp;.      break
3a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3a50: 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P3_COLLSEQ: {. 
3a60: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
3a70: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 2a 29  oll = (CollSeq*)
3a80: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73  pOp->p3;.      s
3a90: 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22 63  printf(zTemp, "c
3aa0: 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20  ollseq(%.20s)", 
3ab0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
3ac0: 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70       zP3 = zTemp
3ad0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3ae0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 33     }.    case P3
3af0: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
3b00: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
3b10: 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f 70 2d  = (FuncDef*)pOp-
3b20: 3e 70 33 3b 0a 20 20 20 20 20 20 63 68 61 72 20  >p3;.      char 
3b30: 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20  zNum[30];.      
3b40: 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22  sprintf(zTemp, "
3b50: 25 2e 2a 73 22 2c 20 6e 54 65 6d 70 2c 20 70 44  %.*s", nTemp, pD
3b60: 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ef->zName);.    
3b70: 20 20 73 70 72 69 6e 74 66 28 7a 4e 75 6d 2c 22    sprintf(zNum,"
3b80: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 6e 41 72  (%d)", pDef->nAr
3b90: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  g);.      if( st
3ba0: 72 6c 65 6e 28 7a 54 65 6d 70 29 2b 73 74 72 6c  rlen(zTemp)+strl
3bb0: 65 6e 28 7a 4e 75 6d 29 2b 31 3c 3d 6e 54 65 6d  en(zNum)+1<=nTem
3bc0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  p ){.        str
3bd0: 63 61 74 28 7a 54 65 6d 70 2c 20 7a 4e 75 6d 29  cat(zTemp, zNum)
3be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3bf0: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP3 = zTemp;.   
3c00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3c10: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
3c20: 20 20 20 20 20 7a 50 33 20 3d 20 70 4f 70 2d 3e       zP3 = pOp->
3c30: 70 33 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  p3;.      if( zP
3c40: 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  3==0 || pOp->opc
3c50: 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  ode==OP_Noop ){.
3c60: 20 20 20 20 20 20 20 20 7a 50 33 20 3d 20 22 22          zP3 = ""
3c70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3c80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 50 33    }.  return zP3
3c90: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
3ca0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
3cb0: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
3cc0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
3cd0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69  /*.** Print a si
3ce0: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68  ngle opcode.  Th
3cf0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3d00: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
3d10: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
3d20: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
3d30: 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e  p(FILE *pOut, in
3d40: 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a  t pc, Op *pOp){.
3d50: 20 20 63 68 61 72 20 2a 7a 50 33 3b 0a 20 20 63    char *zP3;.  c
3d60: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
3d70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3d80: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
3d90: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
3da0: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f   %s\n";.  if( pO
3db0: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73  ut==0 ) pOut = s
3dc0: 74 64 6f 75 74 3b 0a 20 20 7a 50 33 20 3d 20 64  tdout;.  zP3 = d
3dd0: 69 73 70 6c 61 79 50 33 28 70 4f 70 2c 20 7a 50  isplayP3(pOp, zP
3de0: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29  tr, sizeof(zPtr)
3df0: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75  );.  fprintf(pOu
3e00: 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 0a 20 20 20  t, zFormat1,.   
3e10: 20 20 20 70 63 2c 20 73 71 6c 69 74 65 33 4f 70     pc, sqlite3Op
3e20: 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f  codeNames[pOp->o
3e30: 70 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e 70 31 2c  pcode], pOp->p1,
3e40: 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 29 3b 0a   pOp->p2, zP3);.
3e50: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
3e60: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3e70: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
3e80: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
3e90: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
3ea0: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
3eb0: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
3ec0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
3ed0: 20 77 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b   while( N-->0 ){
3ee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3ef0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 2b 2b  beMemRelease(p++
3f00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
3f10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3f20: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
3f30: 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67  * Give a listing
3f40: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   of the program 
3f50: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
3f60: 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  achine..**.** Th
3f70: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74  e interface is t
3f80: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
3f90: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42  e3VdbeExec().  B
3fa0: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ut instead of.**
3fb0: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64   running the cod
3fc0: 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68  e, it invokes th
3fd0: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20  e callback once 
3fe0: 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63  for each instruc
3ff0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65  tion..** This fe
4000: 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  ature is used to
4010: 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c   implement "EXPL
4020: 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  AIN"..*/.int sql
4030: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
4040: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
4050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4060: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71   VDBE */.){.  sq
4070: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
4080: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
4090: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
40a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
40b0: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  explain );.  if(
40c0: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
40d0: 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75  MAGIC_RUN ) retu
40e0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
40f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
4100: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
4110: 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73  GIC_BUSY );.  as
4120: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
4130: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
4140: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
4150: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
4160: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
4170: 65 73 20 6e 6f 74 20 70 75 74 20 64 79 6e 61 6d  es not put dynam
4180: 69 63 20 73 74 72 69 6e 67 73 20 6f 6e 74 6f 20  ic strings onto 
4190: 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  the.  ** the sta
41a0: 63 6b 2c 20 74 68 65 79 20 6d 61 79 20 62 65 63  ck, they may bec
41b0: 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74  ome dynamic if t
41c0: 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20  he user calls.  
41d0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
41e0: 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73  n_text16(), caus
41f0: 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f  ing a translatio
4200: 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f  n to UTF-16 enco
4210: 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ding..  */.  if(
4220: 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e 61 53   p->pTos==&p->aS
4230: 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20 20 72  tack[4] ){.    r
4240: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
4250: 2d 3e 61 53 74 61 63 6b 2c 20 35 29 3b 0a 20 20  ->aStack, 5);.  
4260: 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63  }.  p->resOnStac
4270: 6b 20 3d 20 30 3b 0a 0a 0a 20 20 69 20 3d 20 70  k = 0;...  i = p
4280: 2d 3e 70 63 2b 2b 3b 0a 20 20 69 66 28 20 69 3e  ->pc++;.  if( i>
4290: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
42a0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
42b0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
42c0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
42d0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
42e0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74  SQLITE_Interrupt
42f0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   ){.    db->flag
4300: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
4310: 65 72 72 75 70 74 3b 0a 20 20 20 20 70 2d 3e 72  errupt;.    p->r
4320: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
4330: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
4340: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
4350: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
4360: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73  g(&p->zErrMsg, s
4370: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
4380: 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  rc), (char*)0);.
4390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 70 20    }else{.    Op 
43a0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  *pOp = &p->aOp[i
43b0: 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ];.    Mem *pMem
43c0: 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a 20 20   = p->aStack;.  
43d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
43e0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
43f0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
4400: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
4410: 65 6d 2d 3e 69 20 3d 20 69 3b 20 20 20 20 20 20  em->i = i;      
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
4440: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
4450: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
4460: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
4470: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
4480: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
4490: 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69 74 65  pMem->z = sqlite
44a0: 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70  3OpcodeNames[pOp
44b0: 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f  ->opcode];  /* O
44c0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 70 4d 65  pcode */.    pMe
44d0: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
44e0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 70 4d 65 6d  em->z);.    pMem
44f0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
4500: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  TEXT;.    pMem->
4510: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
4520: 38 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  8;.    pMem++;..
4530: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
4540: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
4550: 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 31  Mem->i = pOp->p1
4560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
4580: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
4590: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
45a0: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
45b0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
45c0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
45d0: 20 70 4d 65 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e   pMem->i = pOp->
45e0: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4600: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
4610: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
4620: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
4630: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
4640: 61 67 73 20 3d 20 4d 45 4d 5f 53 68 6f 72 74 7c  ags = MEM_Short|
4650: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
4660: 3b 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20  ;   /* P3 */.   
4670: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c   pMem->z = displ
4680: 61 79 50 33 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP3(pOp, pMem->
4690: 7a 53 68 6f 72 74 2c 20 73 69 7a 65 6f 66 28 70  zShort, sizeof(p
46a0: 4d 65 6d 2d 3e 7a 53 68 6f 72 74 29 29 3b 0a 20  Mem->zShort));. 
46b0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
46c0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
46d0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
46e0: 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20 20 70  ITE_UTF8;..    p
46f0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 35  ->nResColumn = 5
4700: 3b 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20  ;.    p->pTos = 
4710: 70 4d 65 6d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  pMem;.    p->rc 
4720: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
4730: 20 70 2d 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d   p->resOnStack =
4740: 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
4750: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  ITE_ROW;.  }.  r
4760: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
4770: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
4780: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a  T_EXPLAIN */../*
4790: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
47a0: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
47b0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
47c0: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
47d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
47e0: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
47f0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
4800: 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 4f 70 20  DEBUG.  int nOp 
4810: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
4820: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e  Op *pOp;.  if( n
4830: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
4840: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e   pOp = &p->aOp[n
4850: 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op-1];.  if( pOp
4860: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
4870: 70 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20  p && pOp->p3!=0 
4880: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
4890: 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  r *z = pOp->p3;.
48a0: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
48b0: 63 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b  ce(*(u8*)z) ) z+
48c0: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
48d0: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
48e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
48f0: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
4900: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
4910: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
4920: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
4930: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
4940: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
4950: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
4960: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
4970: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
4980: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
4990: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
49a0: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
49b0: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
49c0: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
49d0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
49e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
49f0: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
4a00: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
4a10: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
4a20: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
4a30: 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  _RUN..*/.void sq
4a40: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
4a50: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
4a80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4ab0: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
4ac0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
4ad0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4b00: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
4b10: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
4b20: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b40: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
4b50: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
4b60: 0a 20 20 69 6e 74 20 6e 41 67 67 2c 20 20 20 20  .  int nAgg,    
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
4b90: 67 67 72 65 67 61 74 65 20 63 6f 6e 74 65 78 74  ggregate context
4ba0: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
4bb0: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20  int isExplain   
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4bd0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
4be0: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
4bf0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a  s present */.){.
4c00: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65    int n;..  asse
4c10: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
4c20: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
4c30: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
4c40: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
4c50: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
4c60: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
4c70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
4c80: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
4c90: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
4ca0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
4cb0: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
4cc0: 6e 20 6c 61 74 65 72 2e 20 54 68 69 73 0a 20 20  n later. This.  
4cd0: 20 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68   * is because th
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a 65  e call to resize
4cf0: 4f 70 41 72 72 61 79 28 29 20 62 65 6c 6f 77 20  OpArray() below 
4d00: 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65 0a 20  may shrink the. 
4d10: 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72 72    * p->aOp[] arr
4d20: 61 79 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f 72  ay to save memor
4d30: 79 20 69 66 20 63 61 6c 6c 65 64 20 77 68 65 6e  y if called when
4d40: 20 69 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   in VDBE_MAGIC_R
4d50: 55 4e 20 0a 20 20 20 2a 20 73 74 61 74 65 2e 0a  UN .   * state..
4d60: 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63     */.  p->magic
4d70: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
4d80: 4e 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 69 6e 73 74  N;..  /* No inst
4d90: 72 75 63 74 69 6f 6e 20 65 76 65 72 20 70 75 73  ruction ever pus
4da0: 68 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 20  hes more than a 
4db0: 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 20 6f  single element o
4dc0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 74 61  nto the.  ** sta
4dd0: 63 6b 2e 20 20 41 6e 64 20 74 68 65 20 73 74 61  ck.  And the sta
4de0: 63 6b 20 6e 65 76 65 72 20 67 72 6f 77 73 20 6f  ck never grows o
4df0: 6e 20 73 75 63 63 65 73 73 69 76 65 20 65 78 65  n successive exe
4e00: 63 75 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  cutions of the. 
4e10: 20 2a 2a 20 73 61 6d 65 20 6c 6f 6f 70 2e 20 20   ** same loop.  
4e20: 53 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  So the total num
4e30: 62 65 72 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ber of instructi
4e40: 6f 6e 73 20 69 73 20 61 6e 20 75 70 70 65 72 20  ons is an upper 
4e50: 62 6f 75 6e 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  bound.  ** on th
4e60: 65 20 6d 61 78 69 6d 75 6d 20 73 74 61 63 6b 20  e maximum stack 
4e70: 64 65 70 74 68 20 72 65 71 75 69 72 65 64 2e 20  depth required. 
4e80: 20 28 41 64 64 65 64 20 6c 61 74 65 72 3a 29 20   (Added later:) 
4e90: 20 54 68 65 0a 20 20 2a 2a 20 72 65 73 6f 6c 76   The.  ** resolv
4ea0: 65 50 32 56 61 6c 75 65 73 28 29 20 63 61 6c 6c  eP2Values() call
4eb0: 20 63 6f 6d 70 75 74 65 73 20 61 20 74 69 67 68   computes a tigh
4ec0: 74 65 72 20 75 70 70 65 72 20 62 6f 75 6e 64 20  ter upper bound 
4ed0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 63  on the.  ** stac
4ee0: 6b 20 73 69 7a 65 2e 0a 20 20 2a 2a 0a 20 20 2a  k size..  **.  *
4ef0: 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61 6c 6c  * Allocation all
4f00: 20 74 68 65 20 73 74 61 63 6b 20 73 70 61 63 65   the stack space
4f10: 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20 6e 65   we will ever ne
4f20: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
4f30: 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b 0a 20  ->aStack==0 ){. 
4f40: 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20     int nArg;    
4f50: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
4f60: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73  mber of args pas
4f70: 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75  sed to a user fu
4f80: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
4f90: 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20 20 2f  nt nStack;     /
4fa0: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
4fb0: 20 6f 66 20 73 74 61 63 6b 20 65 6e 74 72 69 65   of stack entrie
4fc0: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
4fd0: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
4fe0: 73 28 70 2c 20 26 6e 41 72 67 2c 20 26 6e 53 74  s(p, &nArg, &nSt
4ff0: 61 63 6b 29 3b 0a 20 20 20 20 72 65 73 69 7a 65  ack);.    resize
5000: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
5010: 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
5020: 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20 61  nVar>=0 );.    a
5030: 73 73 65 72 74 28 20 6e 53 74 61 63 6b 3c 70 2d  ssert( nStack<p-
5040: 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 6e 53 74 61  >nOp );.    nSta
5050: 63 6b 20 3d 20 69 73 45 78 70 6c 61 69 6e 20 3f  ck = isExplain ?
5060: 20 31 30 20 3a 20 6e 53 74 61 63 6b 3b 0a 20 20   10 : nStack;.  
5070: 20 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71    p->aStack = sq
5080: 6c 69 74 65 4d 61 6c 6c 6f 63 28 0a 20 20 20 20  liteMalloc(.    
5090: 20 20 20 20 6e 53 74 61 63 6b 2a 73 69 7a 65 6f      nStack*sizeo
50a0: 66 28 70 2d 3e 61 53 74 61 63 6b 5b 30 5d 29 20  f(p->aStack[0]) 
50b0: 20 20 20 2f 2a 20 61 53 74 61 63 6b 20 2a 2f 0a     /* aStack */.
50c0: 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a        + nArg*siz
50d0: 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20  eof(Mem*)       
50e0: 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20         /* apArg 
50f0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a  */.      + nVar*
5100: 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20  sizeof(Mem)     
5110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 56 61            /* aVa
5120: 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61  r */.      + nVa
5130: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  r*sizeof(char*) 
5140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
5150: 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20  zVar */.      + 
5160: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5180: 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20  * aMem */.      
5190: 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  + nCursor*sizeof
51a0: 28 43 75 72 73 6f 72 2a 29 20 20 20 20 20 20 20  (Cursor*)       
51b0: 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20 20   /* apCsr */.   
51c0: 20 20 20 2b 20 6e 41 67 67 2a 73 69 7a 65 6f 66     + nAgg*sizeof
51d0: 28 41 67 67 29 20 20 20 20 20 20 20 20 20 20 20  (Agg)           
51e0: 20 20 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65      /* Aggregate
51f0: 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20   contexts */.   
5200: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   );.    if( !sql
5210: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
5220: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  ed ){.      p->a
5230: 4d 65 6d 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b  Mem = &p->aStack
5240: 5b 6e 53 74 61 63 6b 5d 3b 0a 20 20 20 20 20 20  [nStack];.      
5250: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a  p->nMem = nMem;.
5260: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
5270: 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a  &p->aMem[nMem];.
5280: 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20        p->nVar = 
5290: 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f  nVar;.      p->o
52a0: 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  kVar = 0;.      
52b0: 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a  p->apArg = (Mem*
52c0: 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d  *)&p->aVar[nVar]
52d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72  ;.      p->azVar
52e0: 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61   = (char**)&p->a
52f0: 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20  pArg[nArg];.    
5300: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43 75    p->apCsr = (Cu
5310: 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61 72  rsor**)&p->azVar
5320: 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 69 66  [nVar];.      if
5330: 28 20 6e 41 67 67 3e 30 20 29 7b 0a 20 20 20 20  ( nAgg>0 ){.    
5340: 20 20 20 20 70 2d 3e 6e 41 67 67 20 3d 20 6e 41      p->nAgg = nA
5350: 67 67 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  gg;.        p->a
5360: 70 41 67 67 20 3d 20 28 41 67 67 2a 29 26 70 2d  pAgg = (Agg*)&p-
5370: 3e 61 70 43 73 72 5b 6e 43 75 72 73 6f 72 5d 3b  >apCsr[nCursor];
5380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5390: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
53a0: 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e  sor;.      for(n
53b0: 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29  =0; n<nVar; n++)
53c0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61  {.        p->aVa
53d0: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
53e0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  _Null;.      }. 
53f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 70 41     }.  }.  p->pA
5400: 67 67 20 3d 20 70 2d 3e 61 70 41 67 67 3b 0a 20  gg = p->apAgg;. 
5410: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70 2d 3e 6e   for(n=0; n<p->n
5420: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 70  Mem; n++){.    p
5430: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20  ->aMem[n].flags 
5440: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a  = MEM_Null;.  }.
5450: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5460: 45 42 55 47 0a 20 20 69 66 28 20 28 70 2d 3e 64  EBUG.  if( (p->d
5470: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5480: 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 29 21 3d  E_VdbeListing)!=
5490: 30 0a 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  0.    || sqlite3
54a0: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 22 76 64  OsFileExists("vd
54b0: 62 65 5f 65 78 70 6c 61 69 6e 22 29 0a 20 20 29  be_explain").  )
54c0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
54d0: 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 50 72   printf("VDBE Pr
54e0: 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c 6e  ogram Listing:\n
54f0: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ");.    sqlite3V
5500: 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a  dbePrintSql(p);.
5510: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5520: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
5530: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
5540: 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 69 2c  intOp(stdout, i,
5550: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
5560: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71    }.  }.  if( sq
5570: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
5580: 73 28 22 76 64 62 65 5f 74 72 61 63 65 22 29 20  s("vdbe_trace") 
5590: 29 7b 0a 20 20 20 20 70 2d 3e 74 72 61 63 65 20  ){.    p->trace 
55a0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a 23 65  = stdout;.  }.#e
55b0: 6e 64 69 66 0a 20 20 70 2d 3e 70 54 6f 73 20 3d  ndif.  p->pTos =
55c0: 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b   &p->aStack[-1];
55d0: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
55e0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
55f0: 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43  OK;.  p->uniqueC
5600: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 74  nt = 0;.  p->ret
5610: 75 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20 20  urnDepth = 0;.  
5620: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
5630: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
5640: 70 6f 70 53 74 61 63 6b 20 3d 20 20 30 3b 0a 20  popStack =  0;. 
5650: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69   p->explain |= i
5660: 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d  sExplain;.  p->m
5670: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
5680: 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61  C_RUN;.  p->nCha
5690: 6e 67 65 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  nge = 0;.#ifdef 
56a0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
56b0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
56c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
56d0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  p; i++){.      p
56e0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
56f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  ;.      p->aOp[i
5700: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
5710: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
5720: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  .../*.** Remove 
5730: 61 6e 79 20 65 6c 65 6d 65 6e 74 73 20 74 68 61  any elements tha
5740: 74 20 72 65 6d 61 69 6e 20 6f 6e 20 74 68 65 20  t remain on the 
5750: 73 6f 72 74 65 72 20 66 6f 72 20 74 68 65 20 56  sorter for the V
5760: 44 42 45 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  DBE given..*/.vo
5770: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  id sqlite3VdbeSo
5780: 72 74 65 72 52 65 73 65 74 28 56 64 62 65 20 2a  rterReset(Vdbe *
5790: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  p){.  while( p->
57a0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 53 6f 72  pSort ){.    Sor
57b0: 74 65 72 20 2a 70 53 6f 72 74 65 72 20 3d 20 70  ter *pSorter = p
57c0: 2d 3e 70 53 6f 72 74 3b 0a 20 20 20 20 70 2d 3e  ->pSort;.    p->
57d0: 70 53 6f 72 74 20 3d 20 70 53 6f 72 74 65 72 2d  pSort = pSorter-
57e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
57f0: 74 65 46 72 65 65 28 70 53 6f 72 74 65 72 2d 3e  teFree(pSorter->
5800: 7a 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  zKey);.    sqlit
5810: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
5820: 28 26 70 53 6f 72 74 65 72 2d 3e 64 61 74 61 29  (&pSorter->data)
5830: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
5840: 28 70 53 6f 72 74 65 72 29 3b 0a 20 20 7d 0a 20  (pSorter);.  }. 
5850: 20 70 2d 3e 70 53 6f 72 74 54 61 69 6c 20 3d 20   p->pSortTail = 
5860: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  0;.}../*.** Free
5870: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 61   all resources a
5880: 6c 6c 6f 63 69 61 74 65 64 20 77 69 74 68 20 41  llociated with A
5890: 67 67 45 6c 65 6d 20 70 45 6c 65 6d 2c 20 61 6e  ggElem pElem, an
58a0: 20 65 6c 65 6d 65 6e 74 20 6f 66 0a 2a 2a 20 61   element of.** a
58b0: 67 67 72 65 67 61 74 65 20 70 41 67 67 2e 0a 2a  ggregate pAgg..*
58c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
58d0: 65 65 41 67 67 45 6c 65 6d 28 41 67 67 45 6c 65  eeAggElem(AggEle
58e0: 6d 20 2a 70 45 6c 65 6d 2c 20 41 67 67 20 2a 70  m *pElem, Agg *p
58f0: 41 67 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Agg){.  int i;. 
5900: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
5910: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
5920: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
5930: 45 6c 65 6d 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20  Elem->aMem[i];. 
5940: 20 20 20 69 66 28 20 70 41 67 67 2d 3e 61 70 46     if( pAgg->apF
5950: 75 6e 63 20 26 26 20 70 41 67 67 2d 3e 61 70 46  unc && pAgg->apF
5960: 75 6e 63 5b 69 5d 20 26 26 20 28 70 4d 65 6d 2d  unc[i] && (pMem-
5970: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67  >flags & MEM_Agg
5980: 43 74 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ctx)!=0 ){.     
5990: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
59a0: 20 63 74 78 3b 0a 20 20 20 20 20 20 63 74 78 2e   ctx;.      ctx.
59b0: 70 46 75 6e 63 20 3d 20 70 41 67 67 2d 3e 61 70  pFunc = pAgg->ap
59c0: 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Func[i];.      c
59d0: 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  tx.s.flags = MEM
59e0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 63 74 78  _Null;.      ctx
59f0: 2e 70 41 67 67 20 3d 20 70 4d 65 6d 2d 3e 7a 3b  .pAgg = pMem->z;
5a00: 0a 20 20 20 20 20 20 63 74 78 2e 63 6e 74 20 3d  .      ctx.cnt =
5a10: 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 20 20   pMem->i;.      
5a20: 63 74 78 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b  ctx.isError = 0;
5a30: 0a 20 20 20 20 20 20 28 2a 63 74 78 2e 70 46 75  .      (*ctx.pFu
5a40: 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 29 28 26  nc->xFinalize)(&
5a50: 63 74 78 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ctx);.      pMem
5a60: 2d 3e 7a 20 3d 20 63 74 78 2e 70 41 67 67 3b 0a  ->z = ctx.pAgg;.
5a70: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
5a80: 7a 21 3d 30 20 26 26 20 70 4d 65 6d 2d 3e 7a 21  z!=0 && pMem->z!
5a90: 3d 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 20 29 7b  =pMem->zShort ){
5aa0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
5ab0: 72 65 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  ree(pMem->z);.  
5ac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
5ad0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
5ae0: 65 28 26 63 74 78 2e 73 29 3b 0a 20 20 20 20 7d  e(&ctx.s);.    }
5af0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5b00: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
5b10: 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  e(pMem);.    }. 
5b20: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
5b30: 70 45 6c 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pElem);.}../*.**
5b40: 20 52 65 73 65 74 20 61 6e 20 41 67 67 20 73 74   Reset an Agg st
5b50: 72 75 63 74 75 72 65 2e 20 20 44 65 6c 65 74 65  ructure.  Delete
5b60: 20 61 6c 6c 20 69 74 73 20 63 6f 6e 74 65 6e 74   all its content
5b70: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 73  s..**.** For ins
5b80: 74 61 6c 6c 61 62 6c 65 20 61 67 67 72 65 67 61  tallable aggrega
5b90: 74 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 69 66  te functions, if
5ba0: 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
5bb0: 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 63  on has been.** c
5bc0: 61 6c 6c 65 64 2c 20 6d 61 6b 65 20 73 75 72 65  alled, make sure
5bd0: 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 66   the finalizer f
5be0: 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 73 6f  unction has also
5bf0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 20 20 54   been called.  T
5c00: 68 65 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 72 20  he.** finalizer 
5c10: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 66 72  might need to fr
5c20: 65 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ee memory that w
5c30: 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 73 20  as allocated as 
5c40: 70 61 72 74 20 6f 66 20 69 74 73 0a 2a 2a 20 70  part of its.** p
5c50: 72 69 76 61 74 65 20 63 6f 6e 74 65 78 74 2e 20  rivate context. 
5c60: 20 49 66 20 74 68 65 20 66 69 6e 61 6c 69 7a 65   If the finalize
5c70: 72 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63  r has not been c
5c80: 61 6c 6c 65 64 20 79 65 74 2c 20 63 61 6c 6c 20  alled yet, call 
5c90: 69 74 0a 2a 2a 20 6e 6f 77 2e 0a 2a 2a 0a 2a 2a  it.** now..**.**
5ca0: 20 49 66 20 64 62 20 69 73 20 4e 55 4c 4c 2c 20   If db is NULL, 
5cb0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 62 65 69  then this is bei
5cc0: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73  ng called from s
5cd0: 71 6c 69 74 65 56 64 62 65 52 65 73 65 74 28 29  qliteVdbeReset()
5ce0: 2e 20 49 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73  . In.** this cas
5cf0: 65 20 63 6c 65 61 6e 20 75 70 20 61 6c 6c 20 72  e clean up all r
5d00: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
5d10: 20 74 65 6d 70 2d 74 61 62 6c 65 20 75 73 65 64   temp-table used
5d20: 20 66 6f 72 0a 2a 2a 20 61 67 67 72 65 67 61 74   for.** aggregat
5d30: 65 73 20 28 69 66 20 69 74 20 77 61 73 20 65 76  es (if it was ev
5d40: 65 72 20 6f 70 65 6e 65 64 29 2e 0a 2a 2a 0a 2a  er opened)..**.*
5d50: 2a 20 49 66 20 64 62 20 69 73 20 6e 6f 74 20 4e  * If db is not N
5d60: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ULL, then this i
5d70: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
5d80: 72 6f 6d 20 77 69 74 68 20 61 6e 20 4f 50 5f 41  rom with an OP_A
5d90: 67 67 52 65 73 65 74 0a 2a 2a 20 6f 70 63 6f 64  ggReset.** opcod
5da0: 65 2e 20 4f 70 65 6e 20 74 68 65 20 74 65 6d 70  e. Open the temp
5db0: 2d 74 61 62 6c 65 2c 20 69 66 20 69 74 20 68 61  -table, if it ha
5dc0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
5dd0: 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64 0a 2a 2a  en opened and.**
5de0: 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74   delete the cont
5df0: 65 6e 74 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ents of the tabl
5e00: 65 20 75 73 65 64 20 66 6f 72 20 61 67 67 72 65  e used for aggre
5e10: 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
5e20: 2c 20 72 65 61 64 79 0a 2a 2a 20 66 6f 72 20 74  , ready.** for t
5e30: 68 65 20 6e 65 78 74 20 72 6f 75 6e 64 20 6f 66  he next round of
5e40: 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
5e50: 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssing..*/.int sq
5e60: 6c 69 74 65 33 56 64 62 65 41 67 67 52 65 73 65  lite3VdbeAggRese
5e70: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  t(sqlite3 *db, A
5e80: 67 67 20 2a 70 41 67 67 2c 20 4b 65 79 49 6e 66  gg *pAgg, KeyInf
5e90: 6f 20 2a 70 4b 65 79 49 6e 66 6f 29 7b 0a 20 20  o *pKeyInfo){.  
5ea0: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 42 74  int rc = 0;.  Bt
5eb0: 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 0a 20  Cursor *pCsr;.. 
5ec0: 20 69 66 28 20 21 70 41 67 67 20 29 20 72 65 74   if( !pAgg ) ret
5ed0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5ee0: 20 70 43 73 72 20 3d 20 70 41 67 67 2d 3e 70 43   pCsr = pAgg->pC
5ef0: 73 72 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  sr;.  assert( (p
5f00: 43 73 72 20 26 26 20 70 41 67 67 2d 3e 6e 54 61  Csr && pAgg->nTa
5f10: 62 3e 30 29 20 7c 7c 20 28 21 70 43 73 72 20 26  b>0) || (!pCsr &
5f20: 26 20 70 41 67 67 2d 3e 6e 54 61 62 3d 3d 30 29  & pAgg->nTab==0)
5f30: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  .         || sql
5f40: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
5f50: 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ed );..  /* If p
5f60: 43 73 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Csr is not NULL,
5f70: 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20   then the table 
5f80: 75 73 65 64 20 66 6f 72 20 61 67 67 72 65 67 61  used for aggrega
5f90: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  te information. 
5fa0: 20 2a 2a 20 69 73 20 6f 70 65 6e 2e 20 4c 6f 6f   ** is open. Loo
5fb0: 70 20 74 68 72 6f 75 67 68 20 69 74 20 61 6e 64  p through it and
5fc0: 20 66 72 65 65 20 74 68 65 20 41 67 67 45 6c 65   free the AggEle
5fd0: 6d 2a 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  m* structure poi
5fe0: 6e 74 65 64 20 61 74 0a 20 20 2a 2a 20 62 79 20  nted at.  ** by 
5ff0: 65 61 63 68 20 65 6e 74 72 79 2e 20 49 66 20 74  each entry. If t
6000: 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 68 61 73  he finalizer has
6010: 20 6e 6f 74 20 62 65 65 6e 20 63 61 6c 6c 65 64   not been called
6020: 20 66 6f 72 20 61 6e 20 41 67 67 45 6c 65 6d 2c   for an AggElem,
6030: 0a 20 20 2a 2a 20 64 6f 20 74 68 61 74 20 74 6f  .  ** do that to
6040: 6f 2e 20 46 69 6e 61 6c 6c 79 2c 20 63 6c 65 61  o. Finally, clea
6050: 72 20 74 68 65 20 62 74 72 65 65 20 74 61 62 6c  r the btree tabl
6060: 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20  e itself..  */. 
6070: 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20   if( pCsr ){.   
6080: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 61 73   int res;.    as
6090: 73 65 72 74 28 20 70 41 67 67 2d 3e 70 42 74 72  sert( pAgg->pBtr
60a0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
60b0: 28 20 70 41 67 67 2d 3e 6e 54 61 62 3e 30 20 29  ( pAgg->nTab>0 )
60c0: 3b 0a 0a 20 20 20 20 72 63 3d 73 71 6c 69 74 65  ;..    rc=sqlite
60d0: 33 42 74 72 65 65 46 69 72 73 74 28 70 43 73 72  3BtreeFirst(pCsr
60e0: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 77 68 69  , &res);.    whi
60f0: 6c 65 28 20 72 65 73 3d 3d 30 20 26 26 20 72 63  le( res==0 && rc
6100: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6110: 20 20 20 20 20 41 67 67 45 6c 65 6d 20 2a 70 45       AggElem *pE
6120: 6c 65 6d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  lem;.      rc = 
6130: 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
6140: 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCsr, 0, sizeof
6150: 28 41 67 67 45 6c 65 6d 2a 29 2c 20 28 63 68 61  (AggElem*), (cha
6160: 72 20 2a 29 26 70 45 6c 65 6d 29 3b 0a 20 20 20  r *)&pElem);.   
6170: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6180: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6190: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
61a0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
61b0: 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 21 3d 30   pAgg->apFunc!=0
61c0: 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65 41 67   );.      freeAg
61d0: 67 45 6c 65 6d 28 70 45 6c 65 6d 2c 20 70 41 67  gElem(pElem, pAg
61e0: 67 29 3b 0a 20 20 20 20 20 20 72 63 3d 73 71 6c  g);.      rc=sql
61f0: 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
6200: 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d  sr, &res);.    }
6210: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
6220: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6230: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
6240: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ..    sqlite3Btr
6250: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
6260: 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sr);.    sqlite3
6270: 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
6280: 70 41 67 67 2d 3e 70 42 74 72 65 65 2c 20 70 41  pAgg->pBtree, pA
6290: 67 67 2d 3e 6e 54 61 62 29 3b 0a 20 20 7d 65 6c  gg->nTab);.  }el
62a0: 73 65 7b 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  se{ .    /* The 
62b0: 63 75 72 73 6f 72 20 6d 61 79 20 6e 6f 74 20 62  cursor may not b
62c0: 65 20 6f 70 65 6e 20 62 65 63 61 75 73 65 20 74  e open because t
62d0: 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 77 61  he aggregator wa
62e0: 73 20 6e 65 76 65 72 20 75 73 65 64 2c 0a 20 20  s never used,.  
62f0: 20 20 2a 2a 20 6f 72 20 69 74 20 63 6f 75 6c 64    ** or it could
6300: 20 62 65 20 74 68 61 74 20 69 74 20 77 61 73 20   be that it was 
6310: 75 73 65 64 20 62 75 74 20 74 68 65 72 65 20 77  used but there w
6320: 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
6330: 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
6340: 20 20 69 66 28 20 70 41 67 67 2d 3e 70 43 75 72    if( pAgg->pCur
6350: 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 66 72  rent ){.      fr
6360: 65 65 41 67 67 45 6c 65 6d 28 70 41 67 67 2d 3e  eeAggElem(pAgg->
6370: 70 43 75 72 72 65 6e 74 2c 20 70 41 67 67 29 3b  pCurrent, pAgg);
6380: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6390: 20 49 66 20 64 62 20 69 73 20 6e 6f 74 20 4e 55   If db is not NU
63a0: 4c 4c 20 61 6e 64 20 77 65 20 68 61 76 65 20 6e  LL and we have n
63b0: 6f 74 20 79 65 74 20 61 6e 64 20 77 65 20 68 61  ot yet and we ha
63c0: 76 65 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 65  ve not yet opene
63d0: 64 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f  d.  ** the tempo
63e0: 72 61 72 79 20 62 74 72 65 65 20 74 68 65 6e 20  rary btree then 
63f0: 64 6f 20 73 6f 20 61 6e 64 20 63 72 65 61 74 65  do so and create
6400: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 73 74   the table to st
6410: 6f 72 65 20 61 67 67 72 65 67 61 74 65 0a 20 20  ore aggregate.  
6420: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  ** information..
6430: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 64 62 20    **.  ** If db 
6440: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 6c  is NULL, then cl
6450: 6f 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ose the temporar
6460: 79 20 62 74 72 65 65 20 69 66 20 69 74 20 69 73  y btree if it is
6470: 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   open..  */.  if
6480: 28 20 64 62 20 29 7b 0a 20 20 20 20 69 66 28 20  ( db ){.    if( 
6490: 21 70 41 67 67 2d 3e 70 42 74 72 65 65 20 29 7b  !pAgg->pBtree ){
64a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
64b0: 41 67 67 2d 3e 6e 54 61 62 3d 3d 30 20 29 3b 0a  Agg->nTab==0 );.
64c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
64d0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
64e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
64f0: 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
6500: 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 30 2c 20 54  ":memory:", 0, T
6510: 45 4d 50 5f 50 41 47 45 53 2c 20 26 70 41 67 67  EMP_PAGES, &pAgg
6520: 2d 3e 70 42 74 72 65 65 29 3b 0a 23 65 6c 73 65  ->pBtree);.#else
6530: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6540: 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28  te3BtreeFactory(
6550: 64 62 2c 20 30 2c 20 30 2c 20 54 45 4d 50 5f 50  db, 0, 0, TEMP_P
6560: 41 47 45 53 2c 20 26 70 41 67 67 2d 3e 70 42 74  AGES, &pAgg->pBt
6570: 72 65 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ree);.#endif.   
6580: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6590: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
65a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
65b0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
65c0: 41 67 67 2d 3e 70 42 74 72 65 65 2c 20 31 29 3b  Agg->pBtree, 1);
65d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
65e0: 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
65f0: 62 6c 65 28 70 41 67 67 2d 3e 70 42 74 72 65 65  ble(pAgg->pBtree
6600: 2c 20 26 70 41 67 67 2d 3e 6e 54 61 62 2c 20 30  , &pAgg->nTab, 0
6610: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
6620: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
6630: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
6640: 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e    assert( pAgg->
6650: 6e 54 61 62 21 3d 30 20 29 3b 0a 0a 20 20 20 20  nTab!=0 );..    
6660: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6670: 65 43 75 72 73 6f 72 28 70 41 67 67 2d 3e 70 42  eCursor(pAgg->pB
6680: 74 72 65 65 2c 20 70 41 67 67 2d 3e 6e 54 61 62  tree, pAgg->nTab
6690: 2c 20 31 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  , 1,.        sql
66a0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
66b0: 6d 70 61 72 65 2c 20 70 4b 65 79 49 6e 66 6f 2c  mpare, pKeyInfo,
66c0: 20 26 70 41 67 67 2d 3e 70 43 73 72 29 3b 0a 20   &pAgg->pCsr);. 
66d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
66e0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
66f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
6700: 66 28 20 70 41 67 67 2d 3e 70 42 74 72 65 65 20  f( pAgg->pBtree 
6710: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6720: 42 74 72 65 65 43 6c 6f 73 65 28 70 41 67 67 2d  BtreeClose(pAgg-
6730: 3e 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20  >pBtree);.      
6740: 70 41 67 67 2d 3e 70 42 74 72 65 65 20 3d 20 30  pAgg->pBtree = 0
6750: 3b 0a 20 20 20 20 20 20 70 41 67 67 2d 3e 6e 54  ;.      pAgg->nT
6760: 61 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ab = 0;.    }.  
6770: 20 20 70 41 67 67 2d 3e 70 43 73 72 20 3d 20 30    pAgg->pCsr = 0
6780: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 67  ;.  }..  if( pAg
6790: 67 2d 3e 61 70 46 75 6e 63 20 29 7b 20 0a 20 20  g->apFunc ){ .  
67a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 41 67    sqliteFree(pAg
67b0: 67 2d 3e 61 70 46 75 6e 63 29 3b 0a 20 20 20 20  g->apFunc);.    
67c0: 70 41 67 67 2d 3e 61 70 46 75 6e 63 20 3d 20 30  pAgg->apFunc = 0
67d0: 3b 0a 20 20 7d 0a 20 20 70 41 67 67 2d 3e 70 43  ;.  }.  pAgg->pC
67e0: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 70 41  urrent = 0;.  pA
67f0: 67 67 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20  gg->nMem = 0;.  
6800: 70 41 67 67 2d 3e 73 65 61 72 63 68 69 6e 67 20  pAgg->searching 
6810: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
6820: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6830: 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
6840: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
6850: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
6860: 68 61 74 20 63 75 72 73 6f 72 20 68 61 70 70 65  hat cursor happe
6870: 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ns.** to hold..*
6880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6890: 62 65 46 72 65 65 43 75 72 73 6f 72 28 43 75 72  beFreeCursor(Cur
68a0: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
68b0: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
68c0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
68d0: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pCx->pCursor ){
68e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
68f0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
6900: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
6910: 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29    if( pCx->pBt )
6920: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
6930: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
6940: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
6950: 72 65 65 28 70 43 78 2d 3e 70 44 61 74 61 29 3b  ree(pCx->pData);
6960: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43  .  sqliteFree(pC
6970: 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73 71 6c  x->aType);.  sql
6980: 69 74 65 46 72 65 65 28 70 43 78 29 3b 0a 7d 0a  iteFree(pCx);.}.
6990: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
69a0: 20 63 75 72 73 6f 72 73 0a 2a 2f 0a 73 74 61 74   cursors.*/.stat
69b0: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
69c0: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
69d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
69e0: 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72   p->apCsr==0 ) r
69f0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
6a00: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
6a10: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
6a20: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
6a30: 70 2d 3e 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  p->apCsr[i]);.  
6a40: 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20    p->apCsr[i] = 
6a50: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
6a60: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
6a70: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
6a80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6a90: 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  ine will automat
6aa0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79  ically close any
6ab0: 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c   cursors, lists,
6ac0: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65   and/or.** sorte
6ad0: 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66  rs that were lef
6ae0: 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f  t open.  It also
6af0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c   deletes the val
6b00: 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62  ues of.** variab
6b10: 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b  les in the aVar[
6b20: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
6b30: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
6b40: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
6b50: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61  i;.  if( p->aSta
6b60: 63 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  ck ){.    releas
6b70: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53 74  eMemArray(p->aSt
6b80: 61 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54 6f  ack, 1 + (p->pTo
6b90: 73 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29 3b  s - p->aStack));
6ba0: 0a 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26  .    p->pTos = &
6bb0: 70 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20  p->aStack[-1];. 
6bc0: 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72   }.  closeAllCur
6bd0: 73 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c 65 61  sors(p);.  relea
6be0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d  seMemArray(p->aM
6bf0: 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  em, p->nMem);.  
6c00: 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43  sqlite3VdbeFifoC
6c10: 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b  lear(&p->sFifo);
6c20: 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78  .  if( p->contex
6c30: 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  tStack ){.    fo
6c40: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74  r(i=0; i<p->cont
6c50: 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b  extStackTop; i++
6c60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6c70: 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70  VdbeFifoClear(&p
6c80: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69  ->contextStack[i
6c90: 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a  ].sFifo);.    }.
6ca0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
6cb0: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b  ->contextStack);
6cc0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
6cd0: 62 65 53 6f 72 74 65 72 52 65 73 65 74 28 70 29  beSorterReset(p)
6ce0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6cf0: 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
6d00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 67 67    sqlite3VdbeAgg
6d10: 52 65 73 65 74 28 30 2c 20 26 70 2d 3e 61 70 41  Reset(0, &p->apA
6d20: 67 67 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20  gg[i], 0);.  }. 
6d30: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
6d40: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65   = 0;.  p->conte
6d50: 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20 30  xtStackDepth = 0
6d60: 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ;.  p->contextSt
6d70: 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71  ackTop = 0;.  sq
6d80: 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72  liteFree(p->zErr
6d90: 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
6da0: 73 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sg = 0;.}../*.**
6db0: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
6dc0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
6dd0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
6de0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
6df0: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
6e00: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
6e10: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
6e20: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
6e30: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
6e40: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
6e50: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
6e60: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
6e70: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
6e80: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
6e90: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
6ea0: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
6eb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6ec0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
6ed0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
6ee0: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
6ef0: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
6f00: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   n;.  assert( 0=
6f10: 3d 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  =p->nResColumn )
6f20: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
6f30: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a  n = nResColumn;.
6f40: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
6f50: 2a 32 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  *2;.  p->aColNam
6f60: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
6f70: 4d 65 6d 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  Mem*)sqliteMallo
6f80: 63 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  c( sizeof(Mem)*n
6f90: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
6fa0: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
6fb0: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
6fc0: 3e 20 30 20 29 7b 0a 20 20 20 20 28 70 43 6f 6c  > 0 ){.    (pCol
6fd0: 4e 61 6d 65 2b 2b 29 2d 3e 66 6c 61 67 73 20 3d  Name++)->flags =
6fe0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d   MEM_Null;.  }.}
6ff0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
7000: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
7010: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
7020: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
7030: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
7040: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
7050: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
7060: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
7070: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
7080: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
7090: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
70a0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
70b0: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
70c0: 2a 20 49 66 20 4e 3d 3d 50 33 5f 53 54 41 54 49  * If N==P3_STATI
70d0: 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  C  it means that
70e0: 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69 6e   zName is a poin
70f0: 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e  ter to a constan
7100: 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72 69  t static.** stri
7110: 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a 75  ng and we can ju
7120: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
7130: 74 65 72 2e 20 49 66 20 69 74 20 69 73 20 50 33  ter. If it is P3
7140: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a  _DYNAMIC, then .
7150: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
7160: 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c   freed using sql
7170: 69 74 65 46 72 65 65 28 29 20 77 68 65 6e 20 74  iteFree() when t
7180: 68 65 20 76 64 62 65 20 69 73 20 66 69 6e 69 73  he vdbe is finis
7190: 68 65 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20  hed with.** it. 
71a0: 4f 74 68 65 72 77 69 73 65 2c 20 4e 20 62 79 74  Otherwise, N byt
71b0: 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20  es of zName are 
71c0: 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  copied..*/.int s
71d0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
71e0: 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Name(Vdbe *p, in
71f0: 74 20 69 64 78 2c 20 63 6f 6e 73 74 20 63 68 61  t idx, const cha
7200: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29  r *zName, int N)
7210: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
7220: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
7230: 73 73 65 72 74 28 20 69 64 78 3c 28 32 2a 70 2d  ssert( idx<(2*p-
7240: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 29 20 29 3b 0a  >nResColumn) );.
7250: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61    if( sqlite3_ma
7260: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
7270: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
7280: 4d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  M;.  assert( p->
7290: 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  aColName!=0 );. 
72a0: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d   pColName = &(p-
72b0: 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 5d 29 3b  >aColName[idx]);
72c0: 0a 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 59 4e  .  if( N==P3_DYN
72d0: 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54  AMIC || N==P3_ST
72e0: 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20 3d  ATIC ){.    rc =
72f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
7300: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
7310: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
7320: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
7330: 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  TATIC);.  }else{
7340: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7350: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
7360: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
7370: 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 53  N, SQLITE_UTF8,S
7380: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
7390: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
73a0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d  SQLITE_OK && N==
73b0: 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  P3_DYNAMIC ){.  
73c0: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67    pColName->flag
73d0: 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66  s = (pColName->f
73e0: 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69  lags&(~MEM_Stati
73f0: 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20  c))|MEM_Dyn;.   
7400: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20   pColName->xDel 
7410: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
7420: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
7430: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
7440: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
7450: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
7460: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
7470: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
7480: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
7490: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
74a0: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
74b0: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
74c0: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
74d0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
74e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
74f0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
7500: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
7510: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
7520: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
7530: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
7540: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
7550: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
7560: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
7570: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
7580: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
7590: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
75a0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
75b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
75c0: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
75d0: 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
75e0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
75f0: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
7600: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
7610: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
7620: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
7630: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
7640: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
7650: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
7660: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
7670: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7680: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
7690: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
76a0: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
76b0: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
76c0: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
76d0: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
76e0: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
76f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
7700: 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74      sqlite3Safet
7710: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
7720: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
7730: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
7740: 69 74 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  itArg);.    sqli
7750: 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b  te3SafetyOn(db);
7760: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
7770: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7780: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
7790: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
77a0: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
77b0: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
77c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
77d0: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
77e0: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
77f0: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
7800: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
7810: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
7820: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
7830: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
7840: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
7850: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
7860: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
7870: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
7880: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
7890: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
78a0: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
78b0: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e  ase is :memory:.
78c0: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 77    In that case w
78d0: 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75  e do.  ** not su
78e0: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
78f0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
7900: 20 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d 70   so use the simp
7910: 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20 2a  le case then.  *
7920: 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  * too..  */.  if
7930: 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69  ( 0==strlen(sqli
7940: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
7950: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
7960: 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  Bt)) || nTrans<=
7970: 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  1 ){.    for(i=0
7980: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
7990: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
79a0: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
79b0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
79c0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
79d0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
79e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
79f0: 65 65 53 79 6e 63 28 70 42 74 2c 20 30 29 3b 0a  eeSync(pBt, 0);.
7a00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
7a10: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
7a20: 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
7a30: 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
7a40: 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 20 2a 2f  sfully synced */
7a50: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7a60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7a70: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
7a80: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
7a90: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
7aa0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
7ab0: 20 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29         if( pBt )
7ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
7ad0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70  te3BtreeCommit(p
7ae0: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
7af0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7b00: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  /* The compl
7b10: 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20  ex case - There 
7b20: 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  is a multi-file 
7b30: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
7b40: 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54  n active..  ** T
7b50: 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d  his requires a m
7b60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7b70: 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  le to ensure the
7b80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
7b90: 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61    ** committed a
7ba0: 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69  tomicly..  */.#i
7bb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7bc0: 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
7bd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
7be0: 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
7bf0: 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
7c00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
7c10: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
7c20: 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
7c30: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
7c40: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
7c50: 70 42 74 29 3b 0a 20 20 20 20 4f 73 46 69 6c 65  pBt);.    OsFile
7c60: 20 6d 61 73 74 65 72 3b 0a 0a 20 20 20 20 2f 2a   master;..    /*
7c70: 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
7c80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
7c90: 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20  me */.    do {. 
7ca0: 20 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b       u32 random;
7cb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7cc0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
7cd0: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
7ce0: 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f  ess(sizeof(rando
7cf0: 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20  m), &random);.  
7d00: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71      zMaster = sq
7d10: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73  lite3MPrintf("%s
7d20: 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46  -mj%08X", zMainF
7d30: 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66  ile, random&0x7f
7d40: 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69  ffffff);.      i
7d50: 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20  f( !zMaster ){. 
7d60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
7d70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7d80: 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
7d90: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
7da0: 73 74 73 28 7a 4d 61 73 74 65 72 29 20 29 3b 0a  sts(zMaster) );.
7db0: 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
7dc0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
7dd0: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
7de0: 6d 61 73 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  master, 0, sizeo
7df0: 66 28 6d 61 73 74 65 72 29 29 3b 0a 20 20 20 20  f(master));.    
7e00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
7e10: 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 4d 61 73  enExclusive(zMas
7e20: 74 65 72 2c 20 26 6d 61 73 74 65 72 2c 20 30 29  ter, &master, 0)
7e30: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
7e40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7e50: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
7e60: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
7e70: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
7e80: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
7e90: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
7ea0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
7eb0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
7ec0: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
7ed0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
7ee0: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
7ef0: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
7f00: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
7f10: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
7f20: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7f30: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
7f40: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
7f50: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
7f60: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
7f70: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
7f80: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
7f90: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
7fa0: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
7fb0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
7fc0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
7fd0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
7fe0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
7ff0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
8000: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
8010: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
8020: 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e    if( i==1 ) con
8030: 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f  tinue;   /* Igno
8040: 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
8050: 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  base */.      if
8060: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
8070: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
8080: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
8090: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
80a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
80b0: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
80c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
80d0: 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f  zFile[0]==0 ) co
80e0: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
80f0: 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  re :memory: data
8100: 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
8110: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
8120: 72 69 74 65 28 26 6d 61 73 74 65 72 2c 20 7a 46  rite(&master, zF
8130: 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c  ile, strlen(zFil
8140: 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69  e)+1);.        i
8150: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8160: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
8170: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
8180: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
8190: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
81a0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
81b0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
81c0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
81d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
81e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
81f0: 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20  .    }...    /* 
8200: 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
8210: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 42 65  journal file. Be
8220: 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
8230: 20 6f 70 65 6e 20 74 68 65 20 64 69 72 65 63 74   open the direct
8240: 6f 72 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d  ory.    ** the m
8250: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8260: 6c 65 20 69 73 20 73 74 6f 72 65 20 69 6e 20 73  le is store in s
8270: 6f 20 74 68 61 74 20 69 74 20 67 65 74 73 20 73  o that it gets s
8280: 79 6e 63 65 64 20 74 6f 6f 2e 0a 20 20 20 20 2a  ynced too..    *
8290: 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20  /.    zMainFile 
82a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
82b0: 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62  tDirname(db->aDb
82c0: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 72 63  [0].pBt);.    rc
82d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
82e0: 44 69 72 65 63 74 6f 72 79 28 7a 4d 61 69 6e 46  Directory(zMainF
82f0: 69 6c 65 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20  ile, &master);. 
8300: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8310: 45 5f 4f 4b 20 7c 7c 20 28 72 63 20 3d 20 73 71  E_OK || (rc = sq
8320: 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 6d 61 73  lite3OsSync(&mas
8330: 74 65 72 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ter))!=SQLITE_OK
8340: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8350: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72  3OsClose(&master
8360: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8370: 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72  OsDelete(zMaster
8380: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
8390: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
83a0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
83b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
83c0: 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
83d0: 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
83e0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
83f0: 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
8400: 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
8410: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
8420: 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
8430: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
8440: 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
8450: 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
8460: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
8470: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8480: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
8490: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
84a0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
84b0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
84c0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  to sqlite3BtreeS
84d0: 79 6e 63 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68  ync(),.    ** th
84e0: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
84f0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6d 61  ance that the ma
8500: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8510: 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  e will be.    **
8520: 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
8530: 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
8540: 69 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  it, in case the 
8550: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
8560: 20 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 20     ** file name 
8570: 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
8580: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8590: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
85a0: 6c 75 72 65 0a 20 20 20 20 2a 2a 20 6f 63 63 75  lure.    ** occu
85b0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
85c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
85d0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
85e0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
85f0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
8600: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
8610: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
8620: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
8630: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8640: 33 42 74 72 65 65 53 79 6e 63 28 70 42 74 2c 20  3BtreeSync(pBt, 
8650: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
8660: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8670: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
8680: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
8690: 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  &master);.      
86a0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
86b0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
86c0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
86d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
86e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
86f0: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72  3OsClose(&master
8700: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74  );..    /* Delet
8710: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
8720: 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
8730: 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e  commits the tran
8740: 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20  saction. After. 
8750: 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73     ** doing this
8760: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
8770: 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62  s synced again b
8780: 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69  efore any indivi
8790: 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e  dual.    ** tran
87a0: 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72  saction files ar
87b0: 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  e deleted..    *
87c0: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
87d0: 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74  e3OsDelete(zMast
87e0: 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
87f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8800: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
8810: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a  (zMaster);.    z
8820: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
8830: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
8840: 6e 63 44 69 72 65 63 74 6f 72 79 28 7a 4d 61 69  ncDirectory(zMai
8850: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
8860: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8870: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
8880: 73 20 6e 6f 74 20 67 6f 6f 64 2e 20 54 68 65 20  s not good. The 
8890: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
88a0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 64 65 6c  ile has been del
88b0: 65 74 65 64 2c 20 62 75 74 0a 20 20 20 20 20 20  eted, but.      
88c0: 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
88d0: 20 73 79 6e 63 20 66 61 69 6c 65 64 2e 20 54 68   sync failed. Th
88e0: 65 72 65 20 69 73 20 6e 6f 20 63 6f 6d 70 6c 65  ere is no comple
88f0: 74 65 6c 79 20 73 61 66 65 20 63 6f 75 72 73 65  tely safe course
8900: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   of.      ** act
8910: 69 6f 6e 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ion from here. T
8920: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
8930: 75 72 6e 61 6c 73 20 63 6f 6e 74 61 69 6e 20 74  urnals contain t
8940: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 20  he name of the. 
8950: 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a       ** master j
8960: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 62 75 74  ournal file, but
8970: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
8980: 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 69 66 20 74   of knowing if t
8990: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73  hat.      ** mas
89a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
89b0: 74 73 20 6e 6f 77 20 6f 72 20 69 66 20 69 74 20  ts now or if it 
89c0: 77 69 6c 6c 20 65 78 69 73 74 20 61 66 74 65 72  will exist after
89d0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20   the operating. 
89e0: 20 20 20 20 20 2a 2a 20 73 79 73 74 65 6d 20 63       ** system c
89f0: 72 61 73 68 20 74 68 61 74 20 6d 61 79 20 66 6f  rash that may fo
8a00: 6c 6c 6f 77 20 74 68 65 20 66 73 79 6e 63 28 29  llow the fsync()
8a10: 20 66 61 69 6c 75 72 65 2e 0a 20 20 20 20 20 20   failure..      
8a20: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
8a30: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
8a40: 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
8a50: 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
8a60: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
8a70: 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
8a80: 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
8a90: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
8aa0: 72 65 65 43 6f 6d 6d 69 74 28 29 20 61 72 65 20  reeCommit() are 
8ab0: 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
8ac0: 65 73 20 61 6e 64 20 64 65 6c 65 74 69 6e 67 0a  es and deleting.
8ad0: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e      ** journals.
8ae0: 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   If something go
8af0: 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 20 74  es wrong while t
8b00: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
8b10: 20 77 65 20 64 6f 6e 27 74 0a 20 20 20 20 2a 2a   we don't.    **
8b20: 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68   really care. Th
8b30: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
8b40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
8b50: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
8b60: 74 65 65 64 2c 0a 20 20 20 20 2a 2a 20 62 75 74  teed,.    ** but
8b70: 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c   some stray 'col
8b80: 64 27 20 6a 6f 75 72 6e 61 6c 73 20 6d 61 79 20  d' journals may 
8b90: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
8ba0: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 0a 20 20   Returning an.  
8bb0: 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20    ** error code 
8bc0: 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65  won't help matte
8bd0: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
8be0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
8bf0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
8c00: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
8c10: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
8c20: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
8c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
8c40: 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  eeCommit(pBt);. 
8c50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8c60: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
8c70: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
8c80: 69 6e 64 20 65 76 65 72 79 20 61 63 74 69 76 65  ind every active
8c90: 20 56 4d 20 6f 74 68 65 72 20 74 68 61 6e 20 70   VM other than p
8ca0: 56 64 62 65 20 61 6e 64 20 63 68 61 6e 67 65 20  Vdbe and change 
8cb0: 69 74 73 20 73 74 61 74 75 73 20 74 6f 0a 2a 2a  its status to.**
8cc0: 20 61 62 6f 72 74 65 64 2e 20 20 54 68 69 73 20   aborted.  This 
8cd0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 6f 6e 65  happens when one
8ce0: 20 56 4d 20 63 61 75 73 65 73 20 61 20 72 6f 6c   VM causes a rol
8cf0: 6c 62 61 63 6b 20 64 75 65 20 74 6f 20 61 6e 0a  lback due to an.
8d00: 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52  ** ON CONFLICT R
8d10: 4f 4c 4c 42 41 43 4b 20 63 6c 61 75 73 65 20 28  OLLBACK clause (
8d20: 66 6f 72 20 65 78 61 6d 70 6c 65 29 2e 20 20 54  for example).  T
8d30: 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73  he other VMs mus
8d40: 74 20 62 65 0a 2a 2a 20 61 62 6f 72 74 65 64 20  t be.** aborted 
8d50: 73 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f 20  so that they do 
8d60: 6e 6f 74 20 68 61 76 65 20 64 61 74 61 20 72 6f  not have data ro
8d70: 6c 6c 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  lled out from un
8d80: 64 65 72 6e 65 61 74 68 0a 2a 2a 20 74 68 65 6d  derneath.** them
8d90: 20 6c 65 61 64 69 6e 67 20 74 6f 20 61 20 73 65   leading to a se
8da0: 67 66 61 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  gfault..*/.stati
8db0: 63 20 76 6f 69 64 20 61 62 6f 72 74 4f 74 68 65  c void abortOthe
8dc0: 72 41 63 74 69 76 65 56 64 62 65 73 28 56 64 62  rActiveVdbes(Vdb
8dd0: 65 20 2a 70 56 64 62 65 29 7b 0a 20 20 56 64 62  e *pVdbe){.  Vdb
8de0: 65 20 2a 70 4f 74 68 65 72 3b 0a 20 20 66 6f 72  e *pOther;.  for
8df0: 28 70 4f 74 68 65 72 3d 70 56 64 62 65 2d 3e 64  (pOther=pVdbe->d
8e00: 62 2d 3e 70 56 64 62 65 3b 20 70 4f 74 68 65 72  b->pVdbe; pOther
8e10: 3b 20 70 4f 74 68 65 72 3d 70 4f 74 68 65 72 2d  ; pOther=pOther-
8e20: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
8e30: 20 70 4f 74 68 65 72 3d 3d 70 56 64 62 65 20 29   pOther==pVdbe )
8e40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
8e50: 66 28 20 70 4f 74 68 65 72 2d 3e 6d 61 67 69 63  f( pOther->magic
8e60: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
8e70: 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 63 3c 30   || pOther->pc<0
8e80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8e90: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
8ea0: 28 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 70 4f  (pOther);.    pO
8eb0: 74 68 65 72 2d 3e 61 62 6f 72 74 65 64 20 3d 20  ther->aborted = 
8ec0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  1;.  }.}../* .**
8ed0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
8ee0: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
8ef0: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65  lite3.activeVdbe
8f00: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62  Cnt count variab
8f10: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
8f20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
8f30: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
8f40: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
8f50: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
8f60: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
8f70: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
8f80: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
8f90: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
8fa0: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
8fb0: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
8fc0: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
8fd0: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
8fe0: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
8ff0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9000: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
9010: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
9020: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
9030: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
9040: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
9050: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
9060: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
9070: 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  t = 0;.  p = db-
9080: 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
9090: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
90a0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
90b0: 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e  IC_RUN && p->pc>
90c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  =0 ){.      cnt+
90d0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
90e0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
90f0: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
9100: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
9110: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
9120: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
9130: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
9140: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9150: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
9160: 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
9170: 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
9180: 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
9190: 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
91a0: 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
91b0: 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
91c0: 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
91d0: 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
91e0: 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
91f0: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
9200: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
9210: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
9220: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
9230: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
9240: 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
9250: 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
9260: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
9270: 54 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T..**.** Return 
9280: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
9290: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
92a0: 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
92b0: 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
92c0: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
92d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
92e0: 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
92f0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
9300: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
9310: 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
9320: 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
9330: 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
9340: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
9350: 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
9360: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9370: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b   p->db;.  int i;
9380: 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  .  int (*xFunc)(
9390: 42 74 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b  Btree *pBt) = 0;
93a0: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f    /* Function to
93b0: 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74   call on each bt
93c0: 72 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 0a  ree backend */..
93d0: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
93e0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
93f0: 7b 0a 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79  {.    /* Already
9400: 20 68 61 6c 74 65 64 2e 20 20 4e 6f 74 68 69 6e   halted.  Nothin
9410: 67 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 20 20  g to do. */.    
9420: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
9430: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
9440: 54 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T );.    return 
9450: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9460: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
9470: 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  (p);.  checkActi
9480: 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20  veVdbeCnt(db);. 
9490: 20 69 66 28 20 70 2d 3e 70 63 3c 30 20 29 7b 0a   if( p->pc<0 ){.
94a0: 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74      /* No commit
94b0: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
94c0: 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72  ded if the progr
94d0: 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64  am never started
94e0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
94f0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26  db->autoCommit &
9500: 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  & db->activeVdbe
9510: 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66  Cnt==1 ){.    if
9520: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
9530: 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
9540: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
9550: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75  .      /* The au
9560: 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
9570: 73 20 74 72 75 65 2c 20 74 68 65 72 65 20 61 72  s true, there ar
9580: 65 20 6e 6f 20 6f 74 68 65 72 20 61 63 74 69 76  e no other activ
9590: 65 20 71 75 65 72 69 65 73 0a 20 20 20 20 20 20  e queries.      
95a0: 2a 2a 20 75 73 69 6e 67 20 74 68 69 73 20 68 61  ** using this ha
95b0: 6e 64 6c 65 20 61 6e 64 20 74 68 65 20 76 64 62  ndle and the vdb
95c0: 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75  e program was su
95d0: 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20  ccessful or hit 
95e0: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 27 4f 52 20  an.      ** 'OR 
95f0: 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
9600: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
9610: 6f 6d 6d 69 74 20 69 73 20 72 65 71 75 69 72 65  ommit is require
9620: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
9630: 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43    int rc = vdbeC
9640: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20  ommit(db);.     
9650: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9660: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
9670: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
9680: 53 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SY;.      }else 
9690: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
96a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  K ){.        p->
96b0: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
96c0: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
96d0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 3b 0a 20  BtreeRollback;. 
96e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
96f0: 7b 0a 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20  {.      xFunc = 
9700: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
9710: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  back;.    }.  }e
9720: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  lse{.    if( p->
9730: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
9740: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
9750: 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
9760: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
9770: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
9780: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9790: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
97a0: 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
97b0: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
97c0: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
97d0: 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  mt;.    }else{. 
97e0: 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c       xFunc = sql
97f0: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
9800: 6b 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74  k;.      db->aut
9810: 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
9820: 20 20 20 61 62 6f 72 74 4f 74 68 65 72 41 63 74     abortOtherAct
9830: 69 76 65 56 64 62 65 73 28 70 29 3b 0a 20 20 20  iveVdbes(p);.   
9840: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
9850: 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c  xFunc is not NUL
9860: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e  L, then it is on
9870: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
9880: 65 52 6f 6c 6c 62 61 63 6b 2c 0a 20 20 2a 2a 20  eRollback,.  ** 
9890: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
98a0: 62 61 63 6b 53 74 6d 74 20 6f 72 20 73 71 6c 69  backStmt or sqli
98b0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
98c0: 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65  mt. Call it once
98d0: 20 6f 6e 0a 20 20 2a 2a 20 65 61 63 68 20 62 61   on.  ** each ba
98e0: 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65 72 72  ckend. If an err
98f0: 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  or occurs and th
9900: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
9910: 20 73 74 69 6c 6c 0a 20 20 2a 2a 20 53 51 4c 49   still.  ** SQLI
9920: 54 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20 72  TE_OK, set the r
9930: 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 74 68  eturn code to th
9940: 65 20 6e 65 77 20 65 72 72 6f 72 20 76 61 6c 75  e new error valu
9950: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
9960: 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62  0; xFunc && i<db
9970: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
9980: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
9990: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
99a0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
99b0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
99c0: 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b  rc = xFunc(pBt);
99d0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
99e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d  ==SQLITE_OK ) p-
99f0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a  >rc = rc;.    }.
9a00: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
9a10: 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
9a20: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
9a30: 45 2c 20 73 65 74 20 74 68 65 20 63 68 61 6e 67  E, set the chang
9a40: 65 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20  e counter. */.  
9a50: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
9a60: 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  On && p->pc>=0 )
9a70: 7b 0a 20 20 20 20 69 66 28 20 21 78 46 75 6e 63  {.    if( !xFunc
9a80: 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74   || xFunc==sqlit
9a90: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
9aa0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
9ab0: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
9ac0: 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
9ad0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9ae0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9af0: 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
9b00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 43  .    }.    p->nC
9b10: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  hange = 0;.  }..
9b20: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72    /* Rollback or
9b30: 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65   commit any sche
9b40: 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ma changes that 
9b50: 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 69  occurred. */.  i
9b60: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
9b70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
9b80: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
9b90: 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
9ba0: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66   }else if( db->f
9bb0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
9bc0: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
9bd0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
9be0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
9bf0: 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  db);.  }..  /* W
9c00: 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
9c10: 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
9c20: 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
9c30: 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
9c40: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
9c50: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63  =0 ){.    db->ac
9c60: 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  tiveVdbeCnt--;. 
9c70: 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
9c80: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
9c90: 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
9ca0: 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65  beCnt(db);..  re
9cb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
9cd0: 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
9ce0: 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
9cf0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
9d00: 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
9d10: 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
9d20: 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
9d30: 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
9d40: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
9d50: 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
9d60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
9d70: 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
9d80: 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
9d90: 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
9da0: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
9db0: 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
9dc0: 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
9dd0: 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
9de0: 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
9df0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
9e00: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
9e10: 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
9e20: 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
9e30: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
9e40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9e50: 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
9e60: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p){.  if( p->mag
9e70: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
9e80: 55 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d  UN && p->magic!=
9e90: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
9ea0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9eb0: 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  ror(p->db, SQLIT
9ec0: 45 5f 4d 49 53 55 53 45 2c 20 30 29 3b 0a 20 20  E_MISUSE, 0);.  
9ed0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9ee0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f  MISUSE;.  }..  /
9ef0: 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
9f00: 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
9f10: 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
9f20: 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
9f30: 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
9f40: 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
9f50: 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
9f60: 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
9f70: 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
9f80: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
9f90: 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
9fa0: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
9fb0: 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
9fc0: 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
9fd0: 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
9fe0: 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
9ff0: 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
a000: 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
a010: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
a020: 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
a030: 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
a040: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
a050: 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
a060: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
a070: 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
a080: 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
a090: 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
a0a0: 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
a0b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
a0c0: 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
a0d0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
a0e0: 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
a0f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a100: 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e  Error(p->db, p->
a110: 72 63 2c 20 22 25 73 22 2c 20 70 2d 3e 7a 45 72  rc, "%s", p->zEr
a120: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
a130: 69 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d  iteFree(p->zErrM
a140: 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  sg);.      p->zE
a150: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
a160: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
a170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a180: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72  rror(p->db, p->r
a190: 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, 0);.    }else
a1a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a1b0: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49  rror(p->db, SQLI
a1c0: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
a1d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
a1e0: 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
a1f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
a200: 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
a210: 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
a220: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
a230: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
a240: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
a250: 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
a260: 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
a270: 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
a280: 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
a290: 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
a2a0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
a2b0: 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
a2c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70    sqlite3Error(p
a2d0: 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  ->db, p->rc, 0);
a2e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
a2f0: 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
a300: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
a310: 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
a320: 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
a330: 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
a340: 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
a350: 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  E run..  */.  as
a360: 73 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70  sert( p->pTos<&p
a370: 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30  ->aStack[p->pc<0
a380: 3f 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 73 71 6c  ?0:p->pc] || sql
a390: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
a3a0: 65 64 3d 3d 31 20 29 3b 0a 23 69 66 64 65 66 20  ed==1 );.#ifdef 
a3b0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
a3c0: 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
a3d0: 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
a3e0: 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
a3f0: 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
a400: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
a410: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
a420: 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
a430: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
a440: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
a450: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
a460: 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
a470: 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
a480: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
a490: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
a4a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
a4b0: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
a4c0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
a4d0: 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
a4e0: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
a4f0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
a500: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
a510: 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
a520: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
a530: 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
a540: 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
a550: 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
a560: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
a570: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
a580: 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
a590: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
a5a0: 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
a5b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
a5c0: 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
a5d0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
a5e0: 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30    p->aborted = 0
a5f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
a600: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 29 7b 0a  QLITE_SCHEMA ){.
a610: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
a620: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 70  InternalSchema(p
a630: 2d 3e 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ->db, 0);.  }.  
a640: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
a650: 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
a660: 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
a670: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
a680: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
a690: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
a6a0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
a6b0: 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
a6c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
a6d0: 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
a6e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a6f0: 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
a700: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
a710: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
a720: 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
a730: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
a740: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
a750: 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
a760: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
a770: 65 52 65 73 65 74 28 70 29 3b 0a 20 20 7d 65 6c  eReset(p);.  }el
a780: 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  se if( p->magic!
a790: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
a7a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a7b0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
a7c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
a7d0: 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
a7e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a7f0: 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  Call the destruc
a800: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78  tor for each aux
a810: 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56  data entry in pV
a820: 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63  dbeFunc for whic
a830: 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70  h.** the corresp
a840: 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61  onding bit in ma
a850: 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75  sk is clear.  Au
a860: 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65  xdata entries be
a870: 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61  yond 31.** are a
a880: 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e  lways destroyed.
a890: 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c    To destroy all
a8a0: 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   auxdata entries
a8b0: 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  , call this.** r
a8c0: 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b  outine with mask
a8d0: 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ==0..*/.void sql
a8e0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
a8f0: 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a  xData(VdbeFunc *
a900: 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d  pVdbeFunc, int m
a910: 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
a920: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62   for(i=0; i<pVdb
a930: 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b  eFunc->nAux; i++
a940: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75  ){.    struct Au
a950: 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70  xData *pAux = &p
a960: 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b  VdbeFunc->apAux[
a970: 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33  i];.    if( (i>3
a980: 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c  1 || !(mask&(1<<
a990: 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41  i))) && pAux->pA
a9a0: 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ux ){.      if( 
a9b0: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
a9c0: 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
a9d0: 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
a9e0: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
a9f0: 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30    pAux->pAux = 0
aa00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
aa10: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
aa20: 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
aa30: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
aa40: 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
aa50: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
aa60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
aa70: 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66  Cleanup(p);.  if
aa80: 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
aa90: 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
aaa0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
aab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
aac0: 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d  t( p->db->pVdbe=
aad0: 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d  =p );.    p->db-
aae0: 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
aaf0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
ab00: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
ab10: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
ab20: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
ab30: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
ab40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
ab50: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
ab60: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
ab70: 70 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  p[i];.      if( 
ab80: 70 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f  pOp->p3type==P3_
ab90: 44 59 4e 41 4d 49 43 20 7c 7c 20 70 4f 70 2d 3e  DYNAMIC || pOp->
aba0: 70 33 74 79 70 65 3d 3d 50 33 5f 4b 45 59 49 4e  p3type==P3_KEYIN
abb0: 46 4f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  FO ){.        sq
abc0: 6c 69 74 65 46 72 65 65 28 70 4f 70 2d 3e 70 33  liteFree(pOp->p3
abd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
abe0: 20 69 66 28 20 70 4f 70 2d 3e 70 33 74 79 70 65   if( pOp->p3type
abf0: 3d 3d 50 33 5f 56 44 42 45 46 55 4e 43 20 29 7b  ==P3_VDBEFUNC ){
ac00: 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75 6e  .        VdbeFun
ac10: 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28  c *pVdbeFunc = (
ac20: 56 64 62 65 46 75 6e 63 20 2a 29 70 4f 70 2d 3e  VdbeFunc *)pOp->
ac30: 70 33 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p3;.        sqli
ac40: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
ac50: 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20  Data(pVdbeFunc, 
ac60: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
ac70: 74 65 46 72 65 65 28 70 56 64 62 65 46 75 6e 63  teFree(pVdbeFunc
ac80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ac90: 20 69 66 28 20 70 4f 70 2d 3e 70 33 74 79 70 65   if( pOp->p3type
aca0: 3d 3d 50 33 5f 4d 45 4d 20 29 7b 0a 20 20 20 20  ==P3_MEM ){.    
acb0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
acc0: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
acd0: 6c 75 65 2a 29 70 4f 70 2d 3e 70 33 29 3b 0a 20  lue*)pOp->p3);. 
ace0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
acf0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61   sqliteFree(p->a
ad00: 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  Op);.  }.  relea
ad10: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
ad20: 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
ad30: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4c  sqliteFree(p->aL
ad40: 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 46  abel);.  sqliteF
ad50: 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29 3b 0a  ree(p->aStack);.
ad60: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
ad70: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
ad80: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 32 29 3b  ->nResColumn*2);
ad90: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
ada0: 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 70 2d  >aColName);.  p-
adb0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
adc0: 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69  GIC_DEAD;.  sqli
add0: 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  teFree(p);.}../*
ade0: 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20  .** If a MoveTo 
adf0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e  operation is pen
ae00: 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65  ding on the give
ae10: 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64  n cursor, then d
ae20: 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f  o that.** MoveTo
ae30: 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20 61 6e   now.  Return an
ae40: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
ae50: 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70 65   no MoveTo is pe
ae60: 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72  nding, this.** r
ae70: 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68  outine does noth
ae80: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20  ing and returns 
ae90: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
aea0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
aeb0: 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72  sorMoveto(Cursor
aec0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
aed0: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
aee0: 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
aef0: 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
af00: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
af10: 63 6f 75 6e 74 3b 0a 20 20 20 20 61 73 73 65 72  count;.    asser
af20: 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
af30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 54 61  .    if( p->isTa
af40: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ble ){.      rc 
af50: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
af60: 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c  veto(p->pCursor,
af70: 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
af80: 67 65 74 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  get, &res);.    
af90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
afa0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
afb0: 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c  veto(p->pCursor,
afc0: 28 63 68 61 72 2a 29 26 70 2d 3e 6d 6f 76 65 74  (char*)&p->movet
afd0: 6f 54 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20  oTarget,.       
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 36         sizeof(i6
b000: 34 29 2c 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a  4),&res);.    }.
b010: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
b020: 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e  urn rc;.    *p->
b030: 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20  pIncrKey = 0;.  
b040: 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d    p->lastRowid =
b050: 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76   keyToInt(p->mov
b060: 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20  etoTarget);.    
b070: 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  p->rowidIsValid 
b080: 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66  = res==0;.    if
b090: 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
b0a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
b0b0: 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f  eeNext(p->pCurso
b0c0: 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  r, &res);.      
b0d0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
b0e0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rc;.    }.    sq
b0f0: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
b100: 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e 64 65 66  nt++;.    p->def
b110: 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
b120: 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 56 61 6c  .    p->cacheVal
b130: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  id = 0;.  }.  re
b140: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b150: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
b160: 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
b170: 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
b180: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
b190: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
b1a0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
b1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
b1c0: 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69  alRead().** sqli
b1d0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
b1e0: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
b1f0: 65 53 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a  eSerialWrite().*
b200: 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
b210: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
b220: 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
b230: 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
b240: 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
b250: 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
b260: 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
b270: 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
b280: 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
b290: 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
b2a0: 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
b2b0: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
b2c0: 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
b2d0: 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
b2e0: 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
b2f0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
b300: 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
b310: 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
b320: 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
b330: 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
b340: 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
b350: 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
b360: 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
b370: 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
b380: 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
b390: 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
b3a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
b3b0: 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
b3c0: 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
b3d0: 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
b3e0: 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
b3f0: 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
b400: 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
b410: 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
b420: 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
b430: 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  erately..**.** T
b440: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
b450: 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
b460: 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
b470: 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
b480: 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
b490: 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
b4a0: 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
b4b0: 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
b4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
b4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
b4e0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
b4f0: 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b510: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
b520: 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
b540: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
b550: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
b560: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
b570: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
b580: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
b590: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
b5c0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
b5d0: 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
b5f0: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
b600: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
b610: 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
b620: 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
b630: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
b640: 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
b670: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
b680: 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
b690: 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
b6a0: 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
b6b0: 61 74 0a 2a 2a 20 20 20 20 20 38 2d 31 31 20 20  at.**     8-11  
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
b6e0: 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
b6f0: 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
b700: 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
b710: 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
b720: 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
b730: 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
b740: 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
b750: 74 65 78 74 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a 0a 2a  text.**.*/../*.*
b760: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
b770: 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
b780: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
b790: 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71   pMem..*/.u32 sq
b7a0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
b7b0: 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a  ype(Mem *pMem){.
b7c0: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
b7d0: 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 69 66  em->flags;..  if
b7e0: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ( flags&MEM_Null
b7f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
b800: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
b810: 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
b820: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
b830: 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
b840: 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
b850: 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
b860: 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
b870: 28 69 36 34 29 30 78 30 30 30 30 31 30 30 30 29  (i64)0x00001000)
b880: 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
b890: 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20   i = pMem->i;.  
b8a0: 20 20 75 36 34 20 75 20 3d 20 69 3c 30 20 3f 20    u64 u = i<0 ? 
b8b0: 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20  -i : i;.    if( 
b8c0: 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20  u<=127 ) return 
b8d0: 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32  1;.    if( u<=32
b8e0: 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
b8f0: 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
b900: 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
b910: 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
b920: 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
b930: 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
b940: 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
b950: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
b960: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
b970: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
b980: 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
b990: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 53 74  if( flags&MEM_St
b9a0: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  r ){.    int n =
b9b0: 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 61 73   pMem->n;.    as
b9c0: 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
b9d0: 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
b9e0: 2b 20 31 33 29 3b 0a 20 20 7d 0a 20 20 69 66 28  + 13);.  }.  if(
b9f0: 20 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20   flags&MEM_Blob 
ba00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 70  ){.    return (p
ba10: 4d 65 6d 2d 3e 6e 2a 32 20 2b 20 31 32 29 3b 0a  Mem->n*2 + 12);.
ba20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ba30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ba40: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
ba50: 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
ba60: 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
ba70: 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
ba80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ba90: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
baa0: 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
bab0: 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
bac0: 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
bad0: 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
bae0: 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
baf0: 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
bb00: 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
bb10: 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
bb20: 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
bb30: 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
bb40: 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
bb50: 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
bb60: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
bb70: 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
bb80: 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
bb90: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
bba0: 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
bbb0: 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
bbc0: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
bbd0: 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
bbe0: 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
bbf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
bc00: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
bc10: 74 74 65 6e 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  tten..*/ .int sq
bc20: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
bc30: 75 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ut(unsigned char
bc40: 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   *buf, Mem *pMem
bc50: 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
bc60: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
bc70: 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
bc80: 6d 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a  m);.  int len;..
bc90: 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69    /* NULL */.  i
bca0: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
bcb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
bcc0: 30 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 49 6e  0;.  }. .  /* In
bcd0: 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
bce0: 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
bcf0: 79 70 65 3c 3d 37 20 29 7b 0a 20 20 20 20 75 36  ype<=7 ){.    u6
bd00: 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  4 v;.    int i;.
bd10: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
bd20: 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
bd30: 76 20 3d 20 2a 28 75 36 34 2a 29 26 70 4d 65 6d  v = *(u64*)&pMem
bd40: 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ->r;.    }else{.
bd50: 20 20 20 20 20 20 76 20 3d 20 2a 28 75 36 34 2a        v = *(u64*
bd60: 29 26 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 7d  )&pMem->i;.    }
bd70: 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
bd80: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
bd90: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
bda0: 79 70 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ype);.    while(
bdb0: 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75   i-- ){.      bu
bdc0: 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b  f[i] = (v&0xFF);
bdd0: 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
bde0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
bdf0: 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   len;.  }.  .  /
be00: 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
be10: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 65   */.  assert( se
be20: 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 3b  rial_type>=12 );
be30: 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  .  len = sqlite3
be40: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
be50: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
be60: 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
be70: 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 72  em->z, len);.  r
be80: 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a  eturn len;.}../*
be90: 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
bea0: 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
beb0: 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
bec0: 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
bed0: 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
bee0: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
bef0: 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
bf00: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
bf10: 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
bf20: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
bf30: 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
bf40: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
bf50: 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
bf60: 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
bf70: 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
bf80: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bfa0: 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
bfb0: 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
bfc0: 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bfe0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
bff0: 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
c000: 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
c010: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
c020: 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
c030: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
c040: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
c050: 20 63 61 73 65 20 39 3a 20 20 20 20 2f 2a 20 52   case 9:    /* R
c060: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
c070: 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
c080: 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
c090: 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
c0a0: 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
c0b0: 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
c0c0: 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
c0d0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
c0e0: 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20  {  /* NULL */.  
c0f0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
c100: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
c110: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c120: 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
c130: 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
c140: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
c150: 4d 65 6d 2d 3e 69 20 3d 20 28 73 69 67 6e 65 64  Mem->i = (signed
c160: 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20   char)buf[0];.  
c170: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
c180: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
c190: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
c1a0: 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
c1b0: 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
c1c0: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
c1d0: 20 70 4d 65 6d 2d 3e 69 20 3d 20 28 28 28 73 69   pMem->i = (((si
c1e0: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
c1f0: 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
c200: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c210: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
c220: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
c230: 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
c240: 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
c250: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
c260: 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28 28 28     pMem->i = (((
c270: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
c280: 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
c290: 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
c2a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
c2b0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
c2c0: 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
c2d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
c2e0: 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
c2f0: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
c300: 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28 62      pMem->i = (b
c310: 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
c320: 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
c330: 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
c340: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
c350: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
c360: 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
c370: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
c380: 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
c390: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
c3a0: 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28       u64 x = (((
c3b0: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
c3c0: 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
c3d0: 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20  ;.      u32 y = 
c3e0: 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28  (buf[2]<<24) | (
c3f0: 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[3]<<16) | (b
c400: 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[4]<<8) | buf[
c410: 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  5];.      x = (x
c420: 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
c430: 20 70 4d 65 6d 2d 3e 69 20 3d 20 2a 28 69 36 34   pMem->i = *(i64
c440: 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d  *)&x;.      pMem
c450: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
c460: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
c470: 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
c480: 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
c490: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
c4a0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
c4b0: 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
c4c0: 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
c4d0: 20 75 36 34 20 78 20 3d 20 28 62 75 66 5b 30 5d   u64 x = (buf[0]
c4e0: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
c4f0: 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
c500: 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
c510: 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
c520: 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35  4]<<24) | (buf[5
c530: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d  ]<<16) | (buf[6]
c540: 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20  <<8) | buf[7];. 
c550: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
c560: 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20   | y;.      if( 
c570: 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
c580: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
c590: 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
c5a0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
c5b0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
c5c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c5d0: 20 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64     pMem->r = *(d
c5e0: 6f 75 62 6c 65 2a 29 26 78 3b 0a 20 20 20 20 20  ouble*)&x;.     
c5f0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c600: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20   MEM_Real;.     
c610: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
c620: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  8;.    }.    def
c630: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ault: {.      in
c640: 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f  t len = (serial_
c650: 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
c660: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
c670: 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
c680: 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
c690: 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
c6a0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
c6b0: 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29  rial_type&0x01 )
c6c0: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
c6d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
c6e0: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
c6f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c700: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c710: 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45  MEM_Blob | MEM_E
c720: 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  phem;.      }.  
c730: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
c740: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c750: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
c760: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
c770: 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
c780: 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
c790: 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69 66  x records specif
c7a0: 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79  ied by .** {nKey
c7b0: 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e  1, pKey1} and {n
c7c0: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65  Key2, pKey2}, re
c7d0: 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69  turning a negati
c7e0: 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
c7f0: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
c800: 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  if {nKey1, pKey1
c810: 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  } is less than, 
c820: 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
c830: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b  greater than {nK
c840: 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f  ey2, pKey2}.  Bo
c850: 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  th Key1 and Key2
c860: 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73 74   must be byte st
c870: 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65  rings.** compose
c880: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
c890: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
c8a0: 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e   the VDBE..*/.in
c8b0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
c8c0: 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f  ordCompare(.  vo
c8d0: 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20  id *userData,.  
c8e0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
c8f0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20   void *pKey1, . 
c900: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
c910: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
c920: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
c930: 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a  Info = (KeyInfo*
c940: 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75 33 32  )userData;.  u32
c950: 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20 20 20   d1, d2;        
c960: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
c970: 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
c980: 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
c990: 20 20 75 33 32 20 69 64 78 31 2c 20 69 64 78 32    u32 idx1, idx2
c9a0: 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  ;      /* Offset
c9b0: 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
c9c0: 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
c9d0: 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
c9e0: 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a  dr1, szHdr2;  /*
c9f0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
ca00: 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
ca10: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
ca20: 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72   nField;.  int r
ca30: 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
ca40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
ca50: 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
ca60: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
ca70: 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  y1;.  const unsi
ca80: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32  gned char *aKey2
ca90: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
caa0: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b  ed char *)pKey2;
cab0: 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20  ..  Mem mem1;.  
cac0: 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31  Mem mem2;.  mem1
cad0: 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
cae0: 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63  >enc;.  mem2.enc
caf0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
cb00: 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 73 71  ;.  .  idx1 = sq
cb10: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
cb20: 28 70 4b 65 79 31 2c 20 26 73 7a 48 64 72 31 29  (pKey1, &szHdr1)
cb30: 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
cb40: 0a 20 20 69 64 78 32 20 3d 20 73 71 6c 69 74 65  .  idx2 = sqlite
cb50: 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4b 65  3GetVarint32(pKe
cb60: 79 32 2c 20 26 73 7a 48 64 72 32 29 3b 0a 20 20  y2, &szHdr2);.  
cb70: 64 32 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e  d2 = szHdr2;.  n
cb80: 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
cb90: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c  ->nField;.  whil
cba0: 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
cbb0: 26 20 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b  & idx2<szHdr2 ){
cbc0: 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
cbd0: 74 79 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73  type1;.    u32 s
cbe0: 65 72 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20  erial_type2;..  
cbf0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
cc00: 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
cc10: 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
cc20: 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
cc30: 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
cc40: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  te3GetVarint32(&
cc50: 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 26 73 65  aKey1[idx1], &se
cc60: 72 69 61 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20  rial_type1);.   
cc70: 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26   if( d1>=nKey1 &
cc80: 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
cc90: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
cca0: 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65  l_type1)>0 ) bre
ccb0: 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20  ak;.    idx2 += 
ccc0: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
ccd0: 33 32 28 26 61 4b 65 79 32 5b 69 64 78 32 5d 2c  32(&aKey2[idx2],
cce0: 20 26 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3b   &serial_type2);
ccf0: 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b 65  .    if( d2>=nKe
cd00: 79 32 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y2 && sqlite3Vdb
cd10: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
cd20: 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 20 29  erial_type2)>0 )
cd30: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
cd40: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 72  Assert that ther
cd50: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
cd60: 65 20 6c 65 66 74 20 69 6e 20 65 61 63 68 20 6b  e left in each k
cd70: 65 79 20 66 6f 72 20 74 68 65 20 62 6c 6f 62 20  ey for the blob 
cd80: 6f 66 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 74  of.    ** data t
cd90: 6f 20 67 6f 20 77 69 74 68 20 74 68 65 20 73 65  o go with the se
cda0: 72 69 61 6c 20 74 79 70 65 20 6a 75 73 74 20 72  rial type just r
cdb0: 65 61 64 2e 20 54 68 69 73 20 61 73 73 65 72 74  ead. This assert
cdc0: 20 6d 61 79 20 66 61 69 6c 20 69 66 0a 20 20 20   may fail if.   
cdd0: 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 73 20   ** the file is 
cde0: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 6e  corrupted.  Then
cdf0: 20 72 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   read the value 
ce00: 66 72 6f 6d 20 65 61 63 68 20 6b 65 79 20 69 6e  from each key in
ce10: 74 6f 20 6d 65 6d 31 0a 20 20 20 20 2a 2a 20 61  to mem1.    ** a
ce20: 6e 64 20 6d 65 6d 32 20 72 65 73 70 65 63 74 69  nd mem2 respecti
ce30: 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vely..    */.   
ce40: 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
ce50: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
ce60: 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
ce70: 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  ype1, &mem1);.  
ce80: 20 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56    d2 += sqlite3V
ce90: 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
cea0: 65 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f  ey2[d2], serial_
ceb0: 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a  type2, &mem2);..
cec0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ced0: 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
cee0: 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c  , &mem2, i<nFiel
cef0: 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  d ? pKeyInfo->aC
cf00: 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
cf10: 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20   if( mem1.flags 
cf20: 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69  & MEM_Dyn ) sqli
cf30: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
cf40: 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66  e(&mem1);.    if
cf50: 28 20 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d  ( mem2.flags & M
cf60: 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33  EM_Dyn ) sqlite3
cf70: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
cf80: 6d 65 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72  mem2);.    if( r
cf90: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  c!=0 ){.      br
cfa0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
cfb0: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e  ++;.  }..  /* On
cfc0: 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
cfd0: 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c  n out of fields,
cfe0: 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65   but all the fie
cff0: 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
d000: 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65  oint.  ** were e
d010: 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63  qual. If the inc
d020: 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75  rKey flag is tru
d030: 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  e, then the seco
d040: 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74  nd key is.  ** t
d050: 72 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72  reated as larger
d060: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
d070: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b  =0 ){.    if( pK
d080: 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20  eyInfo->incrKey 
d090: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
d0a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d0b0: 64 31 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  d1<nKey1 ){.    
d0c0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
d0d0: 6c 73 65 20 69 66 28 20 64 32 3c 6e 4b 65 79 32  lse if( d2<nKey2
d0e0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d   ){.      rc = -
d0f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
d100: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
d110: 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b  ortOrder && i<pK
d120: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 26  eyInfo->nField &
d130: 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
d140: 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
d150: 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a   rc = -rc;.  }..
d160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d170: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
d180: 6e 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 65  nt is an index e
d190: 6e 74 72 79 20 63 6f 6d 70 6f 73 65 64 20 75 73  ntry composed us
d1a0: 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
d1b0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
d1c0: 20 54 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   The last entry 
d1d0: 69 6e 20 74 68 69 73 20 72 65 63 6f 72 64 20 73  in this record s
d1e0: 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
d1f0: 67 65 72 20 28 73 70 65 63 69 66 69 63 61 6c 6c  ger (specificall
d200: 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  y.** an integer 
d210: 72 6f 77 69 64 29 2e 20 20 54 68 69 73 20 72 6f  rowid).  This ro
d220: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
d230: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
d240: 73 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74  s in.** that int
d250: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
d260: 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
d270: 4c 65 6e 28 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  Len(int nKey, co
d280: 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
d290: 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
d2a0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
d2b0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
d2c0: 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
d2d0: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
d2e0: 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a  f the rowid */..
d2f0: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
d300: 6e 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64  nt32(aKey, &szHd
d310: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74  r);.  sqlite3Get
d320: 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73  Varint32(&aKey[s
d330: 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f  zHdr-1], &typeRo
d340: 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  wid);.  return s
d350: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d360: 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
d370: 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20  d);.}.  ../*.** 
d380: 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
d390: 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
d3a0: 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
d3b0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
d3c0: 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
d3d0: 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
d3e0: 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
d3f0: 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
d400: 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
d410: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
d420: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
d430: 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
d440: 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
d450: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
d460: 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42  e3VdbeIdxRowid(B
d470: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
d480: 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
d490: 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e  4 nCellKey;.  in
d4a0: 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
d4b0: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
d4c0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
d4d0: 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
d4e0: 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
d4f0: 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
d500: 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
d510: 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
d520: 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
d530: 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
d540: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
d550: 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
d560: 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
d570: 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20  llKey<=0 ){.    
d580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d590: 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  RRUPT;.  }.  rc 
d5a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
d5b0: 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
d5c0: 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  0, nCellKey, 1, 
d5d0: 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
d5e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
d5f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65 74    }.  sqlite3Get
d600: 56 61 72 69 6e 74 33 32 28 6d 2e 7a 2c 20 26 73  Varint32(m.z, &s
d610: 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  zHdr);.  sqlite3
d620: 47 65 74 56 61 72 69 6e 74 33 32 28 26 6d 2e 7a  GetVarint32(&m.z
d630: 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65  [szHdr-1], &type
d640: 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77  Rowid);.  lenRow
d650: 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  id = sqlite3Vdbe
d660: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79  SerialTypeLen(ty
d670: 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69  peRowid);.  sqli
d680: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
d690: 28 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  (&m.z[m.n-lenRow
d6a0: 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
d6b0: 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
d6c0: 76 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  v.i;.  sqlite3Vd
d6d0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
d6e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d6f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
d700: 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
d710: 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
d720: 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
d730: 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61   is point to aga
d740: 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
d750: 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28  string in pKey (
d760: 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e  of length nKey).
d770: 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
d780: 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
d790: 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
d7a0: 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
d7b0: 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
d7c0: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
d7d0: 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
d7e0: 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72  han pKey.  Retur
d7f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
d800: 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b  uccess..**.** pK
d810: 65 79 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ey is either cre
d820: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
d830: 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
d840: 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
d850: 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
d860: 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
d870: 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
d880: 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
d890: 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
d8a0: 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a  nored as well..*
d8b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
d8c0: 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
d8d0: 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20    Cursor *pC,   
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d8f0: 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
d900: 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
d910: 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  /.  int nKey, co
d920: 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20  nst u8 *pKey,   
d930: 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f  /* The key to co
d940: 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  mpare */.  int *
d950: 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
d960: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d970: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
d980: 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
d990: 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b  .  i64 nCellKey;
d9a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
d9b0: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43  ursor *pCur = pC
d9c0: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  ->pCursor;.  int
d9d0: 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d 65 6d   lenRowid;.  Mem
d9e0: 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74   m;..  sqlite3Bt
d9f0: 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
da00: 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69   &nCellKey);.  i
da10: 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29  f( nCellKey<=0 )
da20: 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a  {.    *res = 0;.
da30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
da40: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
da50: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
da60: 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75  romBtree(pC->pCu
da70: 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65  rsor, 0, nCellKe
da80: 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
da90: 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
daa0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  n rc;.  }.  lenR
dab0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
dac0: 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 6d 2e  beIdxRowidLen(m.
dad0: 6e 2c 20 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20  n, m.z);.  *res 
dae0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
daf0: 6f 72 64 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70  ordCompare(pC->p
db00: 4b 65 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e  KeyInfo, m.n-len
db10: 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79  Rowid, m.z, nKey
db20: 2c 20 70 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  , pKey);.  sqlit
db30: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
db40: 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
db50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
db60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
db70: 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
db80: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
db90: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
dba0: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
dbb0: 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
dbc0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
dbd0: 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
dbe0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
dbf0: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
dc00: 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
dc10: 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
dc20: 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
dc30: 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
dc40: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
dc50: 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
dc60: 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
dc70: 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
dc80: 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
dc90: 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
dca0: 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
dcb0: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
dcc0: 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
dcd0: 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
dce0: 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
dcf0: 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
dd00: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
dd10: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
dd20: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
dd30: 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
dd40: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
dd50: 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
dd60: 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
dd70: 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
dd80: 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
dd90: 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
dda0: 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
ddb0: 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
ddc0: 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
ddd0: 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
dde0: 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
ddf0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
de00: 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
de10: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
de20: 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
de30: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
de40: 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
de50: 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
de60: 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
de70: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
de80: 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
de90: 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
dea0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
deb0: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
dec0: 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
ded0: 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
dee0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
def0: 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
df00: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
df10: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
df20: 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
df30: 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
df40: 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
df50: 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
df60: 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
df70: 64 62 3b 0a 7d 0a                                db;.}.