/ Hex Artifact Content
Login

Artifact dc5cfd11a0529fcfd217a1807f7c9df513f1c276:


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 0a 2a  tain exactly N.*
0650: 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 56 64 62 65  * elements. Vdbe
0660: 2e 6e 4f 70 41 6c 6c 6f 63 20 69 73 20 73 65 74  .nOpAlloc is set
0670: 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
0680: 6e 65 77 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  new size of.** t
0690: 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  he array..**.** 
06a0: 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  If an out-of-mem
06b0: 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ory error occurs
06c0: 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20   while resizing 
06d0: 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56 64  the array,.** Vd
06e0: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
06f0: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0700: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0710: 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 6e  is so that.** an
0720: 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64  y opcodes alread
0730: 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20  y allocated can 
0740: 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61  be correctly dea
0750: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
0760: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0770: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0780: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
0790: 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  izeOpArray(Vdbe 
07a0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  *p, int N){.  in
07b0: 74 20 72 75 6e 4d 6f 64 65 20 3d 20 70 2d 3e 6d  t runMode = p->m
07c0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
07d0: 5f 52 55 4e 3b 0a 20 20 69 66 28 20 72 75 6e 4d  _RUN;.  if( runM
07e0: 6f 64 65 20 7c 7c 20 70 2d 3e 6e 4f 70 41 6c 6c  ode || p->nOpAll
07f0: 6f 63 3c 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  oc<N ){.    Vdbe
0800: 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  Op *pNew;.    in
0810: 74 20 6e 4e 65 77 20 3d 20 4e 20 2b 20 31 30 30  t nNew = N + 100
0820: 2a 28 21 72 75 6e 4d 6f 64 65 29 3b 0a 20 20 20  *(!runMode);.   
0830: 20 69 6e 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70   int oldSize = p
0840: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a 20 20 20 20  ->nOpAlloc;.    
0850: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  pNew = sqliteRea
0860: 6c 6c 6f 63 28 70 2d 3e 61 4f 70 2c 20 6e 4e 65  lloc(p->aOp, nNe
0870: 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  w*sizeof(Op));. 
0880: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
0890: 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63       p->nOpAlloc
08a0: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 70   = nNew;.      p
08b0: 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20  ->aOp = pNew;.  
08c0: 20 20 20 20 69 66 28 20 6e 4e 65 77 3e 6f 6c 64      if( nNew>old
08d0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
08e0: 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70 5b 6f  memset(&p->aOp[o
08f0: 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 6e 4e 65  ldSize], 0, (nNe
0900: 77 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f  w-oldSize)*sizeo
0910: 66 28 4f 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a  f(Op));.      }.
0920: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0930: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73  ** Add a new ins
0940: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
0950: 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74  list of instruct
0960: 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20  ions current in 
0970: 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65  the.** VDBE.  Re
0980: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
0990: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
09a0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50  ruction..**.** P
09b0: 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a  arameters:.**.**
09c0: 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20      p           
09d0: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74      Pointer to t
09e0: 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20  he VDBE.**.**   
09f0: 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20   op             
0a00: 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   The opcode for 
0a10: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
0a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32  .**.**    p1, p2
0a30: 20 20 20 20 20 20 20 20 20 20 46 69 72 73 74 20            First 
0a40: 74 77 6f 20 6f 66 20 74 68 65 20 74 68 72 65 65  two of the three
0a50: 20 70 6f 73 73 69 62 6c 65 20 6f 70 65 72 61 6e   possible operan
0a60: 64 73 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ds..**.** Use th
0a70: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  e sqlite3VdbeRes
0a80: 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63  olveLabel() func
0a90: 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61  tion to fix an a
0aa0: 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68  ddress and.** th
0ab0: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
0ac0: 6e 67 65 50 33 28 29 20 66 75 6e 63 74 69 6f 6e  ngeP3() function
0ad0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
0ae0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 0a 2a  alue of the P3.*
0af0: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e  * operand..*/.in
0b00: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
0b10: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
0b20: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
0b30: 70 32 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p2){.  int i;.  
0b40: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
0b50: 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d  i = p->nOp;.  p-
0b60: 3e 6e 4f 70 2b 2b 3b 0a 20 20 61 73 73 65 72 74  >nOp++;.  assert
0b70: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
0b80: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
0b90: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
0ba0: 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69 7a  <=i ){.    resiz
0bb0: 65 4f 70 41 72 72 61 79 28 70 2c 20 69 2b 31 29  eOpArray(p, i+1)
0bc0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
0bd0: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
0be0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0bf0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  0;.    }.  }.  p
0c00: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
0c10: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
0c20: 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d   op;.  pOp->p1 =
0c30: 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d   p1;.  pOp->p2 =
0c40: 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d   p2;.  pOp->p3 =
0c50: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 33 74 79 70   0;.  pOp->p3typ
0c60: 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a  e = P3_NOTUSED;.
0c70: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
0c80: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
0c90: 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69  DEBUG.  if( sqli
0ca0: 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74  te3_vdbe_addop_t
0cb0: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0cc0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0cd0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0ce0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
0cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
0d00: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
0d10: 75 64 65 73 20 74 68 65 20 70 33 20 76 61 6c 75  udes the p3 valu
0d20: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
0d30: 33 56 64 62 65 4f 70 33 28 56 64 62 65 20 2a 70  3VdbeOp3(Vdbe *p
0d40: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0d50: 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20  , int p2, const 
0d60: 63 68 61 72 20 2a 7a 50 33 2c 69 6e 74 20 70 33  char *zP3,int p3
0d70: 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  type){.  int add
0d80: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
0d90: 64 64 4f 70 28 70 2c 20 6f 70 2c 20 70 31 2c 20  ddOp(p, op, p1, 
0da0: 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p2);.  sqlite3Vd
0db0: 62 65 43 68 61 6e 67 65 50 33 28 70 2c 20 61 64  beChangeP3(p, ad
0dc0: 64 72 2c 20 7a 50 33 2c 20 70 33 74 79 70 65 29  dr, zP3, p3type)
0dd0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
0de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
0df0: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
0e00: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
0e10: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
0e20: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
0e30: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
0e40: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
0e50: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
0e60: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
0e70: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
0e80: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
0e90: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
0ea0: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
0eb0: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
0ec0: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
0ed0: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
0ee0: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
0ef0: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
0f00: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
0f10: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
0f20: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
0f30: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
0f40: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
0f50: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
0f60: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
0f70: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
0f80: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
0f90: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
0fa0: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
0fb0: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
0fc0: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
0fd0: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
0fe0: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
0ff0: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
1000: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
1010: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
1020: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
1030: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
1040: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
1050: 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  c() fails..*/.in
1060: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
1070: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b  eLabel(Vdbe *p){
1080: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
1090: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
10a0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
10b0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
10c0: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e   );.  if( i>=p->
10d0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20  nLabelAlloc ){. 
10e0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
10f0: 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  c = p->nLabelAll
1100: 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 73  oc*2 + 10;.    s
1110: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72 46 72  qliteReallocOrFr
1120: 65 65 28 28 76 6f 69 64 2a 2a 29 26 70 2d 3e 61  ee((void**)&p->a
1130: 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  Label,.         
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a   p->nLabelAlloc*
1160: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c  sizeof(p->aLabel
1170: 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  [0]));.  }.  if(
1180: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1190: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d    p->aLabel[i] =
11a0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
11b0: 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n -1-i;.}../*.**
11c0: 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22   Resolve label "
11d0: 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64  x" to be the add
11e0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
11f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a   instruction to.
1200: 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ** be inserted. 
1210: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
1220: 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  x" must have bee
1230: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  n obtained from.
1240: 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  ** a prior call 
1250: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  to sqlite3VdbeMa
1260: 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f  keLabel()..*/.vo
1270: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
1280: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
1290: 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e  *p, int x){.  in
12a0: 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73  t j = -1-x;.  as
12b0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
12c0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
12d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d  );.  assert( j>=
12e0: 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c  0 && j<p->nLabel
12f0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61   );.  if( p->aLa
1300: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1310: 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70  abel[j] = p->nOp
1320: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1330: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
1340: 66 20 6f 70 63 6f 64 65 20 27 6f 70 27 20 69 73  f opcode 'op' is
1350: 20 67 75 61 72 65 6e 74 65 65 64 20 6e 6f 74 20   guarenteed not 
1360: 74 6f 20 70 75 73 68 20 6d 6f 72 65 20 76 61 6c  to push more val
1370: 75 65 73 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20  ues.** onto the 
1380: 56 44 42 45 20 73 74 61 63 6b 20 74 68 61 6e 20  VDBE stack than 
1390: 69 74 20 70 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a  it pops off..*/.
13a0: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 63 6f 64  static int opcod
13b0: 65 4e 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a  eNoPush(u8 op){.
13c0: 20 20 2f 2a 20 54 68 65 20 31 30 20 4e 4f 50 55    /* The 10 NOPU
13d0: 53 48 5f 4d 41 53 4b 5f 6e 20 63 6f 6e 73 74 61  SH_MASK_n consta
13e0: 6e 74 73 20 61 72 65 20 64 65 66 69 6e 65 64 20  nts are defined 
13f0: 69 6e 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  in the automatic
1400: 61 6c 6c 79 0a 20 20 2a 2a 20 67 65 6e 65 72 61  ally.  ** genera
1410: 74 65 64 20 68 65 61 64 65 72 20 66 69 6c 65 20  ted header file 
1420: 6f 70 63 6f 64 65 73 2e 68 2e 20 45 61 63 68 20  opcodes.h. Each 
1430: 69 73 20 61 20 31 36 2d 62 69 74 20 62 69 74 6d  is a 16-bit bitm
1440: 61 73 6b 2c 20 6f 6e 65 0a 20 20 2a 2a 20 62 69  ask, one.  ** bi
1450: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
1460: 74 6f 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  to each opcode i
1470: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68  mplemented by th
1480: 65 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 6d  e virtual.  ** m
1490: 61 63 68 69 6e 65 20 69 6e 20 76 64 62 65 2e 63  achine in vdbe.c
14a0: 2e 20 54 68 65 20 62 69 74 20 69 73 20 74 72 75  . The bit is tru
14b0: 65 20 69 66 20 74 68 65 20 77 6f 72 64 20 22 6e  e if the word "n
14c0: 6f 2d 70 75 73 68 22 20 61 70 70 65 61 72 73 0a  o-push" appears.
14d0: 20 20 2a 2a 20 69 6e 20 61 20 63 6f 6d 6d 65 6e    ** in a commen
14e0: 74 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c 69  t on the same li
14f0: 6e 65 20 61 73 20 74 68 65 20 22 63 61 73 65 20  ne as the "case 
1500: 4f 50 5f 58 58 58 3a 22 20 69 6e 20 0a 20 20 2a  OP_XXX:" in .  *
1510: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  * sqlite3VdbeExe
1520: 63 28 29 20 69 6e 20 76 64 62 65 2e 63 2e 0a 20  c() in vdbe.c.. 
1530: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
1540: 62 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  bit is true, the
1550: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
1560: 69 6e 67 20 6f 70 63 6f 64 65 20 69 73 20 67 75  ing opcode is gu
1570: 61 72 65 6e 74 65 65 64 20 6e 6f 74 0a 20 20 2a  arenteed not.  *
1580: 2a 20 74 6f 20 67 72 6f 77 20 74 68 65 20 73 74  * to grow the st
1590: 61 63 6b 20 77 68 65 6e 20 69 74 20 69 73 20 65  ack when it is e
15a0: 78 65 63 75 74 65 64 2e 20 4f 74 68 65 72 77 69  xecuted. Otherwi
15b0: 73 65 2c 20 69 74 20 6d 61 79 20 67 72 6f 77 20  se, it may grow 
15c0: 74 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20 62  the.  ** stack b
15d0: 79 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 6e  y at most one en
15e0: 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  try..  **.  ** N
15f0: 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 63 6f 72  OPUSH_MASK_0 cor
1600: 72 65 73 70 6f 6e 64 73 20 74 6f 20 6f 70 63 6f  responds to opco
1610: 64 65 73 20 30 20 74 6f 20 31 35 2e 20 4e 4f 50  des 0 to 15. NOP
1620: 55 53 48 5f 4d 41 53 4b 5f 31 20 63 6f 6e 74 61  USH_MASK_1 conta
1630: 69 6e 73 0a 20 20 2a 2a 20 6f 6e 65 20 62 69 74  ins.  ** one bit
1640: 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 31 36 20   for opcodes 16 
1650: 74 6f 20 33 31 2c 20 61 6e 64 20 73 6f 20 6f 6e  to 31, and so on
1660: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62  ..  **.  ** 16-b
1670: 69 74 20 62 69 74 6d 61 73 6b 73 20 28 72 61 74  it bitmasks (rat
1680: 68 65 72 20 74 68 61 6e 20 33 32 2d 62 69 74 29  her than 32-bit)
1690: 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20 69   are specified i
16a0: 6e 20 6f 70 63 6f 64 65 73 2e 68 20 0a 20 20 2a  n opcodes.h .  *
16b0: 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
16c0: 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  le is generated 
16d0: 62 79 20 61 6e 20 61 77 6b 20 70 72 6f 67 72 61  by an awk progra
16e0: 6d 2e 20 41 77 6b 20 6d 61 6e 69 70 75 6c 61 74  m. Awk manipulat
16f0: 65 73 0a 20 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62  es.  ** all numb
1700: 65 72 73 20 61 73 20 66 6c 6f 61 74 69 6e 67 2d  ers as floating-
1710: 70 6f 69 6e 74 20 61 6e 64 20 77 65 20 64 6f 6e  point and we don
1720: 27 74 20 77 61 6e 74 20 74 6f 20 72 69 73 6b 20  't want to risk 
1730: 61 20 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a 20  a rounding.  ** 
1740: 65 72 72 6f 72 20 69 66 20 73 6f 6d 65 6f 6e 65  error if someone
1750: 20 62 75 69 6c 64 73 20 77 69 74 68 20 61 6e 20   builds with an 
1760: 61 77 6b 20 74 68 61 74 20 75 73 65 73 20 28 66  awk that uses (f
1770: 6f 72 20 65 78 61 6d 70 6c 65 29 20 33 32 2d 62  or example) 32-b
1780: 69 74 20 0a 20 20 2a 2a 20 49 45 45 45 20 66 6c  it .  ** IEEE fl
1790: 6f 61 74 73 2e 0a 20 20 2a 2f 20 0a 20 20 73 74  oats..  */ .  st
17a0: 61 74 69 63 20 63 6f 6e 73 74 20 75 33 32 20 6d  atic const u32 m
17b0: 61 73 6b 73 5b 35 5d 20 3d 20 7b 0a 20 20 20 20  asks[5] = {.    
17c0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 30 20 2b 20  NOPUSH_MASK_0 + 
17d0: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
17e0: 53 48 5f 4d 41 53 4b 5f 31 29 3c 3c 31 36 29 2c  SH_MASK_1)<<16),
17f0: 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b  .    NOPUSH_MASK
1800: 5f 32 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64  _2 + (((unsigned
1810: 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 33 29 3c  )NOPUSH_MASK_3)<
1820: 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53 48  <16),.    NOPUSH
1830: 5f 4d 41 53 4b 5f 34 20 2b 20 28 28 28 75 6e 73  _MASK_4 + (((uns
1840: 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41 53  igned)NOPUSH_MAS
1850: 4b 5f 35 29 3c 3c 31 36 29 2c 0a 20 20 20 20 4e  K_5)<<16),.    N
1860: 4f 50 55 53 48 5f 4d 41 53 4b 5f 36 20 2b 20 28  OPUSH_MASK_6 + (
1870: 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53  ((unsigned)NOPUS
1880: 48 5f 4d 41 53 4b 5f 37 29 3c 3c 31 36 29 2c 0a  H_MASK_7)<<16),.
1890: 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f      NOPUSH_MASK_
18a0: 38 20 2b 20 28 28 28 75 6e 73 69 67 6e 65 64 29  8 + (((unsigned)
18b0: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 39 29 3c 3c  NOPUSH_MASK_9)<<
18c0: 31 36 29 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72  16).  };.  asser
18d0: 74 28 20 6f 70 3c 33 32 2a 35 20 29 3b 0a 20 20  t( op<32*5 );.  
18e0: 72 65 74 75 72 6e 20 28 6d 61 73 6b 73 5b 6f 70  return (masks[op
18f0: 3e 3e 35 5d 20 26 20 28 31 3c 3c 28 6f 70 26 30  >>5] & (1<<(op&0
1900: 78 31 46 29 29 29 3b 0a 7d 0a 0a 23 69 66 6e 64  x1F)));.}..#ifnd
1910: 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
1920: 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 4e  lite3VdbeOpcodeN
1930: 6f 50 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20  oPush(u8 op){.  
1940: 72 65 74 75 72 6e 20 6f 70 63 6f 64 65 4e 6f 50  return opcodeNoP
1950: 75 73 68 28 6f 70 29 3b 0a 7d 0a 23 65 6e 64 69  ush(op);.}.#endi
1960: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68  f../*.** Loop th
1970: 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72 61  rough the progra
1980: 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32  m looking for P2
1990: 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65   values that are
19a0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 45 61   negative..** Ea
19b0: 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73  ch such value is
19c0: 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c   a label.  Resol
19d0: 76 65 20 74 68 65 20 6c 61 62 65 6c 20 62 79 20  ve the label by 
19e0: 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 0a 2a  setting the P2.*
19f0: 2a 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63  * value to its c
1a00: 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20  orrect non-zero 
1a10: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
1a20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1a30: 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61  led once after a
1a40: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
1a50: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  been inserted..*
1a60: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70  *.** Variable *p
1a70: 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73  MaxFuncArgs is s
1a80: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
1a90: 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50  m value of any P
1aa0: 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  2 argument .** t
1ab0: 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  o an OP_Function
1ac0: 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  , OP_AggStep or 
1ad0: 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64  OP_VFilter opcod
1ae0: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
1af0: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  by .** sqlite3Vd
1b00: 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f  beMakeReady() to
1b10: 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61   size the Vdbe.a
1b20: 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  pArg[] array..**
1b30: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20  .** The integer 
1b40: 2a 70 4d 61 78 53 74 61 63 6b 20 69 73 20 73 65  *pMaxStack is se
1b50: 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  t to the maximum
1b60: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 20   number of vdbe 
1b70: 73 74 61 63 6b 0a 2a 2a 20 65 6e 74 72 69 65 73  stack.** entries
1b80: 20 74 68 61 74 20 73 74 61 74 69 63 20 61 6e 61   that static ana
1b90: 6c 79 73 69 73 20 72 65 76 65 61 6c 73 20 74 68  lysis reveals th
1ba0: 69 73 20 70 72 6f 67 72 61 6d 20 6d 69 67 68 74  is program might
1bb0: 20 6e 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   need..**.** Thi
1bc0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64  s routine also d
1bd0: 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  oes the followin
1be0: 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20  g optimization: 
1bf0: 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a   It scans for.**
1c00: 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69 6f   Halt instructio
1c10: 6e 73 20 77 68 65 72 65 20 50 31 3d 3d 53 51 4c  ns where P1==SQL
1c20: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 6f  ITE_CONSTRAINT o
1c30: 72 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 6f  r P2==OE_Abort o
1c40: 72 20 66 6f 72 0a 2a 2a 20 49 64 78 49 6e 73 65  r for.** IdxInse
1c50: 72 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  rt instructions 
1c60: 77 68 65 72 65 20 50 32 21 3d 30 2e 20 20 49 66  where P2!=0.  If
1c70: 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63   no such instruc
1c80: 74 69 6f 6e 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  tion is.** found
1c90: 2c 20 74 68 65 6e 20 65 76 65 72 79 20 53 74 61  , then every Sta
1ca0: 74 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69  tement instructi
1cb0: 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  on is changed to
1cc0: 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 0a 2a 2a 20   a Noop.  In.** 
1cd0: 74 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f  this way, we avo
1ce0: 69 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  id creating the 
1cf0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1d00: 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73 61  l file unnecessa
1d10: 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rily..*/.static 
1d20: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
1d30: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
1d40: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2c  t *pMaxFuncArgs,
1d50: 20 69 6e 74 20 2a 70 4d 61 78 53 74 61 63 6b 29   int *pMaxStack)
1d60: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1d70: 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a 20   nMaxArgs = 0;. 
1d80: 20 69 6e 74 20 6e 4d 61 78 53 74 61 63 6b 20 3d   int nMaxStack =
1d90: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 4f 70 20 2a 70   p->nOp;.  Op *p
1da0: 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65  Op;.  int *aLabe
1db0: 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20  l = p->aLabel;. 
1dc0: 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d 65   int doesStateme
1dd0: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ntRollback = 0;.
1de0: 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d 65    int hasStateme
1df0: 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20 66  ntBegin = 0;.  f
1e00: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
1e10: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
1e20: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
1e30: 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f    u8 opcode = pO
1e40: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20  p->opcode;..    
1e50: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
1e60: 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64  unction || opcod
1e70: 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 7c 7c  e==OP_AggStep ||
1e80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e90: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1ea0: 45 0a 20 20 20 20 20 20 20 20 6f 70 63 6f 64 65  E.        opcode
1eb0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a 23 65 6e  ==OP_VUpdate.#en
1ec0: 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
1ed0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
1ee0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
1ef0: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
1f00: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1f10: 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20  ==OP_Halt ){.   
1f20: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d     if( pOp->p1==
1f30: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1f40: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
1f50: 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
1f60: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
1f70: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
1f80: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1f90: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  f( opcode==OP_Id
1fa0: 78 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20  xInsert ){.     
1fb0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29 7b 0a   if( pOp->p2 ){.
1fc0: 20 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74          doesStat
1fd0: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1fe0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1ff0: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
2000: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
2010: 0a 20 20 20 20 20 20 68 61 73 53 74 61 74 65 6d  .      hasStatem
2020: 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20  entBegin = 1;.  
2030: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
2040: 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29  de==OP_VFilter )
2050: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
2060: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
2070: 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a  nOp - i >= 3 );.
2080: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
2090: 70 5b 2d 32 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-2].opcode==OP
20a0: 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20  _Integer );.    
20b0: 20 20 6e 20 3d 20 70 4f 70 5b 2d 32 5d 2e 70 31    n = pOp[-2].p1
20c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d  ;.      if( n>nM
20d0: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
20e0: 73 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  s = n;.    }.   
20f0: 20 69 66 28 20 6f 70 63 6f 64 65 4e 6f 50 75 73   if( opcodeNoPus
2100: 68 28 6f 70 63 6f 64 65 29 20 29 7b 0a 20 20 20  h(opcode) ){.   
2110: 20 20 20 6e 4d 61 78 53 74 61 63 6b 2d 2d 3b 0a     nMaxStack--;.
2120: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
2130: 4f 70 2d 3e 70 32 3e 3d 30 20 29 20 63 6f 6e 74  Op->p2>=0 ) cont
2140: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
2150: 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e  ( -1-pOp->p2<p->
2160: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 70 4f  nLabel );.    pO
2170: 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d  p->p2 = aLabel[-
2180: 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 7d 0a  1-pOp->p2];.  }.
2190: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
21a0: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c  aLabel);.  p->aL
21b0: 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d  abel = 0;..  *pM
21c0: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
21d0: 78 41 72 67 73 3b 0a 20 20 2a 70 4d 61 78 53 74  xArgs;.  *pMaxSt
21e0: 61 63 6b 20 3d 20 6e 4d 61 78 53 74 61 63 6b 3b  ack = nMaxStack;
21f0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e 65 76  ..  /* If we nev
2200: 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73 74  er rollback a st
2210: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
2220: 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74 65 6d  ion, then statem
2230: 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ent.  ** transac
2240: 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e 65  tions are not ne
2250: 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e 67 65  eded.  So change
2260: 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74 65 6d   every OP_Statem
2270: 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20  ent.  ** opcode 
2280: 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
2290: 20 20 54 68 69 73 20 61 76 6f 69 64 20 61 20 63    This avoid a c
22a0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
22b0: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 0a  OpenExclusive().
22c0: 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e 20 62    ** which can b
22d0: 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e 20 73  e expensive on s
22e0: 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 20  ome platforms.. 
22f0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53 74 61   */.  if( hasSta
2300: 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26 20 21  tementBegin && !
2310: 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c  doesStatementRol
2320: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  lback ){.    for
2330: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
2340: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
2350: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
2360: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
2370: 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20  e==OP_Statement 
2380: 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  ){.        pOp->
2390: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
23a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
23c0: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
23d0: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
23e0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
23f0: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
2400: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2410: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
2420: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
2430: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
2440: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
2450: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
2460: 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73   Add a whole lis
2470: 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  t of operations 
2480: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
2490: 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20   stack.  Return 
24a0: 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  the.** address o
24b0: 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  f the first oper
24c0: 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a  ation added..*/.
24d0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
24e0: 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70  ddOpList(Vdbe *p
24f0: 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f  , int nOp, VdbeO
2500: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
2510: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
2520: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
2530: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2540: 49 54 20 29 3b 0a 20 20 72 65 73 69 7a 65 4f 70  IT );.  resizeOp
2550: 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 20  Array(p, p->nOp 
2560: 2b 20 6e 4f 70 29 3b 0a 20 20 69 66 28 20 73 71  + nOp);.  if( sq
2570: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
2580: 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d() ){.    retur
2590: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  n 0;.  }.  addr 
25a0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
25b0: 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  nOp>0 ){.    int
25c0: 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69   i;.    VdbeOpLi
25d0: 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20  st const *pIn = 
25e0: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
25f0: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49  ; i<nOp; i++, pI
2600: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
2610: 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20  p2 = pIn->p2;.  
2620: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74      VdbeOp *pOut
2630: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64   = &p->aOp[i+add
2640: 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  r];.      pOut->
2650: 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70  opcode = pIn->op
2660: 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74  code;.      pOut
2670: 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a  ->p1 = pIn->p1;.
2680: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
2690: 20 70 32 3c 30 20 3f 20 61 64 64 72 20 2b 20 41   p2<0 ? addr + A
26a0: 44 44 52 28 70 32 29 20 3a 20 70 32 3b 0a 20 20  DDR(p2) : p2;.  
26b0: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
26c0: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
26d0: 75 74 2d 3e 70 33 74 79 70 65 20 3d 20 70 49 6e  ut->p3type = pIn
26e0: 2d 3e 70 33 20 3f 20 50 33 5f 53 54 41 54 49 43  ->p3 ? P3_STATIC
26f0: 20 3a 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 23   : P3_NOTUSED;.#
2700: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2710: 55 47 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  UG.      if( sql
2720: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f  ite3_vdbe_addop_
2730: 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  trace ){.       
2740: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
2750: 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26  tOp(0, i+addr, &
2760: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b  p->aOp[i+addr]);
2770: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2780: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70      }.    p->nOp
2790: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72   += nOp;.  }.  r
27a0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
27b0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
27c0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
27d0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
27e0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
27f0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
2800: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
2810: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
2820: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
2830: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
2840: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
2850: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
2860: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
2870: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
2880: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
2890: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
28a0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
28b0: 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69  ngeP1(Vdbe *p, i
28c0: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
28d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
28e0: 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  0 || p->magic==V
28f0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2900: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64  ;.  if( p && add
2910: 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61  r>=0 && p->nOp>a
2920: 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  ddr && p->aOp ){
2930: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
2940: 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p1 = val;.  }.
2950: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2960: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2970: 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P2 operand for 
2980: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
2990: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
29a0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
29b0: 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20  l for setting a 
29c0: 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
29d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
29e0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
29f0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
2a00: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
2a10: 65 72 74 28 20 76 61 6c 3e 3d 30 20 29 3b 0a 20  ert( val>=0 );. 
2a20: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
2a30: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2a40: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2a50: 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30  if( p && addr>=0
2a60: 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20   && p->nOp>addr 
2a70: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
2a80: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32   p->aOp[addr].p2
2a90: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
2aa0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2ab0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  P2 operand of in
2ac0: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73  struction addr s
2ad0: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
2ae0: 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65   to.** the addre
2af0: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
2b00: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
2b10: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20   coded..*/.void 
2b20: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2b30: 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ere(Vdbe *p, int
2b40: 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65   addr){.  sqlite
2b50: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
2b60: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
2b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2b80: 61 20 50 33 20 76 61 6c 75 65 20 69 66 20 6e 65  a P3 value if ne
2b90: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
2ba0: 69 63 20 76 6f 69 64 20 66 72 65 65 50 33 28 69  ic void freeP3(i
2bb0: 6e 74 20 70 33 74 79 70 65 2c 20 76 6f 69 64 20  nt p3type, void 
2bc0: 2a 70 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29  *p3){.  if( p3 )
2bd0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 33  {.    switch( p3
2be0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
2bf0: 73 65 20 50 33 5f 44 59 4e 41 4d 49 43 3a 0a 20  se P3_DYNAMIC:. 
2c00: 20 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59       case P3_KEY
2c10: 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65  INFO:.      case
2c20: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
2c30: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
2c40: 71 6c 69 74 65 46 72 65 65 28 70 33 29 3b 0a 20  qliteFree(p3);. 
2c50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2c60: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
2c70: 20 50 33 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20   P3_MPRINTF: {. 
2c80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2c90: 72 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20 20  ree(p3);.       
2ca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2cb0: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 56 44        case P3_VD
2cc0: 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20  BEFUNC: {.      
2cd0: 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62    VdbeFunc *pVdb
2ce0: 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e  eFunc = (VdbeFun
2cf0: 63 20 2a 29 70 33 3b 0a 20 20 20 20 20 20 20 20  c *)p3;.        
2d00: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
2d10: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
2d20: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
2d30: 73 71 6c 69 74 65 46 72 65 65 28 70 56 64 62 65  sqliteFree(pVdbe
2d40: 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62  Func);.        b
2d50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2d60: 20 20 20 20 63 61 73 65 20 50 33 5f 4d 45 4d 3a      case P3_MEM:
2d70: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2d80: 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c  e3ValueFree((sql
2d90: 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 33 29 3b  ite3_value*)p3);
2da0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2dc0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  }.}.../*.** Chan
2dd0: 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74 61  ge N opcodes sta
2de0: 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74 6f  rting at addr to
2df0: 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64   No-ops..*/.void
2e00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2e10: 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70  geToNoop(Vdbe *p
2e20: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
2e30: 4e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  N){.  VdbeOp *pO
2e40: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
2e50: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  ];.  while( N-- 
2e60: 29 7b 0a 20 20 20 20 66 72 65 65 50 33 28 70 4f  ){.    freeP3(pO
2e70: 70 2d 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p3type, pOp->
2e80: 70 33 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  p3);.    memset(
2e90: 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  pOp, 0, sizeof(p
2ea0: 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70  Op[0]));.    pOp
2eb0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
2ec0: 6f 70 3b 0a 20 20 20 20 70 4f 70 2b 2b 3b 0a 20  op;.    pOp++;. 
2ed0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
2ee0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
2ef0: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
2f00: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
2f10: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
2f20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2f30: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
2f40: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
2f50: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
2f60: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
2f70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f80: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
2f90: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
2fa0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
2fb0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
2fc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
2fd0: 68 65 6e 20 74 68 65 20 50 33 20 6f 70 65 72 61  hen the P3 opera
2fe0: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
2ff0: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
3000: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
3010: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
3020: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
3030: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
3040: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
3050: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
3060: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 33  opy bytes of zP3
3070: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
3080: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
3090: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
30a0: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
30b0: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 33 2e  +1 bytes of zP3.
30c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 33 5f  .**.** If n==P3_
30d0: 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73  KEYINFO it means
30e0: 20 74 68 61 74 20 7a 50 33 20 69 73 20 61 20 70   that zP3 is a p
30f0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49  ointer to a KeyI
3100: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
3110: 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65  * A copy is made
3120: 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   of the KeyInfo 
3130: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d  structure into m
3140: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
3150: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 4d 61 6c  rom.** sqliteMal
3160: 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64  loc, to be freed
3170: 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69   when the Vdbe i
3180: 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  s finalized..** 
3190: 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  n==P3_KEYINFO_HA
31a0: 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20  NDOFF indicates 
31b0: 74 68 61 74 20 7a 50 33 20 70 6f 69 6e 74 73 20  that zP3 points 
31c0: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  to a KeyInfo str
31d0: 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64  ucture.** stored
31e0: 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   in memory that 
31f0: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
3200: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
3210: 69 74 65 4d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a  iteMalloc. The .
3220: 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
3230: 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c   not free the al
3240: 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c  location, it wil
3250: 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  l be freed when 
3260: 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66  the Vdbe is.** f
3270: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a  inalized..** .**
3280: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
3290: 20 6e 20 28 50 33 5f 53 54 41 54 49 43 2c 20 50   n (P3_STATIC, P
32a0: 33 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  3_COLLSEQ etc.) 
32b0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
32c0: 33 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  3 points.** to a
32d0: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
32e0: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
32f0: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
3300: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
3310: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
3320: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
3330: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
3340: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
3350: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
3360: 68 65 6e 20 63 68 61 6e 67 65 20 50 33 20 6f 6e  hen change P3 on
3370: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3380: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
3390: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
33a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
33b0: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP3(Vdbe *p, in
33c0: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
33d0: 61 72 20 2a 7a 50 33 2c 20 69 6e 74 20 6e 29 7b  ar *zP3, int n){
33e0: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73  .  Op *pOp;.  as
33f0: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
3400: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
3410: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
3420: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d   p==0 || p->aOp=
3430: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  =0 || sqlite3Mal
3440: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
3450: 20 20 20 69 66 20 28 6e 20 21 3d 20 50 33 5f 4b     if (n != P3_K
3460: 45 59 49 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20  EYINFO) {.      
3470: 66 72 65 65 50 33 28 6e 2c 20 28 76 6f 69 64 2a  freeP3(n, (void*
3480: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 33 29 3b  )*(char**)&zP3);
3490: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
34a0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 64 64  n;.  }.  if( add
34b0: 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d 70 2d 3e  r<0 || addr>=p->
34c0: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 64 64 72 20  nOp ){.    addr 
34d0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
34e0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 20 72    if( addr<0 ) r
34f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70  eturn;.  }.  pOp
3500: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
3510: 3b 0a 20 20 66 72 65 65 50 33 28 70 4f 70 2d 3e  ;.  freeP3(pOp->
3520: 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29  p3type, pOp->p3)
3530: 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b  ;.  pOp->p3 = 0;
3540: 0a 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b  .  if( zP3==0 ){
3550: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30  .    pOp->p3 = 0
3560: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
3570: 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a  e = P3_NOTUSED;.
3580: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
3590: 33 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20  3_KEYINFO ){.   
35a0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
35b0: 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65  fo;.    int nFie
35c0: 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  ld, nByte;..    
35d0: 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e  nField = ((KeyIn
35e0: 66 6f 2a 29 7a 50 33 29 2d 3e 6e 46 69 65 6c 64  fo*)zP3)->nField
35f0: 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69  ;.    nByte = si
3600: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20  zeof(*pKeyInfo) 
3610: 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a  + (nField-1)*siz
3620: 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  eof(pKeyInfo->aC
3630: 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64  oll[0]) + nField
3640: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
3650: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
3660: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 70  ( nByte );.    p
3670: 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a 29  Op->p3 = (char*)
3680: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66  pKeyInfo;.    if
3690: 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
36a0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
36b0: 72 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  r *aSortOrder;. 
36c0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
36d0: 49 6e 66 6f 2c 20 7a 50 33 2c 20 6e 42 79 74 65  Info, zP3, nByte
36e0: 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72  );.      aSortOr
36f0: 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
3700: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
3710: 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72    if( aSortOrder
3720: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   ){.        pKey
3730: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3740: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
3750: 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  r*)&pKeyInfo->aC
3760: 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20  oll[nField];.   
3770: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
3780: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3790: 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46  , aSortOrder, nF
37a0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ield);.      }. 
37b0: 20 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65       pOp->p3type
37c0: 20 3d 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P3_KEYINFO;. 
37d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37e0: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
37f0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a  _NOTUSED;.    }.
3800: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
3810: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
3820: 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 33  F ){.    pOp->p3
3830: 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b 0a 20   = (char*)zP3;. 
3840: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
3850: 20 50 33 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d   P3_KEYINFO;.  }
3860: 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a  else if( n<0 ){.
3870: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63      pOp->p3 = (c
3880: 68 61 72 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f  har*)zP3;.    pO
3890: 70 2d 3e 70 33 74 79 70 65 20 3d 20 6e 3b 0a 20  p->p3type = n;. 
38a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
38b0: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65  n==0 ) n = strle
38c0: 6e 28 7a 50 33 29 3b 0a 20 20 20 20 70 4f 70 2d  n(zP3);.    pOp-
38d0: 3e 70 33 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  >p3 = sqliteStrN
38e0: 44 75 70 28 7a 50 33 2c 20 6e 29 3b 0a 20 20 20  Dup(zP3, n);.   
38f0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50   pOp->p3type = P
3900: 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  3_DYNAMIC;.  }.}
3910: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
3920: 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
3930: 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20 74  he P3 field of t
3940: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
3950: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
3960: 6f 6e 20 77 69 74 68 0a 2a 2a 20 63 6f 6d 6d 65  on with.** comme
3970: 6e 74 20 74 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64  nt text..*/.void
3980: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
3990: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
39a0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
39b0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
39c0: 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t ap;.  assert( 
39d0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
39e0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
39f0: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
3a00: 2d 31 5d 2e 70 33 3d 3d 30 20 0a 20 20 20 20 20  -1].p3==0 .     
3a10: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4d       || sqlite3M
3a20: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b  allocFailed() );
3a30: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
3a40: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69  zFormat);.  sqli
3a50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
3a60: 70 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 4d  p, -1, sqlite3VM
3a70: 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  Printf(zFormat, 
3a80: 61 70 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  ap), P3_DYNAMIC)
3a90: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
3aa0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3ab0: 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64  Return the opcod
3ac0: 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64  e for a given ad
3ad0: 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70  dress..*/.VdbeOp
3ae0: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
3af0: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
3b00: 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28  addr){.  assert(
3b10: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3b20: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3b30: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3b40: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  && addr<p->nOp )
3b50: 3b 0a 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61  ;.  return &p->a
3b60: 4f 70 5b 61 64 64 72 5d 3b 0a 7d 0a 0a 23 69 66  Op[addr];.}..#if
3b70: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3b80: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c  _OMIT_EXPLAIN) |
3b90: 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  | !defined(NDEBU
3ba0: 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66  G) \.     || def
3bb0: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
3bc0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
3bd0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
3be0: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
3bf0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
3c00: 73 20 74 68 65 20 50 33 20 70 61 72 61 6d 65 74  s the P3 paramet
3c10: 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65  er for an opcode
3c20: 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66  ..** Use zTemp f
3c30: 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  or any required 
3c40: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
3c50: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
3c60: 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50  c char *displayP
3c70: 33 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20  3(Op *pOp, char 
3c80: 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d  *zTemp, int nTem
3c90: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b  p){.  char *zP3;
3ca0: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
3cb0: 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68  >=20 );.  switch
3cc0: 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 29 7b  ( pOp->p3type ){
3cd0: 0a 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59  .    case P3_KEY
3ce0: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
3cf0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65  t i, j;.      Ke
3d00: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
3d10: 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f 70 2d  = (KeyInfo*)pOp-
3d20: 3e 70 33 3b 0a 20 20 20 20 20 20 73 70 72 69 6e  >p3;.      sprin
3d30: 74 66 28 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e  tf(zTemp, "keyin
3d40: 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  fo(%d", pKeyInfo
3d50: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  ->nField);.     
3d60: 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d   i = strlen(zTem
3d70: 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  p);.      for(j=
3d80: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
3d90: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
3da0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
3db0: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
3dc0: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
3dd0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
3de0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
3df0: 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a   strlen(pColl->z
3e00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
3e10: 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36   if( i+n>nTemp-6
3e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3e30: 73 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  strcpy(&zTemp[i]
3e40: 2c 22 2c 2e 2e 2e 22 29 3b 0a 20 20 20 20 20 20  ,",...");.      
3e50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3e60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3e70: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
3e80: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ',';.          i
3e90: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
3ea0: 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49  rtOrder && pKeyI
3eb0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
3ec0: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
3ed0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
3ee0: 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -';.          }.
3ef0: 20 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79            strcpy
3f00: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c  (&zTemp[i], pCol
3f10: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
3f20: 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20       i += n;.   
3f30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
3f40: 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +4<nTemp-6 ){.  
3f50: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26          strcpy(&
3f60: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 29  zTemp[i],",nil")
3f70: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
3f80: 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
3f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
3fa0: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
3fb0: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
3fc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3fd0: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
3fe0: 20 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP3 = zTemp;.  
3ff0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4000: 0a 20 20 20 20 63 61 73 65 20 50 33 5f 43 4f 4c  .    case P3_COL
4010: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
4020: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
4030: 43 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d 3e 70 33  CollSeq*)pOp->p3
4040: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
4050: 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28  zTemp, "collseq(
4060: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
4070: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 50  zName);.      zP
4080: 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  3 = zTemp;.     
4090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
40a0: 20 20 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45    case P3_FUNCDE
40b0: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
40c0: 65 66 20 2a 70 44 65 66 20 3d 20 28 46 75 6e 63  ef *pDef = (Func
40d0: 44 65 66 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  Def*)pOp->p3;.  
40e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
40f0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4100: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
4110: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
4120: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 7a 50 33  nArg);.      zP3
4130: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
4140: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
4150: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4160: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
4170: 20 20 63 61 73 65 20 50 33 5f 56 54 41 42 3a 20    case P3_VTAB: 
4180: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4190: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 73  vtab *pVtab = (s
41a0: 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 4f 70  qlite3_vtab*)pOp
41b0: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->p3;.      sqli
41c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
41d0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 70 3a 25  mp, zTemp, "%p:%
41e0: 73 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62  s", pVtab, pVtab
41f0: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 7a 4e 61 6d 65  ->pModule->zName
4200: 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a  );.      zP3 = z
4210: 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Temp;.      brea
4220: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
4230: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4240: 20 20 20 20 20 7a 50 33 20 3d 20 70 4f 70 2d 3e       zP3 = pOp->
4250: 70 33 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  p3;.      if( zP
4260: 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  3==0 || pOp->opc
4270: 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  ode==OP_Noop ){.
4280: 20 20 20 20 20 20 20 20 7a 50 33 20 3d 20 22 22          zP3 = ""
4290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
42a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
42b0: 33 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  3!=0 );.  return
42c0: 20 7a 50 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP3;.}.#endif..
42d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
42e0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
42f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
4300: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
4310: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
4320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
4330: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
4340: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
4350: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
4360: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
4370: 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f  , int pc, Op *pO
4380: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b  p){.  char *zP3;
4390: 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d  .  char zPtr[50]
43a0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
43b0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
43c0: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
43d0: 20 25 34 64 20 25 73 5c 6e 22 3b 0a 20 20 69 66   %4d %s\n";.  if
43e0: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
43f0: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 33   = stdout;.  zP3
4400: 20 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f 70   = displayP3(pOp
4410: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
4420: 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66  Ptr));.  fprintf
4430: 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c  (pOut, zFormat1,
4440: 0a 20 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74  .      pc, sqlit
4450: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f  e3OpcodeNames[pO
4460: 70 2d 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70 2d  p->opcode], pOp-
4470: 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50  >p1, pOp->p2, zP
4480: 33 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75  3);.  fflush(pOu
4490: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
44a0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
44b0: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
44c0: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
44d0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
44e0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
44f0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  t N){.  if( p ){
4500: 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 3e  .    while( N-->
4510: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
4520: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
4530: 28 70 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (p++);.    }.  }
4540: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
4550: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
4560: 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73  /*.** Give a lis
4570: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67  ting of the prog
4580: 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75  ram in the virtu
4590: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a  al machine..**.*
45a0: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
45b0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
45c0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
45d0: 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f  .  But instead o
45e0: 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65  f.** running the
45f0: 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65   code, it invoke
4600: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  s the callback o
4610: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73  nce for each ins
4620: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
4630: 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65  s feature is use
4640: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
4650: 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74  EXPLAIN"..*/.int
4660: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
4670: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4690: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
46a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
46b0: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  p->db;.  int i;.
46c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
46d0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
46e0: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
46f0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
4700: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20  DBE_MAGIC_RUN ) 
4710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
4720: 53 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20  SUSE;.  assert( 
4730: 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54  db->magic==SQLIT
4740: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a  E_MAGIC_BUSY );.
4750: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
4760: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
4770: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
4780: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
4790: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
47a0: 65 20 64 6f 65 73 20 6e 6f 74 20 70 75 74 20 64  e does not put d
47b0: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 6f  ynamic strings o
47c0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
47d0: 20 73 74 61 63 6b 2c 20 74 68 65 79 20 6d 61 79   stack, they may
47e0: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
47f0: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
4800: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
4810: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
4820: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
4830: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
4840: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
4850: 20 69 66 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70   if( p->pTos==&p
4860: 2d 3e 61 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20  ->aStack[4] ){. 
4870: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
4880: 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20 35 29  ay(p->aStack, 5)
4890: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e  ;.  }.  p->resOn
48a0: 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 20 20 64 6f  Stack = 0;..  do
48b0: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
48c0: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70  +;.  }while( i<p
48d0: 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c  ->nOp && p->expl
48e0: 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70  ain==2 && p->aOp
48f0: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45  [i].opcode!=OP_E
4900: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
4910: 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  i>=p->nOp ){.   
4920: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
4930: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
4940: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
4950: 65 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20  e if( db->flags 
4960: 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75  & SQLITE_Interru
4970: 70 74 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c  pt ){.    db->fl
4980: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
4990: 6e 74 65 72 72 75 70 74 3b 0a 20 20 20 20 70 2d  nterrupt;.    p-
49a0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
49b0: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
49c0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
49d0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
49e0: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
49f0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
4a00: 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29  ->rc), (char*)0)
4a10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f  ;.  }else{.    O
4a20: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
4a30: 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  [i];.    Mem *pM
4a40: 65 6d 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b 0a  em = p->aStack;.
4a50: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
4a60: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
4a70: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
4a80: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
4a90: 70 4d 65 6d 2d 3e 69 20 3d 20 69 3b 20 20 20 20  pMem->i = i;    
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4ac0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
4ad0: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
4ae0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
4af0: 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f   MEM_Static|MEM_
4b00: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
4b10: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 73 71 6c 69    pMem->z = sqli
4b20: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70  te3OpcodeNames[p
4b30: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b 20 20 2f 2a  Op->opcode];  /*
4b40: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 61   Opcode */.    a
4b50: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
4b60: 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e  0 );.    pMem->n
4b70: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e   = strlen(pMem->
4b80: 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79  z);.    pMem->ty
4b90: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
4ba0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
4bb0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
4bc0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
4bd0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
4be0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
4bf0: 3e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  >i = pOp->p1;   
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
4c20: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
4c30: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
4c40: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
4c50: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
4c60: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
4c70: 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  m->i = pOp->p2; 
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
4ca0: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
4cb0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
4cc0: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
4cd0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
4ce0: 3d 20 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f  = MEM_Ephem|MEM_
4cf0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20 20  Str|MEM_Term;   
4d00: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
4d10: 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c 61 79 50 33  m->z = displayP3
4d20: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f  (pOp, pMem->zSho
4d30: 72 74 2c 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  rt, sizeof(pMem-
4d40: 3e 7a 53 68 6f 72 74 29 29 3b 0a 20 20 20 20 61  >zShort));.    a
4d50: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
4d60: 30 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e  0 );.    pMem->n
4d70: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e   = strlen(pMem->
4d80: 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79  z);.    pMem->ty
4d90: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
4da0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
4db0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a  = SQLITE_UTF8;..
4dc0: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
4dd0: 6e 20 3d 20 35 20 2d 20 32 2a 28 70 2d 3e 65 78  n = 5 - 2*(p->ex
4de0: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
4df0: 3e 70 54 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20  >pTos = pMem;.  
4e00: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
4e10: 5f 4f 4b 3b 0a 20 20 20 20 70 2d 3e 72 65 73 4f  _OK;.    p->resO
4e20: 6e 53 74 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  nStack = 1;.    
4e30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
4e40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4e50: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
4e60: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
4e70: 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  N */../*.** Prin
4e80: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
4e90: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
4ea0: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
4eb0: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
4ec0: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
4ed0: 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  Vdbe *p){.#ifdef
4ee0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
4ef0: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
4f00: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
4f10: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
4f20: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
4f30: 70 2d 3e 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20  p->aOp[nOp-1];. 
4f40: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
4f50: 3d 3d 4f 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70  ==OP_Noop && pOp
4f60: 2d 3e 70 33 21 3d 30 20 29 7b 0a 20 20 20 20 63  ->p3!=0 ){.    c
4f70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
4f80: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 77 68 69 6c  Op->p3;.    whil
4f90: 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38 2a  e( isspace(*(u8*
4fa0: 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70  )z) ) z++;.    p
4fb0: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
4fc0: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 23 65 6e  \n", z);.  }.#en
4fd0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  dif.}../*.** Pre
4fe0: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
4ff0: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
5000: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f  tion.  This invo
5010: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
5020: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
5030: 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e  g stack space an
5040: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
5050: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
5060: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
5070: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
5080: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
5090: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
50a0: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
50b0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
50c0: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
50d0: 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
50e0: 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44  way to move a VD
50f0: 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  BE from VDBE_MAG
5100: 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44  IC_INIT to.** VD
5110: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f  BE_MAGIC_RUN..*/
5120: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5130: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
5140: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  The VDBE */.  in
5170: 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20  t nVar,         
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5190: 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65  Number of '?' se
51a0: 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61  e in the SQL sta
51b0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
51c0: 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20  nMem,           
51d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
51e0: 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63  mber of memory c
51f0: 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ells to allocate
5200: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f   */.  int nCurso
5210: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
5220: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5230: 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c  f cursors to all
5240: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  ocate */.  int i
5250: 73 45 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20  sExplain        
5260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
5270: 65 20 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e  e if the EXPLAIN
5280: 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72 65   keywords is pre
5290: 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  sent */.){.  int
52a0: 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   n;..  assert( p
52b0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
52c0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
52d0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20  MAGIC_INIT );.. 
52e0: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
52f0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
5300: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
5310: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
5320: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
5330: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
5340: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
5350: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
5360: 65 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73  er. This.   * is
5370: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
5380: 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72  l to resizeOpArr
5390: 61 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73  ay() below may s
53a0: 68 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70  hrink the.   * p
53b0: 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f  ->aOp[] array to
53c0: 20 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20   save memory if 
53d0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56  called when in V
53e0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20  DBE_MAGIC_RUN . 
53f0: 20 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f    * state..   */
5400: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
5410: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20  BE_MAGIC_RUN;.. 
5420: 20 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74 69   /* No instructi
5430: 6f 6e 20 65 76 65 72 20 70 75 73 68 65 73 20 6d  on ever pushes m
5440: 6f 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c  ore than a singl
5450: 65 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74  e element onto t
5460: 68 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20  he.  ** stack.  
5470: 41 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e 65  And the stack ne
5480: 76 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75 63  ver grows on suc
5490: 63 65 73 73 69 76 65 20 65 78 65 63 75 74 69 6f  cessive executio
54a0: 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ns of the.  ** s
54b0: 61 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68  ame loop.  So th
54c0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
54d0: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  f instructions i
54e0: 73 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64  s an upper bound
54f0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78  .  ** on the max
5500: 69 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68  imum stack depth
5510: 20 72 65 71 75 69 72 65 64 2e 20 20 28 41 64 64   required.  (Add
5520: 65 64 20 6c 61 74 65 72 3a 29 20 20 54 68 65 0a  ed later:)  The.
5530: 20 20 2a 2a 20 72 65 73 6f 6c 76 65 50 32 56 61    ** resolveP2Va
5540: 6c 75 65 73 28 29 20 63 61 6c 6c 20 63 6f 6d 70  lues() call comp
5550: 75 74 65 73 20 61 20 74 69 67 68 74 65 72 20 75  utes a tighter u
5560: 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
5570: 65 0a 20 20 2a 2a 20 73 74 61 63 6b 20 73 69 7a  e.  ** stack siz
5580: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c  e..  **.  ** All
5590: 6f 63 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65 20  ocation all the 
55a0: 73 74 61 63 6b 20 73 70 61 63 65 20 77 65 20 77  stack space we w
55b0: 69 6c 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a 20  ill ever need.. 
55c0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53 74   */.  if( p->aSt
55d0: 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ack==0 ){.    in
55e0: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 2f 2a  t nArg;       /*
55f0: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
5600: 6f 66 20 61 72 67 73 20 70 61 73 73 65 64 20 74  of args passed t
5610: 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  o a user functio
5620: 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  n. */.    int nS
5630: 74 61 63 6b 3b 20 20 20 20 20 2f 2a 20 4d 61 78  tack;     /* Max
5640: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
5650: 74 61 63 6b 20 65 6e 74 72 69 65 73 20 72 65 71  tack entries req
5660: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 72 65 73  uired */.    res
5670: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
5680: 26 6e 41 72 67 2c 20 26 6e 53 74 61 63 6b 29 3b  &nArg, &nStack);
5690: 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72  .    resizeOpArr
56a0: 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20  ay(p, p->nOp);. 
56b0: 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e     assert( nVar>
56c0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
56d0: 28 20 6e 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20  ( nStack<p->nOp 
56e0: 29 3b 0a 20 20 20 20 6e 53 74 61 63 6b 20 3d 20  );.    nStack = 
56f0: 69 73 45 78 70 6c 61 69 6e 20 3f 20 31 30 20 3a  isExplain ? 10 :
5700: 20 6e 53 74 61 63 6b 3b 0a 20 20 20 20 70 2d 3e   nStack;.    p->
5710: 61 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 4d  aStack = sqliteM
5720: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 6e  alloc(.        n
5730: 53 74 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e  Stack*sizeof(p->
5740: 61 53 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f 2a  aStack[0])    /*
5750: 20 61 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20   aStack */.     
5760: 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d   + nArg*sizeof(M
5770: 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  em*)            
5780: 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20    /* apArg */.  
5790: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
57a0: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
57b0: 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a       /* aVar */.
57c0: 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a        + nVar*siz
57d0: 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20 20  eof(char*)      
57e0: 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20         /* azVar 
57f0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d 2a  */.      + nMem*
5800: 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20  sizeof(Mem)     
5810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
5820: 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75  m */.      + nCu
5830: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73  rsor*sizeof(Curs
5840: 6f 72 2a 29 20 20 20 20 20 20 20 20 2f 2a 20 61  or*)        /* a
5850: 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20  pCsr */.    );. 
5860: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4d     if( !sqlite3M
5870: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
5880: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d  .      p->aMem =
5890: 20 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 53 74 61   &p->aStack[nSta
58a0: 63 6b 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  ck];.      p->nM
58b0: 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 20  em = nMem;.     
58c0: 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61   p->aVar = &p->a
58d0: 4d 65 6d 5b 6e 4d 65 6d 5d 3b 0a 20 20 20 20 20  Mem[nMem];.     
58e0: 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b   p->nVar = nVar;
58f0: 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20  .      p->okVar 
5900: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  = 0;.      p->ap
5910: 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d  Arg = (Mem**)&p-
5920: 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20  >aVar[nVar];.   
5930: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63     p->azVar = (c
5940: 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b  har**)&p->apArg[
5950: 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  nArg];.      p->
5960: 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a  apCsr = (Cursor*
5970: 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72  *)&p->azVar[nVar
5980: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72  ];.      p->nCur
5990: 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  sor = nCursor;. 
59a0: 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c       for(n=0; n<
59b0: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
59c0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
59d0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
59e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
59f0: 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c   }.  for(n=0; n<
5a00: 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  p->nMem; n++){. 
5a10: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
5a20: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
5a30: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
5a40: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 28  TE_DEBUG.  if( (
5a50: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
5a60: 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e  QLITE_VdbeListin
5a70: 67 29 21 3d 30 0a 20 20 20 20 7c 7c 20 73 71 6c  g)!=0.    || sql
5a80: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
5a90: 28 22 76 64 62 65 5f 65 78 70 6c 61 69 6e 22 29  ("vdbe_explain")
5aa0: 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  .  ){.    int i;
5ab0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 56 44 42  .    printf("VDB
5ac0: 45 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e  E Program Listin
5ad0: 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  g:\n");.    sqli
5ae0: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
5af0: 70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  p);.    for(i=0;
5b00: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
5b10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5b20: 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74  bePrintOp(stdout
5b30: 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
5b40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
5b50: 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
5b60: 78 69 73 74 73 28 22 76 64 62 65 5f 74 72 61 63  xists("vdbe_trac
5b70: 65 22 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 72  e") ){.    p->tr
5b80: 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  ace = stdout;.  
5b90: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 54  }.#endif.  p->pT
5ba0: 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b  os = &p->aStack[
5bb0: 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  -1];.  p->pc = -
5bc0: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
5bd0: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69  ITE_OK;.  p->uni
5be0: 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  queCnt = 0;.  p-
5bf0: 3e 72 65 74 75 72 6e 44 65 70 74 68 20 3d 20 30  >returnDepth = 0
5c00: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
5c10: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
5c20: 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20   p->popStack =  
5c30: 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  0;.  p->explain 
5c40: 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20  |= isExplain;.  
5c50: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
5c60: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
5c70: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
5c80: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
5c90: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
5ca0: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 23  eFormat = 255;.#
5cb0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
5cc0: 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69  LE.  {.    int i
5cd0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5ce0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
5cf0: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
5d00: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  nt = 0;.      p-
5d10: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d  >aOp[i].cycles =
5d20: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   0;.    }.  }.#e
5d30: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ndif.}../*.** Cl
5d40: 6f 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e 64  ose a cursor and
5d50: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
5d60: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
5d70: 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a  cursor happens.*
5d80: 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  * to hold..*/.vo
5d90: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
5da0: 65 65 43 75 72 73 6f 72 28 43 75 72 73 6f 72 20  eeCursor(Cursor 
5db0: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
5dc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
5dd0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78  n;.  }.  if( pCx
5de0: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
5df0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
5e00: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43  seCursor(pCx->pC
5e10: 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66  ursor);.  }.  if
5e20: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
5e30: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
5e40: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
5e50: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
5e60: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
5e70: 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  BLE.  if( pCx->p
5e80: 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
5e90: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
5ea0: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
5eb0: 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43  or = pCx->pVtabC
5ec0: 75 72 73 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  ursor;.    sqlit
5ed0: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
5ee0: 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
5ef0: 74 61 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  tab;.    const s
5f00: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
5f10: 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
5f20: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 4d 6f  pModule;.    pMo
5f30: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
5f40: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  abCursor);.  }.#
5f50: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72  endif.  sqliteFr
5f60: 65 65 28 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a  ee(pCx->pData);.
5f70: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 78    sqliteFree(pCx
5f80: 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73 71 6c 69  ->aType);.  sqli
5f90: 74 65 46 72 65 65 28 70 43 78 29 3b 0a 7d 0a 0a  teFree(pCx);.}..
5fa0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
5fb0: 63 75 72 73 6f 72 73 0a 2a 2f 0a 73 74 61 74 69  cursors.*/.stati
5fc0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
5fd0: 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b  ursors(Vdbe *p){
5fe0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5ff0: 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65  p->apCsr==0 ) re
6000: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
6010: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
6020: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
6030: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
6040: 2d 3e 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 20  ->apCsr[i]);.   
6050: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30   p->apCsr[i] = 0
6060: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
6070: 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61  lean up the VM a
6080: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a  fter execution..
6090: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
60a0: 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  ne will automati
60b0: 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20  cally close any 
60c0: 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20  cursors, lists, 
60d0: 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72  and/or.** sorter
60e0: 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74  s that were left
60f0: 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20   open.  It also 
6100: 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75  deletes the valu
6110: 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c  es of.** variabl
6120: 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d  es in the aVar[]
6130: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
6140: 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56  c void Cleanup(V
6150: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
6160: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63  ;.  if( p->aStac
6170: 6b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  k ){.    release
6180: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 53 74 61  MemArray(p->aSta
6190: 63 6b 2c 20 31 20 2b 20 28 70 2d 3e 70 54 6f 73  ck, 1 + (p->pTos
61a0: 20 2d 20 70 2d 3e 61 53 74 61 63 6b 29 29 3b 0a   - p->aStack));.
61b0: 20 20 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70      p->pTos = &p
61c0: 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20  ->aStack[-1];.  
61d0: 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
61e0: 6f 72 73 28 70 29 3b 0a 20 20 72 65 6c 65 61 73  ors(p);.  releas
61f0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65  eMemArray(p->aMe
6200: 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73  m, p->nMem);.  s
6210: 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c  qlite3VdbeFifoCl
6220: 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a  ear(&p->sFifo);.
6230: 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74    if( p->context
6240: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  Stack ){.    for
6250: 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65  (i=0; i<p->conte
6260: 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29  xtStackTop; i++)
6270: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6280: 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d  dbeFifoClear(&p-
6290: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d  >contextStack[i]
62a0: 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  .sFifo);.    }. 
62b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
62c0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a  >contextStack);.
62d0: 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74    }.  p->context
62e0: 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e  Stack = 0;.  p->
62f0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74  contextStackDept
6300: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74  h = 0;.  p->cont
6310: 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b  extStackTop = 0;
6320: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
6330: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
6340: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 0a  zErrMsg = 0;.}..
6350: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75  /*.** Set the nu
6360: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
6370: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c  olumns that will
6380: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
6390: 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74  this SQL.** stat
63a0: 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e  ement. This is n
63b0: 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c  ow set at compil
63c0: 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74  e time, rather t
63d0: 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78  han during.** ex
63e0: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ecution of the v
63f0: 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74  dbe program so t
6400: 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  hat sqlite3_colu
6410: 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a  mn_count() can.*
6420: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61  * be called on a
6430: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
6440: 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73  before sqlite3_s
6450: 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tep()..*/.void s
6460: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
6470: 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  Cols(Vdbe *p, in
6480: 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20  t nResColumn){. 
6490: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
64a0: 20 20 69 6e 74 20 6e 3b 0a 20 20 72 65 6c 65 61    int n;.  relea
64b0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
64c0: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
64d0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
64e0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
64f0: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
6500: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
6510: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
6520: 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43  esColumn = nResC
6530: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
6540: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
6550: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 4d 61  = (Mem*)sqliteMa
6560: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 4d 65 6d  lloc( sizeof(Mem
6570: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
6580: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
6590: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
65a0: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 28 70  -- > 0 ){.    (p
65b0: 43 6f 6c 4e 61 6d 65 2b 2b 29 2d 3e 66 6c 61 67  ColName++)->flag
65c0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
65d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
65e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
65f0: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
6600: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
6610: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
6620: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
6630: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
6640: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
6650: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
6660: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
6670: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
6680: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
6690: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
66a0: 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f 53 54  *.** If N==P3_ST
66b0: 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74  ATIC  it means t
66c0: 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70  hat zName is a p
66d0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73  ointer to a cons
66e0: 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73  tant static.** s
66f0: 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e  tring and we can
6700: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
6710: 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73  ointer. If it is
6720: 20 50 33 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65   P3_DYNAMIC, the
6730: 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  n .** the string
6740: 20 69 73 20 66 72 65 65 64 20 75 73 69 6e 67 20   is freed using 
6750: 73 71 6c 69 74 65 46 72 65 65 28 29 20 77 68 65  sqliteFree() whe
6760: 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 66 69  n the vdbe is fi
6770: 6e 69 73 68 65 64 20 77 69 74 68 0a 2a 2a 20 69  nished with.** i
6780: 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 4e 20  t. Otherwise, N 
6790: 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61  bytes of zName a
67a0: 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e  re copied..*/.in
67b0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  t sqlite3VdbeSet
67c0: 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c  ColName(Vdbe *p,
67d0: 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 76 61   int idx, int va
67e0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
67f0: 4e 61 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  Name, int N){.  
6800: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
6810: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
6820: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
6830: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
6840: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
6850: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
6860: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
6870: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
6880: 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74 28 20  OMEM;.  assert( 
6890: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
68a0: 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
68b0: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
68c0: 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
68d0: 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d 50  mn]);.  if( N==P
68e0: 33 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d  3_DYNAMIC || N==
68f0: 50 33 5f 53 54 41 54 49 43 20 29 7b 0a 20 20 20  P3_STATIC ){.   
6900: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
6910: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
6920: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
6930: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
6940: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d  ITE_STATIC);.  }
6950: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
6960: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
6970: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
6980: 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f 55  ame, N, SQLITE_U
6990: 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  TF8,SQLITE_TRANS
69a0: 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28  IENT);.  }.  if(
69b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
69c0: 26 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20  & N==P3_DYNAMIC 
69d0: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
69e0: 3e 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e 61  >flags = (pColNa
69f0: 6d 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d 5f  me->flags&(~MEM_
6a00: 53 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79 6e  Static))|MEM_Dyn
6a10: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
6a20: 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDel = 0;.  }.  
6a30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6a40: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
6a50: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
6a60: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
6a70: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
6a80: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
6a90: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
6aa0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
6ab0: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
6ac0: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
6ad0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
6ae0: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
6af0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
6b00: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
6b10: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
6b20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
6b30: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
6b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
6b50: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
6b60: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
6b70: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
6b80: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
6b90: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
6ba0: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
6bb0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
6bc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6bd0: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
6be0: 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  mit = 0;..  for(
6bf0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
6c00: 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
6c10: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6c20: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
6c30: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
6c40: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
6c50: 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58  ) ){.      needX
6c60: 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  commit = 1;.    
6c70: 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72    if( i!=1 ) nTr
6c80: 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ans++;.    }.  }
6c90: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
6ca0: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
6cb0: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
6cc0: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
6cd0: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
6ce0: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
6cf0: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
6d00: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  lback ){.    sql
6d10: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
6d20: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  );.    rc = db->
6d30: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
6d40: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
6d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65  .    sqlite3Safe
6d60: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66  tyOn(db);.    if
6d70: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
6d80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
6d90: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
6da0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
6db0: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
6dc0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
6dd0: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
6de0: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
6df0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
6e00: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
6e10: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
6e20: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
6e30: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
6e40: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
6e50: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
6e60: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
6e70: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
6e80: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
6e90: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
6ea0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
6eb0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
6ec0: 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68  :memory:.  In th
6ed0: 61 74 20 63 61 73 65 20 77 65 20 64 6f 0a 20 20  at case we do.  
6ee0: 2a 2a 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  ** not support a
6ef0: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
6f00: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
6f10: 20 74 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   the simple case
6f20: 20 74 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a   then.  ** too..
6f30: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74    */.  if( 0==st
6f40: 72 6c 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65  rlen(sqlite3Btre
6f50: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
6f60: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c  >aDb[0].pBt)) ||
6f70: 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20   nTrans<=1 ){.  
6f80: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
6f90: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
6fa0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
6fb0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
6fc0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
6fd0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
6fe0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
6ff0: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
7000: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
7010: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
7020: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
7030: 64 62 2c 20 72 63 29 3b 0a 0a 20 20 20 20 2f 2a  db, rc);..    /*
7040: 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
7050: 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
7060: 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
7070: 79 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 20 20  y synced */.    
7080: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7090: 4b 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  K ){.      for(i
70a0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
70b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 74 72  ++){.        Btr
70c0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
70d0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
70e0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
70f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
7100: 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  reeCommit(pBt);.
7110: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7120: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
7130: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
7140: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
7150: 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
7160: 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
7170: 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
7180: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
7190: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
71a0: 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
71b0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
71c0: 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
71d0: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
71e0: 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e  mitted atomicly.
71f0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
7200: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
7210: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74  .  else{.    int
7220: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
7230: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
7240: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
7250: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
7260: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
7270: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
7280: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
7290: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
72a0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
72b0: 74 29 3b 0a 20 20 20 20 4f 73 46 69 6c 65 20 2a  t);.    OsFile *
72c0: 6d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 20  master = 0;..   
72d0: 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
72e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
72f0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20   name */.    do 
7300: 7b 0a 20 20 20 20 20 20 75 33 32 20 72 61 6e 64  {.      u32 rand
7310: 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  om;.      sqlite
7320: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
7330: 20 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64       sqlite3Rand
7340: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61  omness(sizeof(ra
7350: 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b  ndom), &random);
7360: 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  .      zMaster =
7370: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
7380: 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61  "%s-mj%08X", zMa
7390: 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30  inFile, random&0
73a0: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  x7fffffff);.    
73b0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29    if( !zMaster )
73c0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
73d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
73e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
73f0: 65 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  e( sqlite3OsFile
7400: 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 20  Exists(zMaster) 
7410: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  );..    /* Open 
7420: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7430: 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  al. */.    rc = 
7440: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
7450: 6c 75 73 69 76 65 28 7a 4d 61 73 74 65 72 2c 20  lusive(zMaster, 
7460: 26 6d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  &master, 0);.   
7470: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7480: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
7490: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
74a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
74b0: 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
74c0: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
74d0: 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
74e0: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
74f0: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
7500: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
7510: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
7520: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
7530: 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
7540: 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
7550: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
7560: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7570: 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
7580: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
7590: 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
75a0: 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
75b0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
75c0: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
75d0: 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
75e0: 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
75f0: 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
7600: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
7610: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
7620: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
7630: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
7640: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
7650: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
7660: 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65   i==1 ) continue
7670: 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  ;   /* Ignore th
7680: 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
7690: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
76a0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
76b0: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
76c0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
76d0: 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
76e0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
76f0: 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
7700: 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
7710: 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [0]==0 ) continu
7720: 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d  e;  /* Ignore :m
7730: 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
7740: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
7750: 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71  !needSync && !sq
7760: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
7770: 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20  sabled(pBt) ){. 
7780: 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
7790: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
77a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
77b0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 6d 61 73  lite3OsWrite(mas
77c0: 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 74 72 6c  ter, zFile, strl
77d0: 65 6e 28 7a 46 69 6c 65 29 2b 31 29 3b 0a 20 20  en(zFile)+1);.  
77e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
77f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7800: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
7810: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
7820: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
7830: 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29  sDelete(zMaster)
7840: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
7850: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
7860: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
7870: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
7880: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a        }.    }...
7890: 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
78a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
78b0: 69 6c 65 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ile. Before doin
78c0: 67 20 74 68 69 73 2c 20 6f 70 65 6e 20 74 68 65  g this, open the
78d0: 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 2a   directory.    *
78e0: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
78f0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 74 6f  rnal file is sto
7900: 72 65 20 69 6e 20 73 6f 20 74 68 61 74 20 69 74  re in so that it
7910: 20 67 65 74 73 20 73 79 6e 63 65 64 20 74 6f 6f   gets synced too
7920: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61  ..    */.    zMa
7930: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
7940: 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
7950: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
7960: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7970: 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  3OsOpenDirectory
7980: 28 6d 61 73 74 65 72 2c 20 7a 4d 61 69 6e 46 69  (master, zMainFi
7990: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  le);.    if( rc!
79a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
79b0: 20 20 20 20 20 20 20 20 28 6e 65 65 64 53 79 6e          (needSyn
79c0: 63 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33  c && (rc=sqlite3
79d0: 4f 73 53 79 6e 63 28 6d 61 73 74 65 72 2c 30 29  OsSync(master,0)
79e0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b  )!=SQLITE_OK) ){
79f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
7a00: 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a  Close(&master);.
7a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
7a20: 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a  elete(zMaster);.
7a30: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
7a40: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
7a50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7a60: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
7a70: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
7a80: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
7a90: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
7aa0: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
7ab0: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
7ac0: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
7ad0: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
7ae0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
7af0: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
7b00: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
7b10: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
7b20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7b30: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
7b40: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
7b50: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
7b60: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
7b70: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
7b80: 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  (),.    ** then 
7b90: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
7ba0: 65 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65  e that the maste
7bb0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
7bc0: 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 72  ill be.    ** or
7bd0: 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
7be0: 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
7bf0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
7c00: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ter journal.    
7c10: 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  ** file name was
7c20: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
7c30: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
7c40: 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
7c50: 65 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 65 64  e.    ** occured
7c60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
7c70: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
7c80: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
7c90: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
7ca0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
7cb0: 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69   if( pBt && sqli
7cc0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
7cd0: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
7ce0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
7cf0: 72 65 65 53 79 6e 63 28 70 42 74 2c 20 7a 4d 61  reeSync(pBt, zMa
7d00: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ster);.        i
7d10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7d30: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
7d40: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
7d50: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
7d60: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
7d70: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
7d80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7d90: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
7da0: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
7db0: 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
7dc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7dd0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
7de0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
7df0: 65 28 26 6d 61 73 74 65 72 29 3b 0a 0a 20 20 20  e(&master);..   
7e00: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
7e10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7e20: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
7e30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7e40: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
7e50: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
7e60: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
7e70: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
7e80: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
7e90: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
7ea0: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
7eb0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
7ec0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
7ed0: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ete(zMaster);.  
7ee0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
7ef0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73  LITE_OK );.    s
7f00: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
7f10: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
7f20: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
7f30: 6c 69 74 65 33 4f 73 53 79 6e 63 44 69 72 65 63  lite3OsSyncDirec
7f40: 74 6f 72 79 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  tory(zMainFile);
7f50: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7f60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7f70: 2f 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67  /* This is not g
7f80: 6f 6f 64 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ood. The master 
7f90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
7fa0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 62   been deleted, b
7fb0: 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ut.      ** the 
7fc0: 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 66  directory sync f
7fd0: 61 69 6c 65 64 2e 20 54 68 65 72 65 20 69 73 20  ailed. There is 
7fe0: 6e 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61  no completely sa
7ff0: 66 65 20 63 6f 75 72 73 65 20 6f 66 0a 20 20 20  fe course of.   
8000: 20 20 20 2a 2a 20 61 63 74 69 6f 6e 20 66 72 6f     ** action fro
8010: 6d 20 68 65 72 65 2e 20 54 68 65 20 69 6e 64 69  m here. The indi
8020: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20  vidual journals 
8030: 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65  contain the name
8040: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
8050: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8060: 66 69 6c 65 2c 20 62 75 74 20 74 68 65 72 65 20  file, but there 
8070: 69 73 20 6e 6f 20 77 61 79 20 6f 66 20 6b 6e 6f  is no way of kno
8080: 77 69 6e 67 20 69 66 20 74 68 61 74 0a 20 20 20  wing if that.   
8090: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
80a0: 72 6e 61 6c 20 65 78 69 73 74 73 20 6e 6f 77 20  rnal exists now 
80b0: 6f 72 20 69 66 20 69 74 20 77 69 6c 6c 20 65 78  or if it will ex
80c0: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 6f 70  ist after the op
80d0: 65 72 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  erating.      **
80e0: 20 73 79 73 74 65 6d 20 63 72 61 73 68 20 74 68   system crash th
80f0: 61 74 20 6d 61 79 20 66 6f 6c 6c 6f 77 20 74 68  at may follow th
8100: 65 20 66 73 79 6e 63 28 29 20 66 61 69 6c 75 72  e fsync() failur
8110: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
8120: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8130: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
8140: 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
8150: 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
8160: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
8170: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
8180: 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
8190: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
81a0: 69 74 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  it() are only cl
81b0: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 20  osing files and 
81c0: 64 65 6c 65 74 69 6e 67 0a 20 20 20 20 2a 2a 20  deleting.    ** 
81d0: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
81e0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
81f0: 67 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20  g while this is 
8200: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
8210: 27 74 0a 20 20 20 20 2a 2a 20 72 65 61 6c 6c 79  't.    ** really
8220: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
8230: 72 69 74 79 20 6f 66 20 74 68 65 20 74 72 61 6e  rity of the tran
8240: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
8250: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 0a 20  dy guaranteed,. 
8260: 20 20 20 2a 2a 20 62 75 74 20 73 6f 6d 65 20 73     ** but some s
8270: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
8280: 6e 61 6c 73 20 6d 61 79 20 62 65 20 6c 79 69 6e  nals may be lyin
8290: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
82a0: 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 65 72  ing an.    ** er
82b0: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
82c0: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
82d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
82e0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
82f0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
8300: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
8310: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
8320: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
8330: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
8340: 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  t(pBt);.      }.
8350: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8360: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
8370: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
8380: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8390: 2a 2a 20 46 69 6e 64 20 65 76 65 72 79 20 61 63  ** Find every ac
83a0: 74 69 76 65 20 56 4d 20 6f 74 68 65 72 20 74 68  tive VM other th
83b0: 61 6e 20 70 56 64 62 65 20 61 6e 64 20 63 68 61  an pVdbe and cha
83c0: 6e 67 65 20 69 74 73 20 73 74 61 74 75 73 20 74  nge its status t
83d0: 6f 0a 2a 2a 20 61 62 6f 72 74 65 64 2e 20 20 54  o.** aborted.  T
83e0: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
83f0: 20 6f 6e 65 20 56 4d 20 63 61 75 73 65 73 20 61   one VM causes a
8400: 20 72 6f 6c 6c 62 61 63 6b 20 64 75 65 20 74 6f   rollback due to
8410: 20 61 6e 0a 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49   an.** ON CONFLI
8420: 43 54 20 52 4f 4c 4c 42 41 43 4b 20 63 6c 61 75  CT ROLLBACK clau
8430: 73 65 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  se (for example)
8440: 2e 20 20 54 68 65 20 6f 74 68 65 72 20 56 4d 73  .  The other VMs
8450: 20 6d 75 73 74 20 62 65 0a 2a 2a 20 61 62 6f 72   must be.** abor
8460: 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 79  ted so that they
8470: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 64 61 74   do not have dat
8480: 61 20 72 6f 6c 6c 65 64 20 6f 75 74 20 66 72 6f  a rolled out fro
8490: 6d 20 75 6e 64 65 72 6e 65 61 74 68 0a 2a 2a 20  m underneath.** 
84a0: 74 68 65 6d 20 6c 65 61 64 69 6e 67 20 74 6f 20  them leading to 
84b0: 61 20 73 65 67 66 61 75 6c 74 2e 0a 2a 2f 0a 76  a segfault..*/.v
84c0: 6f 69 64 20 73 71 6c 69 74 65 33 41 62 6f 72 74  oid sqlite3Abort
84d0: 4f 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73  OtherActiveVdbes
84e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
84f0: 62 65 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  be *pExcept){.  
8500: 56 64 62 65 20 2a 70 4f 74 68 65 72 3b 0a 20 20  Vdbe *pOther;.  
8510: 66 6f 72 28 70 4f 74 68 65 72 3d 64 62 2d 3e 70  for(pOther=db->p
8520: 56 64 62 65 3b 20 70 4f 74 68 65 72 3b 20 70 4f  Vdbe; pOther; pO
8530: 74 68 65 72 3d 70 4f 74 68 65 72 2d 3e 70 4e 65  ther=pOther->pNe
8540: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 74  xt){.    if( pOt
8550: 68 65 72 3d 3d 70 45 78 63 65 70 74 20 29 20 63  her==pExcept ) c
8560: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
8570: 20 70 4f 74 68 65 72 2d 3e 6d 61 67 69 63 21 3d   pOther->magic!=
8580: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
8590: 7c 20 70 4f 74 68 65 72 2d 3e 70 63 3c 30 20 29  | pOther->pc<0 )
85a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 63   continue;.    c
85b0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
85c0: 4f 74 68 65 72 29 3b 0a 20 20 20 20 70 4f 74 68  Other);.    pOth
85d0: 65 72 2d 3e 61 62 6f 72 74 65 64 20 3d 20 31 3b  er->aborted = 1;
85e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54  .  }.}../* .** T
85f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
8600: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
8610: 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e  te3.activeVdbeCn
8620: 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  t count variable
8630: 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20  .** matches the 
8640: 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73  number of vdbe's
8650: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c   in the list sql
8660: 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20  ite3.pVdbe that 
8670: 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
8680: 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65   active. An asse
8690: 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74  rtion fails if t
86a0: 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f  he two counts do
86b0: 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54   not match..** T
86c0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
86d0: 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e  al self-check on
86e0: 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61  ly - it is not a
86f0: 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63  n essential proc
8700: 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a  essing.** step..
8710: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
8720: 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20  no-op if NDEBUG 
8730: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
8740: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
8750: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
8760: 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c  ctiveVdbeCnt(sql
8770: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
8780: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20  e *p;.  int cnt 
8790: 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
87a0: 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
87b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   ){.    if( p->m
87c0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
87d0: 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  _RUN && p->pc>=0
87e0: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
87f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
8800: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
8810: 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
8820: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b  activeVdbeCnt );
8830: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
8840: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
8850: 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
8860: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8870: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
8880: 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
8890: 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
88a0: 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
88b0: 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
88c0: 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
88d0: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
88e0: 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
88f0: 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
8900: 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
8910: 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
8920: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
8930: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
8940: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
8950: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
8960: 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
8970: 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
8980: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
8990: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
89a0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
89b0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
89c0: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
89d0: 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
89e0: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
89f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
8a00: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
8a10: 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
8a20: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
8a30: 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
8a40: 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
8a50: 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
8a60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
8a70: 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
8a80: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8a90: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
8aa0: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74   int (*xFunc)(Bt
8ab0: 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20  ree *pBt) = 0;  
8ac0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
8ad0: 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65  all on each btre
8ae0: 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69  e backend */.  i
8af0: 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
8b00: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
8b10: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
8b20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
8b30: 49 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54  IOERR */..  /* T
8b40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
8b50: 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
8b60: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
8b70: 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
8b80: 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
8b90: 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
8ba0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
8bb0: 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
8bc0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
8bd0: 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
8be0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
8bf0: 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 65 63 69 61    **.  ** Specia
8c00: 6c 20 65 72 72 6f 72 73 3a 0a 20 20 2a 2a 0a 20  l errors:.  **. 
8c10: 20 2a 2a 20 20 20 20 20 49 66 20 61 6e 20 53 51   **     If an SQ
8c20: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 65 72 72 6f 72  LITE_NOMEM error
8c30: 20 68 61 73 20 6f 63 63 75 72 65 64 20 69 6e 20   has occured in 
8c40: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  a statement that
8c50: 20 77 72 69 74 65 73 20 74 6f 0a 20 20 2a 2a 20   writes to.  ** 
8c60: 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65      the database
8c70: 2c 20 74 68 65 6e 20 65 69 74 68 65 72 20 61 20  , then either a 
8c80: 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61  statement or tra
8c90: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
8ca0: 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 20 20 20   rolled.  **    
8cb0: 20 62 61 63 6b 20 74 6f 20 65 6e 73 75 72 65 20   back to ensure 
8cc0: 74 68 65 20 74 72 65 65 2d 73 74 72 75 63 74 75  the tree-structu
8cd0: 72 65 73 20 61 72 65 20 69 6e 20 61 20 63 6f 6e  res are in a con
8ce0: 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 20 41  sistent state. A
8cf0: 0a 20 20 2a 2a 20 20 20 20 20 73 74 61 74 65 6d  .  **     statem
8d00: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
8d10: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  is rolled back i
8d20: 66 20 6f 6e 65 20 69 73 20 6f 70 65 6e 2c 20 6f  f one is open, o
8d30: 74 68 65 72 77 69 73 65 20 74 68 65 0a 20 20 2a  therwise the.  *
8d40: 2a 20 20 20 20 20 65 6e 74 69 72 65 20 74 72 61  *     entire tra
8d50: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
8d60: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
8d70: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 49 66 20 61  **.  **     If a
8d80: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 65  n SQLITE_IOERR e
8d90: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
8da0: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
8db0: 74 68 61 74 20 77 72 69 74 65 73 20 74 6f 0a 20  that writes to. 
8dc0: 20 2a 2a 20 20 20 20 20 74 68 65 20 64 61 74 61   **     the data
8dd0: 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65  base, then the e
8de0: 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
8df0: 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  n must be rolled
8e00: 20 62 61 63 6b 2e 20 54 68 65 0a 20 20 2a 2a 20   back. The.  ** 
8e10: 20 20 20 20 49 2f 4f 20 65 72 72 6f 72 20 6d 61      I/O error ma
8e20: 79 20 68 61 76 65 20 63 61 75 73 65 64 20 67 61  y have caused ga
8e30: 72 62 61 67 65 20 74 6f 20 62 65 20 77 72 69 74  rbage to be writ
8e40: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
8e50: 61 6c 20 0a 20 20 2a 2a 20 20 20 20 20 66 69 6c  al .  **     fil
8e60: 65 2e 20 57 65 72 65 20 74 68 65 20 74 72 61 6e  e. Were the tran
8e70: 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69  saction to conti
8e80: 6e 75 65 20 61 6e 64 20 65 76 65 6e 74 75 61 6c  nue and eventual
8e90: 6c 79 20 62 65 20 72 6f 6c 6c 65 64 20 0a 20 20  ly be rolled .  
8ea0: 2a 2a 20 20 20 20 20 62 61 63 6b 20 74 68 61 74  **     back that
8eb0: 20 67 61 72 62 61 67 65 20 6d 69 67 68 74 20 65   garbage might e
8ec0: 6e 64 20 75 70 20 69 6e 20 74 68 65 20 64 61 74  nd up in the dat
8ed0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a  abase file..  **
8ee0: 20 20 20 20 20 0a 20 20 2a 2a 20 20 20 20 20 49       .  **     I
8ef0: 6e 20 62 6f 74 68 20 6f 66 20 74 68 65 20 61 62  n both of the ab
8f00: 6f 76 65 20 63 61 73 65 73 2c 20 74 68 65 20 56  ove cases, the V
8f10: 64 62 65 2e 65 72 72 6f 72 41 63 74 69 6f 6e 20  dbe.errorAction 
8f20: 76 61 72 69 61 62 6c 65 20 69 73 20 0a 20 20 2a  variable is .  *
8f30: 2a 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 20 49  *     ignored. I
8f40: 66 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 75  f the sqlite3.au
8f50: 74 6f 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  toCommit flag is
8f60: 20 66 61 6c 73 65 20 61 6e 64 20 61 20 74 72 61   false and a tra
8f70: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20  nsaction.  **   
8f80: 20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b    is rolled back
8f90: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 73 65 74  , it will be set
8fa0: 20 74 6f 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20   to true..  **. 
8fb0: 20 2a 2a 20 4f 74 68 65 72 20 65 72 72 6f 72 73   ** Other errors
8fc0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 20 65  :.  **.  ** No e
8fd0: 72 72 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2f 0a  rror:.  **.  */.
8fe0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
8ff0: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
9000: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
9010: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
9020: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
9030: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
9040: 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 68      /* Already h
9050: 61 6c 74 65 64 2e 20 20 4e 6f 74 68 69 6e 67 20  alted.  Nothing 
9060: 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 20 20 61 73  to do. */.    as
9070: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
9080: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
9090: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
90a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
90b0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
90c0: 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  );.  checkActive
90d0: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
90e0: 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
90f0: 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
9100: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
9110: 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a  ever started */.
9120: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
9130: 7b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  {..    /* Check 
9140: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
9150: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2d 20  pecial errors - 
9160: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
9170: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 2a 2f 0a  SQLITE_IOERR */.
9180: 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
9190: 6f 72 20 3d 20 28 28 70 2d 3e 72 63 3d 3d 53 51  or = ((p->rc==SQ
91a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 2d  LITE_NOMEM || p-
91b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  >rc==SQLITE_IOER
91c0: 52 29 3f 31 3a 30 29 3b 0a 20 20 20 20 69 66 28  R)?1:0);.    if(
91d0: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
91e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
91f0: 20 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74 69   loop does stati
9200: 63 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68  c analysis of th
9210: 65 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 77  e query to see w
9220: 68 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20  hich of the.    
9230: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
9240: 68 72 65 65 20 63 61 74 65 67 6f 72 69 65 73 20  hree categories 
9250: 69 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20  it falls into:. 
9260: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
9270: 20 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20       Read-only. 
9280: 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72       **     Quer
9290: 79 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e 74  y with statement
92a0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
92b0: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
92c0: 6f 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  out statement jo
92d0: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20  urnal.      **. 
92e0: 20 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64       ** We could
92f0: 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f   do something mo
9300: 72 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20  re elegant than 
9310: 74 68 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c  this static anal
9320: 79 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20  ysis (i.e..     
9330: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79   ** store the ty
9340: 70 65 20 6f 66 20 71 75 65 72 79 20 61 73 20 70  pe of query as p
9350: 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c  art of the compl
9360: 69 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62  iation phase), b
9370: 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ut .      ** han
9380: 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f  dling malloc() o
9390: 72 20 49 4f 20 66 61 69 6c 75 72 65 20 69 73 20  r IO failure is 
93a0: 61 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65  a fairly obscure
93b0: 20 65 64 67 65 20 63 61 73 65 20 73 6f 20 0a 20   edge case so . 
93c0: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20       ** this is 
93d0: 70 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e  probably easier.
93e0: 20 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65 20   Todo: Might be 
93f0: 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
9400: 6f 20 72 65 64 75 63 65 20 0a 20 20 20 20 20 20  o reduce .      
9410: 2a 2a 20 63 6f 64 65 20 73 69 7a 65 20 61 20 76  ** code size a v
9420: 65 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74  ery small amount
9430: 20 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20   though....     
9440: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
9450: 52 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  ReadOnly = 1;.  
9460: 20 20 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d      int isStatem
9470: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  ent = 0;.      a
9480: 73 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20  ssert(p->aOp || 
9490: 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20  p->nOp==0);.    
94a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
94b0: 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nOp; i++){ .    
94c0: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61      switch( p->a
94d0: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a  Op[i].opcode ){.
94e0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f            case O
94f0: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20  P_Transaction:. 
9500: 20 20 20 20 20 20 20 20 20 20 20 69 73 52 65 61             isRea
9510: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
9520: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9530: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
9540: 53 74 61 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20  Statement:.     
9550: 20 20 20 20 20 20 20 69 73 53 74 61 74 65 6d 65         isStateme
9560: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
9570: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9580: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
9590: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
95a0: 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
95b0: 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20  nly, we need do 
95c0: 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61  no rollback at a
95d0: 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  ll. Otherwise,. 
95e0: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20       ** proceed 
95f0: 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
9600: 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20   handling..     
9610: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
9620: 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  sReadOnly ){.   
9630: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
9640: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
9650: 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  isStatement ){. 
9660: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
9670: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
9680: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20  lbackStmt;.     
9690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
96a0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
96b0: 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
96c0: 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
96d0: 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
96e0: 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
96f0: 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
9700: 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
9710: 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
9720: 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
9730: 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
9740: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
9750: 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63 74  te3AbortOtherAct
9760: 69 76 65 56 64 62 65 73 28 64 62 2c 20 70 29 3b  iveVdbes(db, p);
9770: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9780: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
9790: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
97a0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
97b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
97c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
97d0: 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
97e0: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
97f0: 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68  t and this is th
9800: 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 76 64  e only active vd
9810: 62 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  be, then.    ** 
9820: 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63  we do either a c
9830: 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
9840: 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  k of the current
9850: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20   transaction. . 
9860: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
9870: 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c  e: This block al
9880: 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f  so runs if one o
9890: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
98a0: 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20  rors handled .  
98b0: 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f    ** above has o
98c0: 63 63 75 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  ccured. .    */.
98d0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f      if( db->auto
98e0: 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 61 63  Commit && db->ac
98f0: 74 69 76 65 56 64 62 65 43 6e 74 3d 3d 31 20 29  tiveVdbeCnt==1 )
9900: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
9910: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
9920: 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
9930: 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
9940: 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
9950: 09 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d  ./* The auto-com
9960: 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
9970: 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65 20 70  , and the vdbe p
9980: 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20  rogram was .    
9990: 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
99a0: 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  l or hit an 'OR 
99b0: 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
99c0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
99d0: 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a  ommit .        *
99e0: 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  * is required.. 
99f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9a00: 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43    int rc = vdbeC
9a10: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 20  ommit(db);.     
9a20: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9a30: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
9a40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9a50: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
9a60: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
9a70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9a80: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
9a90: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9aa0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
9ab0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
9ad0: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
9ae0: 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
9af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
9b00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
9b10: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
9b20: 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
9b30: 20 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e   }else if( !xFun
9b40: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  c ){.      if( p
9b50: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9b60: 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
9b70: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
9b80: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
9b90: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
9ba0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Stmt;.      }els
9bb0: 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
9bc0: 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
9bd0: 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63 20  {.        xFunc 
9be0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
9bf0: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
9c00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9c10: 20 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68   sqlite3AbortOth
9c20: 65 72 41 63 74 69 76 65 56 64 62 65 73 28 64 62  erActiveVdbes(db
9c30: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , p);.        sq
9c40: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
9c50: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
9c60: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
9c70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9c80: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75    .    /* If xFu
9c90: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
9ca0: 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f  then it is one o
9cb0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  f sqlite3BtreeRo
9cc0: 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20  llbackStmt or.  
9cd0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
9ce0: 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c  eCommitStmt. Cal
9cf0: 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63  l it once on eac
9d00: 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e  h backend. If an
9d10: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
9d20: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74    ** and the ret
9d30: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c  urn code is stil
9d40: 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74  l SQLITE_OK, set
9d50: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
9d60: 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20   to the new.    
9d70: 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a  ** error value..
9d80: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
9d90: 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20  t(!xFunc ||.    
9da0: 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33    xFunc==sqlite3
9db0: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20  BtreeCommitStmt 
9dc0: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
9dd0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
9de0: 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a  backStmt.    );.
9df0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75      for(i=0; xFu
9e00: 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  nc && i<db->nDb;
9e10: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
9e20: 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65  t rc;.      Btre
9e30: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
9e40: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
9e50: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
9e60: 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74    rc = xFunc(pBt
9e70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
9e80: 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
9e90: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
9ea0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
9eb0: 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NT) ){.         
9ec0: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
9ed0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
9ee0: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
9ef0: 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Msg, 0);.       
9f00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
9f10: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
9f20: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
9f30: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
9f40: 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  TE and the state
9f50: 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74  ment was committ
9f60: 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  ed, .    ** set 
9f70: 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
9f80: 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
9f90: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
9fa0: 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  On && p->pc>=0 )
9fb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75  {.      if( !xFu
9fc0: 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c  nc || xFunc==sql
9fd0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
9fe0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tmt ){.        s
9ff0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
a000: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
a010: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
a020: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
a030: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
a040: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
a050: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
a060: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
a070: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
a080: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
a090: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
a0a0: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
a0b0: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
a0c0: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
a0d0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
a0e0: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
a0f0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
a100: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
a110: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
a120: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
a130: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
a140: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
a150: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  }.  }..  /* We h
a160: 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
a170: 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
a180: 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
a190: 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
a1a0: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
a1b0: 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76  ){.    db->activ
a1c0: 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a  eVdbeCnt--;.  }.
a1d0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
a1e0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
a1f0: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
a200: 6e 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75 72  nt(db);..  retur
a210: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a220: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
a230: 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
a240: 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
a250: 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
a260: 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
a270: 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
a280: 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
a290: 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
a2a0: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
a2b0: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
a2c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
a2d0: 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
a2e0: 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
a2f0: 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
a300: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
a310: 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
a320: 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
a330: 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
a340: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
a350: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
a360: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
a370: 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
a380: 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
a390: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
a3a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
a3b0: 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
a3c0: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
a3d0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
a3e0: 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  && p->magic!=VDB
a3f0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
a400: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a410: 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4d  (p->db, SQLITE_M
a420: 49 53 55 53 45 2c 20 30 29 3b 0a 20 20 20 20 72  ISUSE, 0);.    r
a430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
a440: 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  USE;.  }..  /* I
a450: 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
a460: 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
a470: 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
a480: 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
a490: 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
a4a0: 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
a4b0: 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
a4c0: 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
a4d0: 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
a4e0: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
a4f0: 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
a500: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
a510: 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
a520: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
a530: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
a540: 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
a550: 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
a560: 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
a570: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
a580: 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
a590: 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
a5a0: 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
a5b0: 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
a5c0: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
a5d0: 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
a5e0: 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
a5f0: 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
a600: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
a610: 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
a620: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
a630: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  >pc>=0 ){.    if
a640: 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
a650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 2a 20 64        sqlite3* d
a660: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 20  b = p->db;.     
a670: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
a680: 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
a690: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
a6a0: 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74  LITE_UTF8, sqlit
a6b0: 65 33 46 72 65 65 58 29 3b 0a 20 20 20 20 20 20  e3FreeX);.      
a6c0: 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d  db->errCode = p-
a6d0: 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  >rc;.      p->zE
a6e0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
a6f0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
a700: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a710: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72  rror(p->db, p->r
a720: 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, 0);.    }else
a730: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a740: 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49  rror(p->db, SQLI
a750: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
a760: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
a770: 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
a780: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
a790: 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
a7a0: 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
a7b0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
a7c0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
a7d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
a7e0: 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
a7f0: 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
a800: 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
a810: 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
a820: 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
a830: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
a840: 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
a850: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70    sqlite3Error(p
a860: 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  ->db, p->rc, 0);
a870: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
a880: 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
a890: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
a8a0: 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
a8b0: 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
a8c0: 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
a8d0: 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
a8e0: 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  E run..  */.  as
a8f0: 73 65 72 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70  sert( p->pTos<&p
a900: 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30  ->aStack[p->pc<0
a910: 3f 30 3a 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d  ?0:p->pc] || !p-
a920: 3e 61 53 74 61 63 6b 20 29 3b 0a 23 69 66 64 65  >aStack );.#ifde
a930: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
a940: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
a950: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
a960: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
a970: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
a980: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a990: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
a9a0: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
a9b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a9c0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
a9d0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
a9e0: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
a9f0: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
aa00: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
aa10: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
aa20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
aa30: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
aa40: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
aa50: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
aa60: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
aa70: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
aa80: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
aa90: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
aaa0: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
aab0: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
aac0: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
aad0: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
aae0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
aaf0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
ab00: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
ab10: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
ab20: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
ab30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
ab40: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
ab50: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
ab60: 3b 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d  ;.  p->aborted =
ab70: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
ab80: 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 29  =SQLITE_SCHEMA )
ab90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
aba0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
abb0: 28 70 2d 3e 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  (p->db, 0);.  }.
abc0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
abd0: 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
abe0: 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
abf0: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
ac00: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
ac10: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
ac20: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
ac30: 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
ac40: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
ac50: 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
ac60: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
ac70: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
ac80: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
ac90: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
aca0: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
acb0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
acc0: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
acd0: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
ace0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
acf0: 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 7d  dbeReset(p);.  }
ad00: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69  else if( p->magi
ad10: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c!=VDBE_MAGIC_IN
ad20: 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
ad30: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
ad40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
ad50: 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
ad60: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ad70: 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72  * Call the destr
ad80: 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61  uctor for each a
ad90: 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20  uxdata entry in 
ada0: 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68  pVdbeFunc for wh
adb0: 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ich.** the corre
adc0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
add0: 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20  mask is clear.  
ade0: 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20  Auxdata entries 
adf0: 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65  beyond 31.** are
ae00: 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65   always destroye
ae10: 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61  d.  To destroy a
ae20: 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69  ll auxdata entri
ae30: 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  es, call this.**
ae40: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61   routine with ma
ae50: 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sk==0..*/.void s
ae60: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
ae70: 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63  AuxData(VdbeFunc
ae80: 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74   *pVdbeFunc, int
ae90: 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b   mask){.  int i;
aea0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56  .  for(i=0; i<pV
aeb0: 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69  dbeFunc->nAux; i
aec0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
aed0: 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
aee0: 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75  &pVdbeFunc->apAu
aef0: 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69  x[i];.    if( (i
af00: 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31  >31 || !(mask&(1
af10: 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e  <<i))) && pAux->
af20: 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66  pAux ){.      if
af30: 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
af40: 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
af50: 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
af60: 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
af70: 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d      pAux->pAux =
af80: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
af90: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
afa0: 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
afb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
afc0: 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
afd0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
afe0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
aff0: 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20    Cleanup(p);.  
b000: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
b010: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
b020: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
b030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
b040: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62  ert( p->db->pVdb
b050: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64  e==p );.    p->d
b060: 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
b070: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
b080: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
b090: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
b0a0: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
b0b0: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
b0c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
b0d0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
b0e0: 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e    Op *pOp = &p->
b0f0: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 20 20 66 72  aOp[i];.      fr
b100: 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65  eeP3(pOp->p3type
b110: 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20  , pOp->p3);.    
b120: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
b130: 28 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20  (p->aOp);.  }.  
b140: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
b150: 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
b160: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
b170: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71  p->aLabel);.  sq
b180: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 53 74 61  liteFree(p->aSta
b190: 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  ck);.  releaseMe
b1a0: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
b1b0: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
b1c0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
b1d0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 43  sqliteFree(p->aC
b1e0: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 70 2d 3e 6d 61  olName);.  p->ma
b1f0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
b200: 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 46  _DEAD;.  sqliteF
b210: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
b220: 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
b230: 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
b240: 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
b250: 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
b260: 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
b270: 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  w.  Return an er
b280: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f  ror code.  If no
b290: 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69   MoveTo is pendi
b2a0: 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ng, this.** rout
b2b0: 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67  ine does nothing
b2c0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c   and returns SQL
b2d0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
b2e0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
b2f0: 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70  Moveto(Cursor *p
b300: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65  ){.  if( p->defe
b310: 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
b320: 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 20    int res, rc;. 
b330: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
b340: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
b350: 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nt;.    assert( 
b360: 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
b370: 20 20 69 66 28 20 70 2d 3e 69 73 54 61 62 6c 65    if( p->isTable
b380: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
b390: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
b3a0: 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  o(p->pCursor, 0,
b3b0: 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
b3c0: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , &res);.    }el
b3d0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
b3e0: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
b3f0: 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 28 63 68  o(p->pCursor,(ch
b400: 61 72 2a 29 26 70 2d 3e 6d 6f 76 65 74 6f 54 61  ar*)&p->movetoTa
b410: 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 20 20 20 20 73 69 7a 65 6f 66 28 69 36 34 29 2c      sizeof(i64),
b440: 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &res);.    }.   
b450: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
b460: 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49 6e   rc;.    *p->pIn
b470: 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  crKey = 0;.    p
b480: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65  ->lastRowid = ke
b490: 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f  yToInt(p->moveto
b4a0: 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e  Target);.    p->
b4b0: 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72  rowidIsValid = r
b4c0: 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72  es==0;.    if( r
b4d0: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  es<0 ){.      rc
b4e0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
b4f0: 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ext(p->pCursor, 
b500: 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
b510: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
b520: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b530: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
b540: 2b 3b 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  +;.    p->deferr
b550: 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
b560: 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
b570: 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
b580: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b590: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b5a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
b5b0: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
b5c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
b5d0: 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
b5e0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
b5f0: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
b600: 56 64 62 65 53 65 72 69 61 6c 52 65 61 64 28 29  VdbeSerialRead()
b610: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
b620: 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
b630: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 57  lite3VdbeSerialW
b640: 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  rite().**.** enc
b650: 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
b660: 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
b670: 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
b680: 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
b690: 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
b6a0: 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
b6b0: 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
b6c0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
b6d0: 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
b6e0: 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
b6f0: 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
b700: 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
b710: 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
b720: 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
b730: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
b740: 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
b750: 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
b760: 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
b770: 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
b780: 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
b790: 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
b7a0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
b7b0: 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
b7c0: 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
b7d0: 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
b7e0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
b7f0: 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
b800: 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
b810: 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
b820: 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
b830: 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
b840: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
b850: 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
b860: 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
b870: 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e  blob seperately.
b880: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
b890: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
b8a0: 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
b8b0: 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
b8c0: 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
b8d0: 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
b8e0: 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
b8f0: 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
b900: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
b910: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
b920: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
b930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
b940: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
b950: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
b960: 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
b970: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
b980: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
b990: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
b9a0: 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
b9d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
b9e0: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
b9f0: 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
ba00: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
ba10: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
ba40: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
ba50: 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
ba80: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
ba90: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
baa0: 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
bab0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
bac0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
baf0: 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
bb00: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
bb10: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
bb20: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
bb30: 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
bb40: 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
bb50: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
bb60: 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
bb70: 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
bb80: 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
bbb0: 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
bbc0: 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
bbd0: 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
bbe0: 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
bbf0: 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
bc00: 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
bc10: 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
bc20: 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
bc30: 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
bc40: 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
bc50: 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
bc60: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
bc70: 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
bc80: 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
bc90: 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
bca0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
bcb0: 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
bcc0: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
bcd0: 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
bce0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
bcf0: 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
bd00: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
bd10: 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
bd20: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20   pMem->flags;.. 
bd30: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
bd40: 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
bd50: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
bd60: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
bd70: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
bd80: 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
bd90: 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
bda0: 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
bdb0: 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
bdc0: 28 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30  ((((i64)0x000010
bdd0: 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
bde0: 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b  i64 i = pMem->i;
bdf0: 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
be00: 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
be10: 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
be20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
be30: 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20  +i;.    }.    u 
be40: 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a  = i<0 ? -i : i;.
be50: 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
be60: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
be70: 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
be80: 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
be90: 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
bea0: 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
beb0: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
bec0: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
bed0: 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
bee0: 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
bef0: 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
bf00: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
bf10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
bf20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
bf30: 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  s&MEM_Str ){.   
bf40: 20 69 6e 74 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e   int n = pMem->n
bf50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e  ;.    assert( n>
bf60: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
bf70: 20 28 28 6e 2a 32 29 20 2b 20 31 33 29 3b 0a 20   ((n*2) + 13);. 
bf80: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
bf90: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 72  EM_Blob ){.    r
bfa0: 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e 6e 2a 32  eturn (pMem->n*2
bfb0: 20 2b 20 31 32 29 3b 0a 20 20 7d 0a 20 20 72 65   + 12);.  }.  re
bfc0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
bfd0: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
bfe0: 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
bff0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
c000: 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
c010: 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74  ial-type..*/.int
c020: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
c030: 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
c040: 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
c050: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
c060: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
c070: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
c080: 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
c090: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
c0a0: 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20   aSize[] = { 0, 
c0b0: 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38  1, 2, 3, 4, 6, 8
c0c0: 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 8, 0, 0, 0, 0 
c0d0: 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53  };.    return aS
c0e0: 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  ize[serial_type]
c0f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
c100: 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
c110: 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
c120: 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
c130: 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
c140: 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
c150: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
c160: 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
c170: 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
c180: 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
c190: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c1a0: 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f  ytes written..*/
c1b0: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
c1c0: 65 53 65 72 69 61 6c 50 75 74 28 75 6e 73 69 67  eSerialPut(unsig
c1d0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 4d  ned char *buf, M
c1e0: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
c1f0: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33  le_format){.  u3
c200: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
c210: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c220: 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65  lType(pMem, file
c230: 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20  _format);.  int 
c240: 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
c250: 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
c260: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
c270: 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
c280: 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
c290: 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  v;.    int i;.  
c2a0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
c2b0: 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 76 20  e==7 ){.      v 
c2c0: 3d 20 2a 28 75 36 34 2a 29 26 70 4d 65 6d 2d 3e  = *(u64*)&pMem->
c2d0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
c2e0: 20 20 20 20 76 20 3d 20 2a 28 75 36 34 2a 29 26      v = *(u64*)&
c2f0: 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 7d 0a 20  pMem->i;.    }. 
c300: 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
c310: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
c320: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
c330: 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  e);.    while( i
c340: 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b  -- ){.      buf[
c350: 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20  i] = (v&0xFF);. 
c360: 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
c370: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
c380: 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
c390: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
c3a0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
c3b0: 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 6c 65 6e  e>=12 ){.    len
c3c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
c3d0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
c3e0: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 6d 65  al_type);.    me
c3f0: 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
c400: 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74  z, len);.    ret
c410: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
c420: 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
c430: 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
c440: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
c450: 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
c460: 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
c470: 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
c480: 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
c490: 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
c4a0: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
c4b0: 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
c4c0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
c4d0: 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
c4e0: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
c4f0: 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
c500: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
c510: 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
c520: 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
c530: 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
c540: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c560: 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
c570: 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
c580: 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c5a0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
c5b0: 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
c5c0: 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
c5d0: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
c5e0: 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
c5f0: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
c600: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
c610: 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
c620: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
c630: 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
c640: 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c  se 0: {  /* NULL
c650: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
c660: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
c670: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c680: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
c690: 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
c6a0: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
c6b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 28       pMem->i = (
c6c0: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
c6d0: 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0];.      pMem->
c6e0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
c6f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
c700: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c710: 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
c720: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
c730: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d  .      pMem->i =
c740: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
c750: 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
c760: 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[1];.      pMem
c770: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
c780: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
c790: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
c7a0: 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
c7b0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
c7c0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69  */.      pMem->i
c7d0: 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
c7e0: 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c  r)buf[0])<<16) |
c7f0: 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62   (buf[1]<<8) | b
c800: 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[2];.      pMe
c810: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
c820: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
c830: 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
c840: 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
c850: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
c860: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
c870: 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  i = (buf[0]<<24)
c880: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
c890: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
c8a0: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[3];.      pM
c8b0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c8c0: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
c8d0: 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
c8e0: 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
c8f0: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
c900: 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  r */.      u64 x
c910: 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
c920: 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
c930: 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33  buf[1];.      u3
c940: 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32  2 y = (buf[2]<<2
c950: 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36  4) | (buf[3]<<16
c960: 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20  ) | (buf[4]<<8) 
c970: 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20  | buf[5];.      
c980: 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
c990: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d  .      pMem->i =
c9a0: 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
c9b0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c9c0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
c9d0: 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
c9e0: 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
c9f0: 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
ca00: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
ca10: 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
ca20: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
ca30: 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20  .      u64 x;.  
ca40: 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21      u32 y;.#if !
ca50: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
ca60: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ca70: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
ca80: 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a  _POINT).      /*
ca90: 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
caa0: 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
cab0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
cac0: 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
cad0: 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
cae0: 2e 20 20 54 68 65 20 62 79 74 65 20 6f 72 64 65  .  The byte orde
caf0: 72 20 64 69 66 66 65 72 73 20 6f 6e 20 73 6f 6d  r differs on som
cb00: 65 20 28 62 72 6f 6b 65 6e 29 20 61 72 63 68 69  e (broken) archi
cb10: 74 65 63 74 75 72 65 73 2e 0a 20 20 20 20 20 20  tectures..      
cb20: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
cb30: 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
cb40: 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
cb50: 3c 3c 33 32 3b 0a 20 20 20 20 20 20 61 73 73 65  <<32;.      asse
cb60: 72 74 28 20 31 2e 30 3d 3d 2a 28 64 6f 75 62 6c  rt( 1.0==*(doubl
cb70: 65 2a 29 26 74 31 20 29 3b 0a 23 65 6e 64 69 66  e*)&t1 );.#endif
cb80: 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66  ..      x = (buf
cb90: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
cba0: 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
cbb0: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
cbc0: 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34        y = (buf[4
cbd0: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d  ]<<24) | (buf[5]
cbe0: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c  <<16) | (buf[6]<
cbf0: 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20  <8) | buf[7];.  
cc00: 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
cc10: 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73  | y;.      if( s
cc20: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
cc30: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69  .        pMem->i
cc40: 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
cc50: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
cc60: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
cc70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cc80: 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 64 6f    pMem->r = *(do
cc90: 75 62 6c 65 2a 29 26 78 3b 0a 20 20 20 20 20 20  uble*)&x;.      
cca0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ccb0: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
ccc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  }.      return 8
ccd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
cce0: 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
ccf0: 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
cd00: 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
cd10: 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d   1 */.      pMem
cd20: 2d 3e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  ->i = serial_typ
cd30: 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
cd40: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
cd50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
cd60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
cd70: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ult: {.      int
cd80: 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
cd90: 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
cda0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
cdb0: 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
cdc0: 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
cdd0: 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
cde0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
cdf0: 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
ce00: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
ce10: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
ce20: 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
ce30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ce40: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
ce50: 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
ce60: 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
ce70: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
ce80: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ce90: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
cea0: 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 72 65  e header of a re
ceb0: 63 6f 72 64 20 63 6f 6e 73 69 73 74 73 20 6f 66  cord consists of
cec0: 20 61 20 73 65 71 75 65 6e 63 65 20 76 61 72 69   a sequence vari
ced0: 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65  able-length inte
cee0: 67 65 72 73 2e 0a 2a 2a 20 54 68 65 73 65 20 69  gers..** These i
cef0: 6e 74 65 67 65 72 73 20 61 72 65 20 61 6c 6d 6f  ntegers are almo
cf00: 73 74 20 61 6c 77 61 79 73 20 73 6d 61 6c 6c 20  st always small 
cf10: 61 6e 64 20 61 72 65 20 65 6e 63 6f 64 65 64 20  and are encoded 
cf20: 61 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  as a single byte
cf30: 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ..** The followi
cf40: 6e 67 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  ng macro takes a
cf50: 64 76 61 6e 74 61 67 65 20 74 68 69 73 20 66 61  dvantage this fa
cf60: 63 74 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  ct to provide a 
cf70: 66 61 73 74 20 64 65 63 6f 64 65 0a 2a 2a 20 6f  fast decode.** o
cf80: 66 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 69  f the integers i
cf90: 6e 20 61 20 72 65 63 6f 72 64 20 68 65 61 64 65  n a record heade
cfa0: 72 2e 20 20 49 74 20 69 73 20 66 61 73 74 65 72  r.  It is faster
cfb0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
cfc0: 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 74 68  case.** where th
cfd0: 65 20 69 6e 74 65 67 65 72 20 69 73 20 61 20 73  e integer is a s
cfe0: 69 6e 67 6c 65 20 62 79 74 65 2e 20 20 49 74 20  ingle byte.  It 
cff0: 69 73 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  is a little slow
d000: 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 69  er when the.** i
d010: 6e 74 65 67 65 72 20 69 73 20 74 77 6f 20 6f 72  nteger is two or
d020: 20 6d 6f 72 65 20 62 79 74 65 73 2e 20 20 42 75   more bytes.  Bu
d030: 74 20 6f 76 65 72 61 6c 6c 20 69 74 20 69 73 20  t overall it is 
d040: 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  faster..**.** Th
d050: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
d060: 65 73 73 69 6f 6e 73 20 61 72 65 20 65 71 75 69  essions are equi
d070: 76 61 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  valent:.**.**   
d080: 20 20 78 20 3d 20 73 71 6c 69 74 65 33 47 65 74    x = sqlite3Get
d090: 56 61 72 69 6e 74 33 32 28 20 41 2c 20 26 42 20  Varint32( A, &B 
d0a0: 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d  );.**.**     x =
d0b0: 20 47 65 74 56 61 72 69 6e 74 28 20 41 2c 20 42   GetVarint( A, B
d0c0: 20 29 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65 66 69 6e   );.**.*/.#defin
d0d0: 65 20 47 65 74 56 61 72 69 6e 74 28 41 2c 42 29  e GetVarint(A,B)
d0e0: 20 20 28 28 42 20 3d 20 2a 28 41 29 29 3c 3d 30    ((B = *(A))<=0
d0f0: 78 37 66 20 3f 20 31 20 3a 20 73 71 6c 69 74 65  x7f ? 1 : sqlite
d100: 33 47 65 74 56 61 72 69 6e 74 33 32 28 41 2c 20  3GetVarint32(A, 
d110: 26 42 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  &B))../*.** This
d120: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
d130: 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
d140: 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
d150: 65 63 6f 72 64 73 20 73 70 65 63 69 66 69 65 64  ecords specified
d160: 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c 20   by .** {nKey1, 
d170: 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b 65 79  pKey1} and {nKey
d180: 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74 75 72  2, pKey2}, retur
d190: 6e 69 6e 67 20 61 20 6e 65 67 61 74 69 76 65 2c  ning a negative,
d1a0: 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
d1b0: 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
d1c0: 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 69  {nKey1, pKey1} i
d1d0: 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
d1e0: 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
d1f0: 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65 79 32  ater than {nKey2
d200: 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74 68 20  , pKey2}.  Both 
d210: 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 6d 75  Key1 and Key2 mu
d220: 73 74 20 62 65 20 62 79 74 65 20 73 74 72 69 6e  st be byte strin
d230: 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64 20 62  gs.** composed b
d240: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
d250: 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
d260: 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74 20 73  e VDBE..*/.int s
d270: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
d280: 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20  Compare(.  void 
d290: 2a 75 73 65 72 44 61 74 61 2c 0a 20 20 69 6e 74  *userData,.  int
d2a0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
d2b0: 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e  id *pKey1, .  in
d2c0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
d2d0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
d2e0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
d2f0: 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 75 73  o = (KeyInfo*)us
d300: 65 72 44 61 74 61 3b 0a 20 20 75 33 32 20 64 31  erData;.  u32 d1
d310: 2c 20 64 32 3b 20 20 20 20 20 20 20 20 20 20 2f  , d2;          /
d320: 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
d330: 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
d340: 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
d350: 33 32 20 69 64 78 31 2c 20 69 64 78 32 3b 20 20  32 idx1, idx2;  
d360: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
d370: 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
d380: 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
d390: 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
d3a0: 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20 4e 75  , szHdr2;  /* Nu
d3b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
d3c0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
d3d0: 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46   i = 0;.  int nF
d3e0: 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ield;.  int rc =
d3f0: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
d400: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
d410: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
d420: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
d430: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
d440: 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20 3d 20  d char *aKey2 = 
d450: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
d460: 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a 0a 20  char *)pKey2;.. 
d470: 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d   Mem mem1;.  Mem
d480: 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e   mem2;.  mem1.en
d490: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
d4a0: 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20 3d 20  c;.  mem2.enc = 
d4b0: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
d4c0: 20 0a 20 20 69 64 78 31 20 3d 20 47 65 74 56 61   .  idx1 = GetVa
d4d0: 72 69 6e 74 28 61 4b 65 79 31 2c 20 73 7a 48 64  rint(aKey1, szHd
d4e0: 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
d4f0: 72 31 3b 0a 20 20 69 64 78 32 20 3d 20 47 65 74  r1;.  idx2 = Get
d500: 56 61 72 69 6e 74 28 61 4b 65 79 32 2c 20 73 7a  Varint(aKey2, sz
d510: 48 64 72 32 29 3b 0a 20 20 64 32 20 3d 20 73 7a  Hdr2);.  d2 = sz
d520: 48 64 72 32 3b 0a 20 20 6e 46 69 65 6c 64 20 3d  Hdr2;.  nField =
d530: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
d540: 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31  d;.  while( idx1
d550: 3c 73 7a 48 64 72 31 20 26 26 20 69 64 78 32 3c  <szHdr1 && idx2<
d560: 73 7a 48 64 72 32 20 29 7b 0a 20 20 20 20 75 33  szHdr2 ){.    u3
d570: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
d580: 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
d590: 79 70 65 32 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype2;..    /* Re
d5a0: 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
d5b0: 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
d5c0: 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
d5d0: 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
d5e0: 31 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20  1 += GetVarint( 
d5f0: 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
d600: 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20  al_type1 );.    
d610: 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
d620: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d630: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
d640: 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
d650: 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 47  k;.    idx2 += G
d660: 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79 32 2b  etVarint( aKey2+
d670: 69 64 78 32 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx2, serial_typ
d680: 65 32 20 29 3b 0a 20 20 20 20 69 66 28 20 64 32  e2 );.    if( d2
d690: 3e 3d 6e 4b 65 79 32 20 26 26 20 73 71 6c 69 74  >=nKey2 && sqlit
d6a0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
d6b0: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 32  Len(serial_type2
d6c0: 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
d6d0: 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
d6e0: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
d6f0: 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 65   space left in e
d700: 61 63 68 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ach key for the 
d710: 62 6c 6f 62 20 6f 66 0a 20 20 20 20 2a 2a 20 64  blob of.    ** d
d720: 61 74 61 20 74 6f 20 67 6f 20 77 69 74 68 20 74  ata to go with t
d730: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6a  he serial type j
d740: 75 73 74 20 72 65 61 64 2e 20 54 68 69 73 20 61  ust read. This a
d750: 73 73 65 72 74 20 6d 61 79 20 66 61 69 6c 20 69  ssert may fail i
d760: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  f.    ** the fil
d770: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d780: 20 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 76   Then read the v
d790: 61 6c 75 65 20 66 72 6f 6d 20 65 61 63 68 20 6b  alue from each k
d7a0: 65 79 20 69 6e 74 6f 20 6d 65 6d 31 0a 20 20 20  ey into mem1.   
d7b0: 20 2a 2a 20 61 6e 64 20 6d 65 6d 32 20 72 65 73   ** and mem2 res
d7c0: 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a  pectively..    *
d7d0: 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
d7e0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
d7f0: 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
d800: 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
d810: 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73 71 6c  );.    d2 += sql
d820: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
d830: 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65  t(&aKey2[d2], se
d840: 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d  rial_type2, &mem
d850: 32 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  2);..    rc = sq
d860: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
d870: 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c  &mem1, &mem2, i<
d880: 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66  nField ? pKeyInf
d890: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29  o->aColl[i] : 0)
d8a0: 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66  ;.    if( mem1.f
d8b0: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
d8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
d8d0: 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20  elease(&mem1);. 
d8e0: 20 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67     if( mem2.flag
d8f0: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 20 73 71  s & MEM_Dyn ) sq
d900: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
d910: 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20  ase(&mem2);.    
d920: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
d930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d940: 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
d950: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65  /* One of the ke
d960: 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
d970: 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68  elds, but all th
d980: 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
d990: 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77  hat point.  ** w
d9a0: 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68  ere equal. If th
d9b0: 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69  e incrKey flag i
d9c0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
d9d0: 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20   second key is. 
d9e0: 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c   ** treated as l
d9f0: 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  arger..  */.  if
da00: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
da10: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63  f( pKeyInfo->inc
da20: 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  rKey ){.      rc
da30: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
da40: 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b   if( d1<nKey1 ){
da50: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
da60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 32 3c     }else if( d2<
da70: 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 20 20 72  nKey2 ){.      r
da80: 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  c = -1;.    }.  
da90: 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e  }else if( pKeyIn
daa0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
dab0: 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  & i<pKeyInfo->nF
dac0: 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20  ield.           
dad0: 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d      && pKeyInfo-
dae0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
daf0: 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a  {.    rc = -rc;.
db00: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
db10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
db20: 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69 6e  rgument is an in
db30: 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f 73  dex entry compos
db40: 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
db50: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
db60: 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65  e..** The last e
db70: 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72 65 63  ntry in this rec
db80: 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  ord should be an
db90: 20 69 6e 74 65 67 65 72 20 28 73 70 65 63 69 66   integer (specif
dba0: 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74  ically.** an int
dbb0: 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54 68  eger rowid).  Th
dbc0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
dbd0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
dbe0: 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68 61   bytes in.** tha
dbf0: 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e  t integer..*/.in
dc00: 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
dc10: 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20 75  RowidLen(const u
dc20: 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
dc30: 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
dc40: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
dc50: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
dc60: 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
dc70: 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
dc80: 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c   rowid */..  sql
dc90: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
dca0: 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20  aKey, &szHdr);. 
dcb0: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
dcc0: 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d  t32(&aKey[szHdr-
dcd0: 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b  1], &typeRowid);
dce0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
dcf0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
dd00: 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d  en(typeRowid);.}
dd10: 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  .  ../*.** pCur 
dd20: 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
dd30: 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
dd40: 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
dd50: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
dd60: 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
dd70: 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
dd80: 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
dd90: 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
dda0: 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
ddb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
ddc0: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
ddd0: 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
dde0: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
ddf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
de00: 65 49 64 78 52 6f 77 69 64 28 42 74 43 75 72 73  eIdxRowid(BtCurs
de10: 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72  or *pCur, i64 *r
de20: 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65  owid){.  i64 nCe
de30: 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b  llKey;.  int rc;
de40: 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
de50: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
de60: 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
de70: 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
de80: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
de90: 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
dea0: 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
deb0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
dec0: 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
ded0: 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69  em m, v;..  sqli
dee0: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
def0: 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
df00: 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
df10: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
df20: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
df30: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
df40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
df50: 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
df60: 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  0, nCellKey, 1, 
df70: 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
df80: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
df90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 47 65 74    }.  sqlite3Get
dfa0: 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
dfb0: 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71  z, &szHdr);.  sq
dfc0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
dfd0: 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
dfe0: 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29  -1], &typeRowid)
dff0: 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  ;.  lenRowid = s
e000: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
e010: 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
e020: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
e030: 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
e040: 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
e050: 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
e060: 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
e070: 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
e080: 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
e090: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e0a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
e0b0: 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
e0c0: 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
e0d0: 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
e0e0: 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69  is point to agai
e0f0: 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
e100: 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f  tring in pKey (o
e110: 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20  f length nKey). 
e120: 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
e130: 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
e140: 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
e150: 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
e160: 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
e170: 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
e180: 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
e190: 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e  an pKey.  Return
e1a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e1b0: 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65  ccess..**.** pKe
e1c0: 79 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61  y is either crea
e1d0: 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ted without a ro
e1e0: 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61  wid or is trunca
e1f0: 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ted so that it.*
e200: 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69  * omits the rowi
e210: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
e220: 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
e230: 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
e240: 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e   entry.** is ign
e250: 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ored as well..*/
e260: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
e270: 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
e280: 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20   Cursor *pC,    
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2a0: 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
e2b0: 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
e2c0: 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e  .  int nKey, con
e2d0: 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20 2f  st u8 *pKey,   /
e2e0: 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f 6d  * The key to com
e2f0: 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 72  pare */.  int *r
e300: 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
e310: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
e320: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
e330: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
e340: 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
e350: 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
e360: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d  rsor *pCur = pC-
e370: 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  >pCursor;.  int 
e380: 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20  lenRowid;.  Mem 
e390: 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
e3a0: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
e3b0: 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66  &nCellKey);.  if
e3c0: 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b  ( nCellKey<=0 ){
e3d0: 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
e3e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e3f0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
e400: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
e410: 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
e420: 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  sor, 0, nCellKey
e430: 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
e440: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
e450: 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f   rc;.  }.  lenRo
e460: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
e470: 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 28 75 38  eIdxRowidLen((u8
e480: 2a 29 6d 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d  *)m.z);.  *res =
e490: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
e4a0: 72 64 43 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b  rdCompare(pC->pK
e4b0: 65 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52  eyInfo, m.n-lenR
e4c0: 6f 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c  owid, m.z, nKey,
e4d0: 20 70 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65   pKey);.  sqlite
e4e0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
e4f0: 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
e500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e510: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
e520: 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
e530: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
e540: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
e550: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
e560: 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
e570: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
e580: 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
e590: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
e5a0: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
e5b0: 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
e5c0: 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
e5d0: 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
e5e0: 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
e5f0: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
e600: 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
e610: 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
e620: 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
e630: 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
e640: 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
e650: 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
e660: 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
e670: 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
e680: 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
e690: 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
e6a0: 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
e6b0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
e6c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
e6d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e6e0: 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
e6f0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
e700: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
e710: 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
e720: 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
e730: 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
e740: 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
e750: 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
e760: 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
e770: 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
e780: 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
e790: 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
e7a0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
e7b0: 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
e7c0: 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
e7d0: 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
e7e0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
e7f0: 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
e800: 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
e810: 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
e820: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
e830: 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
e840: 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
e850: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
e860: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
e870: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
e880: 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
e890: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
e8a0: 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
e8b0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
e8c0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
e8d0: 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
e8e0: 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
e8f0: 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
e900: 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
e910: 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
e920: 62 3b 0a 7d 0a                                   b;.}.